#+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) を返す。…なんでだ?
2009年4月3日金曜日
[LISP]マクロのエイリアス
マクロ名の定義にも setf が使えるらしいことに気づいたのでメモ。
ついでに xyzzy だと macro-function に setf 出来ないので定義しておく。
たぶん間違ってるけど。
# xyzzy, CLISP-2.44 で確認
登録:
コメントの投稿 (Atom)
0 件のコメント:
コメントを投稿