¿Es posible tener “dinámica” puntero de función en rebol?
Pregunta
p puede crear como un puntero a f como esto:
f: func[][print 1]
p: :f
Al ejecutar:
>> p
1
Pero si modifico f para
f: func[][print 1 print 2]
p no imprimirá 2.
¿Hay otra manera de conseguir puntos P "dinámica" de f?
Solución
Tenga en cuenta que ha creado una nueva instancia de f allí - no lo modificó. Puede modificar f aunque alterando el contenido de su segundo bloque. es decir ...
>> f: func[][print 1] >> p: :f >> p 1 >> append second :f [print 2] == [print 1 print 2] >> p 1 2
Espero que ayude.
Otros consejos
Se podría utilizar un alias .
Alias ??en REBOL es un poco limitado, ya que no puede utilizar cualquier palabra preexistente como un alias. Pero esto funciona para mí:
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
]
cuando haces F::. P en realidad se está haciendo F "apunta a" valor (la función) de P
cuando haces P:. Func [] [] una vez más, se está creando una nueva función valor para que sólo P se le asigna el valor
la única manera de tener indirección es a través de un descriptor de acceso, algo así como F: hace [P]
Cuando p cambios valor f sabrá que tiene que llamar a la nueva función ya que la unión de P no ha cambiado, sólo su valor (que es una función nueva).
alias son equivalencias palabra, ni punteros, por lo que también son válidos como palabras en caminos y son bastante desagradable en el uso del mundo real.