3

私は教授の一人からコードを再利用しなければならないプログラムを書いています。私のプログラムは Racket で書かれており、再利用したいコードは r6rs で書かれています。

プログラムをテストしようとすると、常に失敗します。これは、リスト(ラケット リスト)を引数としてプロシージャを呼び出すためですが、そのプロシージャは R6RS ファイルにあります。R6RS ファイルには があり(assert (list? argument))、これは常にfalse です...

ここに簡単な例があります: ラケットコード:

#lang racket
(require "test2.ss")

(define a (list 1 2 3))
(b a)

R6RS コード :

#!r6rs

(library 
 (test)
 (export b)
 (import (rnrs base (6))
         (rnrs control (6))
         (rnrs lists (6))
         (rnrs io simple (6)))

 (define (b a)
   (display "a is : ") (display a) (newline)
   (display "list? : ") (display (list? a)) (newline)))

R6RS ファイルのlist?テストは常に false です...上記の例のように、新しく作成されたリストを引数として渡しても。

list?テストの結果が真になるように、上記の例と同じことを行うにはどうすればよいでしょうか。

ご協力いただきありがとうございます!

編集: 不変リストで true になる r6rs テストが見つかりませんでしたが、問題を解決する別の方法を見つけました (可変リストをプロシージャに渡すことにより)。

4

3 に答える 3

3

ラケット ペアはスキーム ペアとは異なります。ラケット ペアは不変ですが、スキーム ペアは不変です。

私の知る限り、純粋な R n RS スキームで Racket の不変リストをチェックする方法はありません。ただし、Scheme の変更可能なリストを Racket で使用することは可能です (もちろん、それはあまりお勧めできません)。

#lang racket

(require compatibility/mlist
         "test2.ss")

(define a (mlist 1 2 3))
(b a)

のドキュメントcompatibility/mlistからの抜粋を次に示します。

このcompatibility/mlistライブラリは、可変リストのサポートを提供します。サポートは、主に Lisp/Scheme コードを Racket に移植するために提供されます。

最新の Racket コードに変更可能なリストを使用することは強くお勧めしません。代わりに、リストの使用を検討してください。

それでも、Scheme コードを操作する必要がある場合は、おそらくそれが唯一の合理的な選択肢です。

于 2015-03-10T20:12:07.043 に答える
2

あなたのコードがRacketで書かれていると言うとき。Racket、ソフトウェア、または#!racket、Racket (ソフトウェア) がサポートする複数の互換性のある言語の 1 つを意味しますか?

ライブラリは で記述されているため、モジュール#!r6rsに移植するか、メイン プログラムを で記述してライブラリをそのまま使用できます。3 番目のオプションは、変更可能なリストを作成してライブラリ関数に渡し、元に戻すか、リストをすべて一緒に禁止することですが、このオプションはやや最適ではないと思います。#!racket#!r6rs

完全に行うには#!r6rs、次のようにライブラリをインストールする必要があります。

plt-r6rs --force --install ./test.sls

test.sls現在のディレクトリにあると仮定します。確認が届きます。DrRacket を再起動する必要はありません。(強制は必要ありませんが、以前のバージョンを上書きします。) 次に、コードを Scheme コードに変更します。

#!r6rs
(import (rnrs)
        (test))

(define a (list 1 2 3))
(b a) ; #<void> (and prints stuff to stdout)

DrRacket で [実行] を押して、魔法を見てみましょう!

于 2015-03-10T20:38:39.210 に答える