如何理解编程Clojure 2nd';第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,我可以猜测

我正在阅读《使宏更简单》一书,在《代码》第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
,我可以猜测并验证
[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非常感谢。你的解释和我在谷歌上搜索的结果是一样的