Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Emacs 为什么REPL将clojure.core/doc视为var?_Emacs_Clojure_Read Eval Print Loop_Slime - Fatal编程技术网

Emacs 为什么REPL将clojure.core/doc视为var?

Emacs 为什么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)

我试图使用Clojure
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