引文,具体化和反思之间的关系

时间:2012-07-25 12:38:37

标签: reflection lisp reification

我最近对报价,具体化和反思感到困惑。有人可以对他们的关系和差异(如果有的话)提供一个很好的解释吗?

1 个答案:

答案 0 :(得分:5)

引用

这可能是最简单的一个。考虑在REPL中输入以下内容时会发生什么:

(+ a 1)

REPL代表Read Eval Print Loop,所以首先读取它。这是一个列表,所以在阅读之后我们有一个包含3个元素的列表:< the symbol“+”> <符号“a”> <数字1>

下一步是评估。评估Common Lisp中的列表涉及查找绑定到列表中第一项的函数(或宏)。由于+绑定到函数而不是宏,因此它会计算列表中的每个后续元素。数字评估自己,“a”将评估它所绑定的任何东西。现在评估了参数,使用评估结果调用函数“+”。

然后我们打印结果并循环回读步骤

所以这很好,但是如果我们想要一些东西,当评估时,最终将作为包含<符号“+”>的3个元素的列表。 <符号“a”> <数字1>?对此的解决方案是引用。 Lisps通常有一个称为“quote”的特殊形式,它接受一个参数,结果就是那个没有评估的参数。所以

(quote (+ a 1))

将评估该列表。作为一些语法糖,'被处理与(引用)相同,所以我们可以写'(+ a 1)。

物化

具体化是一个通用术语,大致意思是“使一个抽象概念”具体化。特定于编程,当某些内容被实现时,它大致意味着您可以将其视为数据(或“第一类对象”)。 lisp中的一个示例是函数lambda表达式使您能够创建表示函数调用的抽象概念的具体的第一类对象。另一个例子是CLOS类,它本身就是一个CLOS对象,它代表了类的抽象概念。

反射

在某种程度上,反思与物化相反。给定具体的东西,你想要一些关于它的抽象表示的信息。考虑一个Common Lisp Package对象,它是包概念的具体化,它只是从符号名到符号的映射。您可以使用do-symbols迭代包中的所有符号,从而在运行时获取该信息。

另外,还记得我怎么说lambda是功能的具体化吗? “函数 - lambda表达式”是函数的反映。

元对象协议(MOP)是一种使用类和对象执行各种操作的半标准方法。除此之外,它还允许对类和对象进行反思。