Byron's log
‹‹ back
elisp 快节奏笔记(1)
Create Time : 2011-06-08 15:11:08
Modify Time : 2011-06-20 15:50:26

资源

  1. 官方elisp手册

变量(符号)

在lisp的世界中,人们更喜欢把变量叫作符号,所以符号和变量其实说的就是一个东西. 赋值
(set 'foo "good")
(setq foo "good")
  • set/setq都是赋值操作,唯一不同的是setq会自动将参数foo转化为符号
  • 关于符号,在lisp中变量名通常都是符号,在上列中foo就是一个字符串"good"的引用。set方法给foo前面加了(')单引号就是申明为符号。
为了必免全局变量与局部变量命名冲突,elisp有一个函数叫let通常在定义函数的函数体内被申明和使用。
(defun myfunc()
	   (let (
				(foo 5)
				(bar)
				)
	   (message "hey hey!")))
  • 第3行申明了一个局部变量foo并对它进了初始化值为5
  • 第4行申明了一个局部变量bar并没有初始化
所以,就算let只申明一个变量也要是列表形式
(let ((foo))
	 (BODY-FORMS))
有时候,也可以写成这这样,但一定不会被误导了。
(defun myfunc()
	   (let ((foo 5)
		bar)
	   (message "hey hey!")))
  • 不要对第3行感到奇怪,虽然没有用括号但也是申明了一个未初始化的bar符号

函数定义

(defun FUNTION_NAME (REQUIRED-VARS... [&optional OPTIONAL-VARS...] [&rest REST-VAR])
	   "函数说明文档..."
	   (interactive)
	   (BODY-FORMS))
官方文档的示例:
(defun foo () 5)
⇒ foo

(foo)
⇒ 5

(defun bar (a &optional b &rest c)
	   	   (list a b c))
⇒ bar

(bar 1 2 3 4 5)
⇒ (1 2 (3 4 5))

(bar 1)
⇒ (1 nil nil)

(bar)
error Wrong number of arguments.

(defun capitalize-backwards ()
  "Upcase the last letter of a word."
  (interactive)
  (backward-word 1)
  (forward-word 1)
  (backward-char 1)
  (capitalize-word 1))
⇒ capitalize-backwards
  1. FUNCTION_NAME 是定义的函数名
  2. REQUIRED-VARS 是函数必须投递的参数申明(复数列表)
  3. &optional 关键字之后的参数是可选参数申明
  4. &rest 关键字后面只能申明一个参数,而这个参数将以列表形式返回所有剩余参数
  5. 第2行是一个可选字符串,它是elisp的函数说明文档,这点和python很像。当然,这个说明文档有很多的技巧,比如生成链接之类的。
  6. interactive 是一个交互命令申明,一旦申明,该函数可用M-x在操作中被调用。
  7. BODY-FROMS 这是一个函数体本身的语句块了也就是括号的恶梦的开始

lambda

这就是匿名函数,在ruby/python/lisp中都有看到它的影子。 定义:
(lambda (arguments-list)
  "documentation string"
  body)
因为lambda叫匿名函数,所以它当然没有名字,那么有一种情况是直接被调用:
(funcall (lambda (name)
           (message "Hello, %s!" name)) "Emacser")
如果只是为了直接调用而出现lambda的模式,就有点浪费了,另一种比较常用的情况是把它赋值给一个符号(变量):
(setq foo (lambda (name)
            (message "Hello, %s!" name)))
(funcall foo "Emacser")