3

私は J のスコープの専門家ではないので、間違いがあれば訂正してください。(実際、それがこの質問の理由の一部です。)

私がやりたいことは、ロケール(ただし、ロケールなしではない) に表示される名前を作成することです。with を割り当ててもこれ達成され=.ないことに注意してください。

これは無理だと思いますが、Jの専門家からの確認が欲しいです。

Eelvex の回答を見て、質問を明確にする必要があると感じました。これが私が望むものです:ロケール内ではグローバルであるが、ロケール外では見えない名前が必要です。名前を知っていて、ロケール接尾辞で修飾したとしても、OOP のクラスのプライベート メンバーとまったく同じです。

privateロケール内で名前を非公開にするJ 動詞 called を想像してみましょう。

cocurrent 'foo'
x =: 3
private 'x' NB. x is still visible to all members of _foo_, but cannot be accessed in any way outside of _foo_
bar =: 3 : 'x & *'
cocurrent 'base'

bar_foo_ 14 NB. This works, because bar_foo_ can see x_foo_
x_foo_ NB. value error. We can't see x_foo_ because it's private to the locale.
4

2 に答える 2

2

編集(OPの編集後)

いいえ、名前を隠すことはできません。エンティティがロケールで表示される場合、すべてのロケールからアクセスできます。私の知る限り、本当にプライベートな名前は=.、明示的な:定義内で定義された名前だけです

プレビューの回答:

すべての名前は、ロケール(ただし、ロケールなしでは表示されません)で表示されます。例えば:

  a_l1_ =: 15
  a_l2_ =: 20
  coclass 'l1'
  a
15
  coclass 'l2'
  a
20
  coclass 'base'
  a
|value error: a
于 2013-01-19T01:33:38.200 に答える
1

簡単な答え: はい、現在の実装では不可能です。

長い回答: おそらく、ロケールはクラスまたはオブジェクトの公開部分であると考える必要があります (ただし、ロケールは、スタック フレームやクロージャーなど、他の目的にも使用できます)。

隠し情報が必要な場合は、ロケールではなく、別のプロセスまたは別のマシンに配置することを検討してください。(たとえば、外部関数インターフェイスまたはファイルを使用して) 隠すこともできますが、これが有効かどうかは、情報を隠す理由によって異なります。

とはいえ、任意のロケールで任意の情報にアクセスすることは、別の言語でデバッガー API またはリフレクション API を使用することにいくらか似ていることに注意してください。あなたはそれを行うことができますが、それがあなたの望むものではない場合は、おそらくそれを避けるべきです.

とはいえ、私の意見では、非公開の状態を非表示にするのではなく、理想的には削除する必要があります。(そして、それが遅すぎる場合は、コードの関連する速度が重要な部分を他の言語で実装することを検討することもできます。J は、アーキテクチャの代替案を検討するのに最適ですが、現在の実装には、任意の最適化に適したコンパイラが含まれていません。 (13 :) または (f.) をコンパイラと見なすこともできますが、それらは gcc ビルド ツールのようなものに取って代わるものではなく、現在 gcc が処理できるコードを発行することはできません。)

とはいえ、新しい文からロケールへの明示的なアクセスを防ぐために、言語拡張 (9!:24 に類似) を追加することも可能です。

于 2013-01-21T21:05:05.503 に答える