Plaster
New
List
Login
common-lisp
default
anonymous
2023.10.13 14:43:24
(defmacro tmlet ((name lambda-list &body body) &body mlet-body &environment env) (let ((transfer (gensym "MLET-TRANSFER"))) `(macrolet ((,transfer (&rest args &environment env) (funcall ,(macro-function name env) `(,',name ,@args) env)) (,name ,lambda-list (let ((,name ',transfer)) ,@body))) ,@mlet-body))) (defmacro ct (var) `(error "~A doesn't have compile time value" ',var)) (defmacro ctlet (bindings &body body &environment env) `(tmlet (ct (var) (case var ,@(loop for (var value) in (mapcar #'alexandria:ensure-list bindings) collect `(,var ',(if (constantp value env) ;; fixed - now it doesn't fail with "sbcl bug" if value is not constant '(sb-ext::eval-in-lexenv value env) `(error "~S is not a constant expression" ',value)))) (t `(,ct ,var)))) ,@body))
Raw
Annotate
Repaste
Edit