レガシーコード生産ガイド

私に教えられることなら

続 Common Lispで遊ぶためにexpectを作って遊ぶ

Common Lispで遊ぶ為にテストフレームワークを作って遊ぶ - レガシーコード生産ガイド

これの続きを作って、githubにアップしてみた。

(load "expect.lisp")

(defun last-elm (x)
  (cond
    ((null x) nil)
    ((atom x) x)
    ((null (cdr x)) (car x))
    (t (last-elm (cdr x)))))

(expect (last-elm '(3 4)) to eq 4)
(expect (last-elm '(2))   to eql 2)
(expect (last-elm '())    to equal nil)
(expect (last-elm 2)      to eq 2)
(expect (last-elm '(5 6)) not to eq nil)
(expect (last-elm '(3 4)) to eql 3) ; fail

(defmacro test-macro-for-expand (x)
  `(setq ,x 1))

(expect '(test-macro-for-expand a) to be once expanded to '(setq a 1))
(expect '(test-macro-for-expand a) to be expanded to '(setq a 1))

(run-test)

; => fail: (EXPECT (LAST-ELM '(3 4)) TO EQ 3 BUT 4)
;    success: (7 OF 8)

今のところ

to eq
to eql
to equal
to expanded to (macroexpand)
to once expanded to (macroexpand-1)

が使える。 もうひとつ、to throwでエラーを捕まえたかったんだけど、今日はギブアップ。

On Lispも届いたし、これを使ってLispの本を進めていきたい。 まずは初めての人のためのLISPを…と思ってたけどものすごく難しい気がする。並行してLands of lispとか読もうかな。

感想

  • 少しだけ探してみたけど、Common Lispでのexpect系のテストフレームワーク見つからなかった。みんなあんまり好きじゃないのかな
  • マクロで短くしていくのは凄く楽しいんだけど、出来上がったコードみて保守できる自信が無くなった。何か指針を見つけたい
  • 実力不足でマクロにできなかった繰り返しがとても悔しい。
  • 名前でものすごく悩む
  • Lispでの美しいコードを読んで学びたいと思った。

おねがい

英語やコードのミスの指摘・アドバイスをガンガン投げて欲しい。

広告を非表示にする