水木社区手机版
首页
|版面-函数式编程语言(FuncProgram)|
新版wap站已上线
返回
下页
|
尾页
|
1/2
|
转到
主题:帮忙解释一下 Lisp 定义宏时的参数设定,谢谢!
楼主
|
snoopyzhao
|
2020-11-23 13:50:32
|
只看此ID
有这么两个common lips 宏的定义:
(defmacro destructuring-switch-bind (lambdalist expr . body)
(...))
(defmacro define-local-class (&whole whole &rest args)
(destructuring-switch-bind (name
layer
&key
(range 1)
(depth 0)
&switch
(var :var))
args
(...)))
第一个宏,我看了代码,大概能够明白,但不知道那里面的 expr 和 body 之间的点代表的是啥?
第二个宏,其实就是在第一个宏的外面再套了一层,然后,我就不是很清楚里面这个参数是从哪里来的,或者怎么知道它们的对应关系?
多谢!
--
FROM 220.249.99.*
1楼
|
wolfgang
|
2020-11-24 12:09:23
|
只看此ID
关于 (a . b)的语法,其中b就相当于这个列表的cdr。
具体请参见这个文档:
https://www.gnu.org/software/emacs/manual/html_node/elisp/Dotted-Pair-Notation.html
也就是所谓的dotted notation
关于&body等等带着&的语法,可以参见:
http://www.gigamonkeys.com/book/macros-defining-your-own.html
http://clhs.lisp.se/Body/m_defmac.htm
【 在 snoopyzhao (只打酱油,不兼职) 的大作中提到: 】
: 有这么两个common lips 宏的定义:
: (defmacro destructuring-switch-bind (lambdalist expr . body)
: (...))
: ...................
--
FROM 101.93.23.*
2楼
|
snoopyzhao
|
2020-12-01 20:16:06
|
只看此ID
【 在 wolfgang (狂云) 的大作中提到: 】
: 关于 (a . b)的语法,其中b就相当于这个列表的cdr。
: 具体请参见这个文档:
:
https://www.gnu.org/software/emacs/manual/html_node/elisp/Dotted-Pair-Notation.html
: ...................
多谢,我大概知道了 (a . b) 的语法
对于这个问题,我现在的想法是,common lisp 的参数解析是复杂的,理解起来有点儿费劲,比如 &whole
然后,
(defmacro destructuring-switch-bind (lambdalist expr . body)
(...))
和
(destructuring-switch-bind (name
layer
&key
(range 1)
(depth 0)
&switch
(var :var))
args
(...))
这两者的对应关系是:
lambdalist 对应于 (name layer &key (range 1) (depth 0) &switch (var :var))
expr 对应于 args
body 对应于后面调用中的 (...)
但愿我的理解是对的
真是太伤脑筋了……
--
修改:snoopyzhao FROM 220.249.99.*
FROM 220.249.99.*
3楼
|
Dieken
|
2020-12-31 23:04:02
|
只看此ID
那个语法不是 dotted pair,而是 Common Lisp 的 Lambda list 语法,点表示 &rest。
http://clhs.lisp.se/Body/03_dd.htm
【 在 wolfgang (狂云) 的大作中提到: 】
: 标 题: Re: 帮忙解释一下 Lisp 定义宏时的参数设定,谢谢!
: 发信站: 水木社区 (Tue Nov 24 12:11:42 2020), 站内
:
: 关于 (a . b)的语法,其中b就相当于这个列表的cdr。
:
: 具体请参见这个文档:
:
https://www.gnu.org/software/emacs/manual/html_node/elisp/Dotted-Pair-Notation.html
: 也就是所谓的dotted notation
:
: 关于&body等等带着&的语法,可以参见:
:
:
http://www.gigamonkeys.com/book/macros-defining-your-own.html
:
http://clhs.lisp.se/Body/m_defmac.htm
:
:
:
:
: 【 在 snoopyzhao (只打酱油,不兼职) 的大作中提到: 】
: : 有这么两个common lips 宏的定义:
: : (defmacro destructuring-switch-bind (lambdalist expr . body)
: : (...))
: : ...................
:
: --
: 热二定律比动量守恒更高
: 它告诉我们世界的原初是恨
:
: 爱, 就是对恨的战斗!
:
:
: ※ 来源:·水木社区 newsmth.net·[FROM: 101.93.23.*]
--
FROM 111.193.29.*
4楼
|
Dieken
|
2020-12-31 23:06:47
|
只看此ID
我只能说看这里,但是我也不懂。。。
http://clhs.lisp.se/Body/03_dda.htm
【 在 snoopyzhao (只打酱油,不兼职) 的大作中提到: 】
: 多谢,我大概知道了 (a . b) 的语法
: 对于这个问题,我现在的想法是,common lisp 的参数解析是复杂的,理解起来有点儿费劲,比如 &whole
: 然后,
: ...................
--
FROM 111.193.29.*
5楼
|
littleSram
|
2021-01-01 08:11:01
|
只看此ID
我认为好像还是吧
因为 (1 2) <=> (1 . (2)), 所以当形参是 (x . y) 的时候, x 为 1,y 为 (2)。
【 在 Dieken 的大作中提到: 】
: 那个语法不是 dotted pair,而是 Common Lisp 的 Lambda list 语法,点表示 &rest。
:
http://clhs.lisp.se/Body/03_dd.htm
:
--
FROM 114.249.25.*
6楼
|
littleSram
|
2021-01-01 08:16:08
|
只看此ID
为啥要看common LISP呢
如果要学LISP的话,可以从简单的LISP方言学起来,比如scheme
【 在 snoopyzhao 的大作中提到: 】
: 有这么两个common lips 宏的定义:
: (defmacro destructuring-switch-bind (lambdalist expr . body)
: (...))
: ...................
--
FROM 114.249.25.*
7楼
|
snoopyzhao
|
2021-01-01 08:40:22
|
只看此ID
【 在 littleSram (littleSram) 的大作中提到: 】
: 我认为好像还是吧
: 因为 (1 2) <=> (1 . (2)), 所以当形参是 (x . y) 的时候, x 为 1,y 为 (2)。
是这么个意思,感觉在形参中用这个就是为了简化的样子
--
FROM 117.152.220.*
8楼
|
snoopyzhao
|
2021-01-01 08:41:01
|
只看此ID
【 在 Dieken (风催草低 - 明月何尝不照人) 的大作中提到: 】
: 那个语法不是 dotted pair,而是 Common Lisp 的 Lambda list 语法,点表示 &rest。
:
http://clhs.lisp.se/Body/03_dd.htm
Common Lisp 形参的 lambda list 语法真是变态,看得头大……
--
FROM 117.152.220.*
9楼
|
littleSram
|
2021-01-01 09:25:07
|
只看此ID
因为list是dot pair的简化表达
(1 2 3)= (1.(2.(3.())))
【 在 snoopyzhao 的大作中提到: 】
:
: 是这么个意思,感觉在形参中用这个就是为了简化的样子
--
FROM 114.249.25.*
下页
|
尾页
|
1/2
|
转到
选择讨论区
首页
|
分区
|
热推
BYR-Team
©
2010.
KBS Dev-Team
©
2011
登录完整版