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,
等等。通常根据上下文,应该能看出这些操作符的意思。

QinHongYu blog
原文地址:https://www.cnblogs.com/psil-xyz/p/7768416.html