【问题标题】:How deterministic is Racket's evaluation order?Racket 的评估顺序有多确定?
【发布时间】:2019-09-19 23:54:11
【问题描述】:

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

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

以这个 sn-p 为例:

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

【问题讨论】:

    标签: racket evaluation


    【解决方案1】:

    与 Scheme 不同,Racket 保证从左到右。所以对于示例调用:

    (proc-expr arg-expr ...)
    

    您可以在Guide 中阅读以下内容:(强调我的)

    函数调用通过首先评估 proc-expr 和所有 arg-exprs 按顺序(从左到右)

    也就是说这个程序:

    (define a 0)
    (define (++a) (set! a (add1 a)) a)
    
    (list (++a) (++a)) 
    ; ==> (1 2)
    

    而且是一致的。对于 Scheme (2 1) 是一种替代解决方案。您可以通过使用绑定来强制排序,并可以确保得到相同的结果:

    (let ((a1 (++ a)))
      (list a1 (++ a)))
    ; ==> (1 2)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多