2010/10/05

(series::install) して (declare (optimizable-series-function)) する

(series::install) して (declare (optimizable-series-function)) すると下のコードのようにおもしろいことがおきる。

(series::install) で defun は SERIES::DEFUN になり、 (declare (optimizable-series-function)) で SERIES::DEFUN したものは、マクロ展開されてしまう。

始めて collect-xxx 系をマクロ展開してみたときの驚きは忘れられない。

(series::install)

(defun scan-string-bytes (string &optional (external-format :default))
(declare (optimizable-series-function))
(scan (sb-ext:string-to-octets string :external-format external-format)))

(scan-string-bytes "あいう")
;; => #Z(227 129 130 227 129 132 227 129 134)

(functionp #'scan-string-bytes)
;; => T
(macro-function 'scan-string-bytes)
;; => NIL
(macroexpand-1 '(scan-string-bytes "あいう"))
;; => (SCAN-STRING-BYTES "あいう")
;; NIL

(collect-first (scan-string-bytes "あいう"))
;; => 227

(macroexpand-1 '(collect-first (scan-string-bytes "あいう")))
;; => (COMMON-LISP:LET* ((#:OUT-940
;; (STRING-TO-OCTETS "あいう" :EXTERNAL-FORMAT :DEFAULT)))
;; (COMMON-LISP:LET (#:ELEMENTS-941
;; #:LISTPTR-938
;; #:TEMP-937
;; (#:LIMIT-936 0)
;; (#:INDEX-935 -1)
;; #:LSTP-934
;; (#:ITEM-933 NIL))
;; (DECLARE (TYPE LIST #:LISTPTR-938)
;; (TYPE SERIES::VECTOR-INDEX+ #:LIMIT-936)
;; (TYPE SERIES::-VECTOR-INDEX #:INDEX-935)
;; (TYPE BOOLEAN #:LSTP-934)
;; (TYPE (SERIES::NULL-OR T) #:ITEM-933))
;; (LOCALLY
;; (DECLARE (TYPE ARRAY #:TEMP-937))
;; (IF (SETQ #:LSTP-934 (LISTP #:OUT-940))
;; (SETQ #:LISTPTR-938 #:OUT-940
;; #:TEMP-937 #())
;; (LOCALLY
;; (DECLARE (TYPE ARRAY #:OUT-940))
;; (SETQ #:TEMP-937 #:OUT-940)
;; (SETQ #:LIMIT-936
;; (SERIES::ARRAY-FILL-POINTER-OR-TOTAL-SIZE #:OUT-940))))
;; (TAGBODY
;; #:LL-947
;; (IF #:LSTP-934
;; (PROGN
;; (IF (ENDP #:LISTPTR-938)
;; (GO SERIES::END))
;; (SETQ #:ELEMENTS-941 (CAR #:LISTPTR-938))
;; (SETQ #:LISTPTR-938 (CDR #:LISTPTR-938)))
;; (PROGN
;; (INCF #:INDEX-935)
;; (LOCALLY
;; (DECLARE (TYPE ARRAY #:OUT-940)
;; (TYPE SERIES::VECTOR-INDEX #:INDEX-935))
;; (IF (>= #:INDEX-935 #:LIMIT-936)
;; (GO SERIES::END))
;; (SETQ #:ELEMENTS-941
;; (THE SERIES::*TYPE*
;; (ROW-MAJOR-AREF #:OUT-940 #:INDEX-935))))))
;; (SETQ #:ITEM-933 #:ELEMENTS-941)
;; SERIES::END)
;; #:ITEM-933)))
;;T

0 件のコメント: