2010-11-28 24 views

Antwort

3

Hinweis Sie haben eine neue Instanz von f dort erstellt - nicht geändert. Sie können f jedoch ändern, indem Sie den Inhalt seines zweiten Blocks ändern. dh ...

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

Hoffe, dass hilft.

+0

Großartig, das ist ziemlich schön. –

+0

mit R3 aus Sicherheitsgründen nicht mehr möglich. – moliad

+0

In R3 ist es * möglich, Funktionen zu ändern, wenn Sie auf den ursprünglichen Text der Funktion zugreifen können. – Ladislav

1

Sie könnten einen Alias ​​ verwenden.

Alias ​​in REBOL ist ein wenig eingeschränkt, da Sie kein vorhandenes Wort als Alias ​​verwenden können. Aber das funktioniert für mich:

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

Ich liebe Alias ​​sehr, aber oft ist es sehr fehlerhaft, oft gibt es vor, dass es bereits einen Alias ​​für die Zeichenkette gibt, obwohl es nicht wahr ist. –

+0

Hope Alias ​​funktioniert besser in Rebol 3, aber ich erinnere mich, dass Carl wollte es fallen lassen, nur weil er weiß, dass es Buggy ist –

0

, wenn Sie F tun:: P Sie sind F tatsächlich tun "Punkte" P Wert (die Funktion). Wenn Sie P: func [] [] erneut ausführen, erstellen Sie eine neue Funktion Wert, der nur P den Wert zugewiesen ist.

der einzige Weg, indirection haben über einen Accessor ist, so etwas wie F: Hat [P]

wenn p ändert Wert f nicht die neue Funktion, da die Bindung von P zu nennen wissen hat sich verändert, nur sein Wert (was eine neue Funktion ist).

Alias ​​sind Wortäquivalenzen, keine Zeiger, daher gelten sie auch als Wörter auf Pfaden und sind in der realen Welt ziemlich unangenehm.

Verwandte Themen