- 185 名前:デフォルトの名無しさん mailto:sage [2015/03/18(水) 00:49:30.65 ID:smUcV4wp.net]
- 関数だと引数は全部実行というか評価されてしまうが、
マクロでなんとでもなる (defmacro myif (pred good bad) (list 'if pred good bad)) もしくは略記法として (defmacro myif (pred good bad) `(if ,pred ,good ,bad)) とすると、 (myif t (insert "ok") (insert "ng")) と書ける。こうやってS式を返すような関数と同様にmyifを「マクロとして」定義すると、 (myif ...)というフォームはまず最初に「展開」されてから実行される。ここだと (if t (insert "ok") (insert "ng")) と最初から書いてあったのと同じことになって、 nbの部分は実行されないという寸法。これはつまらない例だが。 もうちょっと面白い例だと、 (defmacro awhen (pred &rest body) `(let ((it ,pred)) (when it ,@body))) とすると条件式の結果を本体(body)の中でitとして使えるとか (awhen "hogehoge" (message it)) special formとマクロの違いは組み込みかどうかぐらい。 こんな感じで色々制御構文を作ったり、遅延評価のを実装したりもできるが、 あんまり濫用すると自分でもわからなくなってくる諸刃の剣 長文御免
|

|