3

スクリプト ヘッダーの Needs フィールドを処理するときの R3 の動作と、それが単語バインディングに与える影響について知りたいです。

バックグラウンド。現在、R3 を学習するために、いくつかの R2 スクリプトを R3 に移植しようとしています。R2 では、スクリプト ヘッダーの Needs フィールドは基本的に単なるドキュメントでしたが、スクリプトを実行するために必要なスクリプトを参照するカスタム関数と共に使用しました。

R3 は Needs 参照スクリプト自体を呼び出しているように見えますが、バインディングは他のスクリプトを実行するのとは異なるようです。

たとえば、%test-parent.r が次の場合:

REBOL [
    title: {test parent}
    needs: [%test-child.r]
]

parent: now
?? parent
?? child

%test-child は次のとおりです。

REBOL [
    title: {test child}
]

child: now
?? child

R3 Alpha (Saphiron ビルド 2013 年 2 月 22 日/11:09:25) は以下を返します。

>> do %test-parent.r
Script: "test parent" Version: none Date: none
child: 9-May-2013/22:51:52+10:00
parent: 9-May-2013/22:51:52+10:00
** Script error: child has no value
** Where: get ajoin case ?? catch either either -apply- do
** Near: get :name

test-parent が %test-child.r によって設定された Child にアクセスできない理由がわかりません

test-parent.r ヘッダーから Needs フィールドを削除し、代わりに DO %test-child.r だけの行を挿入すると、エラーは発生せず、スクリプトは期待どおりに実行されます。

4

1 に答える 1

2

ああ、あなたは Rebol 3 のポリシーに出くわしました。R3 のNeedsヘッダーはモジュール システムの一部であるため、ロードするものNeedsはすべて、モジュールとして宣言されていなくても、実際にはモジュールとしてインポートされます。

でスクリプトをロードするNeedsと、元の作成者がモジュールとして宣言していなくても、それらをモジュールとして扱う簡単な方法になります。モジュールは、単語が定義されている独自のコンテキストを取得します。スクリプトをモジュールとしてロードすることは、共有スクリプト コンテキストに単語を漏らしてしまうような整頓されていないスクリプトを使用するための優れた方法です。あなたの%test-child.rスクリプトのように、単語childをスクリプト コンテキストに漏らします。Needsorでロードするとimport、すぐにクリーンアップされます。

スクリプトをスクリプトとして扱いたい場合は、 を使用doして実行します。通常のスクリプトは (ほとんどの場合) 共有コンテキストを使用するためdo、スクリプトを実行すると、呼び出し元のスクリプトと同じコンテキストに影響します。child: nowこれが、ステートメントchildが親スクリプトに影響を与えた理由です。そのため、R3 でスクリプトがそのように機能するように懸命に取り組んだのはそのためです。

独自のスクリプトを使用Needsまたはimportロードする場合は、それらをモジュールにして、次のように必要なものをエクスポートすることもできます。

REBOL [
    type: module
    title: {test child}
    exports: [child]
]

child: now
?? child

以前と同様に、またはtype: moduleを使用する場合は を含める必要さえありませんが、モジュールを で実行する場合にのみ役立ちます。R3 は、モジュールをモジュールとして宣言した場合、それをモジュールとして記述し、それが で呼び出されたとしてもそのように動作することに依存していると想定します。少なくとも、ヘッダーを宣言することは、ヘッダーをまったく宣言しないことよりも強力なステートメントであるため、競合する「do what you say」状況では優先されます。Needsimportdodotypetype

モジュールシステムの仕組みの詳細については、ここを参照してください: Rebolモジュール内で単語はどのようにバインドされていますか?

于 2013-05-09T15:56:43.590 に答える