这种形式构建有什么问题?

yve*_*mes 3 clojure

考虑到有效的clojure形式:

    > (let [a 16 b 8] (/ a b))
2
Run Code Online (Sandbox Code Playgroud)

我正在尝试手动构建它以便将其提供eval给呼叫.我很快被拒绝了:

> (list 'let '[ 'a '16 'b '8 '] '(/ a b) )
RuntimeException Unmatched delimiter: ]  clojure.lang.Util.runtimeException (Util.java:156)
(/ a b)
RuntimeException Unmatched delimiter: )  clojure.lang.Util.runtimeException (Util.java:156)
Run Code Online (Sandbox Code Playgroud)

引用数组字符[]是不够的.实际上,以下表达式(删除[和])是可以的:

> (list 'let  'a '16 'b '8  '(/ a b) )
(let a 16 b 8 (/ a b))
Run Code Online (Sandbox Code Playgroud)

那个建筑有什么问题?我该如何解决这个问题呢?引用[和]字符有什么特殊形式吗?

mik*_*era 5

如果您正在尝试生成代码,那么我建议使用auto-gensyms构建此表达式,如下所示:

`(let [a# 16 b# 8] (/ a# b#))
Run Code Online (Sandbox Code Playgroud)

自动gensyms(a#b#)创建保证唯一的符号名称.这不是绝对必要的,但在更复杂的情况下,它可以帮助避免变量名称被意外捕获(例如,通过不同级别的宏扩展).

注意在表达式的开头使用syntax-quote(`)而不是常规引号(').当您生成代码时,这通常比常规引用更好,因为它会自动处理名称空间.