Size: a a a

Clojure — русскоговорящее сообщество

2020 July 03

((

(fun () -> ()) in Clojure — русскоговорящее сообщество
я даже был уверен что в js там будет какая-то дичь, а оказалось логично
источник

T

Timmy B in Clojure — русскоговорящее сообщество
(fun () -> ())
я даже был уверен что в js там будет какая-то дичь, а оказалось логично
this
я уже прям ожидал что-то типа 1 2 1 2
источник

VL

Vlad Lisovsky in Clojure — русскоговорящее сообщество
я думал, 11 22 изначально
источник

T

Timmy B in Clojure — русскоговорящее сообщество
но поц чему?
источник

VL

Vlad Lisovsky in Clojure — русскоговорящее сообщество
Мол, замыкание изолирует переменную на момент создания
источник

T

Timmy B in Clojure — русскоговорящее сообщество
не, референс только
источник

VL

Vlad Lisovsky in Clojure — русскоговорящее сообщество
А оказалось Shared, да
источник

MB

Mikhail Borisov in Clojure — русскоговорящее сообщество
Vlad Lisovsky
Мол, замыкание изолирует переменную на момент создания
А где это так работает?
источник

MB

Mikhail Borisov in Clojure — русскоговорящее сообщество
Вообще это одна из причин поменьше мутироваться, такие приколы сложно искать
источник

OR

Oleg Roshchupkin in Clojure — русскоговорящее сообщество
Vlad Lisovsky
Мол, замыкание изолирует переменную на момент создания
Ну так оберни в IIFE
источник

OR

Oleg Roshchupkin in Clojure — русскоговорящее сообщество
А так там глобальная переменная, оба замыкания смотрят на неё.
источник

VL

Vlad Lisovsky in Clojure — русскоговорящее сообщество
Mikhail Borisov
А где это так работает?
(defn foo []
 (let [counter (atom 0)]
   (fn [] (do (swap! counter inc) @counter))))

(def f1 (foo))
(def f2 (foo))

(comment
 (f1)
 (f2))
источник

OR

Oleg Roshchupkin in Clojure — русскоговорящее сообщество
Ну нет же
источник

VL

Vlad Lisovsky in Clojure — русскоговорящее сообщество
да, counter надо вынести
источник

MB

Mikhail Borisov in Clojure — русскоговорящее сообщество
Vlad Lisovsky
(defn foo []
 (let [counter (atom 0)]
   (fn [] (do (swap! counter inc) @counter))))

(def f1 (foo))
(def f2 (foo))

(comment
 (f1)
 (f2))
Если этот атом снаружи создать, то будет то же самое
источник

VL

Vlad Lisovsky in Clojure — русскоговорящее сообщество
да-да
источник

VL

Vlad Lisovsky in Clojure — русскоговорящее сообщество
(def counter (atom 0))

(defn foo []
   (fn [] (do (swap! counter inc) @counter)))

(def f1 (foo))
(def f2 (foo))

(comment
 (f1)
 (f2))
источник

OR

Oleg Roshchupkin in Clojure — русскоговорящее сообщество
Тот вопрос скорее на базовое знание замыканий, нежели на знание особенностей
источник

OR

Oleg Roshchupkin in Clojure — русскоговорящее сообщество
Никакого тебе hoisting или перекрытия областей видимости
источник

MB

Mikhail Borisov in Clojure — русскоговорящее сообщество
В общем, никакой магии не происходит, захватываемая переменная из тела функции просто ссылается на ту же память, что и переменная, которую она захватила
источник