* macro : 初看,和 C 的 macro 差不多,但是至少想到一种不一样的地方: 比如一个 macro 返回多个 function 时就不一样( 比如 defstruct 这个 macro), 这时更像 code generator
* 自底向上的设计, 需要和分层的概念一起使用,才更有威力
* ghci 和 repl 其实是差不多的东东
* lisp 语法只有一条 : S-expression
* 注意理解 evaluate 是在什么时候发生的
# 正常的函数调用,是把所有参数从左到右都 evaluate 后, evaluate 整个 S-expression ( "后根序"求值)( evaluation rules)
# macro 是把代码生成后, 再进行 evaluate
# if 不是函数, 因为他不会把所有参数都 evaluate, 只会 evaluate 应该执行的部分( 这和 cond 是不同的)
# special form 也不遵守 evaluation rules.
# 'list' 是个函数,所以 (setf x (list 3 (+ 4 5))) 和 (setf x '(3 (+ 4 5))) 是不一样的, 因为 quota 不是函数,而是 special operator
* 按缩进去读代码, 括号的问题,交给编辑器(比如 emacs + slime) 去解决
* FP 就是写代码去"返回值",而不是改变东西,并拒绝在 assign 的两边出现同样的 symbol (真是一针见血)
* 在一些语言中, "变量"是有类型的, 在 lisp 中, "值"是有类型的,而不是"变量", 可以认为是"变量"有一个属性标记自己是什么类型;而且,每个"值"是有多种类型的.
* 在 lisp 中, 变量和list 一样, 都是指针, 所以在把一个 list 赋值给另一个 list 时,不是 copy 值, 而是 copy 的指针......要做值复制,可以用 copy- 系统的函数,如 copy-list, copy-tree
* 理解"递归"的方法在于,问下面的问题"它是不是覆盖了所有的情况?"
* 函数中的 keyword, 一般是可选的,如果出现,则出现在函数的最后(与 c++ 中的默认参数是一样的).
阅读(772) | 评论(0) | 转发(0) |