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,
等等。通常根據上下文,應該能看出這些操作符的意思。