28

我试图理解Wikipedia 关于 homoiconity 的文章,但它太冗长,并没有简明地解释这个词背后的主要理论。我应该补充一点,我不是以英语为母语的人,所以我更喜欢简单的英语而不是学术白皮书的引用。

那么,如果一种语言是谐音的,这到底意味着什么?是什么让 C#、Java 或 JavaScript 非谐音?

4

3 回答 3

15

它的意思是“代码即数据”,这是 Lisp 家族的一个普遍特征。

(add 2 3)

就像上面的字符串一样,它既是一个列表,也是一个函数调用。“Homo”前缀代表这个特征。

于 2012-12-14T02:09:45.687 回答
12

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!\"); }";

您可以对其进行解析并将其提供给编译器,但这很尴尬,因为它是一个字符串而不是结构化术语。

于 2011-06-27T12:26:58.220 回答
3

同音异义对不同的人可能意味着不同的东西。最初,它是在语言TRAC的上下文中定义的,如下所示:

因为 TRAC 程序和文本在处理器内部和外部具有相同的表示形式,所以可以使用术语 homo-iconic,从 homo 含义相同,以及 icon 含义表示。

然而,这个定义是有问题的,因为很难准确地确定内部和外部表示的含义。这也完全不是今天大多数人的意思。

今天,大多数人的意思可能与 Mike Yang 在这里接受的答案一致,即语言中结构化数据的表示是优雅的(字面语法),并且这种数据结构本身就是表示代码的主要手段。

为了进一步混淆问题,这个概念通常被称为“代码即数据”(这本身就是一个非常重载的术语)。

更多信息在这里:

于 2020-06-04T08:38:10.137 回答