2014-12-12 8 views
0

Я пытаюсь это сделать на Racket, и он дает ответ как 5. Но я не могу понять, как это дошло до ответа.Как это выражение call/cc работает?

((call/cc call/cc) (lambda (x) 5)) 

Я расширил его следующим образом.

((call/cc (lambda (k) (call/cc (lambda (k1) (k k1))))) (lambda (x) 5)) 

Если предположить, что расширение является правильным, я до сих пор не понимаю, что происходит, когда к продолжению применяется к k1 продолжению и как он это делает для выполнения внешней лямбды с получением 5.

ответ

1

(k k1) вернется k1 как возвращаемое значение внешнего call/cc. Затем, когда вы вызываете k1 (как часть (... (lambda (x) 5))), который возвращает 5 как возвращаемое значение внутреннего call/cc, которое затем возвращается (как нормальное возвращение на этот раз) в качестве возвращаемого значения внешнего call/cc.

Извините, это был довольно полный глоток. :-)

+0

Просто, чтобы подтвердить свое понимание объяснения. (k k1) возвращается с k1. Тогда (k1 (lambda (x) 5)). Что возвращается с (лямбда (x) 5). Тогда ((лямбда (x) 5) (лямбда (x) 5)) происходит уступкой 5. Правильно ли я понял? –

+0

Да, это звучит разумно. –

+0

Awesome. Итак, в этом случае как k, так и k1 продолжения почти одинаковы? –

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

  • Нет связанных вопросов^_^