È possibile avere un puntatore a funzione "dinamico" in rebol?
Domanda
Posso creare p come puntatore a f in questo modo:
f: func[][print 1]
p: :f
Durante l'esecuzione:
>> p
1
Ma se modifico f to
f: func[][print 1 print 2]
p non stamperà 2.
Esiste un altro modo per ottenere punti p "dinamicamente" su f ?
Soluzione
Si noti che hai creato una nuova istanza di f lì - non modificati esso. È possibile modificare f se alterando il contenuto del suo secondo blocco. cioè ...
>> f: func[][print 1] >> p: :f >> p 1 >> append second :f [print 2] == [print 1 print 2] >> p 1 2
La speranza che aiuta.
Altri suggerimenti
Potresti usare un alias.
L'alias in REBOL è un po' limitato in quanto non è possibile utilizzare alcuna parola preesistente come alias.Ma questo funziona per me:
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
]
quando si esegue F::. P si sta effettivamente facendo F "punti" di P Valore (la funzione)
quando si esegue P:. Func [] [] ancora una volta, si sta creando una nuova funzione di Valore per cui solo P viene assegnato il valore
l'unico modo per avere indirezione è tramite una funzione di accesso, qualcosa come F: fa [P]
quando cambia p valore f saprà chiamare la nuova funzione poiché il legame della P non è cambiato, solo il suo valore (che è una nuova funzione).
alias sono equivalenze parola, non puntatori, in modo che siano validi anche come parole su sentieri e sono abbastanza brutto in uso mondo reale.