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

1 (set ‘flowers ‘roots)
2 (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 赋值了一个列表:

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

总结:

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

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

时间: 2025-01-21 20:41:52

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

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

现象: 1.在JavaScript中变量和函数的声明会提升到最顶部执行. 2.函数的提升高于变量的提升. 3.函数内部如果用var声明了相同名称的外部变量,函数将不再向上寻找. 4.匿名函数不会提升. 5.不同<script>块中的函数互不影响. 例子: 函数声明提升高于变量声明 //同时声明变量a和函数a var a; function a() {} alert(typeof a); //显示的是"function",初步证明function的优先级高于var. //先声

Python中变量赋值的8种形式、需要注意哪些细节?

本文解释python中变量赋值的形式,并解释一些细节. python中变量赋值的几种形式 1 x = "long" # (1).基本形式 2 x, y = "long", "shuai" # (2).元组对应赋值 3 [x, y] = ["long", "shuai"] # (3).列表对应赋值 4 a, b, c, d = "long" # (4).序列赋值 5 a, *b = 'lo

面向对象(子父类中变量、函数、构造函数的特点)

/** * Created by 刘朋程 博客园 on 2014-07-15. */ class fu {     int num = 4 ;               //定义父类的变量num = 4     fu()                        //定义父类的构造函数     {         System.out.println("fu run");     }     void speak()                //定义父类的方法     {

Makefile中变量赋值的方式

Makefile中的"="":="."?="和"+="区别是:"="是直接给变量赋值.":="是将":="右边中包含的变量直接展开给左边的变量赋值."?="是在该变量没有被赋值 的情况下为其赋值."+="是给该变量追加值.例:a = 1b = 2c := $(a) 3d = 4d ?= 5b += 6结果:a=1c=1 3d=4

Oracle 过程中变量赋值

? 1 2 3 4 5 6 7 8 9 10 create or replace function get_sal1(id employees.employee_id%type)   return number is   sal employees.salary%type; begin   sal := 0;   select salary into sal from employees where employee_id = id;   return sal; end; ? 1 2 3 4 5

mysql中变量赋值

http://www.cnblogs.com/qixuejia/archive/2010/12/21/1913203.html sql server中变量要先申明后赋值: 局部变量用一个@标识,全局变量用两个@(常用的全局变量一般都是已经定义好的): 申明局部变量语法:declare @变量名 数据类型:例如:declare @num int: 赋值:有两种方法式(@num为变量名,value为值) set @num=value;   或   select @num=value; 如果想获取查询

网页中变量和函数的应用-无所不能的变量载体

—————————————————— <script type="text/javascript">            //定义变量f,并为它赋值一个函数,函数名则就是f            var f = function(){                //函数的功能就是进行一次alert操作                alert('我是一个函数哟.');            };            //定义函数callme,传入的参数就是一个函数 

java中变量赋值的理解

1.当赋值的值超出声明变量的范围时候,会报错! byte a =200 //会报错,因超出范围. byte a =(byte)200;//进行一个强制转换,就不会报错,不过会超出范围,超出部分会从头开始加, 由于byte的范围为-128~127,所以是-128+73为所得结果.2.声明一个整数类型时候,默认都是int类型(4个8位):如果具体的数值比声明变量的取值范围小,则不报错. 例:short a =222;3.long l = 88888888888l 很明显,这一长串数字是好超过int的

HTML父窗口与IFRAME中变量互访

1.HTML父窗口访问IFRAME中变量或函数 在父窗口脚本中写: //调用变量赋值 IframeObj.contentWindow.someVar = "test is ok"; //调用函数 IframeObj.contentWindow.someFunction(); 2.HTML中IFRAME访问父窗口中变量或函数 假设在父窗口脚本中具有方法: function showMsg(str){ alert('Read from iframe:'+ str); } 则在IFRAME可