如何延迟/延迟计算Racket中函数的参数?

如何延迟/延迟计算Racket中函数的参数?,racket,lazy-evaluation,divide-by-zero,Racket,Lazy Evaluation,Divide By Zero,我要呆在“朗”的球拍里。 我试图找出如何延迟函数参数的求值-我无法更改传入的参数。 例如,假设我想通过这样做: (定义(ae)6) 然后我想用这个参数调用a (a(/10)) 我怎样才能推迟对这一论点的评估 我尝试了(在函数a中)这样的操作: (定义(a e) (定义E(lambda()E)) 6) 但这仍然是先评估论点的。有什么建议吗?#lang racket是一种渴望的语言,但由于它的早期版本是R5RS方案,它仍然有R5RS兼容的延迟和强制: (定义(测试延迟-e)6) (测试(延迟(/1

我要呆在“朗”的球拍里。 我试图找出如何延迟函数参数的求值-我无法更改传入的参数。 例如,假设我想通过这样做:

(定义(ae)6)

然后我想用这个参数调用a

(a(/10))

我怎样才能推迟对这一论点的评估

我尝试了(在函数a中)这样的操作:

(定义(a e)
(定义E(lambda()E))
6) 

但这仍然是先评估论点的。有什么建议吗?

#lang racket
是一种渴望的语言,但由于它的早期版本是R5RS方案,它仍然有R5RS兼容的
延迟
强制

(定义(测试延迟-e)6)
(测试(延迟(/10)))
; ==> 6.
如果没有特殊表格,您可以:

(测试(thunk(/10)))
; ==> 6.
;; 与…一样
(测试(lambda()(/10)))
; ==> 6.
请注意,在这两种情况下,调用函数时都需要这样做,因为需要在语言计算值之前包装这些值。在像
#lang lazy
这样的惰性语言中,您可以天真地编写代码,它会做正确的事情

#lang lazy
(定义(测试e)6)
(测试(/10))
; ==> 6.
现在,
#lang lazy
的一个实现是使用带有
delay
force
装饰的宏,因此核心可能与表面语言略有不同。如果在一种急切的语言中有那么容易使用的惰性评估,我们就不会使用惰性语言

编辑

宏是对实际代码进行计算的一种方法。因此,如果您将函数改为宏,则可以将其转换为您想要的:

(定义语法测试)
(语法规则()
(((uuu忽略的edpression)6)))
(测试(/10))
; ==> 6.
不重要的是要知道这将用
6
替换代码。您可以改为将其包装:

(定义语法定义惰性
(语法规则()
(((名称参数…)正文…)
(开始
(定义(impl args…)
身体…)
(定义语法名称)
(语法规则()
(((……)保证金(……)(暗示(延期保证金)(……)()()()()))
(定义惰性(测试e)6)
(测试(/10))
; ==> 6.
如果您看一下这将
(test(/10))
扩展到的内容,它将类似于第一个示例。与惰性语言不同,您需要显式地强制执行体中的参数

(定义惰性(我的if p c a)
(如有)(强制p)
(c队)
(a)
(我的if(<34)10(/10))
; ==> 10

有没有一种方法可以在不修改函数参数的情况下执行此操作?正如在参数中变成(delay(/10))而不是(/10)。@Chubbles也许您可以创建一个名为test的宏,该宏扩展为延迟其参数。您需要围绕着
#lang racket
评估模型的迫切性展开工作,因此需要付出努力。使用
#lang lazy
不会。@Chubbles我添加了一个宏示例。如果你发布了我的示例,这就是我想要的。比如说,如果传入3个参数,最后一个是一些(/10);显然,该函数将计算args,但我不希望它这样做。我只想在前两个参数上使用函数,也许可以使用第三个参数。@Chubbles不客气。在一种急切的语言中,使用显式宏或使用专门为此而设计的惰性racket可能更简洁。