我试图理解Wikipedia 关于 homoiconity 的文章,但它太冗长,并没有简明地解释这个词背后的主要理论。我应该补充一点,我不是以英语为母语的人,所以我更喜欢简单的英语而不是学术白皮书的引用。
那么,如果一种语言是谐音的,这到底意味着什么?是什么让 C#、Java 或 JavaScript 非谐音?
我试图理解Wikipedia 关于 homoiconity 的文章,但它太冗长,并没有简明地解释这个词背后的主要理论。我应该补充一点,我不是以英语为母语的人,所以我更喜欢简单的英语而不是学术白皮书的引用。
那么,如果一种语言是谐音的,这到底意味着什么?是什么让 C#、Java 或 JavaScript 非谐音?
它的意思是“代码即数据”,这是 Lisp 家族的一个普遍特征。
(add 2 3)
就像上面的字符串一样,它既是一个列表,也是一个函数调用。“Homo”前缀代表这个特征。
Scheme 是同型的,因为它的程序具有数据结构的解释。
'(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!\"); }";
您可以对其进行解析并将其提供给编译器,但这很尴尬,因为它是一个字符串而不是结构化术语。
同音异义对不同的人可能意味着不同的东西。最初,它是在语言TRAC的上下文中定义的,如下所示:
因为 TRAC 程序和文本在处理器内部和外部具有相同的表示形式,所以可以使用术语 homo-iconic,从 homo 含义相同,以及 icon 含义表示。
然而,这个定义是有问题的,因为很难准确地确定内部和外部表示的含义。这也完全不是今天大多数人的意思。
今天,大多数人的意思可能与 Mike Yang 在这里接受的答案一致,即语言中结构化数据的表示是优雅的(字面语法),并且这种数据结构本身就是表示代码的主要手段。
为了进一步混淆问题,这个概念通常被称为“代码即数据”(这本身就是一个非常重载的术语)。
更多信息在这里: