Elisp 中变量赋值函数 set 与 setq 辨析
在 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 辨析的更多相关文章
- JavaScript中变量和函数声明的提升
现象: 1.在JavaScript中变量和函数的声明会提升到最顶部执行. 2.函数的提升高于变量的提升. 3.函数内部如果用var声明了相同名称的外部变量,函数将不再向上寻找. 4.匿名函数不会提升. ...
- C++:类中的赋值函数
先来看一个例子: #include<iostream> #include<string> using namespace std; class Student{ public: ...
- 关于javascript中变量及函数的提升
javascript中变量以及函数的提升,在我们平时的项目中其实还是挺常用的,尤其是大型项目中,不知不觉就会顺手添加一些变量,而有时候自己的不小心就会酿成一些不必要错误,趁有时间整理一下自己对于js中 ...
- C语言中变量和函数的作用域和链接属性
C语言中变量和函数的作用域和链接属性 作用域 代码块作用域: 代码块指的是使用"{}"包围起来的部分. 在代码块中定义的变量,代码块之外是不能访问的. 代码块嵌套之后的变量作用域, ...
- Keil C51中变量和函数的绝对地址定位问题
1.变量绝对地址定位 1) 在定义变量时使用 _at_ 关键字加上地址就可. unsigned char idata myvar _at_ 0x40; 把变量 myvar 定义在 idata 的 0 ...
- mysql中变量赋值
http://www.cnblogs.com/qixuejia/archive/2010/12/21/1913203.html sql server中变量要先申明后赋值: 局部变量用一个@标识,全局变 ...
- Oracle 过程中变量赋值
create or replace function get_sal1(id employees.employee_id%type) return number is sal employees.sa ...
- 为什么linux驱动中变量或者函数都用static修饰?(知乎问题)
static定义的全局变量 或函数也只能作用于当前的文件. 世界硬件厂商太多,定义static为了防止变量或 函数 重名,定义成static, 就算不同硬件驱动中的 变更 或函数重名了也没关系 .
- c++中的赋值函数
在c++中,对于任意一个类Class A,如果程序员不显示的声明和定义上述函数,C++编译器将会自动的为A产生4个public inline 的默认函数,这4个函数最常见的形式为: A() //默认构 ...
随机推荐
- Linux系统上安装、卸载JAVA、TOMCAT的方法
一. 安装JAVA 安装方法1:手工上传 创建安装目录上传JAVA安装包 Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE /* Styl ...
- SR-IOV 简介
SR-IOV 技术是一种基于硬件的虚拟化解决方案,可提高性能和可伸缩性.SR-IOV 标准允许在虚拟机之间高效共享 PCIe(Peripheral Component Interconnect Exp ...
- 多态 与 鸭子类型 duck duck duck
# --> ''' 多态 与 鸭子类型 --> 什么是多态 对象的多种状态,父类对象的多种 (子类对象) 状态 --> 什么是鸭子类型: 长的像就是 1.规定有什么属性及什么方法的对 ...
- 蓝牙协议分析(12)_LQ和RSSI的原理及应用场景
在蓝牙协议栈的物理层,有这样两个比较有用的参数:LQI和RSSI.它们都是通过接收端,判断当前无线环境的质量(链路质量),以指导后续的动作.但这两个数值的计算原理和使用场景又有很大的差别. LQI ( ...
- jupyter 中markdown使用
jupyter使用还是很方便的,尤其是喜欢MarkDown功能,在安装插件后可以非常清晰的看到整个文档的基本结构,下面介绍下MarkDownd的使用: 1.MarkDown必须是在命令模式是下使用的, ...
- hadoop day 7
1.storm概述 应用于实时的流式计算,结合消息队列和数据库进行使用. Spouts:拓扑的消息源 Bolts:拓扑的处理逻辑单元,每个bolt可以在集群当中多实例的并发执行 tuple:消息元组, ...
- ES5数组、对象常用方法总结
数组方法: Array.isArray(items);判断判断一个变量是否包含数组数据: forEach(function(value, index, fullArray){ }); every(fu ...
- linux下安装python3(转)
一.Linux下安装Python 二.Linux下Python安装完成后如何使用pip命令 三.Linux下Python安装完成后如何使用yum命令 四.Linux下安装Anaconda 五.Linu ...
- 使用sed在匹配行之后增加一行数据
需求:在原来大量的shell文件中,给出了错误信息打印,现在要求打印错误后直接退出脚本. if [ $? -eq 0 ];then echo_green "done!" else ...
- python excel 读写
python操作Excel读写--使用xlrd xlwt python中使用xlrd.xlwt操作excel表格详解