Alan@AI.AI.MIT.EDU (02/09/88)
(define (make-cell) (call-with-current-continuation (lambda (return-from-make-cell) (letrec ((state (call-with-current-continuation (lambda (return-new-state) (return-from-make-cell (lambda (op) (case op ((set) (lambda (value) (call-with-current-continuation (lambda (return-from-access) (return-new-state (list value return-from-access)))))) ((get) (car state))))))))) ((cadr state) 'done)))))
bard@THEORY.LCS.MIT.EDU (Bard Bloom) (02/09/88)
Date: Mon, 8 Feb 88 17:44:38 EST From: Alan@AI.AI.MIT.EDU Sender: JAR@AI.AI.MIT.EDU (define (make-cell) (call-with-current-continuation (lambda (return-from-make-cell) (letrec ((state (call-with-current-continuation (lambda (return-new-state) (return-from-make-cell (lambda (op) (case op ((set) (lambda (value) (call-with-current-continuation (lambda (return-from-access) (return-new-state (list value return-from-access)))))) ((get) (car state))))))))) ((cadr state) 'done))))) What the hey is this?
evan@russell.STANFORD.EDU (Evan Kirshenbaum) (02/10/88)
In article <8802090251.AA01964@RAVEN.LCS.MIT.EDU> bard@THEORY.LCS.MIT.EDU (Bard Bloom) writes:
]
] Date: Mon, 8 Feb 88 17:44:38 EST
] From: Alan@AI.AI.MIT.EDU
] Sender: JAR@AI.AI.MIT.EDU
]
] (define (make-cell)
] (call-with-current-continuation
] (lambda (return-from-make-cell)
] (letrec ((state
] (call-with-current-continuation
] (lambda (return-new-state)
] (return-from-make-cell
] (lambda (op)
] (case op
] ((set)
] (lambda (value)
] (call-with-current-continuation
] (lambda (return-from-access)
] (return-new-state
] (list value return-from-access))))))
] ((get) (car state)))))))))
] ((cadr state) 'done)))))
]
]
]
]What the hey is this?
A side-effect-free value cell (I think). Cute. For those who take
the trouble to walk through it, I think that last call should be to
(caddr state) [the return-from-access continuation].
Now can you do it without consing?
---
Evan Kirshenbaum
Stanford University
evan@CSLI.STANFORD.EDU
...!ucbvax!russell.stanford.edu!evan
duba@iuvax.cs.indiana.edu (02/25/88)
;; This is how we would write the "set!-free" make-cell in Scheme ;; extended with the F-operator and prompts (see Felleisen POPL88). (define (make-cell) (# (rec state (F (lambda (set-state) (lambda (op) (case op [(get) state] [(set) set-state]))))))) ;; Now with just F (define (make-cell) (F (lambda (return-cell) (rec state (F (lambda (set-state) (return-cell (lambda (op) (case op [(get) state] [(set) set-state]))))))))) ;; Of course what this code shows is that in a language with call/cc or F ;; either rec and letrec must be considered side-effects, or they must ;; be fixed so that it is not possible to find out that they are ;; implemented with side-effects. ;; Bruce Duba and Matthias Felleisen