(in-package :cl-user) (defmacro read-only (place &optional name) (declare (ignore name)) place) (define-setf-expander read-only (place &optional (name place)) (error "You're not supposed to SETF ~S." name)) (defmacro letro (bindings &body body) (let ((gensyms (mapcar (lambda (x) (declare (ignore x)) (gensym)) bindings))) `(LET ,(mapcar (lambda (b g) `(,g ,@(if (consp b) (cdr b)))) bindings gensyms) (SYMBOL-MACROLET ,(mapcar (lambda (b g &aux (v (if (consp b) (car b) b))) `(,v (READ-ONLY ,g ,v))) bindings gensyms) ,@body)))) (defun foo () (letro ((a 42)) (incf a) ;<-- Generates compile-time error a))