我想了解的是 维基百科上关于同源性的文章,但它太啰嗦了,没有简明扼要地解释这个词背后的主要理论。我需要补充的是,我不是英语母语,所以我更喜欢简单的英语,而不是学术白皮书的引用。
那么,如果一门语言是同义词,到底是什么意思?是什么让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-icicon这个术语,从homo的意思是相同,icon的意思是表征。
然而,这个定义是有问题的,因为很难精确地确定什么是内部和外部表示。它也根本不是今天大多数人的意思。
今天,大多数人的意思可能是沿着杨迈克在这里所接受的答案的思路来理解的,即:Represenation of the 结构化 语言中的数据是优雅的(字面语法),而这种数据结构本身就是表示代码的主要手段。
为了进一步混淆问题,这个概念通常被称为 "代码即数据"(这本身就是一个非常超载的术语)。
更多信息在这里。