なぜLISPで独自言語が作れるのか

Lispマクロの基本構文

アイデア

マクロの実装するための構文がおぼえられないので、自分が理解しやすい書き方でマクロを定義する必要があるのではないだろうか?

自分の言葉で表現するためのマクロを量産したい。が、LISPに慣れていないと、以下の文法が頭に入ってこないので、大勢の人が脱落してしまうだろう。ちょっと見てみようか。以下に文法を示す

マクロ定義の基本形

defmacro マクロ名 (引数リスト) 本体

引数リストで使える特殊記号

これを見た直後は覚え得られるだろうが、2週間たった後でおもいだせるだろうか?

それよりは、すでに覚えている言葉、もしくは、自然にとっつきやすい言葉であれば、2週間後でも理解できるのではないだろうか?

以下の記号になると、暗記が必要になる。数は多くないがいずれなれるのだと思うが、マクロを使って自分にとっては、とっつきやすい単語に置き換えたほうがよい。しかし、十人十色、それぞれが自分のマクロを作れればの話だ。

依然として、以下のような記法よりも良い方法があるはずである。

バッククォート記法

バッククォートの例

(let ((x 5) (lst '(2 3)))
  `(1 ,x ,@lst))
;; => (1 5 2 3)

実践的なマクロ例

(defmacro my-when (condition &rest body)
  `(if ,condition
       (progn ,@body)))

展開例

;; マクロ使用
(my-when (> x 0)
  (print "正の数")
  (print x))
;; 展開結果
(if (> x 0)
    (progn 
      (print "正の数")
      (print x)))

マクロ展開の注意点

マクロ使用時のデバッグ

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS