10

次のようなファイルがあるとします

#lang racket/base
(define (hello) (print "Hello"))
... more definitions ...

ファイルに定義をロードして、(X)REPL でインタラクティブに作業したいと考えています。それ、どうやったら出来るの?

(X)REPL と を開始すると(load "/tmp/hello.rkt")hello関数は使用できなくなります。

-> (hello)
; hello: undefined;

I の場合(require (file "/tmp/hello.rkt"))、結果は同じです。今ではでき (enter! (file "/tmp/hello.rkt"))(hello)動作しますが、これはむしろ... 直感的ではなく、初心者には不向きです。

これは実際にこれを行うべき方法であり、モジュールと名前空間を読んでコードを簡単に参照して実験する必要がありますか、それとも見落としている簡単な方法はありますか?

注意:コマンドライン経由でファイルをラケットにロードするにはどうすればよいですか? 、しかしそれはファイルを実行する方法を説明するだけです。REPLにロードする方法ではないため、特定の定義をテスト/デバッグしてから、編集、リロードなどを行うことができます.

4

2 に答える 2

12

で始まるファイル#langはモジュールなので何もしませんload。(実際には何かを行いますが、おそらく役に立たないでしょう。)load完全に使用するのを避けるのが本当に最善です。ただそこにないふりをしてください。

今、使用するrequireことは正しいことですが、それはモジュールをインスタンス化し、それが提供する名前にアクセスできるようにすることです。あなたの場合、何も提供しなかったため、hello. これを行うには、ファイルに追加でき(provide hello)ます。しかし、コードをデバッグしたいように見えるので、それはおそらくあなたが望むものではありません。provide(つまり、何かに取り組むためだけにモジュールのすべてを使いたくないでしょう。)

したがって、使用するのに適しているenter!のは です。または、xrepl を使用している場合は、より便利な,enコマンドがあります。これにより、モジュールがインスタンス化され、repl がモジュールの名前空間を使用するようになるため、すべてにアクセスできます。(また、その必要はありませんloadrequire) コードを変更した場合は、コードをリロードするために複数回使用することもできます。ただし、いくつかの問題があったため、ナイトリー ビルドをインストールして使用する必要がある場合があることに注意してください。

最後に、ご存知かもしれませんが、DrRacket を使用すると、一般的に物事がはるかに簡単になります。

于 2013-02-16T18:06:20.880 に答える
3

ファイルの先頭にを置くことは#lang racket/base、ファイルをモジュール形式としてマークすることです(これは#langの省略形です)。(file "/tmp/hello.rkt")したがって、ファイルをロードすることは、そのパスが必要なときに発見したように、のモジュール定義を追加するだけです。

一連の定義を試してインタラクティブにロードしてみたい場合は、ファイルの先頭からを削除してみてください。#lang racket/baseこれを「ラケットトップレベル」(rktl)ファイルのペアで説明します。

% cat hello-unhashed.rktl
(define (hello) (print "Hello") (newline))
% cat hello2-unhashed.rktl
(define (hello) (print "Hello2") (newline))
% racket
Welcome to Racket v5.3.2.
> (load "hello-unhashed.rktl")
> (hello)
"Hello"
> (load "hello2-unhashed.rktl")
> (hello)
"Hello2"
> (load "hello-unhashed.rktl")
> (hello)
"Hello"
> (exit)
% 

上に示した方法でトップレベルで作業する場合、多くの落とし穴があることに注意してください。私が話していることを理解するには、「ラケットのトップレベルは絶望的です」または「pltスキームのトップレベルは絶望的です」をグーグルで検索してみてください

于 2013-02-16T12:00:20.963 に答える