#+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 件のコメント:
コメントを投稿