ブログ用のCSSをちょっといじってみた。pandocで出力されるHTMLファイルには勝手にCSSクラス名を付けてくれるので、それに合わせてCSSファイルを書けば色が付くのだが、全部自分でやったらかかる手間は並大抵のものではない。
せっかく自分のサイトなので出来合いのものではなく自作しようと決めたものの、でもブラウザ間の差は埋めるべきだと思ったのでnormalize.css をまず採用した。
あとはまあ色々調べながら適当に。コードブロックは普段僕が使ってるターミナルみたいに黒い背景の色にしてみた。せっかくなのでHaskellのコードブロックについてはちょっと色も付けてみた。いつも使っているVimのシンタックスハイライトと同じ色合いに。最初のブログ記事が一番よく違いが出ていると思う。
…と思ってこの記事を読み返したら色の付き方が思ってたのと違う!出力する CSSクラス名を修正しないと直せないから100%狙い通りの色付けを行うのは困難を極めそうだ。
この前作ったラムダ計算のプログラムでちょっと自信のないところがあったので単体テストを作成することにした。Haskellのビルドツールであるcabalでは test-suiteスタンザを記述することでテストを置くことができるが、テスト対象のモジュールをインポートして使いたいならexecutableじゃなくて libraryにしなければならない(privateでも可)。
例えば、最初の状態がexecutableしかない構成の場合:
-- foo.cabal
-- 前略
executable foo
main-is: Main.hs
other-modules: Foo
build-depends: base >=4.13 && <=4.14
hs-source-dirs: src
default-language: Haskell2010
ghc-options: -Wall -threaded
この場合、まずexecutable fooスタンザをlibrary化した後に、 test-suiteスタンザを加えると上手くいく:
-- foo.cabal (修正後)
-- 前略
library -- (1)
exposed-modules: Foo.Foo
Foo.Main -- (2)
build-depends: base >=4.13 && <=4.14
hs-source-dirs: src
default-language: Haskell2010
ghc-options: -Wall
executable foo
main-is: src/foo.hs -- (3a)
-- other-modules:
build-depends: foo, base -- (4a)
-- hs-source-dirs: -- (3b)
default-language: Haskell2010
ghc-options: -Wall -threaded
test-suite unittest
type: exitcode-stdio-1.0
main-is: Main.hs
other-modules Foo.FooSpec
build-depends: foo, base -- (4b)
, QuickCheck
, hspec
hs-source-dirs: test/unittest
default-language: Haskell2010
ghc-options: -Wall
ポイントがいくつかある。
(1): libraryというキーワードの後に名前を書かない場合はpublicライブラリ(通常のライブラリ)に、名前を書く場合はprivateライブラリになる。今後Hackageにうpしたいかどうかによって変わるが、そのつもりがないならどちらでもOK。
(2): executableスタンザにあったMainモジュールをまるごとライブラリに移動してしまうのが手っ取り早くておすすめ。そうしたらexecutableの方のMainモジュールはこれだけになる:
import qualified Foo.Main
main :: IO ()
main = Foo.Main.mainHackageにうpする場合はmain関数がライブラリに残っているのは不格好かもしれない。
(3a) (3b): libraryとexecutableのhs-source-dirは同じにしてはいけない。同じにしてしまうと2度コンパイルされてしまう。 executableのファイル名は上記(2)に従うならファイル一枚になるので、名前は適当でいい。
(4a) (4b): executableとtest-suiteはライブラリ(foo)と同じ baseパッケージを必ず使用するので、バージョンの範囲を指定する必要はない。
なるべく手間を減らし、かつcabalをきれいに使うやり方だと自分で思っているけどやはりめんどくさい。。。executableを直接test-suiteの build-dependsに書いてインポートできるようになってくれないだろうか。結構よくある用途な気がするんだが……