elisp各种标点符号操作符的含义是什么?

'foo 
#'foo
`foo
',foo
,foo
 ,@foo
,@,foo

这些蛋疼的操作符都是什么含义呢?有什么区别呢?感觉在macro里面尤其迷糊,各种高深的组合,麻烦明白的道友给科普下。感谢

'foo = (quote foo)
#'foo = (function foo)
`foo = 'foo
',foo = (quote ,foo)
2 个赞

像这种,如果不是写复杂的宏,一辈子也用不到。。。。

(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

' 是函数 quote 的简便写法,作用见 C-h f quote。

#' 是函数 function 的简便写法,作用见 C-h f function,它是 quote 的一个特例。

Backquote

` 是宏 backquote 的简写,作用见 C-h f backquote,其它的逗号,AT 符号是服务于 backquote 的,作用在 backquote 的 docstring 里有写。

因为 backquote 是宏,一旦展开,各种逗号、@符号的作用就清楚了。

3 个赞