Archive for lisp

1.变量 let引入新的局部变量。 [33]> (let ((x 1) (y 2)) (+ x y)) 3 defparameter创造一个全域变量。 [37]> (defparameter *ga* 123) *GA* [38]> *ga* 123 用 defconstant 来定义一个全域的常量 [39]> (defconstant limit 8 ) LIMIT [40]> limit 8 检查某些符号,是否是一个全域变量或常数,用 boundp [41]> (boundp 'limit) T [42]> (boundp '*ga*) T 2.赋值 setf给全域或局域变量做赋值,如果 setf 的第一个参数是一个符号(symbol),且这个符号不是某个局部变量的名字,那么 setf 将设置这个符号为全局变量。还是使用 defparameter 显式地创建全局变量比较好。 [44]> *ga* 1 [45]> (let ((n 10)) (setf n 2) n) 2 [46]> (setf x (list 'a 'b 'c)) (A B C) 传入 setf 的第一个参数,还可以是一个表达式或一个变量名。在这种情况下,第二个参数的值被插入至第一个参数所引用 (refer)的地方。 [47]> (setf (car x) 'n) N [48]> x (N B C) [53]> (setf a 1 b 2 c 3) 3 [54]> a 1 [55]> b 2 [56]> c 3 相当于

(setf a b)
(setf c d)
(setf e f)

3. 类型
在 Common Lisp 里,数值才有类型,而不是变量。typep判断类型。
[57]> (typep 25 'integer)
T

类型 (Types)

Continue

1.quote Lisp 提供 quote 作为一种保护表达式被求值的方式。Common Lisp 定义 ' 作为 quote 的缩写。 [62]> (quote (+ 3 5)) (+ 3 5) [64]> '(+ 3 5) (+ 3 5) 这意味着 Lisp 程序可以写出 Lisp 代码。 Lisp 程序员能(并且经常)写出能为自己写程序的程序。 2. if [20]> (if t 'a 'b) A [21]> (if nil 'b 'a) A 第一个参数是判断,第二个是为true时求值,第三个是false求值。 3. and和or 逻辑操作符 andor 与条件式 (conditionals) 类似。两者都接受任意数目的参数,但只对能够决定返回值的那几个参数来作求值。如果所有的参数都为 (即不为 nil ),那么 and 会返回最后一个参数的值,如果其中一个参数为 ,那么之后的所有参数都不会被求值。 or 也是如此,只要碰到一个是 的参数,就停止对之后的所有的参数求值。 [23]> (and t t (+ 1 3) t) T [24]> (and t t (+ 1 3) nil) NIL [25]> (and t t (+ 1 3) nil t) NIL [26]> (or nil nil (+ 4 5)) 9 [28]> (or nil nil (+ 4 5) nil) 9 [29]> (or nil nil (+ 4 5) (- 8 7) nil) 9 其实也可以这么理解,对每一个参数求值,当and遇到nil,或者or遇到非nil,终止求值,返回nil或者非nil。没遇到就返回最后一个参数的值。  

Continue

符号,字母开头,包括字母数字和连接符。 5 17 -34 +6 2/4 1/3 3.1415 1.722e-15 #c(1.722e-15 0.75) 有趣撒~ lisp支持分数形式,下面几个测试: [1]> (+ 3 2/3) 11/3 [2]> (+ 3.0 2/3) 3.6666667 [3]> (* 2.0 1/3) 0.6666667 [4]> (* 3.0 1/3) 1.0 [5]> (* 3.00 1/3) 1.0 [6]> (/ 3.0 1/3) 9.0 [7]> (/ 2.0 1/3) 6.0 lisp支持复数形式#c(r,i),r为实部,i为虚部。 lisp字符串包含在双引号中,#\a  #\3表示字符。反斜杠为转义字符。   命名约定:在全局变量开头和结尾带有“*”,常量都已“+”开头结尾。   构造一个列表:(list 4  5 6) [4]> (cons 'a '(b c)) (A B C) 用函数 cons 来构造列表。如果传入的第二个参数是一个列表,则返回一个由第二个参数所组成的新列表,其中新列表的第一个元素是传入的第一个参数。 [6]> (cons 'a (cons 'b nil)) (A B) 来取出列表元素的基本函数是 carcdr 。列表的 car 是第一个元素,而列表的 cdr 是第一个元素之后的所有元素 [13]> (setq l '(a b c)) (A B C) [14]> l (A B C) [15]> (car l) A [16]> (cdr l) (B C) 这个像erlang里列表操作,或者应该说erlang学的lisp。   nil唯一一个既是原子又是列表的对象。

Continue

又准备开始学lisp,前些时候就想学,但是就怕贪多嚼不烂。现在又想:喜欢就学,先学习语法,不用深。说不定以后就用到。 lisp方言很多,没什么太多了解,先学一个撒~ 下载地址:www.clisp.org,一路next安装windows版完成。 一个lisp的IDE:http://www.daansystems.com/lispide/ [1]> 10 10 [2]> (* 2 3) 6 感觉想极了编译原理里面学的,三元式还是啥的来。 [3]> (format t "hello world") hello world NIL t 是标准输出,NIL是对format求值的结果。列表的第一个元素是函数名。nil代表false,t代表true。 写成函数形式: [4]> (defun hello-world () (format t "hello world")) HELLO-WORLD [5]> (hello-world) hello world NIL 求值后,得到一个名为HELLO-WORLD的函数,函数没有参数。

Continue