История изменений
Исправление LeninGad, (текущая версия) :
Поднять typecase наружу из циклов бывает полезно, и компилятор сам едва ли сообразит (допустим, он инлайнит, но тип аргумента в этой точке не виден).
Helper macro для такого поднимания можно нарисовать, например, так:
(defmacro with-types ((varname &rest types) &body body)
`(etypecase ,varname
,@(loop for type in types
collect `(,type (let ((,varname (the ,type ,varname)))
,@body)))))
...
(defun bar ()
(declare (optimize (speed 3)))
(let ((a (foo)))
(with-types (a fixnum float t)
(+ a 1))))
Я бы в такой ситуации код писал по-человечески, а в нужных местах добавил define-compiler-macro и уж в нём бы извращался.
Исходная версия LeninGad, :
Поднять typecase наружу из циклов бывает полезно, и компилятор сам едва ли сообразит (допустим, он инлайнит, но тип аргумента в этой точке не виден).
Helper macro для такого поднимания можно нарисовать, например, так:
(defmacro with-types ((varname &rest types) &body body)
`(etypecase ,varname
,@(loop for type in types
collect `(,type (let ((,varname (the ,type ,varname)))
,@body)))))
...
(defun bar ()
(declare (optimize (speed 3)))
(let ((a (foo)))
(with-typed (a fixnum float t)
(+ a 1))))
Я бы в такой ситуации код писал по-человечески, а в нужных местах добавил define-compiler-macro и уж в нём бы извращался.