Возможно ли иметь "динамический" указатель на функцию в реболе? - PullRequest
1 голос
/ 28 ноября 2010

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

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

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

>> p
1

Но если я изменю f на

f: func[][print 1 print 2]

p не печатает 2.

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

Ответы [ 3 ]

3 голосов
/ 28 ноября 2010

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

>> f: func[][print 1]
>> p: :f
>> p
1
>> append second :f [print 2]
== [print 1 print 2]
>> p
1
2

Надеюсь, это поможет.

1 голос
/ 28 ноября 2010

Вы можете использовать псевдоним .

Псевдоним в 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
    ]
0 голосов
/ 09 декабря 2010

когда вы делаете F:: P, вы на самом деле делаете F "указывает на" P's значение (функция).

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

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

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

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

...