fixedpoint.jp


2009/09/19

R6RS での operator と operand の評価順序について

2008/08/10に Scheme での式の operand と operator の評価順序について書いていましたが、一部勘違いしているところがありました。

R6RS では、各部分式の評価順序が定められていないということと同時に、各部分式を並行に評価する場合に守らなければならない点が注意されています:

Although the order of evaluation is otherwise unspecified, the effect of any concurrent evaluation of the operator and operand expressions is constrained to be consistent with some sequential order of evaluation.

これによると、いずれかの順序でシリアルに評価して同じ結果が得られなければなりません。例えば、

(letrec ((x 0)
         (count (lambda ()
                  (let ((y x))
                    (set! x (+ x 1))
                    y))))
  (+ (count) (count) (count)))

は必ず3を返すということになります。

また R5RS でも同じ注意があります。


© 2006-2023 fixedpoint.jp