Advertisement
Guest User

Untitled

a guest
Jun 18th, 2018
137
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 0.87 KB | None | 0 0
  1. (defstruct ro (value nil :read-only t))
  2.  
  3. (defmacro immutable-let ((&rest bindings) &body body)
  4. (let* ((values (mapcar (lambda (binding) (list (gensym) `(make-ro :value ,(second binding)))) bindings))
  5. (immuts (mapcar (lambda (binding value) (list (first binding) `(ro-value ,(first value)))) bindings values)))
  6. `(let ,values
  7. (symbol-macrolet ,immuts ,@body))))
  8.  
  9. (pprint (macroexpand-1 '(immutable-let ((x 42)
  10. (y (+ 2 3)))
  11. (setf x 33)
  12. (list x y))))
  13.  
  14. (let ((#1=#:g42316 (make-ro :value 42))
  15. (#2=#:g42317 (make-ro :value (+ 2 3))))
  16. (symbol-macrolet ((x (ro-value #1#))
  17. (y (ro-value #2#)))
  18. (setf x 33)
  19. (list x y)))
  20.  
  21.  
  22. (immutable-let ((x 42)
  23. (y (+ 2 3)))
  24. (setf x 33)
  25. (list x y))
  26.  
  27. (42 5)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement