基本的に怠Diary

学習ログを残したい

マクロ童貞

えーまじマクロ未使用?

マクロ未使用が許されるのは小学生までだよね。


話をしよう。

あれは今から数日前、Todoリストでも作ってやろうとか思ってた時の話でした。

私はいつものようにcl-dbiでDB処理を書いていました。

(defun update-task (id title contents priority)
  (let* ((query
          (dbi:prepare *db*
                       "update set title = ?,contents = ?,priority = ? where id = ?"))
         (result (dbi:execute query title contents priority id)))))

いつもの糞コード。

流石に三ヶ月以上Lispを触ってくると無駄にプライドがついてくるものです(残念ながら実力は…)

ここでふと、「マクロがすごい」とLisperはイカれたloopマクロのように繰り返していたことを思い出したので

私もなんとなくマクロを触ってみることにした。

SQL文はともかく、引数は可変的に処理したい。

引数をリストでまとめて渡せると良いのだが、

残念ながらそんなことできないようだ(もしかしたら、調べ方が足りなかったのかもしれない。)

一個ずつ調整するの面倒くさい・・・。

(defvar db-path "./todo.sqlite3")

(defvar *db*
    (dbi:connect :sqlite3
                 :database-name db-path))

(defmacro update-sql (sql &body body)
  `(dbi:execute (dbi:prepare ,*db* ,sql) ,@body))

;;利用例
(update-sql "insert into todo(title,contents,priority) values(?,?,?)"
            "update-sql-test" "test" 2)

それで試しに作ってみたのがこのupdate-sql

たった一行で簡単に抽象化できるとは思いませんでした。

ハッカー向けとはなるほどとなりました。私は使いこなせるまで何年費やせばよいのやら。

On Lispしっかり読んでもう少しまともに使えるようにしないと