gpt4 book ai didi

function - ns的参数是什么?

转载 作者:行者123 更新时间:2023-12-04 06:46:06 25 4
gpt4 key购买 nike

ns 的参数是什么?文档说了些什么,但不清楚(至少对我来说)


my-new-namespace=> (doc ns)
-------------------------
clojure.core/ns
([name docstring? attr-map? references*])
Macro
Sets *ns* to the namespace named by name (unevaluated), creating it
if needed.

...the rest of the documentation was not copied

混淆来自所有其他与命名空间相关的函数:

user=> (find-ns 'my-new-namespace)
nil
user=> (remove-ns 'my-new-namespace)
nil
user=> (create-ns 'my-new-namespace)
#<Namespace my-new-namespace>
user=> (ns 'my-new-namespace)
java.lang.ClassCastException: clojure.lang.PersistentList cannot be cast to clojure.lang.Symbol (NO_SOURCE_FILE:26)
user=> (ns my-new-namespace)
nil
my-new-namespace=>
find-ns, create-ns, remove-nsmy-new-namespace引用,而 ns需要 my-new-namespace未引用

那么,交易是什么?为什么有些人得到带引号的形式,而有些人得到 my-new-namespace 的未引号形式| ?

在每种情况下,是什么 my-new-namespace ?

ps:我想我在这里写问题时已经找到了答案,但这似乎是一个有趣的练习,所以这个问题仍然被发布了:D

最佳答案

ns 是一个宏,在引擎盖下,如果引用名称可以省去麻烦:

user> (macroexpand '(ns foo))
(do (clojure.core/in-ns (quote foo)) (clojure.core/with-loading-context
(clojure.core/refer (quote clojure.core))))

其他函数不能使用不带引号的参数,因为它们是函数,并且函数首先评估了那里的参数。

ns 宏作为一个宏,可以在计算参数之前查看并调整其参数,因此它可以在读者尝试将其作为变量名称查找之前获得 my-new-namespace。

简而言之,这可以节省键盘和手腕上的磨损和皮重 ;) 开个玩笑,在这两种情况下,函数接收的是一个符号,它们的不同之处在于你必须做什么才能将这个符号传递给他们。

用于比较;如果你去哪里通过 (ns 'my-new-namespace)它会得到符号 'my-new-namespace报价和所有!您可能不希望引用成为 namespace 的一部分。

如果你想让它保持一致,你可以编写包装宏,为其余的命名空间函数采用不带引号的符号,只引用第一个参数并返回对实际函数的调用(请记住,宏返回要调用的代码)
(defmacro my-find-ns [name]
`(find-ns (quote ~name)))

虽然这会打破“宏观俱乐部的第一条规则”

关于参数是列表的错误是由于它试图使用 (quote my-new-namespace) 引起的作为名字
 user> (macroexpand '(ns 'foo))
(do (clojure.core/in-ns (quote (quote foo))) (clojure.core/with-loading-context
(clojure.core/refer (quote clojure.core))))

关于function - ns的参数是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3747165/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com