3

私が取っているクラスでは、Scheme の古い R5RS 標準を使用して SICP 割り当てを解決しています。私はテスト ファーストの開発を行うのが好きなので、単体テスト フレームワークが適していると判断し、小規模なテストを作成するために SchemeUnit を選択しました。

これはこれまでのところうまく機能しており、出力のプリミティブ (文字列、数値など) をテストするだけですが、リストをテストしようとすると障害が発生しました。これはおそらく、テストの実行に使用される Scheme ダイアレクトの違いと関係があります。

foo.scm: (define a-list (list 2))

foo-tests.scm: (check-equal? a-list (list 2))

テストを実行したときの結果:

Unnamed test 
FAILURE
name:       check-equal?
location:   tester.scm:22:3
actual:     {2}

expected:   (2)

テスト スイートを実行するには"#lang scheme/base 、foo-tests.scm とrequireschemeunit パッケージの先頭に追加する必要があります。foo.scm には、上部に#lang r5rsandが必要です。(#%provide (all-defined))

R5RS と "scheme/base" では、リストの実装が何らかの形で異なっていると思います。それらを連携させる方法はありますか?そして、なぜ失敗するのですか ({} vs ())?

4

1 に答える 1

4

はい、お気づきのように、リストは#lang r5rsvsで異なる方法で実装されています#lang scheme/base。r5rs でテストを書くことができれば、foo-tests.scm混乱の可能性を排除するのに役立ちます。

foo-tests.scmこれをファイルの先頭に置くことで、これを行うことができるはずです。

#lang r5rs

(#%require schemeunit)
(#%require "foo.scm")

;; Now you can add your tests here:
(check-equal? a-list (list 1 2 3))

テスト スイートが同じ言語で記述されている場合、構成要素 --- 特にリストの表現 --- が一致する必要があります。上記のテストは成功するはずです。

r5rsリストと#lang scheme(および)のリストの違いを詳しく説明するには、#lang racketRacket は不変のコンスペアを使用してリストを表します。set-car!不変のコンスペアは r5rs のand関数をサポートしていないため、組み込みの不変のペアを使用する言語set-cdr!の標準に忠実ではありません。#lang r5rsr5rs 標準をサポートするために、Racket には個別の変更可能なペアのデータ型が含まれており、r5rs 内で一貫して使用されます。しかし、Racket の標準的なペアと変更可能なペアが等しく比較されないことを意味します。

于 2013-02-17T21:04:00.147 に答える