По поводу продолжения в 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
вместо того, чтобы вернуться из любой функции.