gpt4 book ai didi

reflection - 引用、具体化和反射(reflection)的关系

转载 作者:太空宇宙 更新时间:2023-11-03 18:38:26 27 4
gpt4 key购买 nike

我最近对引用、具体化和反射(reflection)感到困惑。有人可以很好地解释他们的关系和差异(如果有的话)吗?

最佳答案

引用

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

(+ a 1)

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

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

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

这很好,但是如果我们想要一些东西,在评估时,最终将作为包含 <符号“+”> <符号“a”> <数字 1> 的 3 个元素的列表怎么办?解决这个问题的方法是引用。 Lisp 通常有一种称为“引用”的特殊形式,它接受一个参数,结果是该参数,未计算。所以

(quote (+ a 1))

将评估该列表。作为一些语法糖,' 被视为与 (quote) 相同,因此我们可以只写 '(+ a 1)。

具体化

具体化是一个通用术语,大致意思是“使抽象概念具体化”。具体到编程中,当一个东西被具体化了,大致就是你可以把它当成数据(或者“一等对象”)。 lisp 中的一个例子是函数,lambda 表达式使您能够创建一个具体的、一流的对象来表示函数调用的抽象概念。另一个例子是 CLOS 类,它本身就是一个 CLOS 对象,代表类的抽象概念。

反射(reflection)

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

此外,还记得我说过 lambda 是函数的具体化吗?那么“function-lambda-expression”就是对函数的反射(reflect)。

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

关于reflection - 引用、具体化和反射(reflection)的关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11649898/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com