On Tuesday, December 30, 2003 12:39 PM, Ben Rudiak-Gould 
[SMTP:[EMAIL PROTECTED] wrote:
>
> With letrec and unrestricted call/cc you can implement ML-style refs:

With an *implementation of letrec that uses mutation* and unrestricted 
call/cc, you can implement ML-style ref cells:

Petite Chez Scheme Version 6.0a
Copyright (c) 1998 Cadence Research Systems

> (define-syntax letrec^
    (syntax-rules ()
      ((_ ((Var Exp)) Body Bodies ...)
       (let ((Y (lambda (f)
                  ((lambda (g) (f (g g)))
                   (lambda (g) (f (lambda (x) ((g g) x))))))))
         (let ((Var (Y (lambda (Var) Exp))))
           Body Bodies ...)))))

> (letrec^ ((fact (lambda (n) (if (zero? n) 1 (* n (fact (- n 1)))))))
    (fact 5))
120

> (define (make-cell)
    (call/cc
     (lambda (return-from-make-cell)
       (letrec^ ((state
                   (call/cc
                     (lambda (return-new-state)
                       (return-from-make-cell
                         (lambda (op)
                           (case op
                             ((set)
                              (lambda (value)
                                (call/cc
                                  (lambda (return-from-access)
                                    (return-new-state
                                      (list value 
return-from-access))))))
                             ((get) (car state)))))))))
         ((cadr state) 'done)))))

> (define c (make-cell))

> ((c 'set) 3)

> (c 'get)
3

> ((c 'set) 7)
done

> (c 'get)
3
_______________________________________________
Haskell mailing list
[EMAIL PROTECTED]
http://www.haskell.org/mailman/listinfo/haskell

Reply via email to