我试图理解Wikipedia article on homoiconity,但它太冗长,并没有简明扼要地解释这个词背后的主要理论。我应该补充一点,我不是母语为英语的人,所以我更喜欢简单的英语而不是学术白皮书。
那么,如果一种语言是同质的,那究竟是什么意思呢?是什么让C#,Java或JavaScript非同质?
答案 0 :(得分:11)
这意味着“代码作为数据”,这是Lisp系列的一般特征。
(add 2 3)
就像上面的字符串一样,它既是列表又是函数调用。 “Homo”前缀代表了这一特征。
答案 1 :(得分:10)
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!\"); }";
你可以解析并提供给编译器,但这很尴尬,因为它是一个字符串而不是结构化术语。
答案 2 :(得分:0)
同调对不同的人可能意味着不同的事情。最初是定义 在 TRAC 语言的上下文中,例如:
因为TRAC程序和文本在内部和内部具有相同的表示形式 在处理器外部,从均等意义上讲,均等性适用于术语 相同,并且图标含义表示。
但是,这个定义是有问题的,因为很难精确地确定 内部和外部表示的含义是什么。也根本不是什么 今天大多数人都这么说。
今天,大多数人可能会按照已接受的答案表达某些意思 这里是Mike Yang提出的,即结构化数据在语言中的表示形式 很优雅(字面语法),并且这种数据结构本身就是主要手段 代表代码。
为了进一步混淆,此概念通常称为“代码即数据”( 本身就是一个非常重载的术语)。
更多信息在这里: