在球拍中分配变量(变量变异)

时间:2013-10-10 01:15:43

标签: variables lambda scheme racket mutability

我有以下函数给出一个表达式,执行它:

(define (foo exp0) exp0)

如果我执行以下操作:

(define x 5)
(foo (+ x 4))
(foo (* x 2))
display(x)

我想显示(x)显示18.基本上,如何将给定表达式的值赋给给定变量?

2 个答案:

答案 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 ...)))))