Обычные лиспы порождают загадку - PullRequest
0 голосов
/ 21 ноября 2018

Я получил это

(dotimes (temp-one 10 temp-one))

из примеров Hyperspec на dotimes.Выполнение этого приводит к ответу 10. Таким образом, temp-one в позиции третьего параметра действует как возвращаемый «результат», но как оно достигло 10, когда dotimes начинается с 0 и будет идти только к 9?

>(dotimes (temp-one 10 temp-one) (format t "~3d " temp-one))
  0   1   2   3   4   5   6   7   8   9 
10

Чего мне не хватает в третьем параметре?

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

Hyperspec сообщает:

Во время обработки формы результата переменная привязывается к числу выполнений тела.

Итак, вВ третьей форме, в форме результата, переменная сначала привязывается к числу раз, когда тело было выполнено первым, а затем вычисляется третья форма.

Именно поэтому значение переменной равно 10а не текущее значение 9.

Это также видно, если вы выполните

(macroexpand-1 '(dotimes (temp-one 3 temp-one) (format t "~3d~%" temp-one)))

;; resulting in CLISP in:
;; (DO ((TEMP-ONE 0 (1+ TEMP-ONE))) ((>= TEMP-ONE 10) TEMP-ONE)
;;  (FORMAT T "~3d~%" TEMP-ONE)) ;
;; T

Итак, наконец, (1+ TEMP-ONE) возвращается из цикла DO, к которому DOTIMES расширяется до - как указано @ zut.

0 голосов
/ 21 ноября 2018

Если вы посмотрите на dotimes Hyperspec entry , в ней говорится, что это macro , что означает, что вы можете увидеть «под капотом», вызвав macroexpand:

(macroexpand '(dotimes (i 10 i)))

SBCL:

(BLOCK NIL
  (LET ((I 0))
    (DECLARE (TYPE UNSIGNED-BYTE I))
    (TAGBODY
      (GO #:G386)
     #:G385
      (TAGBODY)
      (PSETQ I (1+ I))
     #:G386
      (UNLESS (>= I 10) (GO #:G385))
      (RETURN-FROM NIL (PROGN I)))))

Allegro CL:

(do ((i 0 (1+ i)))
    ((>= i 10) i))

В обоих случаях переменная итерации i равнаувеличивается на единицу, и затем завершается тест (>= i 10).Как писал jkiiski :

"Во время обработки результирующей формы , var привязано к числу разтело было выполнено. "

и формы (return-from ..) (SBCL) и i (Allegro CL) оцениваются после увеличения переменной и проверки.

...