我想知道当使用set!
时,Racket的评估顺序是如何确定的。更具体地说,
#%app
总是从左到右评估其参数吗?例如,使用以下代码段:
#lang racket
(define a 0)
(define (++a) (set! a (add1 a)) a)
(list (++a) (++a)) ; => ?
最后一个表达式的计算结果是否不同于'(1 2)
,例如'(1 1)
,'(2 2)
或'(2 1)
?
我在http://docs.racket-lang.org/reference上找不到确切答案。
答案 0 :(得分:2)
与计划不同,球拍可以保证从左到右。因此,对于示例调用:
(proc-expr arg-expr ...)
您可以在Guide中阅读以下内容:(强调我的意思)
首先通过评估proc-expr和所有函数来评估函数调用 arg-exprs 顺序(从左到右)。
这意味着该程序:
(define a 0)
(define (++a) (set! a (add1 a)) a)
(list (++a) (++a))
; ==> (1 2)
这是一致的。对于方案(2 1)
是替代解决方案。您可以通过使用绑定来强制订购,并可以确保相同的结果,如下所示:
(let ((a1 (++ a)))
(list a1 (++ a)))
; ==> (1 2)