2014-12-07 2 views
0

Рассмотрим следующее определение: СхемаСтранная рекурсивное определение в схеме

(define f (lambda() (procedure? f))) 

Как ни странно, когда я оцениваю (f) я #t. Вопрос в том, почему эта оценка заканчивается? Я ожидал, что он зациклится на неопределенный срок. Что оценивает внутренний lambda, так как f еще не определен?

ответ

1

Здесь нет рекурсии.

При выполнении этого кода, процедура f определяется (не выполняется):

> (define f (lambda() (procedure? f))) 
> f 
#<procedure:f> 

Когда вы затем выполнить его, он проверяет, есть ли процедура, связанная с символом F, что справедливо при что точка во времени, поэтому она возвращает #t:

> (f) 
#t 

чтобы быть рекурсивными, процедура будет иметь называть себя с помощью (f).

+0

я вижу. Для меня рекурсивное определение функции означало ** любую ссылку ** на нее в ее определении, а не только на вызовы. Спасибо за уточнение. –

+0

Теперь я думаю, что я понимаю это лучше. Рассмотрим следующее лямбда-выражение: (лямбда() (/ 1 0)); замечательно, переводчик его принимает. Должен ли я понять, что выражение лямбда никогда не оценивает его тело (это оценивается только в функциональных приложениях)? –

+0

@ AlexM. Да. Он оценивается при вызове, а не при определении. – uselpa

Смежные вопросы