2012-07-22 50 views
2

怎麼回事,在Common Lisp的反引號評價:分隔符和運營商

`(1 ,(+ 1 1) (- 4 1) 4) ; '(1 2 (- 4 1) 4) 

減號(「 - 」)不作爲操作員處理(但作爲一個象徵;「 - 而不是#」 )(這部分我想我明白了。)

但是,爲什麼第三個左括號的確被評估爲'( - >(list ...(即,列表/表達式分隔符,而不是隻是一個像' - above'這樣的字面意思)解釋器是否在結束分隔符處「向前看」,或者它是否簡單地說:「好的,這應該是一個列表。如果右側沒有分隔符,表達無效,這不是我的問題。「?

對不起,有一個令人困惑的問題;煮沸它,我想我的問題是:解釋器如何逐步評估上面的列表正確? (也可隨意更正術語。)

回答

2

我試圖想象你在想什麼導致了混亂。我猜的問題是:

如果反引號引用的東西,爲什麼括號仍然意味着列表,而不是僅僅是文字再吃一塊?

如果那是你所問的問題,那麼答案(粗略地說 - 比如rainer更瞭解lisp的人比我更瞭解)引用並不像你想象的那麼簡單。當代碼被lisp讀取時,它被稱爲「讀者」的東西處理。將代碼轉換爲語法樹 - 一堆列表形成一個包含程序的樹。

報價僅僅是給讀者的指令,說是這樣的:

治療`(A,B)爲(名單「AB)

頓號,使用起來有點像

忽略以上 - 做你平常做的事

我不知道這是否有幫助。如果我是相反的,那麼他(我認爲這是一個男性的名字?)勝。我只是想在你的腦海中獲得更多。

哦 - 還有一件事。引用不會使事情成爲「文本」。它使詞的原子(和括號列表)。所以它不像「製作這些文字」那麼簡單。

+0

「如果反引號引用的話,爲什麼括號仍然意味着列表,而不僅僅是一個文本?這就是要點,除非我知道這不是文字。 (我寫了「符號」,但你的「單詞原子」可能更好)。至於你的回答 - 公平地說 - **首先**樹根據列表完成,然後**操作是並且反引用是一種操作符,這就是爲什麼反引用內的列表仍然是列表的原因? (Sill有些困惑。) – 2012-07-22 20:54:10

+0

這是由讀者應用的。它在同一時間*完成轉換爲列表。反引用不像運行時發生的任何事情那樣是一個操作符。它是解析輸入的代碼的特殊指令。它發生在任何評估之前。 – 2012-07-22 21:13:05

4
`(1 ,(+ 1 1) (- 4 1) 4) 

反引用是一種讀取宏。它在READ TIME轉換表達式。

這樣做:

(read-from-string "`(1 ,(+ 1 1) (- 4 1) 4)") 

這被解讀爲實施具體形式。與此類似的東西:

(list* 1 (+ 1 1) '((- 4 1) 4)) 

CL標準沒有指定反引號解析的內容。

所以上面的轉換是由READER完成的。

然後使用通常的規則進行評估。沒什麼特別的。

LIST*取第一個參數,並在最後一個參數arg之前列出它們,這是一個列表。

+0

何時發生讀取時間?關於CL,我只聽說過編譯時間和運行時間(後者在解釋模式下) - 我應該說這是在宏觀擴展的背景下。 – 2012-07-22 21:02:06

+0

@Emanual Berg:'READ TIME'是READ運行時。當文本s表達式讀入Lisp數據時。 – 2012-07-22 21:08:17

+0

你寫了一個表達式,然後回車,解釋器讀取它 - 那是什麼時候?而且,你加載一個文件,然後每次讀取一行,讀取該行,然後讀取下一行......? – 2012-07-22 21:12:02