day*_*day 5 lisp reflection reification
我最近对报价,具体化和反思感到困惑.有人可以对他们的关系和差异(如果有的话)提供一个很好的解释吗?
这可能是最简单的一个.考虑在REPL中键入以下内容时会发生什么:
(+ a 1)
Run Code Online (Sandbox Code Playgroud)
REPL代表Read Eval Print Loop,所以首先读取它.这是一个列表,所以在阅读之后我们有一个包含3个元素的列表:<符号"+"> <符号"a"> <数字1 >
下一步是评估.评估Common Lisp中的列表涉及查找绑定到列表中第一项的函数(或宏).由于+绑定到函数而不是宏,因此它会计算列表中的每个后续元素.数字评估自己,"a"将评估它所绑定的任何东西.现在评估了参数,使用评估结果调用函数"+".
然后我们打印结果并循环回读步骤
所以这很好,但是如果我们想要一些东西,当评估时,最终将作为包含<符号"+"> <符号"a"> <数字1>的3个元素的列表?对此的解决方案是引用.Lisps通常有一个称为"quote"的特殊形式,它接受一个参数,结果就是那个没有评估的参数.所以
(quote (+ a 1))
Run Code Online (Sandbox Code Playgroud)
将评估该列表.作为一些语法糖,'被处理与(引用)相同,所以我们可以写'(+ a 1).
具体化是一个通用术语,大致意思是"使一个抽象概念"具体化.特定于编程,当某些内容被实现时,它大致意味着您可以将其视为数据(或"第一类对象").lisp中的一个示例是函数lambda表达式使您能够创建表示函数调用的抽象概念的具体的第一类对象.另一个例子是CLOS类,它本身就是一个CLOS对象,它代表一个类的抽象概念.
在某种程度上,反思与物化是相反的.给定具体的东西,你想要一些关于它的抽象表示的信息.考虑一个Common Lisp Package对象,它是包概念的具体化,它只是从符号名到符号的映射.您可以使用do-symbols迭代包中的所有符号,从而在运行时获取该信息.
还记得我怎么说lambda是功能的具体化?那么"function-lambda-expression"就是函数的反映.
元对象协议(MOP)是一种使用类和对象执行各种操作的半标准方法.除此之外,它还允许对类和对象进行反射.
| 归档时间: |
|
| 查看次数: |
290 次 |
| 最近记录: |