'foo
#'foo
`foo
',foo
,foo
,@foo
,@,foo
这些蛋疼的操作符都是什么含义呢?有什么区别呢?感觉在macro里面尤其迷糊,各种高深的组合,麻烦明白的道友给科普下。感谢
'foo
#'foo
`foo
',foo
,foo
,@foo
,@,foo
这些蛋疼的操作符都是什么含义呢?有什么区别呢?感觉在macro里面尤其迷糊,各种高深的组合,麻烦明白的道友给科普下。感谢
'foo = (quote foo)
#'foo = (function foo)
`foo = 'foo
',foo = (quote ,foo)
像这种,如果不是写复杂的宏,一辈子也用不到。。。。
(quote foo) 和 (function foo)有什么区别?不是一个意思么?
从字面意思来说,一个是要得到符号本身,一个是代表函数,是不一样的,但平时我们感觉不出来,可能编译的 elisp 的时候,有不同
还有那个逗号是什么意思?加不加逗号有什么区别?
如果不想eval是怎么做?
逗号是 与
配合使用的, 你可以将
理解为一种模板表示法, 逗号以及,@ 都是用于插入变量。
\` is a Lisp macro in ‘backquote.el’.
`STRUCTURE
Argument STRUCTURE describes a template to build.
The whole structure acts as if it were quoted except for certain
places where expressions are evaluated and inserted or spliced in.
For example:
b => (ba bb bc) ; assume b has this value
`(a b c) => (a b c) ; backquote acts like quote
`(a ,b c) => (a (ba bb bc) c) ; insert the value of b
`(a ,@b c) => (a ba bb bc c) ; splice in the value of b
Vectors work just like lists. Nested backquotes are permitted.
用模板类比豁然开朗。感觉自己又能看懂一些高人代码了。感谢马哥指导。
如果不想eval入参,只想原样入参应该怎么做?比如:
(foo (+ 1 1))
不想入参评估成了2,想直接入参就是原表达式。
你好了解三种不同的lisp 的 eval 规则, 函数,宏和特殊结构(if,while等),函数的参数必定eval,宏的参数用户可以控制 eval 时机,特殊结构按特殊结构的要求 eval
你这种情况,只能将 foo 定义为一个宏,然后在宏定义内部控制 参数表达式 eval 时机
明白了。跪谢,我再研究研究宏
这么多也就分成两类:Quote 和 Backquote。
'
是函数 quote
的简便写法,作用见 C-h f quote。
#'
是函数 function
的简便写法,作用见 C-h f function,它是 quote
的一个特例。
`
是宏 backquote
的简写,作用见 C-h f backquote,其它的逗号,AT 符号是服务于 backquote 的,作用在 backquote 的 docstring 里有写。
因为 backquote 是宏,一旦展开,各种逗号、@符号的作用就清楚了。