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

使用 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 赋一个值,如下:

 (set 'flowers 'roots)
(set flowers '(rose violet daisy buttercup))

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

使用 setq 赋值:

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

(setq flowers '(rose violet daisy buttercup))

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

 (setq trees '(pine fir oak maple)
flowers '(rose violet daisy buttercup))

总结:

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

Elisp 中变量赋值函数 set 与 setq 辨析的更多相关文章

  1. JavaScript中变量和函数声明的提升

    现象: 1.在JavaScript中变量和函数的声明会提升到最顶部执行. 2.函数的提升高于变量的提升. 3.函数内部如果用var声明了相同名称的外部变量,函数将不再向上寻找. 4.匿名函数不会提升. ...

  2. C++:类中的赋值函数

    先来看一个例子: #include<iostream> #include<string> using namespace std; class Student{ public: ...

  3. 关于javascript中变量及函数的提升

    javascript中变量以及函数的提升,在我们平时的项目中其实还是挺常用的,尤其是大型项目中,不知不觉就会顺手添加一些变量,而有时候自己的不小心就会酿成一些不必要错误,趁有时间整理一下自己对于js中 ...

  4. C语言中变量和函数的作用域和链接属性

    C语言中变量和函数的作用域和链接属性 作用域 代码块作用域: 代码块指的是使用"{}"包围起来的部分. 在代码块中定义的变量,代码块之外是不能访问的. 代码块嵌套之后的变量作用域, ...

  5. Keil C51中变量和函数的绝对地址定位问题

    1.变量绝对地址定位 1) 在定义变量时使用 _at_ 关键字加上地址就可. unsigned char idata myvar _at_ 0x40;  把变量 myvar 定义在 idata 的 0 ...

  6. mysql中变量赋值

    http://www.cnblogs.com/qixuejia/archive/2010/12/21/1913203.html sql server中变量要先申明后赋值: 局部变量用一个@标识,全局变 ...

  7. Oracle 过程中变量赋值

    create or replace function get_sal1(id employees.employee_id%type) return number is sal employees.sa ...

  8. 为什么linux驱动中变量或者函数都用static修饰?(知乎问题)

    static定义的全局变量 或函数也只能作用于当前的文件. 世界硬件厂商太多,定义static为了防止变量或 函数 重名,定义成static, 就算不同硬件驱动中的 变更 或函数重名了也没关系 .

  9. c++中的赋值函数

    在c++中,对于任意一个类Class A,如果程序员不显示的声明和定义上述函数,C++编译器将会自动的为A产生4个public inline 的默认函数,这4个函数最常见的形式为: A() //默认构 ...

随机推荐

  1. docker配置代理的用户名密码

    公司访问外网全部需要经过代理服务器,在使用docker的过程中,发现就算为docker配置了代理,还是会因为没有代理服务器认证,导致pull操作失败,报如下错误: Error response fro ...

  2. Python 守护线程

    import time from threading import Thread from multiprocessing import Process #守护进程:主进程代码执行运行结束,守护进程随 ...

  3. 从零开始写自己的PHP框架系列教程(一)[core.php]

    这里我直接上代码: /** * 框架核心 */ if (version_compare(PHP_VERSION, '5.3.0','<')) { header("Content-Typ ...

  4. SQL数据库中查询中加N'' 前缀是什么意思

    It's declaring the string as nvarchar data type, rather than varchar You may have seen Transact-SQL ...

  5. AI五子棋第四周——接近尾声

    欢乐时光过得特别快~ 真是快乐的一周,就是项目进展几乎纹丝不动. 燃尽图?? (添加了背景音乐,找到了一个很好的音乐素材网站!) (添加了俩图标:重开,和音乐.) (调了一下前后端通讯,基本能通话了, ...

  6. ubuntu安装tensorboardx

    先安装tensorboardX,因为tensorboard依赖于tensorflow中的一些东西,所以安装完tensorboard之后,需要再安装tensorflow pip install tens ...

  7. Multiple plot function

    From: http://www.cookbook-r.com/Graphs/Multiple_graphs_on_one_page_(ggplot2)/ library(ggplot2) multi ...

  8. java中的hashmap理解

    转自大神,以便以后翻阅http://www.cnblogs.com/whgk/p/6091316.html

  9. vue项目localhost可以访问 ip不能访问

    解决方法: 如图所示:

  10. vue.js组件传值

    组件传值有一下几种方式:父子传值(父传子,子传父),非父子传值,vuex,插槽作用域 1.父子传值: (1)父传子: 传值方:当子元素在父元素中当标签使用时,通过给子标签绑定一个自定义属性,属性值为需 ...