LINUX.ORG.RU

Ответ на: комментарий от recon88

what?

Точка возврата в продолжение - это, фактически, лямбда.

mv ★★★★★
()
Ответ на: комментарий от Ruga-Suneto

> Эээ, а continuations можно реализовать макрами да лямбдами?

В CL можно, но это будут не совсем полноценные continuations.

anonymous
()
Ответ на: комментарий от Ruga-Suneto

Эээ, а continuations можно реализовать макрами да лямбдами?


Нет, только неполноценный костыль на тему. Вот что сказано на странице cl-cont

All special operators listed under http://www.lisp.org/HyperSpec/Body/sec_3-1-2-1-2-1.html are supported with the following limitation: call/cc cannot appear within the body of catch, throw, progv, or unwind-protect.

Because compilers often expand standard macros into non-standard CL code, supporting all special operators is not sufficient to support all of Common Lisp. cl-cont makes special arrangements to support defun. Currently defgeneric and defmethod are not supported. Additional cases will be handled as they are exposed.

Calling call/cc from functions passed to standard functions (like mapcar) is not supported because standard functions have not been transformed to CPS style. Eventually cl-cont will provide its own version of commonly used standard functions that accept higher order parameters.

archimag ★★★
()
Ответ на: комментарий от recon88

CPS можно реализовать через монаду(в haskell)

реализовать через монаду - это звучит

ежели по существу, то монада определяет только определённый (удобный во многих случаях) интерфейс, и не имеет никакого отношения к реализации; реализовать CPS она не поможет - однако пользоваться CPS с монадическим интерфейсом будет значительно удобней, чем без оного

jtootf ★★★★★
()
Ответ на: комментарий от Ruga-Suneto

>Эээ, а continuations можно реализовать макрами да лямбдами?

В современных смолтоках они делаются без непосредственного участия виртуальной машины, чисто средствами языка например

yoghurt ★★★★★
()
Ответ на: комментарий от yoghurt

И как это делается?

Smalltalk вместе с Io у меня стоят в списке to-see, но это потом.

Ты можешь мне примерно объяснить как там реализовано?

Ruga-Suneto
() автор топика
Ответ на: комментарий от Ruga-Suneto

Вот пример использования продолжений:

Object subclass: ContinuationTest [
    | continuation someVar |
    create [
        someVar := Continuation currentDo:  [:cc | continuation := cc. 0].
        someVar printNl
    ]
    use [
        someVar = 0 ifTrue: [continuation value: 42]
    ]
]

ContinuationTest new create; use.
~ $ gst -f ~/devel/cont.st 
0
42

А в реализации там используется возможность прямого доступа к стеку. Смолтоковская магия во всей её красе. Три метода, по сути

Continuation class >> currentDo: aBlock
    ^aBlock value: (self new stack: thisContext parentContext copyStack)

Continuation >> value: anObject
    ^self resume: anObject nextContinuation: stack copyStack

Continuation >> resume: returnValue nextContinuation: aContext
    | continuation |
    stack isNil ifTrue: [ ^self primitiveFailed ].
    continuation := stack.
    stack := aContext.
    thisContext parentContext: continuation.
    ^returnValue
yoghurt ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.