是否可以在rebol中使用“动态”函数指针?

时间:2010-11-28 09:12:22

标签: rebol red

我可以创建p作为指向f的指针:

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

执行时:

>> p
1

但如果我将f修改为

f: func[][print 1 print 2]

p不会打印2。

还有另一种方法可以“动态地”将p点变为f吗?

3 个答案:

答案 0 :(得分:3)

注意你在那里创建了一个新的f实例 - 没有修改它。您可以通过更改其第二个块的内容来修改f。即...

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

希望有所帮助。

答案 1 :(得分: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
    ]

答案 2 :(得分:0)

当你做F :: P你实际上做F“指向'P的(该功能)。

再次执行P:func [] []时,您正在创建一个新的函数,只为其赋值。

间接的唯一方法是通过访问器,类似F:做[P]

当p改变时f将知道调用新函数,因为P的绑定没有改变,只有它的值(这是一个新函数)。

别名是单词等价,而不是指针,所以它们在路径上也是有效的,在实际使用中非常讨厌。