Elisp中有三种引用结构: quote , function 以及 backquote 。
quote
(quote object ) 会按照文本形式返回 object ,不对其进行求值。所以quote的主要用途在于定义常量符号和列表。
(quote (+ 1 2)) ; 对这个表达式求值,会返回下面的结果。
(+ 1 2)
quote的简写形式就是一个单引号字符 ’ 。 ‘x 等价于 (quote x) 。
backquote
backquote 用于引用一个list,但是允许对list的某些元素求值。其最简单的形式等同于 quote 。下面的两个form是等价的:
`(a list of (+ 2 3) elements)
(a list of (+ 2 3) elements)
'(a list of (+ 2 3) elements)
(a list of (+ 2 3) elements) backquote的简写形式就是一个反引号字符 ` 。 , 特殊标记 , 告诉 backquote ,其后跟随的参数需要求值,结果放到backquote生成的list中。例如:
`(a list of ,(+ 2 3) elements)
a list of 5 elements 再看另一个例子:
(setq v '(a b c))
`(a list embedding ,v)
a list embedding (a b c) ,@ 特殊标记 ,@ 告诉 backquote ,其后跟随的参数需要求值, 求值后生成的list的元素要被提取到跟外围元素同级的位置。 看例子:
(setq v '(v1 v2 v3))
`(a list including values a ,@v and b)
a list including values a v1 v2 v3 and b 需要注意的是, ,@ 后的参数求值后应该是一个list(或者其它自求值的对象,例如数字,字符串,向量等)。
function
(function function-object ) 不对参数 function-object 求值,而是直接返回(类似quote)。跟 quote 不同的是,它会告诉Elisp其返回的值是要作为函数使用的。
function 有个简写形式: #’ 。下面三种定义匿名函数的方式是等价的:
(lambda (x) x)
(function (lambda (x) x))
#'(lambda (x) x)
> (apply #’area ‘(2)) 12.5663706143592 > (apply #’* ‘(1 2 3 4)) 24 > (funcall #’area 2) 12.5663706143592 > (funcall #’* 1 2 3 4) 24 //apply 与 funcall 的区别。Apply 要求其最后一个参数是一个表,表中列出相应的函数所需的 参数,如 area 需要一个参数,所以例中 apply 使用方式是 (apply #’area ‘(2)),相当于(area 2);funcall 则不同,函数所需的各参数直接跟在 函数名参数之后,不能是表,所以例中(funcall #’* 1 2 3 4),相 当于(* 1 2 3 4)。
字符用于在s表达式中引入特殊语法。这里有些例子:
#’functionname -> (function functionname) #(1 2 3) -> the vector of the elements 1 2 3 #c(1 2) -> a complex number #xFFFF -> a hex number #b1111 -> a binary number
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。