如何理解编程Clojure 2nd';第173页?
我正在阅读《使宏更简单》一书,在《代码》第173页中,宏的定义如下:如何理解编程Clojure 2nd';第173页?,clojure,macros,Clojure,Macros,我正在阅读《使宏更简单》一书,在《代码》第173页中,宏的定义如下: (defmacro chain ([x form] (list '. x form)) ([x form & more] (concat (list 'chain (list '. x form)) more))) 但是根据p167中关于defmacro的定义: (defmacro name doc-string? attr-map? [params*] body) 从定义chain,我可以猜测
(defmacro chain
([x form] (list '. x form))
([x form & more] (concat (list 'chain (list '. x form)) more)))
但是根据p167
中关于defmacro
的定义:
(defmacro name doc-string? attr-map? [params*] body)
从定义chain
,我可以猜测并验证[x form]
是chain
的参数,但显然
([x表单](列表'.x表单))
([x表单和更多](concat(list'chain(list.x表单))更多))
是链
的主体
,为什么将主体
的参数更改为链
的参数?或者我能理解这是clojure的
的重载
像java
?我错过了什么
更新:我在谷歌上搜索了clojure的结果,但在书中没有找到关于
重载的描述clojure函数和宏可以有多个算术
defmacro
的当前文档说明它采用以下参数
([name doc-string? attr-map? [params*] body]
[name doc-string? attr-map? ([params*] body) + attr-map?])
其中,([params*]body)
部分可以重复多次,只要它们之间没有歧义
([params*]body)
部分与fn
和defn
中的部分相同
(defmacro foo
([x y] ,,,)
([x y & xs] ,,,)
如果用两个参数调用,它将使用第一个算术。
如果用三个或更多的函数调用它,它将使用第二个函数
(defmacro bar
[x y & xs]
,,,)
这个函数可以用两个参数调用,在这种情况下,xs将为空。Clojure函数和宏可以有多个算术
defmacro
的当前文档说明它采用以下参数
([name doc-string? attr-map? [params*] body]
[name doc-string? attr-map? ([params*] body) + attr-map?])
其中,([params*]body)
部分可以重复多次,只要它们之间没有歧义
([params*]body)
部分与fn
和defn
中的部分相同
(defmacro foo
([x y] ,,,)
([x y & xs] ,,,)
如果用两个参数调用,它将使用第一个算术。
如果用三个或更多的函数调用它,它将使用第二个函数
(defmacro bar
[x y & xs]
,,,)
这个可以用两个参数调用,在这种情况下,xs将为空。在(defmacro-chain…
中的两种形式表示不同的宏-使用不同数量的参数
- 第一个主体形式
([x形式]…)
,需要两个
争论
- 第二个主体形式,
([x-form&more]…)
接受任意数量的
大于两个的参数(如果不是第一种形式,则为
也接受两个)
您可以在本书第33页找到关于多个算术函数的解释(defmacro
扩展为fn
形式) 在(defmacro-chain…
中的两种形式代表不同的宏-采用不同数量的参数
- 第一个主体形式
([x形式]…)
,需要两个
争论
- 第二个主体形式,
([x-form&more]…)
接受任意数量的
大于两个的参数(如果不是第一种形式,则为
也接受两个)
您可以在本书第33页找到关于多个算术函数的解释(defmacro
扩展为fn
形式) @缩略图,谢谢!你的解释和我的结果是一样的googled@Thumbnail非常感谢。你的解释和我在谷歌上搜索的结果是一样的