Rebolで「動的な」関数ポインターを持つことは可能ですか?

StackOverflow https://stackoverflow.com/questions/4296125

  •  28-09-2019
  •  | 
  •  

質問

私はこのようなfへのポインターとしてpを作成できます:

f: func[][print 1]
p: :f

実行するとき:

>> p
1

しかし、Fに変更すると

f: func[][print 1 print 2]

Pは2を印刷しません。

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
    ]

あなたがf :: pをするとき、あなたは実際にf "pointに" pをしています 価値 (関数)。

p:func [] []を実行すると、新しい機能を作成しています 価値 Pのみが値を割り当てられます。

間接を持つ唯一の方法はアクセサを介して、f:dos [p]のようなものです

pが変化したとき 価値 fは、pの結合が変更されておらず、その値(新しい関数)のみが変更されていないため、新しい関数を呼び出すことを知っています。

エイリアスは単語の等価であり、ポインターではないため、パス上の単語としても有効であり、現実世界での使用では非常に厄介です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top