Hatena::Groupcadr

わだばLisperになる このページをアンテナに追加 RSSフィード

2004 | 12 |
2005 | 01 | 02 | 07 | 10 | 11 |
2006 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 11 |

2011-04-25

プロジェクトの最小セットを考えてみる

| 18:41 | プロジェクトの最小セットを考えてみる - わだばLisperになる を含むブックマーク はてなブックマーク - プロジェクトの最小セットを考えてみる - わだばLisperになる

Rubyの人達のように気軽にgithubにプロジェクトをぽんぽん作るにはどうしたら良いだろうか、と思ってプロジェクトの最小セットあれこれ考えてみています。

今回書いてみるのは、かなりイレギュラーながらテストを含めて3つのファイルで記述してみる試みです。

ファイル構成

  • package.lisp
    • パッケージの記述
  • project-name.asd
    • ファイルやライブラリの依存関係など記述
  • project-name.lisp
    • コード本体

中身

prnというArcのprnを真似たもの1つだけがあるプロジェクトを例にしてみます。

  • package.lisp
;;;; package.lisp

(defpackage #:prn
  (:export :prn))

(defpackage #:prn-internal
  (:use #:prn
        #:cl
        #:fiveam))
  1. prnがメインパッケージ。妙なところは、CLパッケージをuseしないところ。メインパッケージは、パッケージからエクスポートするシンボルを管理するだけです。
  2. prn-internalがコード上での本体。テストライブラリ/その他もこのパッケージにuseしてしまいます。メインパッケージのシンボルをuseすると便利っぽいのでuseしてみます。
  3. prn.asd
;;;; prn.asd

(in-package :asdf)

(defsystem #:prn
  :serial t
  :depends-on (#:fiveam)
  :components ((:file "package")
               (:file "prn")))

(defmethod perform ((o test-op) (c (eql (find-system :prn))))
  ;; テストするには本体をロードする必要がある
  (load-system :prn)
  ;; テスト実行
  (or (flet ((_ (pkg sym)
         (intern (symbol-name sym) (find-package pkg))))
        ;;
        (let ((result (funcall (_ :fiveam :run) (_ :prn :prn))))
          (funcall (_ :fiveam :explain!) result)
          (funcall (_ :fiveam :results-status) result)))
      ;; Tで抜けなかったらエラー
      (error "test-op failed") ))

テストが付属してくるプロジェクトでは、大抵メインと、メイン-testのような2つの構成になっていますが、一つにしてみます。

システムにasdf:performメソッドを用意してやることによって、 (asdf:test-system :prn)できるようにします。

中身がごちゃごちゃしてしまっているのは、asdファイルが本体よりも先に読まれるため読み込み時点ではまだ存在しないシンボルを踏まないようにするためです。

この部分でテストの実行関数を呼ぶことになります (上記では、 (fiveam:run) を呼んでいます)

  • prn.lisp
;;;; prn.lisp

(in-package #:prn-internal)

(def-suite prn)

(in-suite prn)

(defun prn (&rest args)
  (format *standard-output*
          "~{~A~}~%"
          args))

(test prn
  (is (string= "ABCD
"
               (with-output-to-string (*standard-output*)
                 (prn 'a 'b 'c 'd))))
  (is (string= "abcd
"
               (with-output-to-string (*standard-output*)
                 (prn "a" "b" "c" "d")))))

本体のコード。prn-internalパッケージ内で定義します。

テストもずらずら並べて書いてしまいます。上の例では、fiveamを利用。

注意する点は今回の場合メインパッケージをuseしているので、prn:prnであるということ。

ロード

(asdf:load-system :prn)

でロードでき、

(asdf:test-system :prn)

でテストが走ります。

(asdf:test-system :prn :force T)

で色々コンパイルしなおしながらテストを実行

色々とイレギュラーで、テストとコードがごっちゃになる、シンボルの扱いが若干複雑、等々問題はある気がしますが、書捨てコードの雛形にはこれでも良いかなあと考えています。

何かアイデア/問題ありましたら是非教えてください!

ゲスト



トラックバック - http://cadr.g.hatena.ne.jp/g000001/20110425