*/-->
elisp 编程基础
Table of Contents
- 1. 指令
- 2. 打印
- 3. 数学运算
- 3.1. 加减乘除
- 3.2. 类型判断
- 3.3. 字符串与数字转换
- 4. 逻辑判断
- 4.1. 真假判断
- 4.2. 逻辑运算
- 4.2.1. and 和 or
- 4.2.2. 数字判断
- 4.2.3. 字符串判断
- 4.2.4. equal
- 5. 变量
- 5.1. 全局变量
- 5.2. 局部变量
- 6. 代码块
- 7. 遍历
- 8. 函数与命令
- 9. 补充: 奇怪的单引号 → `
- 10. ref
1 指令
cmds | description | shortcut |
---|---|---|
eval-last-sexp | 执行cursor左边的指令 | C-x C-e |
eval-region | 执行选定的代码 | |
describe-function | 描述函数功能 | C-h f |
view-echo-area-messages | 查看buffer输出信息 | C-h e |
emacs指令繁多,但是借助smex的情况下,只要记住大概的英文即可运行。
注意 在emacs中运行elisp不需要在elisp-mode下。通过上述指令可以在
主模式为org-mode下运行elisp代码。
2 打印
(message "hi") ; printing variable values (message "Her age is: %d" 16) ; %d is for number (message "Her name is: %s" "Vicky") ; %s is for string (message "My list is: %S" (list 8 2 3)) ; %S is for any lisp expression
3 数学运算
3.1 加减乘除
(+ 4 5 1) ; ? 10 (- 9 2) ; ? 7 (- 9 2 3) ; ? 4 (* 2 3) ; ? 6 (* 2 3 2) ; ? 12 (/ 7 2) ; ? 3 (integer part of quotient) (/ 7 2.0) ; ? 3.5 (% 7 4) ; ? 3 (mod, remainder) (expt 2 3) ; ? 8 (power; exponential)
这里的特殊情况和java相同。整数后+ .0算浮点数。
3.2 类型判断
;; 3. is a integer, 3.0 is a float (integerp 3.) ; returns t (floatp 3.) ; returns nil (floatp 3.0) ; returns t
p→ predicate 这里和ios的数据很类似
3.3 字符串与数字转换
(string-to-number "3") (number-to-string 3)
4 逻辑判断
4.1 真假判断
elisp里面nil和空list为假,其余都为真
(if nil "yes" "no") ; ? "no" (if () "yes" "no") ; ? "no" (if ‘() "yes" "no") ; ? "no" (if (list) "yes" "no") ; ? "no", because (list) eval to a empty list, same as () (if 0 "yes" "no") ; ? "yes" (if [] "yes" "no") ; ? "yes". The [] is vector of 0 elements
4.2 逻辑运算
4.2.1 and 和 or
(and t nil) ; ? nil (or t nil) ; ? t
4.2.2 数字判断
(< 3 4) ; less than (> 3 4) ; greater than (<= 3 4) ; less or equal to (>= 3 4) ; greater or equal to (= 3 3) ; ? t (= 3 3.0) ; ? t (/= 3 4) ; not equal. ? t
4.2.3 字符串判断
(string-equal "this" "this") ; ? t. Case matters.
4.2.4 equal
equal需要类型和值一样,这点和java类似。not→ !
;; testing if two values have the same datatype and value. (equal "abc" "abc") ; ? t (equal 3 3) ; ? t (equal 3.0 3.0) ; ? t (equal 3 3.0) ; ? nil. Because datatype doesn‘t match. ;; testing equality of lists (equal ‘(3 4 5) ‘(3 4 5)) ; ? t (equal ‘(3 4 5) ‘(3 4 "5")) ; ? nil ;; testing equality of symbols (equal ‘abc ‘abc) ; ? t (not (= 3 4)) ; ? t
5 变量
setq→ global var , let→ local var
5.1 全局变量
(setq x 1) ; assign 1 to x (setq a 3 b 2 c 7) ; assign 3 to a, 2 to b, 7 to c
5.2 局部变量
(let (a b) (setq a 3) (setq b 4) (+ a b) ) ; returns 7
或者不用setq
(let ((a 3) (b 4)) (+ a b) ) ; returns 7
注意,在let里面使用setq,则变量为局部变量。
6 代码块
使用progn来写代码块。
(progn (message "a") (message "b")) ;; is equivalent to (message "a") (message "b")
可以用于真假判断。
(if something (progn ; true … ) (progn ; else … ) )
progn会返回最后一条语句。
(progn 3 4 ) ; ? 4
7 遍历
(setq x 0) (while (< x 4) (print (format "yay %d" x)) (setq x (1+ x)))
(let ((x 32)) (while (< x 127) (ucs-insert x) (setq x (+ x 1))))
退出遍历或函数使用catch throw
(defun test-exit-f () "example. using catch/throw to exit function" (interactive) (catch ‘aaa (if (y-or-n-p "exit?") (progn (message "existing") (throw ‘aaa 3) ; if yes, exit right away, return 3 to catch ) (progn ; else, go on (message "went on") 4 ; return 4 ))))
8 函数与命令
定义函数格式: (defun function_name (param1 param2 …) "doc_string" body)
示例:
(defun myFunction () "testing" (message "Yay!") )
定义命令和定义函数类似,不过要加上 interactive
示例:
(defun yay () "Insert “Yay!” at cursor position." (interactive) (insert "Yay!"))
命令的参数可为两种,一种是常规参数,一种是emacs特殊参数。
常规参数示例:
(defun myFunction (myArg) "Prints the argument" (interactive "p") (message "Your argument is: %d" myArg) )
特殊参数示例:
(defun myFunction (myStart myEnd) "Prints region start and end positions" (interactive "r") (message "Region begin at: %d, end at: %d" myStart myEnd) )
带 interactive 的函数起始就是 execute-extended-command → alt+x
interactive 可带的参数:
格式 | 含义 |
(interactive) | 无参数命令 |
(interactive "nWhatisYourAge?") | n即参数 |
(interactive "s") | s为string |
(interactive "r" | r为region,接受首尾作为参数 |
9 补充: 奇怪的单引号 → `
在配置文件中,我们经常会看到符号 `。
由于在 lisp里, 形式 (op v1 v2)的op为操作数,所以我们如果不想运行,而只是想表达
一个list时,我们就加上符号`。
示例如下:
; assign a list to a var (setq myList ‘(a b c)) ; prints a list (message "%S" myList)
10 ref
李杀 |
Author: lexnewgate
Created: 2016-04-10 周日 11:46
Emacs 24.5.1 (Org mode 8.2.10)
时间: 2024-11-05 16:00:43