Fork me on GitHub
#clojure-russia
<
2016-02-17
>
Dos04:02:50

Всем ассаламалейкум. насколько реально написать аналог этого прокси на кложуре? https://github.com/brcontainer/html2canvas-php-proxy

be904:02:48

@artemyarulin: сейчас объясню на пальцах. смотри: декоратор — функция, статический конструктор — функция. класс — порождение defrecord 😄

turtle04:02:42

be9: класс это хранённое состояние, что есть замыкание в функции. simple_smile Но это же всё ерунда. Интересно не базовые способности языка, а удобные и понятные конструкции.

rm04:02:43

и вопрос сокращается до "я хотел макрос для defrecord сделать, можно без этого обойтись?"

be904:02:19

turtle: храненное состояние — это инстанс класса! 👽

Kira Sotnikov05:02:46

А я никогда в ооп не мог

Kira Sotnikov05:02:57

А вот на кложе начал даже писать

turtle05:02:42

@be9: ну инстанс это что? Замыкание же ж.

be905:02:07

инстанс класса — замыкание, а класс? 😛

turtle05:02:19

А класс это функции.

artemyarulin07:02:58

@misha: Спасибо, уже использую во всю, няшная либа simple_smile

artemyarulin07:02:42

@be9: Спасибо за объяснение simple_smile Я просто вроде 10 лет почти оопешил на сишарпе и тока вот вчера понял что с кложурой абсолютно забыл про статичные поля и прочую фигню, причем напрочь:)

be909:02:54

artemyarulin: умом может и забыл, а тело помнит! зайди в Visual Studio, поставь руки на клавиатуру и закрой глаза. hello_world.cs поди набьёшь 😄

artemyarulin09:02:46

Ну вот сразу не так - HelloWorld.cs! ОМГ, я помню 😄

be909:02:31

хаха. я другие академии кончал 😄

be909:02:06

регистр букв — это такой шибболет. я сразу спалился, что не использовал C# 😄

artemyarulin09:02:55

simple_smile Я чота задумался - во всяких С# синглтон делается по типу:

public class Singleton
{
   private static Singleton instance;
   private Singleton() {}
   private static object syncRoot = new Object();
   public static Singleton Instance
   {
get 
      {
         if (instance == null) 
         {
            lock (syncRoot) 
            {
               if (instance == null) 
                  instance = new Singleton();
            }
         }
         return instance;
      }
   }
}
// и эти люди про скобочки лиспа чота грят...
на кложуре же тупо def и все?

artemyarulin09:02:45

а неа, def будет не ленивым. А как сделать аналог? Т.е. хочу ленивый синглтон? db connection и чтоб мультипоточно работало и все такое

artemyarulin09:02:59

компонент не предлагать

be909:02:16

Как мне видится, аналог синглтона — atom

dottedmag09:02:42

@artemyarulin: Функцию сделать, которая возвращает экземпляр из атома.

artemyarulin09:02:06

а если я дерну ее из нескольких потоков?

dottedmag09:02:29

swap! атомарный

dottedmag09:02:52

(swap! conn-atom (fn [cur-conn] (if (nil? cur-conn) (generate-conn) cur-conn)))

dottedmag09:02:58

А потом @conn-atom

dottedmag09:02:38

Хотя хотелось бы, чтобы compare-and-set! принимал функцию третьим аргументом.

artemyarulin09:02:00

ааа, if можно внутри swap! засунуть, я чота не думал раньше об этом

artemyarulin09:02:34

спасибо!

andfadeev09:02:16

да что угодно можно засунуть, свап же функцию принимает)

artemyarulin09:02:27

дада, счас то я понимаю. Я просто думал по началу про неправильный вариант типа:

