码迷,mamicode.com
首页 > 其他好文 > 详细

Elisp 中变量赋值函数 set 与 setq 辨析

时间:2019-03-02 12:25:17      阅读:253      评论:0      收藏:0      [点我收藏+]

标签:使用   默认   分析   rcu   列表   fir   map   des   debugger   

Elisp 中,为变量赋值的函数有 setsetq,但是,两者存在很大的差异。

使用 set 赋值:

如果我们想为变量 flowers 赋值为一个 列表 ‘(rose violet daisy buttercup) ,我们需要如下语句:

(set ‘flowers ‘(rose violet daisy buttercup))

需要注意的是,当你使用 set 函数为变量赋值时,你需要在 set 函数的两个参数(即变量与值)前添加单引号。因为如果我们不添加单引号,这两个参数就会被当成表达式运行。

比如,如果我们去掉 flowers 前的单引号:

(set flowers ‘(rose violet daisy buttercup))

运行上面这条语句,如果 flowers 之前没有被赋值的话,我们会得到如下错误消息:Debugger entered--Lisp error: (void-variable flowers) 。如果我们在运行上面这条语句之前,为 flowers 赋一个值,如下:

1 (set ‘flowers ‘roots)
2 (set flowers ‘(rose violet daisy buttercup))

先后运行上面两条语句,之后,使用 C-h v 快捷键,或者 M-x describe-variable,查看 flowersroots 的值,就会发现此时 roots 的值为列表 ‘(rose violet daisy buttercup)

使用 setq 赋值:

通过上面对 set 函数的分析,就会发现,使用 set 函数赋值不是很直观,由于和其他编程语言区别比较大,所以比较容易出错。因此,setq 函数主要用于解决这个问题。 setq 函数默认会为第一个参数(需要被赋值的变量)添加一个单引号,这样就不必程序员额外添加了。当然,注意,只是第一个参数,第二个参数(值)就没有什么特权了,该加单引号的话还是得加。这样,使用 setq 为变量 flowers 赋值一个列表 ‘(rose violet daisy buttercup) ,使用如下语句就可以了:

(setq flowers ‘(rose violet daisy buttercup))

此外,setq 函数更加方便的一点是可以为多个变量赋值,例如下面这条语句,分别为变量 treesflowers 赋值了一个列表:

1 (setq trees ‘(pine fir oak maple)
2       flowers ‘(rose violet daisy buttercup))

总结:

通过对比 setsetq 函数的特点,就会发现 Elisp 这门编程语言的一个特点,也就是“代码即数据,数据即代码”。之后,你是不是反倒觉得 setq 赋值函数虽然方便一些,但是于这门语言的设计思想而言其实是不和谐的?不过,这却是我们理解这门语言的一个重要的引路人。

Elisp 中变量赋值函数 set 与 setq 辨析

标签:使用   默认   分析   rcu   列表   fir   map   des   debugger   

原文地址:https://www.cnblogs.com/asvblog/p/10460206.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!