Насколько детерминирован порядок оценки Ракета? - PullRequest
0 голосов
/ 20 сентября 2019

Я хотел бы знать, насколько детерминирован порядок оценки Ракета, когда используется set!.В частности,

  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 Ответ

2 голосов
/ 20 сентября 2019

В отличие от Схемы, ракетка гарантируется слева направо.Так для примера вызова:

(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)
...