(when-not (:conn @state) 
   (swap! state assoc :conn (new-con))
(:conn @state)

artemyarulin09:02:18

не дошло сразу что проверку надо внутрь swap! засунуть

sanitar4eg09:02:38

Привет, наткнулся на yo генератор jhipster, хотел узнать есть ли чтото побное для clojure, для изучения бест практис? Готовый апп, с возможностью расширения

malch09:02:40

@artemyarulin: еще delay, если я правильно понял

artemyarulin09:02:55

@malch: ООО, т.е. все схлопнется вообще до (def conn (delay (gen-conn))

prepor09:02:05

> (swap! conn-atom (fn [cur-conn] (if (nil? cur-conn) (generate-conn) cur-conn))) так не стоит делать

malch09:02:36

ну да simple_smile

be909:02:55

@artemyarulin: кстати, а почему component не предлагать? офигительный набор отвёрток сразу комплект синглтонов

artemyarulin09:02:42

@be9: Ну тогда б дискуссии этой не было вообще simple_smile - Как мне сделать аналог синлтона кода из С# в кложуре? - Юзай компонент - А хм, ок

artemyarulin09:02:57

@prepor: Просвяти плиз чо не так со swap!? Вроде выглядит все пучком

malch09:02:56

потенциально generate-conn может выполнится несколько раз

prepor09:02:58

потому что стоит почитать про то как работает swap!

prepor09:02:01

именно

prepor09:02:28

как правило, нельзя допускать никаких сайд эффектов внутри swap! функции, если точно не знаешь что делаешь

artemyarulin09:02:32

хм, странно - а почему функция может дернуться несколько раз? Т.е. я понимаю что детали реализации ага, но не могу просто понять почему так сделано

malch09:02:48

это не детали реализации

malch09:02:59

это нужно знать

malch09:02:27

atom сделан неблокирующимся

prepor09:02:33

это собственно суть atom

prepor09:02:47

оптимистичный compare and set в конце

prepor09:02:52

если не вышло - повторить

artemyarulin09:02:55

public Object swap(IFn f, Object arg) {
	for(; ;)
		{
		Object v = deref();
		Object newv = f.invoke(v, arg);
		validate(newv);
		if(state.compareAndSet(v, newv))
			{
			notifyWatches(v, newv);
			return newv;
			}
		}
}

artemyarulin09:02:58

нашел.да

artemyarulin09:02:03

сорри за тупой вопрос simple_smile

malch09:02:18

не, вопрос абсолютно не тупой

malch09:02:37

просто стоит сразу с этим разобраться, важная вещь

prepor09:02:41

нормальный вопрос, да )

dottedmag09:02:43

@prepor: Окей, как тогда делать.

prepor09:02:04

ну delay интерфейно как раз для такого )

artemyarulin09:02:15

да, матчасть надо читать 😳

prepor09:02:50

но вообще это тупняк синглетоны в нормальном кложа коде иметь )

prepor09:02:13

а в данном случае просто def же нужен )

artemyarulin09:02:23

да нене, упаси господь - в моем коде такого не будет. Просто как упражнение simple_smile

prepor09:02:24

даже без delay всяких

artemyarulin09:02:43

вон как оказалось очень полезно было, узнал много нового simple_smile

niquola10:02:18

Agent созданы для io

dottedmag11:02:49

@prepor: Действительно, delay -- это ж синглтон-конструктор прям.

artemyarulin14:02:18

How well do you know about postfix increments? Try to predict the output of the following snippet
int[] data = { 1, 2, 3 }; 
int i = 1;
data[i++] = data[i] + 10;
Console.WriteLine(String.Join(",", data));
а такое слабо воспроизвести на кложуре? Но тока чтобы тоже было непонятно какой ответ получится 😄

larhat14:02:34

это сшарп?

konukhov14:02:35

я думаю, слабо, потому что у тебя в clj мутация в любом случае будет явной.

konukhov14:02:42

или тут нет мутации в i++?

konukhov14:02:59

слабо, чтобы непонятно было, имею в виду simple_smile

larhat14:02:46

warning: unsequenced modification and access to 'i' [-Wunsequenced] data[i++] = data[i] + 10;

larhat14:02:50

clang хороший

artemyarulin16:02:50

>я думаю, слабо, потому что у тебя в clj мутация в любом случае будет явной. вообще подумалось - можно ли на кложуре написать код который былоб непонятно что он вернет?

