球拍的评估顺序如何确定?

时间:2019-09-19 23:54:11

标签: racket evaluation

我想知道当使用set!时,Racket的评估顺序是如何确定的。更具体地说,

  1. #%app总是从左到右评估其参数吗?
  2. 如果否,不同论点的评估是否可以交织在一起?

例如,使用以下代码段:

#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上找不到确切答案。

1 个答案:

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