Programing in Elisp
Table of Contents
lisp note.
<!– more –>
语法知识
List
原子 可以是数字、单字符符号、多字符符号、字符串 List 由括号括起来的原子,或括号括起来的 list,或括号括起来的原子和 list,或者一个空括号。元素之间通过空格分隔。 符号表达式 原子和列表的书面或计算机表示被称作符号表达式。 Example: '(name age class grade) (+ 1 2) '(name "wolfand11") Tips: (1) 空列表既是一个列表,也是一个原子; nil 等价于() (2) 元素之间的空格可以任意多,解析器在处理的时候会去掉所有多余的空格只留下一个。 (3) 所谓 s 表达式(s-expression)就是符号表达式(symbolic expression)
Base Special List
quote
如果不想元素被求值可以写为
'(a b …) ;; This is equivalent to (quote (list a b …))
Backquote and Comma and @
backquote 和 quote 一样,其允许你引用一个 list, 但是 backquote 允许你使用 Comma 来选择性地对列表中元素进行求解
`(a list of (+ 2 3) elements) ;;⇒ (a list of (+ 2 3) elements) '(a list of (+ 2 3) elements) ;;⇒ (a list of (+ 2 3) elements) ;; Use , evaluate (+ 2 3) `(a list of ,(+ 2 3) elements) ;;⇒ (a list of 5 elements) (setq some-list '(2 3)) ;;⇒ (2 3) (cons 1 (append some-list '(4) some-list)) ;;⇒ (1 2 3 4 2 3) `(1 ,@some-list 4 ,@some-list) ;;⇒ (1 2 3 4 2 3) (setq list '(hack foo bar)) ;;⇒ (hack foo bar) (cons 'use (cons 'the (cons 'words (append (cdr list) '(as elements))))) ;;⇒ (use the words foo bar as elements) `(use the words ,@(cdr list) as elements) ;;⇒ (use the words foo bar as elements)
defun
定义函数 (defun func-name argument-list body)
let
定义局部变量,该变量只在 let 列表内可用。 (let ((local-var value) …) body)
car cdr cons
cons 是 construct 的缩写。构造一个 list
car 是 Contents of the Address part of the Register 的缩写。获得 list 首部的元素
cdr 是 Contents of the Decrement part of the Register 的缩写。获得 list 除去首部的部分
(car '(rose violet daisy buttercup)) ;; => rose (cdr '(rose violet daisy buttercup)) ;; => (violet daisy buttercup) (car '((lion tiger cheetah) (gazelle antelope zebra) (whale dolphin seal))) ;; => (lion tiger cheetah) (cdr '((lion tiger cheetah) (gazelle antelope zebra) (whale dolphin seal))) ;; => ((gazelle antelope zebra) (whale dolphin seal))
cons 是 car 操作和 cdr 操作的反操作
(cons 'pine '(fir oak maple)) ;; => (pine fir oak maple)
set setq setf
定义全局变量。(set 'var value) (setq var value) (setf var value)
(set ls '(1 2 3 4)) => Error - ls has no value (set 'ls '(1 2 3 4)) => OK (setq ls '(1 2 3 4)) => OK - make ls to (quote ls) and then have the usual set (setf ls '(1 2 3 4)) => OK - same as setq so far BUT (setf (car ls) 10) => Makes ls '(10 2 3 4) - not duplicated by setq/set
if
分支语句。 (if do-someing do-other-thing)
Tips: elisp 中除去()和 nil 外都为 true (if () "() is true" "() is false") ;; () is false (if 0 "0 is true" "0 is false") ;; 0 is true (if 'false "'false is true" "'false is false") == (if (quote false) "'false is true" "'false is false") ;; 'false is true
Block of Expressions
progn 的作用和 c 语言中的 {} 作用类似,将一组表达式组成一个代码块。
(progn (message "a") (message "b")) ;; is equivalent to (message "a") (message "b") (if something (progn ; true ;; code here ) (progn ; else ;; code here )) ;; progn 返回最后一个表达 (progn 3 4 ) ; 4
interactive
使函数变为交互函数。 (interactive arg)
;;Example: (defun AddTwo (var1) "add two with argument" (interactive "p") (let ((two_value 2) result (info "result is %d")) (setq result (+ var1 two_value)) (message info (+ var1 two_value))))
save-excursion
保存恢复 point 和 mark 变量
eval-last-sexp
对前面的表达式求值
Buffer-related List
Evaluation 表达式求值
Number 求值 直接返回数值 符号求值 (1) 变量求值 返回变量符号指向的值 (2) 函数求值 执行函数符号指向的指令,返回最后一个指令的返回值 Lisp 中的任何一个 List 都是一个可以运行的程序。运行一个列表,被称作对这个列表求值。 运行一个列表会有三类情况: (1)只返回列表本身 (2)提示错误信息 (3)将列表第一个符号当作命令,然后执行这个命令 Tips: 单引号('),表示一个引用。单引号出现在一个列表前,告诉 Lisp 不要对这个列表 做任何操作,仅仅保持其原样。如果一个列表前没有引号,这个列表的第一个符 号就是计算机将要执行的一条命令(Lisp 中,这些命令称为函数)。 '(setq count 20) ;;C-x C-e 得到 list (setq count 20) (setq count 20) ;;C-x C-e 得到 20 '('name) ;;C-x C-3 得到((quote name))
字符串操作
concat
(message (concat "a" "b" "c"))
Emacs 相关功能
自定义启动参数
;; define handler (defun wolf-args-fn (switch) (let (arg0 (pop command-line-args-left)) (progn (message (concat "wolf-args " arg0))))) ;; register handler (add-to-list 'command-switch-alist '("-wolf-args" . wolf-args-fn))
Emacs 相关命令
1、lisp 代码缩排: M-C-\ 一个区域内正确缩排命令 TAB 光标所在行缩排 2、运行一个列表 C-x C-e 3、查看 variable function 信息 C-h v