elisp 快节奏笔记(1)
资源
变量(符号)
在lisp的世界中,人们更喜欢把变量叫作符号,所以符号和变量其实说的就是一个东西. 赋值(set 'foo "good") (setq foo "good")
- set/setq都是赋值操作,唯一不同的是setq会自动将参数foo转化为符号
- 关于符号,在lisp中变量名通常都是符号,在上列中foo就是一个字符串"good"的引用。set方法给foo前面加了(')单引号就是申明为符号。
(defun myfunc() (let ( (foo 5) (bar) ) (message "hey hey!")))
- 第3行申明了一个局部变量foo并对它进了初始化值为5
- 第4行申明了一个局部变量bar并没有初始化
(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
- FUNCTION_NAME 是定义的函数名
- REQUIRED-VARS 是函数必须投递的参数申明(复数列表)
- &optional 关键字之后的参数是可选参数申明
- &rest 关键字后面只能申明一个参数,而这个参数将以列表形式返回所有剩余参数
- 第2行是一个可选字符串,它是elisp的函数说明文档,这点和python很像。当然,这个说明文档有很多的技巧,比如生成链接之类的。
- interactive 是一个交互命令申明,一旦申明,该函数可用M-x在操作中被调用。
- 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")