2009年4月3日金曜日

[LISP]マクロのエイリアス

マクロ名の定義にも setf が使えるらしいことに気づいたのでメモ。 ついでに xyzzy だと macro-function に setf 出来ないので定義しておく。 たぶん間違ってるけど。 # xyzzy, CLISP-2.44 で確認
#+xyzzy (defsetf macro-function si:*fset)

(progn
  (setf (macro-function 'if-progn)
        (macro-function 'when))
  (list (if-progn t "てー")
        (if-progn nil "てー")))
;=> ("てー" NIL)

(progn
  (setf (macro-function '&&)
        (macro-function 'and))
  (list (&& t "てー")
        (&& nil "てー")))
;=> ("てー" NIL)

(progn
  (setf (macro-function 'mvbind)
        (macro-function 'multiple-value-bind))
  (mvbind (a b c)
      (values 1 2 3)
    (list a b c)))
;=> (1 2 3)
; #+xyzzy だと (macro-function 'multiple-value-bind) => nil となりエラー

(progn
  (setf (macro-function 'defconst)
        (macro-function 'defconstant))
  (defconst e (exp 1))
  (list e (multiple-value-list
           (ignore-errors (let ((e pi)) e)))))
;=> (2.7182817 (NIL #<SYSTEM::SIMPLE-SOURCE-PROGRAM-ERROR #x19EE7919>))

(progn
  (setf (macro-function '++)
        (macro-function 'incf))
  (let ((n 1))
    (list n (++ n) (++ n))))
;=> (1 2 3)

(progn
  (setf (macro-function 'fn)
        (macro-function 'lambda))
  (remove-if (fn (x) (zerop (mod x 3)))
             '(0 1 2 3 4 5 6 7 8 9)))
;-> *** - FUNCTION: (FN (X) (ZEROP (MOD X 3))) is not a function name; try using a symbol instead
; #+GCL ではエラーにならずに (1 2 4 5 7 8) を返す。…なんでだ?

0 件のコメント:

コメントを投稿