私はこのようなFへのポインタとしてPを作成することができます。rebolに「動的」関数ポインタを持つことは可能ですか?
f: func[][print 1]
p: :f
実行:
>> p
1
しかし、私は、pが2を印刷しない
f: func[][print 1 print 2]
にfを変更した場合を
pポイントを「動的に」fにする別の方法はありますか?
私はこのようなFへのポインタとしてPを作成することができます。rebolに「動的」関数ポインタを持つことは可能ですか?
f: func[][print 1]
p: :f
実行:
>> p
1
しかし、私は、pが2を印刷しない
f: func[][print 1 print 2]
にfを変更した場合を
pポイントを「動的に」fにする別の方法はありますか?
あなたはfの新しいインスタンスを作成しましたが、それを変更していないことに注意してください。 2番目のブロックの内容を変更することで、fを変更することができます。すなわち...
>> f: func[][print 1] >> p: :f >> p 1 >> append second :f [print 2] == [print 1 print 2] >> p 1 2
希望するものがあります。
エイリアスを使用できます。
REBOLのエイリアスは、既存の単語をエイリアスとして使用できないため、少し制限されています。しかし、これは私の作品:
f: does [print 1] ;; define 'f as you do
alias 'f "px" ;; create an alias as 'px
px
== 1 ;; same result as 'f
f: context [a: 3] ;; change 'f to something completely different
probe px ;; 'px is the same as the new 'f
make object! [
a: 3
]
私はエイリアスが非常に好きですが、何度も頻繁にエイリアスが発生することがよくあります。 –
希望のエイリアスはReol 3でうまく動作しますが、カーはそのバグを知っている理由で –
あなたがFを実行します:Pあなたが実際にFやっている "点に" Pの値(機能)。
P:func [] []をもう一度実行すると、値という新しい関数が作成され、Pのみに値が割り当てられます。
間接を持っている唯一の方法は、アクセサ経由で、Fのようなもの:ない[P]、pは値を変更したときにPの結合が変更されていないので、
fが新しい関数を呼び出すために知っているだろう、その値(新しい関数)のみを返します。
エイリアスはポインタではなく単語同値なので、パス上の単語としても有効であり、実際の使用では非常に厄介です。
素晴らしいですね。 –
は、セキュリティ上の懸念からR3ではこれ以上使用できません。 – moliad
R3では、関数の元の本体にアクセスできる場合、関数を変更することは可能です。 – Ladislav