Skip to content

Instantly share code, notes, and snippets.

@Nymphium
Created January 7, 2020 12:24
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Nymphium/0437e9529e7046e223383d70c8014c77 to your computer and use it in GitHub Desktop.
Save Nymphium/0437e9529e7046e223383d70c8014c77 to your computer and use it in GitHub Desktop.
(require control/racket)
; (% (+ (fcontrol 3) (fcontrol 4)) (λ (x k) (k (* x x))))
; ~> ((λ (x k) (k (* x x))) 3 (λ (y) (+ y (fcontrol 4))))
; ~> ((λ (y) (+ y (fcontrol 4))) 9)
; ~> (+ 9 (fcontrol 4))
; ~> %の外側に出ちゃたあ(正しい)
(let [(p (make-continuation-prompt-tag))]
(% (+ (fcontrol 3 #:tag p) (fcontrol 4 #:tag p)) (λ (x k) (k (* x x))) #:tag p))
; ~>* 25
; なぜ…
@Nymphium
Copy link
Author

Nymphium commented Jan 7, 2020

(struct spwn (val p) #:prefab #:extra-name Spwn)

(define (fcontrol-at p v)
  (fcontrol (spwn v p)))

(define (%-at p th handler)
  (% (th) (λ (x k)
          (match x
            [(Spwn v p~) #:when (eqv? p p~)
                         (handler v k)]
            [(Spwn v p~) (%-at p (th) (fcontrol-at p~ v) handler)]))))

@Nymphium
Copy link
Author

Nymphium commented Jan 7, 2020

(define (%-at p th handler)
  (% (th) (λ (x k)
          (match x
            [(Spwn v p~) #:when (eqv? p p~)
                         (handler v k)]
            [(Spwn v p~)
             (let [(res (fcontrol-at p~ v))]
               (%-at p (λ () (k res)) handler))]))))

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