Emacs 为什么REPL将clojure.core/doc视为var?
我试图使用ClojureEmacs 为什么REPL将clojure.core/doc视为var?,emacs,clojure,read-eval-print-loop,slime,Emacs,Clojure,Read Eval Print Loop,Slime,我试图使用Clojuredoc函数获取文档,但无法从REPL中识别它(我使用的是Emacs和SLIME)。以下顺序描述了发生的情况(每行后面紧跟着错误消息): 如何引用doc函数并将其识别为函数而不是变量 附录,2011年6月22日,问题发布后9小时 @kotarak发表了最相关的评论:“请注意,clojure.core/doc是1.2及更低版本。clojure.repl/doc是1.3及更高版本。”果然,以下内容起到了作用: user> (clojure.repl/doc first)
doc
函数获取文档,但无法从REPL中识别它(我使用的是Emacs和SLIME)。以下顺序描述了发生的情况(每行后面紧跟着错误消息):
如何引用doc
函数并将其识别为函数而不是变量
附录,2011年6月22日,问题发布后9小时 @kotarak发表了最相关的评论:“请注意,clojure.core/doc是1.2及更低版本。clojure.repl/doc是1.3及更高版本。”果然,以下内容起到了作用:
user> (clojure.repl/doc first)
-------------------------
clojure.core/first
([coll])
Returns the first item in the collection. Calls seq on its
argument. If coll is nil, returns nil.
nil
user>
我能够确认Clojure 1.3处于活动状态:
user> *clojure-version*
{:interim true, :major 1, :minor 3, :incremental 0, :qualifier "master"}
user>
但这也令人困惑——我的Leiningen project.clj指定了Clojure 1.2
根据我自己的经验,我曾经注意到,即使在我更改了相关目录的内容之后,基于SLIME的REPL仍然“挂起”Java类路径值。然后,解决方案是退出Emacs和lein swank
,然后重新输入两者并重试。我尝试了同样的方法,结果如下:
user> *clojure-version*
{:major 1, :minor 2, :incremental 0, :qualifier ""}
user>
我唯一能得出的结论是,我以前的REPL一直在使用Clojure 1.3。在此之前我参与的项目使用了Clojure1.3快照,因此我猜REPL不知何故“挂起”了Clojure1.3
问题解决、经验教训等。对于加分,有人能解释发生的原因吗(Clojure 1.2 vs.1.3)
感谢所有贡献者。几处更正。首先,doc是一个宏而不是一个函数。此外,函数和宏也可以存储在一个变量中。其次,在clojure 1.3(可能是您正在使用的版本)中,doc存储在变量clojure.repl/doc中,而不是clojure.core/doc中(与1.2中一样)。在名称空间用户中,doc是“使用的”,即有一个隐式的“(使用[clojure.repl:仅[doc])。当您转到一个新名称空间,或者甚至使用ns创建一个名称空间时,clojure.repl/doc不会自动添加,这与“user”不同 要更明确地回答这些问题: 为什么REPL将clojure.core/doc视为var clojure中的函数、宏和值要么存储在var中,要么绑定到let或函数等符号。clojure.core/doc是保存宏的var,宏的作用与doc相同 如何引用doc函数并将其识别为函数而不是变量 与所有Lisp一样,无论是函数还是宏,要执行调用,必须将函数/宏放在列表的第一个位置
(<fn/macro> *args)
doc for doc显示它的宏,因此用macroexpand展开它会显示它是 应为包含函数的var的名称。因此,对于您的问题,最简短的答案是“名称空间中的函数包含在vars中” 在这种情况下,macroexpand-1是一个很好的起点:
(macroexpand-1 '(doc doc))
(clojure.core/print-doc (var doc))
sso-config.core> (doc doc)
-------------------------
clojure.core/doc
([name])
Macro
Prints documentation for a var or special form given its name
请注意,
clojure.core/doc
为1.2及更低版本。clojure.repl/doc
为1.3及更高版本。我注意到您还没有接受任何问题的答案。如果您认为答案足够,您肯定应该接受一些答案。这就是stackoverflow网站的工作方式。@kotarak和@bmillare:请阅读我的问题和两个答案。我想你会同意,虽然两个答案都试图有所帮助,但都没有回答我的问题。这就是为什么我没有接受任何一个。@gregg williams这对你的所有其他问题都是正确的,你没有提供任何反馈建议的解决方案是否有帮助。@gregg我更新了我的回答。我更加明确,假设更少。如果仍然不清楚,请反馈。@kotarak,我误读了你最初的评论。感谢你指出我没有选择前两个问题的答案。我已经这样做了,我感谢你指出错误所在;我确实想做一个好公民。谢谢。
(doc doc)
(macroexpand-1 '(doc doc))
(clojure.core/print-doc (var doc))
sso-config.core> (doc doc)
-------------------------
clojure.core/doc
([name])
Macro
Prints documentation for a var or special form given its name