artemyarulin16:02:47

мутации все явные, приоритета операторов помнить не надо. Ну исключая конечно адский ад на 100500 строчек с кор.асинк simple_smile

artemyarulin16:02:17

@andre: А в чем фишка котлина вообще?

rm16:02:42

> чтоб было непонятно, что он вернет (rand-int 10)

artemyarulin16:02:05

@rm: Ну ты понял о чем я, тут понятно что рандом simple_smile

fxposter16:02:52

в кложуре свои особенности

abtv16:02:41

@artemyarulin: котлин для тех, кто хочет ООП на jvm, но устал от Java и при этом не хочет scala. Лучше чем c# даже (если отстраниться от MS, то язык же хорош). Я два года ждал его с бета версии, кажется, так и не дождался - сначала scala попробовал, потом clojure simple_smile

fxposter16:02:49

(defn side-effecting-fn-returning-int [] (println "42") 42)

fxposter16:02:54

(defmacro add [])

fxposter16:02:05

(add 10 ( side-effecting-fn-returning-int))

fxposter16:02:27

(defmacro add [a b]), простите )

artemyarulin16:02:35

@abtv: А там функциональщины вообще нет?

abtv16:02:52

Как в c# ))

artemyarulin16:02:05

@fxposter: Ну дада, тоже подумал про макросы

malch16:02:39

@artemyarulin: так как в clojure ты можешь делать все то же, что и в java, можешь с помощью reflection добиться сколь угодно непонятного кода

artemyarulin16:02:41

ну наверно да - это задачка из C# тоже по сути придумана. Если захотеть можно и на кложуре х сломать

misha16:02:18

парни, а как кошерно в датаскрипте делать or?

artemyarulin16:02:39

// Return null if str does not hold a number
fun parseInt(str: String): Int? {
    try {
        return Integer.parseInt(str)
    } catch (e: NumberFormatException) {
        println("One of the arguments isn't Int")
    }
    return null
}
ну блин, где монадический option? фу, кака

misha16:02:09

юзкейс не

(or
  (= :name "a")
  (= :name "b"))
а:
(or
  (= :name "a")
  (= :address "a"))

misha17:02:45

на сетах написал -_-

artemyarulin17:02:47

@abtv: А чем котлин лучше скалы?

konukhov17:02:24

я на днях читал про него дискуссию какую-то – он проще в 100 раз, по идее, чем скала. так-то с первого взгляда – одно и то же.

konukhov17:02:15

на нем можно, как на хаскелле писать? говорят, что у скалисты делятся на 2 лагеря – одни пишут “на хаскелле”, другие – на старой доброй джаве.

artemyarulin17:02:31

вот ага, смотрю сча примеры http://try.kotlinlang.org и чота не впечатляет

artemyarulin17:02:51

неа, монадических типов нету походу

abtv17:02:04

@artemyarulin: в скале 100500 способов сделать одно и тоже, на своём опыте говорю, мне было сложно разбираться в чужом коде, в котлище такого нет (вроде бы, нет опыта с ним, просто игрался два года назад)

artemyarulin17:02:22

immutable тоже нету по ходу

abtv17:02:22

Котлище))) - котлине)

artemyarulin17:02:54

val map = hashMapOf<String, Int>() ссылка сама immutable тока

abtv17:02:38

scala = over engineering Kotlin = modern, pragmatic

artemyarulin17:02:10

data class User(val name: String, val id: Int)
val user = User("Alex", 1)
println(user.copy(id = 2))
ну хоть чота

abtv17:02:44

В два раза меньше кода сразу)))

abtv17:02:39

Джависты должны оценить, несмотря на то, что идея генерирует все эти геттеры и сеттеры

abtv17:02:01

Ещё все мапы и фильтры сразу инлайн будут в котлине, производительность не пострадает, тут верю на слово чуваку из jet brains

artemyarulin17:02:28

ну чота хз, может после жавы мб и ах этот котлин. С другой стороны проще чем скала да

artemyarulin17:02:10

ну чем больше языков для жвм тем лучше