【问题标题】:Assigning variables (variable mutation) in racket在球拍中分配变量(变量突变)
【发布时间】: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


    【解决方案1】:

    首先,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))
    

    【讨论】:

    • @user1025948 您的函数foo 没有使用变量调用。它是用一个值调用的。当(foo x) 被求值时,foo 被求值以产生一个过程,x 被求值以产生一个值,然后它用该值调用的过程。该过程的主体不知道为了生成传递给它的值而评估了哪种形式(在本例中为x)。如果正文需要了解该表单,则需要一个宏,如Chris Jester-Young's answer 所示。
    【解决方案2】:

    如果你能保证你要更新的变量总是第一个操作数,你确实可以写这样一个宏:

    (define-syntax foo
      (syntax-rules ()
        ((foo (op var arg ...))
         (set! var (op var arg ...)))))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-18
      • 1970-01-01
      • 2015-07-28
      • 1970-01-01
      相关资源
      最近更新 更多