加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
lisp.org 2.75 KB
一键复制 编辑 原始数据 按行查看 历史
Sniper 提交于 2022-06-11 16:32 . update rust...

tatol

quote和backquote

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

马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化