我試圖去了解Wikipedia article on homoiconity,但它太冗長了,並沒有簡明地解釋單詞背後的主要理論。我應該補充一點,我不是以英語爲母語的人,所以我比學術白皮書中的報價更喜歡簡單的英語。homoiconicity是什麼意思?
那麼,如果一種語言是同相的,究竟意味着什麼呢?什麼使C#,Java或JavaScript不同心?
我試圖去了解Wikipedia article on homoiconity,但它太冗長了,並沒有簡明地解釋單詞背後的主要理論。我應該補充一點,我不是以英語爲母語的人,所以我比學術白皮書中的報價更喜歡簡單的英語。homoiconicity是什麼意思?
那麼,如果一種語言是同相的,究竟意味着什麼呢?什麼使C#,Java或JavaScript不同心?
這意味着「code as data」這是Lisp家族的一個普遍特徵。
(add 2 3)
就像上面的字符串一樣,它既是一個列表也是一個函數調用。 「Homo」前綴代表這一特徵。
方案是同構的,因爲它的程序有一個解釋爲數據結構。
'(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!\"); }";
,你可以解析和飼料的編譯器,但是這是尷尬的,因爲它是一個字符串,而不是一個結構化的術語。
我不認爲這意味着什麼,這裏解釋:http://www.expressionsofchange.org/dont-say-homoiconic/ –