common lisp和scheme的区别

1. 在Common Lisp 眼中,一个符号的symbol-value 和symbol-function 是不同的,而Scheme
对二者不做区分。在Scheme 里面,变量只有惟一对应的值,它能够是个函数,也能够是另外一种对
象。所以,在Scheme 中就不须要#’ 或者funcall 了。Common Lisp 的:
(let ((f #’(lambda (x) (1+ x))))
(funcall f 2))
在Scheme 中将变成:
(let ((f (lambda (x) (1+ x))))
(f 2))
2. 因为Scheme 只有一个名字空间,于是它没有必要为各个名字空间专门设置对应的赋值操做
符(例如defun 和setq)。取而代之,它使用define,define 的做用和defvar 大体至关,同时
用set! 替代了setq。在用set! 为全局变量赋值前,必须先用define 建立这个变量。
3. 在Scheme 中,一般用define 定义有名函数,它行使着defun 和defvar 在Common Lisp 中的功
能。Common Lisp 的:
(defun foo (x) (1+ x))
有两种可能的Scheme 翻译:
(define foo (lambda (x) (1+ x)))
(define (foo x) (1+ x))
4. 在Common Lisp 中,函数的参数按从左到右的顺序求值。而在Scheme 中,有意地不对求值顺序
加以规定。(而且语言的实现者对于忘记这点的人幸灾乐祸。)
5. Scheme 不用t 和nil,相应的,它有#t 和#f。空列表,(),在某些实现里为真,而在另外一些实现里
为假。
6. cond 和case 表达式里的默认子句在Scheme 中带有else 关键字,而不是Common Lisp 中的t。
7. 某些内置操做符的名字被改掉了:consp 成了pair?,而null 则是null?,mapcar (几乎) 是map,
等等。一般根据上下文,应该能看出这些操做符的意思。函数

相关文章
相关标签/搜索