2014-02-19 54 views
1

我習慣了(quote x)評估爲x,(quote (x y z))評估爲(x y z)(car (quote (x y z))評估爲x。推理很簡單:引用是一種特殊的形式,它不會評估它的參數,而只是簡單地返回它。球拍中的報價行爲

我剛開始使用的球拍,並認爲(quote x)計算結果爲(quote x)(quote (x y z))計算結果爲(quote (x y z)),並(car (quote (x y z))評估爲(quote x)

那麼,實際上,它分別打印這些爲'x,'(x y z)'x,但這是同樣的事情。

有人可以在這裏解釋推理嗎?如果由於某種原因,(quote (x y z))評估爲(quote (x y z)),那麼不應該那輛車是quote(quote x)從哪裏來?

據我所知,在整個計算過程中,Racket的內部行爲與我習慣的一樣,除了打印最終結果時,它將其包裝在報價單中。這在所有情況下都是正確的嗎?如果是這樣,爲什麼要這樣做?

+0

見我注意到在[這個答案](http://stackoverflow.com/a/20643658/1281433):「作爲一個額外的複雜性,一些系統(我想一些語言,球拍博士,特別是)不要在交互式提示中打印表單的值,而是打印一個能夠產生相同結果的表單(對於「相同」的某些值的某些解釋)。例如,您可以評估'(1。 2),並看到輸出(cons 1 2),因爲這是另一種形式,會產生相同的價值。「 –

+0

[Lisp中引用的含義]的可能重複(http://stackoverflow.com/questions/20643147/meaning-of-quote-in-lisp) –

回答

3

球拍以與任何方案相同的方式評估表達式。然而,球拍在教學語言中有特殊的作者。在DrRacket中,您可以更改打印值的方式。在語言菜單中,單擊高級按鈕,然後查看打印選項。

0

球拍(語言)打印出的頂級形式,在交互窗口(REPL)進入不僅時候,卻總是結果。這是爲了讓我開發起來更容易,而且在真實世界的應用程序中,您沒有任何不等於任何內容的語句,所以真正的應用程序不會顯示這些行,因爲您有define和一個表達式來啓動您的程序,並且您可以返回(void)強制不輸出。

如果您要將語言更改爲#!r6rs#!r5rs您很快就會看到在定義窗口中獲得評估結果的唯一方法是,如果您明確使用display的結果。

無論所使用的語言,正確display顯示它。對於REPL-打印語言並設置控件的顯示方式。標準#!球拍是以這樣的方式顯示的,即將其放入包含display的新表達式中將會打印完全一樣,就好像您將原始表達式與顯示一起打包一樣。

(define test 'hello-world) 
(display test) ;; displays hello-world and not 'hello-world 
test   ;; displays 'hello-world in #!racket, nothing in R6RS unless in interactions window