- 197 名前:デフォルトの名無しさん mailto:sage [2015/03/19(木) 10:18:55.55 ID:KVeBWceY.net]
- >>195
力技というほどのものでもなかった (put t 'cdrif-value #'car) (put nil 'cdrif-value #'cadr) (defun convert (x) (get x 'cdrif-value)) (defmacro my-if (idx good bad) (funcall (convert idx) (list good bad))) いや、本当はさらに (put nil 'convert-value t) (defun to-t-or-nil (x) (not (ignore-errors (get x 'convert-value)))) (defun convert (x) (get (to-t-or-nil x) 'cdrif-value)) とかいう力業っぽいことを考えてたんだけども、 ignore-errors が反則だったと気づいた。 こっちの反則版だとnil以外のどんな値を渡しても ちゃんとt扱いされるという利点はあるけど… C/C++プリプロセッサ、そういうことか。条件付きコンパイルを想像していた。 #define DEBUG(level) if(level>=verbosity){printf(_VA_ARGS_);} みたいなことは一回やったことがある。 完全に文字列として変形するからlevelのところに関数呼び出しのコンマがあると 変なことになるという罠があるが、こういう用途だと大丈夫だしね。 自由度という点では何も考えずに言語全体を使えるlispマクロは特異に高いと思う。 elispじゃなくてcommon lispになっちゃうがland of lispとか読むと楽しいかもしれない。
|

|