#| stackoverflow.com/questions/34299077/
execute-following-call-cc-exp/34314930#34314930
(let/cc done
((let/cc esc
(done (+ 1 (let/cc k
(esc k)))))
3)) ==>
|#
(print
(prog (retval done arg1 func esc arg2 k arg3 arg4)
(setq done (lambda(x) (setq retval x) (go DONE)))
(setq arg1 3)
(setq esc (lambda(x) (setq func x) (go ESC)))
(setq arg3 1)
(setq k (lambda(x) (setq arg4 x) (go K)))
(setq arg4 (funcall esc k))
(/ 0 0)
K
(setq arg2 (+ arg3 arg4))
(setq func (funcall done arg2))
(/ 0 0)
ESC
(setq retval (funcall func arg1))
DONE
(print retval) ; normally, (return retval) should be used
))
#| stackoverflow.com/questions/16529475/
scheme-continuations-for-dummies/16531429#16531429
(prog (k retval)
(setq k (lambda (x) ;; capture the current continuation:
(setq retval x) ;; set! the return value
(go EXIT))) ;; and jump to exit point
(setq retval ;; get the value of the last expression,
(progn ;; as usual, in the
;;;;;;;;;;;;;;;;
(* 5 (funcall k 4)) ;; body of code
;;;;;;;;;;;;;;;;
))
EXIT ;; the goto label
(print retval))
|#
I3wgc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzM0Mjk5MDc3LwogICAgICAgZXhlY3V0ZS1mb2xsb3dpbmctY2FsbC1jYy1leHAvMzQzMTQ5MzAjMzQzMTQ5MzAKCiAgICAobGV0L2NjIGRvbmUKICAgICAgKChsZXQvY2MgZXNjCiAgICAgICAgIChkb25lICgrIDEgKGxldC9jYyBrCiAgICAgICAgICAgICAgICAgICAgICAoZXNjIGspKSkpKQogICAgICAgMykpID09Pgp8IwoocHJpbnQKIChwcm9nICAocmV0dmFsIGRvbmUgYXJnMSBmdW5jIGVzYyBhcmcyIGsgYXJnMyBhcmc0KQogICAgKHNldHEgZG9uZSAobGFtYmRhKHgpIChzZXRxIHJldHZhbCB4KSAoZ28gRE9ORSkpKQogICAgIChzZXRxIGFyZzEgMykKICAgICAgKHNldHEgZXNjICAobGFtYmRhKHgpIChzZXRxIGZ1bmMgeCkgKGdvIEVTQykpKQogICAgICAgKHNldHEgYXJnMyAxKQogICAgICAgIChzZXRxIGsgIChsYW1iZGEoeCkgKHNldHEgYXJnNCB4KSAoZ28gSykpKQogICAgICAgIChzZXRxIGFyZzQgKGZ1bmNhbGwgZXNjIGspKQogICAgICAgICgvIDAgMCkKICBLCiAgICAgICAoc2V0cSBhcmcyICgrIGFyZzMgYXJnNCkpCiAgICAgIChzZXRxIGZ1bmMgKGZ1bmNhbGwgZG9uZSBhcmcyKSkKICAgICAgKC8gMCAwKQogIEVTQwogICAgIChzZXRxIHJldHZhbCAoZnVuY2FsbCBmdW5jIGFyZzEpKQogIERPTkUKICAgIChwcmludCByZXR2YWwpICA7IG5vcm1hbGx5LCAocmV0dXJuIHJldHZhbCkgc2hvdWxkIGJlIHVzZWQKICApKQogIAojfCBzdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTY1Mjk0NzUvCiAgICAgICBzY2hlbWUtY29udGludWF0aW9ucy1mb3ItZHVtbWllcy8xNjUzMTQyOSMxNjUzMTQyOQoKKHByb2cgKGsgcmV0dmFsKQogICAgKHNldHEgayAobGFtYmRhICh4KSAgICAgICAgICAgICA7OyBjYXB0dXJlIHRoZSBjdXJyZW50IGNvbnRpbnVhdGlvbjoKICAgICAgICAgICAgICAgICAgICAoc2V0cSByZXR2YWwgeCkgOzsgICBzZXQhIHRoZSByZXR1cm4gdmFsdWUKICAgICAgICAgICAgICAgICAgICAoZ28gRVhJVCkpKSAgICAgOzsgICBhbmQganVtcCB0byBleGl0IHBvaW50CiAgICAoc2V0cSByZXR2YWwgICAgICAgICAgICAgICAgICAgIDs7IGdldCB0aGUgdmFsdWUgb2YgdGhlIGxhc3QgZXhwcmVzc2lvbiwKICAgICAgKHByb2duICAgICAgICAgICAgICAgICAgICAgICAgOzsgICBhcyB1c3VhbCwgaW4gdGhlCiAgICAgICAgIDs7Ozs7Ozs7Ozs7Ozs7OzsKICAgICAgICAgKCogNSAoZnVuY2FsbCBrIDQpKSAgICAgICAgOzsgYm9keSBvZiBjb2RlCiAgICAgICAgIDs7Ozs7Ozs7Ozs7Ozs7OzsKICAgICAgICAgKSkKICBFWElUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOzsgdGhlIGdvdG8gbGFiZWwKICAgIChwcmludCByZXR2YWwpKQp8Iw==