1

R3 Alpha 99セッションを起動し、これを最初のコマンドとして入力すると、エラーが発生します。

>> is-email-addr: get bind to-word "email?" bind? 'system
** Script error: email? is not in the specified context
** Where: bind
** Near: bind to-word "email?" bind? 'system

email?しかし、終了して再起動し、代わりにテストを実行して、プリミティブがオブジェクトのようなグローバルコンテキストに存在することを証明するとsystem、テスト自体によってエイリアスが機能します。

>> equal? bind? 'system bind? 'email?
== true

>> is-email-addr: get bind to-word "email?" bind? 'system
>> is-email-addr fork@example.com
== true

何が起きてる?

4

2 に答える 2

5

バインドは、指示しない限り、コンテキストに単語を追加しません。使用する必要がありますbind/new

>> get bind/new to-word "email?" bind? 'system

しかし、あなたの質問は、R3 バインディング モデルに関するいくつかの誤解を示しています。R2 とは異なり、R3 には単一のグローバル コンテキストはありません。例の単語'systemは、ユーザー コンテキストとも呼ばれるタスク ローカルの共有スクリプト コンテキストにバインドされています。また、ユーザー コンテキストで単語の適切な値を取得するには、多くの場合、システム コンテキストからそれらをインポートするか、ロードされたモジュールをエクスポートする必要があります。これは単語のインターンと呼ばれるプロセスです。

ここで明らかにやりたいことを行うには、次internのように を使用するのが最善です。

>> get first intern to-block "email?"

to-blockが使用されるのinternは、通常、コードのブロック全体を操作するために使用されるためです。次のバージョンで修正して、単語でも直接動作できるようにします。その後、これを行うことができます:

>> get intern to-word "email?"

これが役立つことを願っています。

なぜ直接言葉を使わないのですか?文字列を使用して後で単語に変換すると、通常は不要なオーバーヘッドが非常に大きくなります。

于 2010-06-19T19:59:28.313 に答える
1

本当に「メール」を使いたいと思ったら?「email?」の代わりに文字列 その場合、奇妙さを観察せずにそこから単語を取得する最も簡単な方法は、次のように LOAD 関数を使用することです。

is-email-addr: get bind load "email?" bind? 'system
于 2010-06-20T07:20:51.607 に答える