Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- (defstruct ro (value nil :read-only t))
- (defmacro immutable-let ((&rest bindings) &body body)
- (let* ((values (mapcar (lambda (binding) (list (gensym) `(make-ro :value ,(second binding)))) bindings))
- (immuts (mapcar (lambda (binding value) (list (first binding) `(ro-value ,(first value)))) bindings values)))
- `(let ,values
- (symbol-macrolet ,immuts ,@body))))
- (pprint (macroexpand-1 '(immutable-let ((x 42)
- (y (+ 2 3)))
- (setf x 33)
- (list x y))))
- (let ((#1=#:g42316 (make-ro :value 42))
- (#2=#:g42317 (make-ro :value (+ 2 3))))
- (symbol-macrolet ((x (ro-value #1#))
- (y (ro-value #2#)))
- (setf x 33)
- (list x y)))
- (immutable-let ((x 42)
- (y (+ 2 3)))
- (setf x 33)
- (list x y))
- (42 5)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement