在 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. 关于SpringMVC的配置流程以及一些细节

    首先说道SpringMvc是什么,SpringMVC是Spring框架里面的一个子框架,它对网站前后端的代码分层做了一套实现,这套实现给我们带来了几个好处,首先第一,SpringMVC实现了一个请求对 ...

  2. 关于springboot项目中自动注入,但是用的时候值为空的BUG

    最近想做一些web项目来填充下业余时间,首先想到了使用springboot框架,毕竟方便 快捷 首先:去这里 http://start.spring.io/ 直接构建了一个springboot初始化的 ...

  3. L2-014 列车调度 (25 分)

    L2-014 列车调度 (25 分)   火车站的列车调度铁轨的结构如下图所示. 两端分别是一条入口(Entrance)轨道和一条出口(Exit)轨道,它们之间有N条平行的轨道.每趟列车从入口可以选择 ...

  4. 【sem竞价】点击量较多、咨询少怎么解决?

    点击量较多咨询少可能这种情况对于竞价技术专员来说比较常见的现象之一,在搜客大伟看来主要取决于两方面因素:一方面是外界环境因素影响:另一方面也就是我们下面主要介绍的sem竞价推广账户内部因素. 如下图, ...

  5. storm入门基础实例(无可靠性保证实例)

    本实例为入门篇无可靠性保证实例,关于storm的介绍,以及一些术语名词等,可以参考Storm介绍(一).Storm介绍(二). 本案例是基于storm0.9.3版本 1.案例结构 案例:Word Co ...

  6. 对lua中__newindex的理解

    阅读了文章后用流程图来总结一下 __newindex的规则: a.如果__newindex是一个函数,则在给table不存在的字段赋值时,会调用这个函数.b.如果__newindex是一个table, ...

  7. Python3.7 练习题(-) 如何使用Python生成200个优惠卷(激活码)

    # 如何使用Python生成200个优惠卷(激活码) import random import string # string.ascii_letters 26个大小写 # -9数字 # 获得激活码中 ...

  8. 在c#中 RemoveAt、 Remove、delete用法区别

    有三种方法可以删除 DataTable 中的 DataRow: Delete 方法和 Remove 方法和 RemoveAt 方法 其区别是: Delete 方法实际上不是从 DataTable 中删 ...

  9. Vector的用法

    vector容器是笔试时最经常用到的容器,它实际是一个类模板,它所具有一些成员函数我们必须熟练使用,这样才会加快编程速度. 首先加头文件并定义: #include<vector> vect ...

  10. SVN使用方法

    用了一年多SVN了,突然想起来对SVN操作做一个总结,以免有些操作不常用而忘记,也希望可以帮到其他人. 准备工作: 在使用SVN时首先就是要在服务器安装SVN管理端(VisualSVN),在电脑上安装 ...