我有以下函数给出一个表达式,执行它:
(define (foo exp0) exp0)
如果我执行以下操作:
(define x 5)
(foo (+ x 4))
(foo (* x 2))
display(x)
我想显示(x)显示18.基本上,如何将给定表达式的值赋给给定变量?
答案 0 :(得分:2)
首先,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))
答案 1 :(得分:2)
如果可以保证您正在更新的变量始终是第一个操作数,那么您确实可以编写这样的宏:
(define-syntax foo
(syntax-rules ()
((foo (op var arg ...))
(set! var (op var arg ...)))))