Scheme
Guile

[Guile] スクリプトをコマンドラインから実行して code coverage をとる方法

More than 1 year has passed since last update.

Guile のマニュアルによると,次のようにすると code coverage がとれるとある

(use-modules (system vm coverage)
             (system vm vm))

(call-with-values (lambda ()
                    (with-code-coverage
                      (lambda ()
                        (do-something-tricky))))
  (lambda (data result)
    (let ((port (open-output-file "lcov.info")))
      (coverage-data->lcov data port)
      (close file))))

(最後の (close file)(close port) の間違いと思われる)

REPLから上記コードを実行すると確かにデータがとれる.

しかし,このコードを使ってスクリプトファイルを作り

guile -s script.scm

としても生成される lcov.info の中の coverage データはすべて 0 になっている.

試行錯誤の結果,次のようにしたらデータがとれた.まず上記のコードを関数に入れてスクリプトの関数の形にする.

(define (main . args)
  上記のコード
  (exit 0))

コマンドラインから次のように実行する.

guile -l script.scm -e main

追記

with-code-coverage は version 2.0 と 2.2 でパラメータが異なるので注意.