読者です 読者をやめる 読者になる 読者になる

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

私に教えられることなら

Common Lispでexpect-returns

ウルトラめんどくさがりニンゲンなのでとにかくコードをタイプしたくない。書きたいけどタイプはしたくない。繰り返しがいやなんじゃ。

というわがままを叶えるためにLispを使っているので、テスト書きでもその欲求を満たすべくいろいろ模索している。今のところリストに対して関数とマクロで操作するプログラムしか作っていないので、他のデータ構造のことは置いといて、関数とマクロのテストだけを考える。

前に作ったexpectは何度もexpect hoge to equalとタイプしなければいけないこと、同じ関数名も何度もタイプしないといけないこと、そのせいで見難くなっていることが不満になってきた。

それらの対策として作ってみた

phaendal/expect-returns · GitHub

以下のように、引数 => 返り値 と書ける。

(load "./expect-returns.lisp")

(expect + returns
  1 2     => 3
  3 4     => 7
  1 2 3   => 6
  1 2 3 4 => 5 ; failed
  (car '(1 2)) (cadr '(1 2)) => 3)

(expect (lambda (x) (* x x)) returns
  2 => 4
  3 => 9
  5 => 24) ; failed

(defmacro hogemac (x)
  `(+ ,x ,x))

(expect hogemac expanded
  1  => '(+ 1 1)
  a  => '(+ a a)
  'a => '(+ a a)) ; failed

(expect hogemac returns
  1 => 2
  2 => 4
  3 => 6)
  
(run-test)

実行結果

$ sbcl --script test.lisp
expected (+ 1 2 3 4) returns 5 but 10
expected ((LAMBDA (X) (* X X)) 5) returns 24 but 25
expected (HOGEMAC 'A) to be expanded '(+ A A) but (+ 'A 'A)
failed : 3
success: 11 of 14

そこそこ見やすい気もするけどどうだろう。使ってみないとわからないかな。

テストフレームワークの開発が一番活発なLisp方言ってどれだろう。Clojureかな?他の言語も参考にして一番書きやすくて見やすい表記を追求したい。

広告を非表示にする