LINUX.ORG.RU

История изменений

Исправление unlog1c, (текущая версия) :

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

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

Тебе нужно это (взято из M.Fogus «The Joy of Clojure»):

(defmacro local-context []
  (let [symbols (keys &env)]
    (zipmap (map (fn [sym] `(quote ~sym)) symbols) symbols)))

(local-context)
;=> {}

(let [a 1, b 2, c 3]
  (let [b 200]
    (local-context)))
;=> {a 1, b 200, c 3}

(defn contextual-eval [ctx expr]
(eval
`(let [~@(mapcat (fn [[k v]] [k `'~v]) ctx)]
~expr)))

Исходная версия unlog1c, :

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

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

Тебе нужно это (взято из M.Fogus «The Joy of Clojure»):

(defmacro local-context []
  (let [symbols (keys &env)]
    (zipmap (map (fn [sym] `(quote ~sym)) symbols) symbols)))

(local-context)
;=> {}

(let [a 1, b 2, c 3]
  (let [b 200]
    (local-context)))
;=> {a 1, b 200, c 3}