Можно ли иметь "динамический" указатель на функцию в реболе?

Я могу создать p как указатель на f следующим образом:

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

При выполнении:

>> p
1

Но если я изменю F для

f: func[][print 1 print 2]

р не будет печатать 2.

Есть ли другой способ получить p точек "динамически" для f?

3 ответа

Решение

Обратите внимание, что вы создали новый экземпляр f там, а не изменили его. Вы можете изменить f, хотя, изменив содержимое его второго блока. то есть...

>> f: func [] [print 1]
>> p:: f
>> р
1
>> добавь второе:f [print 2]
== [печать 1 печать 2]
>> р
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 "указывает на" значение P (функция).

когда вы снова делаете P: func [][], вы создаете новое значение функции, которому присваивается значение только P.

единственный способ получить косвенное обращение - через аксессор, что-то вроде F: do [P]

когда p изменит значение, f узнает, что нужно вызывать новую функцию, поскольку привязка P не изменилась, только его значение (которое является новой функцией).

псевдонимы являются эквивалентами слов, а не указателями, поэтому они также допустимы в качестве слов на путях и весьма неприятны в реальном мире.

Другие вопросы по тегам