2011-06-07 75 views
4

我已閱讀SICP第4章,剛發現第一部分列出了實現評估者的最重要功能,evalapply,據我所知eval非常重要,但爲什麼apply如此重要?對於某些語言,在Javascript中完全沒有apply爲什麼申請對lisp評估者如此重要?

編輯:對不起,我錯了,沒有適用於Javascript,請忽略。

+0

我確定JavaScript中有一些等價物:) – leppie 2011-06-07 16:16:56

+0

JavaScript *確實有'apply',不是嗎?我不是JS專家,但https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/Apply – spacemanaki 2011-06-08 14:46:18

回答

6

SICP(和別處)中的eval/apply事件將評估者的兩個主要部分分開。第一部分,eval正在做的一件事是處理代碼的語法翻譯以達到它的意義 - 但除了調度表達式類型之外,它幾乎沒有做任何事情。正如您在書中看到的那樣,各種「特殊形式」有各種各樣的eval-foo,因爲它們每個都有其獨特的評估規則。

現在,評估者需要處理的最重要的形式是功能應用。事實上,這個表單中沒有關鍵字非常重要(否則,你會看到apply或任何亂拋垃圾方案/ lisp代碼)。相反,如果一個表單以某種不是已知特殊形式的東西開始(並且在實際實現中,而不是已知的宏),那麼評估者將其視爲一個函數應用程序。此時,要評估函數調用,您需要評估函數本身(第一個表格)及其所有參數,然後您需要應用第一個值。這裏主要的啓發時刻是認識到這個evalapply之間存在主要區別 - 前者固有地處理語法,但後者處理

作爲一個便箋,有幾個人將此與Scheme和Lisp實現具有的內置apply函數混淆。爲什麼這個函數需要使用語言,與SICP的觀點完全無關(粗略地說,它提供了不具備它的功能,它是從實現到語言的一種反射形式)。我甚至不認爲SICP評估者甚至可以用解釋型語言提供apply。如果你正在尋找更多的啓發,那麼做到這一點(以SICP元圓形評估者的身份,並將apply添加到的解釋語言)將是一個很好的反思練習。

1

應用評估函數調用。它需要一個函數和一個參數列表:(apply fn args)。如果您的語言支持函數調用,那麼您可能會在解釋器中使用apply函數。 Scheme和Javascript的不同之處在於Scheme不僅向解釋器展示了這個函數,而且還向解釋爲的程序展示了這個函數。

+0

在這種情況下,「評估」具有特定的含義,因此此解釋不是幫助很大。更重要的是,你正在談論「apply」函數,以及這與本書所討論的應用程序有什麼關係,這是一個更加微妙的問題。 – 2011-06-07 17:12:12

+0

這是一個微妙的問題,但在我看來,OP正在詢問確切的問題,因爲他提到JS沒有應用函數。 eval函數對錶達式類型執行案例分析,然後每個案例決定如何評估該類型的表達式。 SICP中的評估者恰好將用於評估函數調用的代碼分解爲稱爲apply的另一個函數。這不是評估者的基本特徵:您可以將應用函數內聯到eval中,儘管這可能會使代碼不太清晰。 – Jules 2011-06-07 18:17:17

+0

解釋器中的apply函數和apply函數之間的區別實際上並不大。通過將apply函數放入您的原始程序列表中,可以將apply函數直接暴露給用戶程序。 – Jules 2011-06-07 18:18:55