【发布时间】:2013-10-10 01:15:43
【问题描述】:
我有以下函数,给定一个表达式,执行它:
(define (foo exp0) exp0)
如果我执行以下操作:
(define x 5)
(foo (+ x 4))
(foo (* x 2))
display(x)
我希望 display(x) 显示 18。基本上,我如何将给定表达式的值分配回给定变量?
【问题讨论】:
标签: variables lambda scheme racket mutability
我有以下函数,给定一个表达式,执行它:
(define (foo exp0) exp0)
如果我执行以下操作:
(define x 5)
(foo (+ x 4))
(foo (* x 2))
display(x)
我希望 display(x) 显示 18。基本上,我如何将给定表达式的值分配回给定变量?
【问题讨论】:
标签: variables lambda scheme racket mutability
首先,foo 过程只是简单地返回参数,而不是“执行”它。回答您的问题,以下是在 Scheme 中重新分配值的方法:
(define x 5)
(set! x (+ x 4))
(set! x (* x 2))
(display x)
但说实话,这种编程风格(可变变量)在 Scheme 中是不受欢迎的。我相信这是更惯用的:
(let* ((x 5)
(y (+ x 4))
(z (* y 2)))
(display z))
【讨论】:
foo 没有使用变量调用。它是用一个值调用的。当(foo x) 被求值时,foo 被求值以产生一个过程,x 被求值以产生一个值,然后它用该值调用的过程。该过程的主体不知道为了生成传递给它的值而评估了哪种形式(在本例中为x)。如果正文需要了解该表单,则需要一个宏,如Chris Jester-Young's answer 所示。
如果你能保证你要更新的变量总是第一个操作数,你确实可以写这样一个宏:
(define-syntax foo
(syntax-rules ()
((foo (op var arg ...))
(set! var (op var arg ...)))))
【讨论】: