【发布时间】:2022-12-01 01:25:22
【问题描述】:
将函数 my-if 定义为在内部使用 cond 会导致与直接使用 cond 不同的行为。
使用cond,DrRacket 解释器只打印第一个displayln 的字符串。
代码:
(cond
(#t (displayln "Cond: should run"))
(else (displayln "Cond: shouldn't run")))
输出:
Cond: should run
使用my-if,DrRacket 解释器打印两个字符串,尽管看起来(至少对我而言)它应该扩展为相同的代码。
代码:
(define (my-if condition statement-if statement-else)
(cond (condition statement-if)
(else statement-else)))
(my-if
#t
(displayln "should run")
(displayln "shouldn't run"))
输出:
My-If: should run
My-If: shouldn't run
我假设由 define 创建的函数将扩展为与 cond 相同的代码,但考虑到它有不同的结果,我假设它没有。
鉴于代码的 2 个版本有不同的结果,我的猜测与急切/惰性求值或 cond 本身就是一个宏有关。
【问题讨论】:
-
是的,函数不是宏。
-
评估函数的所有参数,然后评估函数。你需要一个宏。
标签: functional-programming racket side-effects