UP | HOME

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

参考资料