Skip to content

Instantly share code, notes, and snippets.

@DadgadCafe
Created March 26, 2017 03:32
Show Gist options
  • Save DadgadCafe/4e7166f4bfa703e1aee905fd1e969a10 to your computer and use it in GitHub Desktop.
Save DadgadCafe/4e7166f4bfa703e1aee905fd1e969a10 to your computer and use it in GitHub Desktop.
yin-yang problem.
;; detailed continuation usage, see previous gist: https://gist.github.com/DadgadCafe/07b0b50bf9537522fed09b3dc8df2784
(define call/cc call-with-current-continuation)
(let* ((yin
((lambda (cc) (display #\@) cc)
(call/cc (lambda (c) c))))
(yang
((lambda (cc) (display #\*) cc)
(call/cc (lambda (c) c)))))
(yin yang))
;; yang catches previous yin
;; yin becomes previous yang
'use strict'
// chain: ccYin -> yang -> cont -> ccYin(previous)
// obviously, Maximum call stack size exceeded
function makeYang (cont) {
ccYin = yang
function yang () {
console.log('*')
cont()
}
}
function yin () {
console.log('@')
makeYang(ccYin)
ccYin()
}
let ccYin = yin
ccYin()
@DadgadCafe
Copy link
Author

call/cc is a black hole, terminates once it is applied with parameter.

(
  (
    (call/cc (lambda (k) k))
    (lambda (k) k)
  )
  "HEY!"
)

;; STEP 1: REPLACE k with
(lambda ? (
  (? (lambda (k) k)) "HEY!"
))

;; call/cc is proc take one parameter
;; REPLACE (call/cc (lambda (k) k)) with k
(
  (
    K
    (lambda (k) k)
  )
  "HEY!"
)
=>
(
  K
  (lambda (k) k)
)
;; RESULT
(
  (lambda ? (
    (? (lambda (k) k)) "HEY!"
  ))
  (lambda (k) k)
)
=>
(((lambda (k) k) (lambda (k) k)) "HEY!")
=>
((lambda (k) k) "HEY!")
=>
"HEY!"



(let ([x (call/cc (lambda (k) k))])
(x (lambda (ignore) "hi")))
=>
K:
(lambda ?
  (let ([x ?])
  (x (lambda (ignore) "hi"))))
=>
(let ([x K])
(x (lambda (ignore) "hi")))
=>
(K (lambda (ignore) "hi"))
=>
((lambda (ignore) "hi") (lambda (ignore) "hi"))
=>
"hi"

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment