Size: a a a

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

2020 September 22

AL

Arseniy Lebedev in Clojure — русскоговорящее сообщество
А зачем ты делаешь def? Почему нельзя забиндить сразу в лет?
источник

AB

Alex Bubnov in Clojure — русскоговорящее сообщество
Arseniy Lebedev
А зачем ты делаешь def? Почему нельзя забиндить сразу в лет?
да это я так, границы возможного нащупываю.
а что ты имеешь ввиду?
источник

AL

Arseniy Lebedev in Clojure — русскоговорящее сообщество
Не вполне понимаю пчоему нельзя сделать
(let [name 1])
источник

E

ETL in Clojure — русскоговорящее сообщество
(defn bind-let [a] (let [n (symbol a)] (def n 1)))
источник

T

The2lb3oz4dr10½grOfH... in Clojure — русскоговорящее сообщество
ETL
(defn bind-let [a] (let [n (symbol a)] (def n 1)))
n же будет. Это не макрос
источник

DS

Denis Shilov in Clojure — русскоговорящее сообщество
Ну это же разные вещи. let - локальный биндинг, def создает Var и интернит его в текущем пакете
источник

KR

Kostyantin Randomnam... in Clojure — русскоговорящее сообщество
NS-e
источник

T

The2lb3oz4dr10½grOfH... in Clojure — русскоговорящее сообщество
ETL
(defn bind-let [a] (let [n (symbol a)] (def n 1)))
источник

DS

Denis Shilov in Clojure — русскоговорящее сообщество
ну да, сорян, в currentNS()
источник

T

The2lb3oz4dr10½grOfH... in Clojure — русскоговорящее сообщество
Alex Bubnov
я очень извиняюсь, но
как правильно переписать выражение (let [name 'a] (def name 1))?
ну то есть, как подсунуть в def символ из локального биндинга?
Это делается с помощью макросов. Твой макрос должен вернуть
`(def ~name 1)
источник

DS

Denis Shilov in Clojure — русскоговорящее сообщество
Плюс def это спецформа
источник

T

The2lb3oz4dr10½grOfH... in Clojure — русскоговорящее сообщество
Denis Shilov
Плюс def это спецформа
Поэтому макросом
источник

DS

Denis Shilov in Clojure — русскоговорящее сообщество
Можно через eval наворотить, либо ручками логику def воспроизвести и дергать как функцию
источник

T

The2lb3oz4dr10½grOfH... in Clojure — русскоговорящее сообщество
Alex Bubnov
я очень извиняюсь, но
как правильно переписать выражение (let [name 'a] (def name 1))?
ну то есть, как подсунуть в def символ из локального биндинга?
Вот, например, мой макрос
(defmacro persist-scope
 "Takes local scope vars and defines them in the global scope. Useful for RDD"
 []
 `(do ~@(map (fn [v] `(def ~v ~v))
             (keys (cond-> &env (contains? &env :locals) :locals)))))

Он берет весь локальный скоуп и делает его глобальным через (def name name)
источник

DS

Denis Shilov in Clojure — русскоговорящее сообщество
тупой вариант через eval:
(let [name 'a]
 (eval `(def ~name 1)))
источник

DS

Denis Shilov in Clojure — русскоговорящее сообщество
Либо через intern:
(let [name 'a]
 (intern *ns* name 1))
источник

E

ETL in Clojure — русскоговорящее сообщество
А можно условия задачи полностью, что мы хотим получить? Почему кстати именно name используется, это же вроде как библиотечная функция из core?
источник

AB

Alex Bubnov in Clojure — русскоговорящее сообщество
да нет никакой задачи, я уточняю, как оно работает.
источник

DS

Denis Shilov in Clojure — русскоговорящее сообщество
Да балуется человек, пытается понять как эмулировать поведение def из функции
источник

DS

Denis Shilov in Clojure — русскоговорящее сообщество
Alex Bubnov
да нет никакой задачи, я уточняю, как оно работает.
https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/Compiler.java#L407

Вот реализация спец-формы def в исходниках компилятора, если действительно хочется понять как оно работает
источник