gpt4 book ai didi

macros - SICP:可以或在 lisp 中定义为没有 gensym 的句法转换吗?

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

我正在尝试解决 Structure and Interpretation of computer programming 问题 4.4 的最后一部分;任务是将 or 作为句法转换来实现。只定义了基本句法形式;引用、if、begin、cond、define、apply 和 lambda。

(或 a b ... c)等于第一个真值或假,如果没有值是真的。

想要处理它的方式是将例如(或a b c)转换成

(if a a (if b b (if c c false)))

问题在于 a、b 和 c 将被计算两次,如果其中任何一个有副作用,则可能会给出不正确的结果。所以我想要一个类似 let 的东西

(let ((syma a)) 
(if syma syma (let ((symb b))
(if symb symb (let ((symc c))
(if (symc symc false)) )) )) )

这又可以像练习 4.6 中那样通过 lambda 实现。现在的问题是确定符号syma、symb 和symc;例如,如果表达式 b 包含对变量 syma 的引用,则 let 将破坏绑定(bind)。因此我们必须有 syma 是一个不在 b 或 c 中的符号。

现在我们遇到了障碍;我能从这个漏洞中看到的唯一方法是让符号不能出现在传递给 eval 的任何表达式中。 (这包括可能已通过其他句法转换传入的符号)。

但是因为我无法直接访问表达式中的环境,所以我不确定是否有任何合理的方法来生成此类符号;我认为 Common Lisp 具有用于此目的的函数 gensym(这意味着在 metacircular 解释器中保持状态,危及任何并发使用)。

我错过了什么吗?有没有办法实现或不使用 gensym?我知道 Scheme 有它自己的 hygenic macro 系统,但我还没有弄明白它是如何工作的,我不确定它下面是否有一个 gensym。

最佳答案

我认为您在这里可能想要做的是转换为句法扩展,其中不嵌套各种形式的计算。您可以这样做,例如,将每个表单包装为 lambda 函数,然后您使用的方法就可以了。例如,你可以做类似

(or a b c)

进入

(let ((l1 (lambda () a))
(l2 (lambda () b))
(l3 (lambda () c)))
(let ((v1 (l1)))
(if v1 v1
(let ((v2 (l2)))
(if v2 v2
(let ((v3 (l3)))
(if v3 v3
false)))))))

(实际上,lambda 函数的求值 调用 仍然嵌套在 iflet 中s,但是 lambda 函数的定义所在的位置使得在嵌套的 iflet 中调用它们不会导致捕获绑定(bind)的任何困难。)这没有解决如何您获取变量 l1l3v1< 的问题v3,但这并不重要,它们都不在 lambda 函数的范围内,因此您不需要担心它们是否出现在体内。事实上,您可以对所有结果使用相同变量:

(let ((l1 (lambda () a))
(l2 (lambda () b))
(l3 (lambda () c)))
(let ((v (l1)))
(if v v
(let ((v (l2)))
(if v v
(let ((v (l3)))
(if v v
false)))))))

此时,您实际上只是在执行更一般形式的循环展开,例如:

(define (functional-or . functions)
(if (null? functions)
false
(let ((v ((first functions))))
(if v v
(functional-or (rest functions))))))

(或 a b c) 的扩展就是

(functional-or (lambda () a) (lambda () b) (lambda () c))

此方法也用于 an answerWhy (apply and '(1 2 3)) doesn't work while (and 1 2 3) works in R5RS? .而这一切都不需要任何 GENSYMing!

关于macros - SICP:可以或在 lisp 中定义为没有 gensym 的句法转换吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18284610/

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