gpt4 book ai didi

lisp - 如何在 Scheme 的 eval 中使用外部变量?

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

我正在 Scheme 中尝试一些有趣的东西。我正在尝试制作一个 Area 函数,该函数获取它正在操作的事物的类型,然后根据对象的类型调用不同的函数。这是我的代码:

(define (area object)
(if (not (null? (eval (word 'area- (get-type object)))))
(eval (list (word 'area- (get-type object)) 'object))
#f
)
)

Scheme 不喜欢这个,因为它说对象是一个未绑定(bind)的变量。不,我不能把引号拿走,因为它实际上是把值放在那里,然后 Scheme 提示列表格式不正确。

如何在 eval 中使用对象中的值?

注意:Scheme 显然很好地获取了全局变量“object”,所以它基本上忽略了它在函数内部。

相关语言的一些信息在这里:http://docs.racket-lang.org/guide/eval.html ,这似乎表明 Scheme 中没有解决方案,但如果您知道,我很想听听。

最佳答案

没有 - 这是一项功能。 eval 对运行时动态生成的表单进行评估。所以,如果它需要了解本地绑定(bind),那么您需要以不同方式编译 (lamba (x) x)(lambda (y) y) --因为名字很重要。但这只是小贴士,实现此类功能存在一大堆问题。

至于您的问题——即使可以按照您的意愿行事,这也是一个依赖名称的脆弱解决方案。请记住,在 Scheme 中,您可以像使用任何其他值一样使用函数——因此,与其调用 get-type 并将其与某个符号组合以获取名称,不如让您的对象包含所需的函数(这在这一点上称为“方法”会更好)。

类似于:

(define (area object)
((get-area-method object) object))

显然,这样做意味着不完全采用以下方法毫无意义:

(define (area object)
(get-area object))

这只是

(define area get-area)

但第一个可能更典型的是一般的 OO 类系统,具有获取方法的方法,因此它可能对您有用。这个方向可以带你去:

(define (area object)
((get-method object 'get-area) object))

关于lisp - 如何在 Scheme 的 eval 中使用外部变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3844196/

24 4 0
文章推荐: lisp - 为什么我会收到此 lambda 表达式错误,我该怎么办?
文章推荐: c# - 根据该对象中变量的值拆分 List