下面的代码编译细:如何解决let中的interned vars?
(intern *ns* 'a 1) ;#'user/a
(intern *ns* 'b (+ a 1)) ;#'user/b
它还编译在do
:
(do
(intern *ns* 'c 1)
(intern *ns* 'd (+ c 1)))
然而汇编在一个let
失败(或任何其他结合形式我曾尝试,包括fn
):
(let []
(intern *ns* 'e 1)
(intern *ns* 'f (+ e 1)))
;CompilerException java.lang.RuntimeException: Unable to resolve symbol: ‘e in this context, compiling:(NO_SOURCE_PATH:2:5)
看起来实习生在这种情况下不会执行unti l let
完成后。我唯一的工作,而不是使用当地人是为了突变原子或使用alter-var-root
。
为什么intern
工作在let
,et al。就像它在do
中那样?有没有办法迫使实习生在let内部完成,以便上面的例子编译? (顺便说一句,宏不是一种选择,因为我想要访问使用ns-map
我约束力的形式运行信息)
一个很好的问题,但这里唯一令人惊讶的是赤裸裸的'do'编译。隐式'do'的合约是按顺序执行的,不是按顺序编译的。解决方案是提前“申报”。 – 2015-02-08 05:10:22
@ A.Webb当在顶层时,'(do x y z)'编译x,运行x;编译y,运行y;编译z,运行z。这是必要的,以便允许宏发出包装在“do”中的多个表单并将它们视为独立的顶级表达式。 – amalloy 2015-02-08 19:59:38