随笔分类 -  <ansi Common Lisp>

摘要:分别将参数加1与减1后返回。有一点误导,因为(1- x)返回x-1而不是1-x。 CL-USER> (setf x 5) 5 CL-USER> x 5 CL-USER> (1+ x) 6 CL-USER> x 5 CL-USER> (1- x) 4 CL-USER> x 5 阅读全文
posted @ 2013-01-05 09:50 flowjacky 阅读(325) 评论(0) 推荐(0)
摘要:宏incf及decf分别递增和递减数字。这样形式的表达式(incf x n)类似于(setf x (+ x n))的效果,而(decf x n)类似于(setf x (- x n))的效果。这两个形式里,第二个参数皆是选择性给入的,缺省值为1. CL-USER> (setf x 5) 5 CL-USER> (incf x 2) 7 CL-USER> x... 阅读全文
posted @ 2013-01-05 09:41 flowjacky 阅读(491) 评论(0) 推荐(0)
摘要:CL-USER> (defun palindrome? (x) (let ((mid (/ (length x) 2))) (equal (subseq x 0 (floor mid)) (reverse (subseq x (ceiling mid)))))) PALINDROME? C... 阅读全文
posted @ 2013-01-04 17:59 flowjacky 阅读(444) 评论(0) 推荐(0)
摘要:给defparameter传入一个符号和一个值,来创造一个全局变量; defconstant创造一个全局常量。 CL-USER> (defparameter *glob* 99) *GLOB* CL-USER> (defconstant limit (+ *glob* 1)) LIMIT CL-USER> *glob* 99 CL... 阅读全文
posted @ 2013-01-04 15:31 flowjacky 阅读(257) 评论(0) 推荐(0)
摘要:对equal来说,若它的参数打印出的值相同,返回真。 对eql来说,只有它的参数是相同的对象时才返回真。 CL-USER> (eql (cons 'a nil) (cons 'a nil)) NIL CL-USER> (equal (cons 'a nil) (cons 'a nil)) T CL-USER> (setf x (cons 'a nil... 阅读全文
posted @ 2013-01-04 14:33 flowjacky 阅读(148) 评论(0) 推荐(0)
摘要:char函数取得字符串中指定位置的字符(zero-base) char=比较两字符是否相等 CL-USER> (setf x "hello") "hello" CL-USER> (char x 1) #\e CL-USER> (char= #\e (char x 1)) T CL-USER> (char= #\E (char x ... 阅读全文
posted @ 2013-01-03 15:57 flowjacky 阅读(184) 评论(0) 推荐(0)
摘要:所有条件式的母体是cond,它带有两个新的优点:它允许多重条件式,与每个条件式相关的代码是隐式的progn。它预期在我们需要在一个if中使用另一个if的情况下使用。举例来说,这个伪member函数 CL-USER> (defun our-member (obj lst) (if (atom lst) nil ... 阅读全文
posted @ 2013-01-03 15:52 flowjacky 阅读(370) 评论(0) 推荐(0)
摘要:CL-USER> (defstruct buf vec (start -1) (used -1) (new -1) (end -1)) BUF CL-USER> (defun bref (buf n) (svref (buf-vec buf) (mod n (length (buf-vec ... 阅读全文
posted @ 2013-01-03 15:11 flowjacky 阅读(177) 评论(0) 推荐(0)
摘要:函数(1+ val)的作用是返回val + 1后的结果,但val的值不会变: CL-USER> (setf x 1) 1 CL-USER> (1+ x) 2 CL-USER> (1+ x) 2 CL-USER> x 1 CL-USER> (1+ x) 2 CL-USER> x 1 ... 阅读全文
posted @ 2013-01-03 10:41 flowjacky 阅读(189) 评论(0) 推荐(0)
摘要:when与if唯一的不同点在于when的代码主体可以是多句:when的相反是unless:它接受同样的阐述,但主体仅在测试表达式返回假时,才对主体求值。CL-USER> (when (oddp that) (format t "Hmm,that's odd.") (+ that 1)) Hmm,that's odd. 6 CL-USER> (if (oddp that) (progn (format t "Hmm,that's odd.") (+ that 1))) Hmm,that's odd. ... 阅读全文
posted @ 2013-01-03 10:32 flowjacky 阅读(767) 评论(0) 推荐(0)
摘要:CL-USER> (prog1 (+ 1 2) (+ 2 3) (+ 3 4)) 3 CL-USER> (prog2 (+ 1 2) (+ 2 3) (+ 3 4)) 5 CL-USER> (prog... 阅读全文
posted @ 2013-01-03 09:59 flowjacky 阅读(295) 评论(0) 推荐(0)
摘要:CL-USER> (setf x 10) 10 CL-USER> x 10 CL-USER> (incf x 5) 15 CL-USER> x 15 CL-USER> x 15 CL-USER> (incf x 7) 22 CL-USER> x 22 CL-USER> 所以(incf x 5)等价于(setf x (+ x 5))CL-USER> (setf x (+ x 7)) 29 CL-USER> x 29 CL-USE... 阅读全文
posted @ 2013-01-03 09:30 flowjacky 阅读(437) 评论(0) 推荐(0)
摘要:使用完后需要使用close函数修补myfile上的洞。对标准输入输出流的理解标准输入流指键盘,则上图中的myfile为键盘,读取的内容从键盘input to流标准输出流指电脑屏幕,则上图中的myfile为屏幕,写入的内容output to屏幕 阅读全文
posted @ 2013-01-02 17:54 flowjacky 阅读(147) 评论(0) 推荐(0)
摘要:当defun的第一个参数是(setf f)这样的形式时,是在定义使用(setf (f params) val)时的行为。 例如: CL-USER> (setf lst (list 'a 'b 'c)) (A B C) CL-USER> (defun fun (x) (car x)) FUN CL-USER> (setf (fu... 阅读全文
posted @ 2013-01-02 17:22 flowjacky 阅读(306) 评论(0) 推荐(0)
摘要:CL-USER> (defun pseudo-cat (file) (with-open-file (str file :direction :input) (do ((line (read-line str nil 'eof) (read-line str nil 'eof))) ((eql line... 阅读全文
posted @ 2013-01-02 11:39 flowjacky 阅读(167) 评论(0) 推荐(0)
摘要:CL-USER> (setf path (make-pathname :name "BECKY")) #P"BECKY" CL-USER> (with-open-file (bstr path :direction :output :if-exists :supersede) (format bstr "hello worl... 阅读全文
posted @ 2013-01-02 10:44 flowjacky 阅读(135) 评论(0) 推荐(0)
摘要:递归写法: (defun fib (n) (if (<= n 1) 1 (+ (fib (- n 1)) (fib (- n 2))))) 迭代写法: (defun fib (n) (do ((i n (- i 1)) ... 阅读全文
posted @ 2012-12-29 14:40 flowjacky 阅读(398) 评论(0) 推荐(0)
摘要:传入一个符号和一个值,来创造一个全局变量:CL-USER> (defparameter *glob* 99)*GLOB*CL-USER> (let ((*print-base* 16)) (princ 32))2032像这样的变量在任何地方都可以存取,除了在有定义了相同名字的局部变量的表达式里。为了避免这样情形发生,通常我们在给全局变量命名时,以星号作开始与结束。刚才我们创造的变量可以念作“星-golb-星”(star-golb-start)。 阅读全文
posted @ 2012-12-26 22:14 flowjacky 阅读(307) 评论(0) 推荐(0)
摘要:有词法作用域的变量叫词法变量(lexical variable)。在词法作用域下,一个符号参照到语境中符号名字出现的地方(可以理解为参照到定义)。局部变量缺省有着词法作用域。eg:CL-USER> (let ((x 50)) (defun foo () x)) FOOCL-USER> (foo)50CL-USER> (let ((x 80)) (foo));Compiler warnings :; In an anonymous lambda form: Unused lexical variable X50有动态作用域的变量叫特别变量(special variable)。 阅读全文
posted @ 2012-12-26 21:48 flowjacky 阅读(1411) 评论(0) 推荐(0)
摘要:reduce用来把一个序列压缩成一个值。它接受至少两个参数,一个函数与一个序列。这函数必须是一个接受两个参数的函数。在最简单的情况下,函数起初用前两个元素作为参数来调用,之后接续的元素作为下次调用的第二个参数,上次返回的值作为下次调用的第一个参数。最后调用所返回的值作为reduce函数的返回值。也就是说像这样的表达式: (reduce #’fn ‘(a b c d)) 等同于:(fn (fn ... 阅读全文
posted @ 2012-12-21 16:59 flowjacky 阅读(463) 评论(0) 推荐(0)