Можно ли иметь "динамический" указатель на функцию в реболе?
Я могу создать 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 не изменилась, только его значение (которое является новой функцией).
псевдонимы являются эквивалентами слов, а не указателями, поэтому они также допустимы в качестве слов на путях и весьма неприятны в реальном мире.