---------------------------------------
前言: 什么是编程? 比批命令有什么优势?
编程有流程控制
编程有变量
编程有函数
----------------------------------------
lisp 程序特点:
----------------------------------------
甲. lisp 的语素由整数,浮点数,字符(前面要加前导?),字符串(用"括住)布尔值(t,nil)
符号(有符合名,符号值),内嵌列表组成。
符号可以是变量或者函数名字,对名字的引用要加上前导单引号
乙. 语句块 用括号表示
还有一种表示(progn statement-block) 显式声明
丙. 函数调用,用括号表示.
其中第一项为函数名称,其它项为参数,用空格隔开
函数调用可以嵌套,次序为先执行内部函数得到其返回值
lisp 用小括号搞定一切,没有中括号和大括号.
1. 赋值语句(示例) setq 函数, let 函数
(setq auto-save-interval 800)
setq 是一个函数,auto-save-interval 是一个变量, 800 为变量赋值,放到一对括号中
(let ((count1 1) (count2 2)) (message "count1 is %d, count2 is %d" count1 count2))
let 是一个函数
count1,count2 是局部变量, 出了该语句块就无效了
语句块有一条打印语句。
2. if 语句
(if condition
true-block
false-block)
(cond (cond1 state1) (cond2 state2)...)
类似与if-else if-else 或 switch-case 结构
3. 循环语句
(while condition
statement-block)
while 是个函数, condition 是个表达式,statement 是个语句块
condition 条件表达式, 或者说是函数返回值,是个bool值, 例如:
(< a b)
< 是个函数, a,b 是变量
elisp 是列表处理语言,是一个面向函数的语言, 它的语句块和C语言的{}不同,可以理解为配对的()为函数调用,
至不匹配的)为块语句结尾,这个)与其匹配的(构成一个更高一级的函数调用。所有在排版上右括号
总是不与(在同一列, 不过好像右括号习惯上不单独在一行。所以常见到一堆右括号连在一起,需分别找
它们对应的左括号构成函数调用。 还有一个习惯是用连字符而不是下划线来构成符号表示变量或函数名称。
好了,理解了这一点,现在看一个无聊的阶乘程序。
(defun factorial(number)
"return factorial of number"
(let ((total 1))
(while (> number 0)
(setq total (* total number))
(setq number (- number 1)))
total))
(factorial 4)
此例说明了lisp语言是一个弱类型语言, 参数类型是无需声明的,但内部肯定是有区别的。
如果你能用edebug来调试它,编程似乎也都殊途同归了。
a. 首先用edebug 加载函数,方法
将光标定位与函数内,执行
M-x edebug defun
b. 调用该函数,
一个=> 会停留在函数开始处, edebug 菜单会出现, 你可以用SPC 单步执行代码
在minibuffer 中有变量显示。
主模式框架代码, 定义一个函数,如下简单的三行代码, 用M-x hjj-mode 即可打开下面的窗口.
;;让emacs 命令接受前缀参数,
;; 需要使用 (interactive "p") 命令接受前缀参数
;; 测试发现, 直接敲Alt-x test, 传递的参数 num 为1
;; C-u Alt-x test, 传递的参数 num 为 4
;; C-u <num> Alt-x test, 传递的参数为你输入的num
(defun test (&optional num)
(interactive "p")
(if (/= num 0)
(message "num is %d" num)
(message "num is 0")
))