首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当在顶层之外使用时,Clojure: def丢弃^:宏

当在顶层之外使用时,Clojure: def丢弃^:宏
EN

Stack Overflow用户
提问于 2013-09-16 10:07:24
回答 1查看 162关注 0票数 3

如果我评估

代码语言:javascript
运行
复制
(def ^:macro my-defn1 #'defn)

定义了一个名为'my-defn1‘的宏,我可以像使用'defn’一样使用它。

但是,如果我评估

代码语言:javascript
运行
复制
(if true
  (def ^:macro my-defn2 #'defn))

“my-defn2”的var没有设置:宏元数据,即使'def‘形式与前面的大小写相同,我也不能将其用作宏。

下面是完整的代码(http://cljbin.com/paste/52322ba5e4b0fa645e7f9243):

代码语言:javascript
运行
复制
(def ^:macro my-defn1 #'defn)

(if true
  (def ^:macro my-defn2 #'defn))

(println (meta #'my-defn1))    ; => contains :macro

(println (meta #'my-defn2))    ; => doesn't contain :macro!

(my-defn1 hello1 []
          (println "hello 1"))

(hello1)                       ; => prints "hello 1"

(my-defn2 hello2 []            ; => CompilerException: Unable to resolve 
  (println "hello 2"))         ;    symbol: hello2 in this context

是什么让这种行为不同呢?

EN

回答 1

Stack Overflow用户

发布于 2013-09-16 14:59:10

Clojure的def不能真正有条件地应用。关于def的文档在这方面是不够强大的。这不仅仅是糟糕的风格,它可能会导致各种微妙的问题。

您应该只在顶层使用def,或者在顶层使用dolet表单。有条件地应用def将导致功能被拆分成类似于declare和随后的条件def,但并不总是以您期望/喜欢的方式。

你最好在这里的顶层使用def,然后有条件地使用alter-var-root。或者使用(def my-var (if .. .. ..))。想想为什么你会想要有一个全局的定义“消失”。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18819490

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档