LINUX.ORG.RU

Вопрос по call/cc

 ,


0

1

Пытаюсь разобраться с этой аццкой конструкцией. Самое простое объяснение, вроде бы, на первый взгляд понятное для меня, звучит как «call/cc — это вызов функции, переданной как аргумент, с продолжением в качестве аргумента». По этому определению, вроде бы, в следующем коде

(define f (lambda(cont) (cont 1 2 3)))
(write (+ 1 (call/cc f))) ; 2
Должно быть, продолжение (+ 1 _), которое подается в качестве аргумента f. Но тогда почему это продолжение забирает в себя только первый аргумент, ведь + должен хапать произвольное количество аргументов?

UPD А другая имплементация вообще ошибку выбрасывает, «wrong number of arguments given continuation»



Последнее исправление: linux-101 (всего исправлений: 2)

Это косяк дизайна языка

anonymous
()

Да, видимо так не работает в схемке.

Bad_ptr ★★★★★
()

Потому что продолжение (write (+ 1 [])) принимает не сколько угодно аргументов, а ровно один — тот, который должен возвращать вызов (call/cc f).

Продолжения, генерируемые call/cc, могут принимать произвольное число аргументов только в определённых случаях (когда все возвращаемые значения игнорируются; например, продолжение вычисления формы begin не в конце). Во всех остальных случаях они должны принимать или один аргумент, или столько, сколько значений ожидает замыкание-потребитель call-with-values. Иначе поведение не определено. [См. спеку на call/cc в RnRS.]

Какие-то реализации падают с ошибкой. Какие-то молча отбрасывают остальные значения.

ilammy ★★★
()

просто подумай, во что ты хочешь, чтобы это вычислилось и поймешь.

x4DA ★★★★★
()
10 февраля 2015 г.

Ты не понял, лисп не предназначен для этого, он работает по-другому.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.