LINUX.ORG.RU

История изменений

Исправление 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 и уж в нём бы извращался.