2010-11-28 7 views
1

я могу создать р как указатель на F, как это:Возможно ли иметь «динамический» указатель на функцию в rebol?

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

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

>> p 
1 

Но если я изменяю е к

f: func[][print 1 print 2] 

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

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

ответ

3

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

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

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

+0

Отлично, это очень приятно. – 2010-11-28 15:55:15

+0

больше не возможно с R3 для обеспечения безопасности. – moliad 2010-12-09 16:02:25

1

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

Псевдоним в 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

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

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

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^