2013-03-27 17 views
1

在或多或少了解this question的答案之後,它在我看來,在球拍/方案中,在閱讀器級別,語法樹中每對的第二個元素必須是列表。換句話說,無論何時(A . B)形式的虛線s表達式表示語法樹的頂點,B只能通過作爲列表解析的s表達式,如(C D E)。例如:(A . (C D E))。這當然可以寫成(A C D E),因爲它的解析是一致的。爲什麼在Racket語法中允許「虛線對」的表達式?

(+ . (1 2 3)) ; => 6 
(+ 1 2 3) ; => 6 

(define . (x 1)) 
x ; => 1 
(define y 2) 
y ; => 2 

我的問題是:什麼是「點對」 s表達式被允許在球拍/ Scheme語法的原因,除了內部的文字數據等?是否有可以使用配對書寫的球拍/方案表達式的示例,但是使用列表不能簡單地編寫?

回答

3

在任何Lisp系統中,閱讀和評估都是單獨的步驟。給讀者,一切是文字數據;它是評估者決定要評估什麼以及什麼(憑藉quotequasiquote)將其視爲文字數據。

閱讀者閱讀下列表達式完全相同的方式:

(+ 1 2 3) 
(+ . (1 2 3)) 
(+ . (1 . (2 3))) 
(+ . (1 . (2 . (3)))) 
(+ . (1 . (2 . (3 .())))) 

這是因爲,在基層,非空列表是由一串利弊細胞,恰好有一個的cdr指向另一個列表(空或不)。

此外,確實使用不正確列表的合法Scheme表達式。休息論據lambda表達式是一個很好的例子:

(define (list . items) 
    items) 
+0

任何Lisp的系統,除了Clojure中,P – leppie 2013-03-27 16:39:35

+0

Clojure中不單獨從評估看? :-O – 2013-03-27 16:48:44

+0

Nope'.'是一個符號(Clojure中沒有'pairs')O_o(也就是'''基本上是一個空格) – leppie 2013-03-27 16:49:56

相關問題