2011-06-27 20 views
19

我試圖去了解Wikipedia article on homoiconity,但它太冗長了,並沒有簡明地解釋單詞背後的主要理論。我應該補充一點,我不是以英語爲母語的人,所以我比學術白皮書中的報價更喜歡簡單的英語。homoiconicity是什麼意思?

那麼,如果一種語言是同相的,究竟意味着什麼呢?什麼使C#,Java或JavaScript不同心?

+0

我不認爲這意味着什麼,這裏解釋:http://www.expressionsofchange.org/dont-say-homoiconic/ –

回答

10

這意味着「code as data」這是Lisp家族的一個普遍特徵。

(add 2 3) 

就像上面的字符串一樣,它既是一個列表也是一個函數調用。 「Homo」前綴代表這一特徵。

9

方案是同構的,因爲它的程序有一個解釋爲數據結構。

'(define (foo x) (* x x)) 

是一個列表,所述第一元件,其是define,第二(foo x)(列表),等等。引號'的意思是:不要解釋這個,把它作爲一個列表。如果我們刪除'我們得到

(define (foo x) (* x x)) 

這是一個Scheme函數定義。由於Scheme程序定義是嵌套列表表達式(因此也是一種「語法樹文字」),而Scheme是一種動態語言,因此您可以使用這些技巧來構建非常強大的宏/代碼生成系統。

現在Java並不是簡單的同義詞,因爲它沒有提供這些評估解析樹碎片的「程序文字」。當然,你可以定義字符串

String helloWorld = 
    "class Hello { public static void main(System.out.println(\"Hello, world!\"); }"; 

,你可以解析和飼料的編譯器,但是這是尷尬的,因爲它是一個字符串,而不是一個結構化的術語。