По поводу продолжения в OnLisp

Я все еще интересуюсь вопросом, на который был дан ответ.

продолжение в общем lisp макросами - относительно реализации в OnLisp

Что произойдет, если предположение Пола Грэма будет верным, особенно при переходе от (A 5) к (B 1)? С чем здесь связано?

И еще одна путаница, когда текст говорит

=bind, предназначен для использования таким же образом, что и множественное-bind. Он принимает список параметров, выражение и тело кода: параметры привязываются к значениям, возвращаемым выражением, и тело кода оценивается с помощью этих привязок.

Я не могу увидеть привязку непосредственно из макроопределения =bind, которое выглядит как

 (defmacro =bind (parms expr &body body)
  `(let ((*cont* #'(lambda ,parms ,@body))) ,expr))

Связывание происходит только тогда, когда = значения приходят позже?

1 ответ

Решение

Макрос устанавливает продолжение, *cont*, чтобы быть лямбда-выражением, которое принимает все ваши переменные в качестве аргументов, а затем оценивает выражение expr, Ожидается, что выражение вызовет продолжение с его окончательным значением, что можно сделать косвенным путем, вызвав =values функция или непосредственно с funcall, В отличие от Scheme, где продолжение неявно вызывается с возвращаемым значением любого выражения, вы должны явно написать свой код в стиле передачи продолжения, вызвав *cont* или используя =values вместо того, чтобы вернуться из любой функции.

Другие вопросы по тегам