У меня происходит следующее в REPL:
mathematics.core> (let [zebra 1] (resolve 'zebra))
nil
mathematics.core> (def zebra 1)
#'mathematics.core/zebra
mathematics.core> (let [zebra 2] (when (resolve 'zebra) (eval 'zebra)))
1
По сути, я хотел бы динамически связывать значения с переменными, используя что-то вроде формы let
, и иметь функции внутри этой формы, чтобы иметь возможность доступа к значению, с которым связана переменная.
mathematics.core> (def ^:dynamic zebra 1)
#'mathematics.core/zebra
mathematics.core> (binding [zebra 2] (when (resolve 'zebra) (eval 'zebra)))
2
binding
, кажется, делает то, что я хочу, но AFAIK требует, чтобы сначала была определена переменная с метаданными :dynamic
. Я хочу иметь возможность использовать переменные, которые никогда не были определены ранее на лету, и иметь выражения в форме, чтобы иметь доступ к этой переменной, как если бы она была фактически определена.
Чтобы проиллюстрировать, я хочу что-то вроде этого:
mathematics.core> (let-dynamic [undefined-variable 1]
(when (resolve 'undefined-variable) (eval 'unresolved-variable)))
1
Есть ли простой способ сделать это? Или способ сделать это с помощью макросов?