2013-07-18 9 views
5

Lets sagen, dass ich ein paar Worte zu definieren:REBOL 3 - Wo kann auf benutzerdefinierte Namespace-Wörter zugegriffen werden?

Word1: 5 
Word2: "blahdiddyblah" 

Gibt es einen Teil oder Block des Systems, das speichert, welche Wörter im Einsatz sind?

so etwas wie dies versucht, aber es ist fehlgeschlagen:

S1: to-block copy system/contexts/user 

D: 3 

S2: to-block copy system/contexts/user 

Difference s1 s2 

Nach @johnk Vorschlag habe ich versucht:

>> snapshot-of-words: words-of system/contexts/user 
== [system snapshot-of-words words-of contexts user] 

>> x: 1 
== 1 

>> difference snapshot-of-words words-of system/contexts/user 
== [x difference] 

>> difference snapshot-of-words words-of system/contexts/user 
== [x difference] 

>> 5 + 9 
== 14 

>> form ["hellow" "there" ] 
== "hellow there" 

>> difference snapshot-of-words words-of system/contexts/user 
== [x difference + form] 

Was bedeutet das? native Funktionen werden nach der Verwendung in den Benutzerkontext eingebunden? Gibt es eine Möglichkeit, diese von denen zu isolieren, die ein Benutzer binden könnte?

+0

alle integrierten in Worte werden verwendet im Benutzerkontext gebunden, ob in Skript oder Konsole – kealist

+0

beteiligt LOAD-GUI ist viel komplizierter, weil es so viele verschiedene Wörter bindet – kealist

+0

Überprüfung vor oder nach Load-GUI ist nicht hilfreich für das, was ich versuche zu tun – kealist

Antwort

5

Wenn Sie Wörter in einem Skript verwenden - jede Befehlszeile, die Sie interaktiv eingeben, ist ein anderes Skript - diese Wörter werden zu system/contexts/user, dem Benutzerkontext, hinzugefügt. Wenn Sie die Wörter im Skript überhaupt haben, werden sie dem Benutzerkontext hinzugefügt, das ist alles, was Sie brauchen. Wenn eines dieser neuen Wörter bereits in der Laufzeitbibliothek lib vorhanden ist, werden die Benutzerkontextwörter ihre Anfangswerte aus den Werten zugewiesen, die diese Wörter in der Laufzeitbibliothek zu diesem Zeitpunkt haben.

Wenn Sie in Ihrem Beispielcode das Wort form in Ihrem Skript verwenden, wird es dem Benutzerkontext hinzugefügt. Dann wird form der Wert zugewiesen, der lib/form zu der Zeit zugewiesen ist. Ab diesem Zeitpunkt ist form ein Benutzerwort - das Systemwort lautet lib/form.

Die einzige Zeit, in der die Werte von Wörtern von lib an den Benutzerkontext weitergegeben werden, ist, wenn das Wort zuerst dem Benutzerkontext hinzugefügt wird und seinen Anfangswert erhält. Wenn Sie danach Änderungen in der lib-Version dieses Worts vornehmen möchten, um es in die Benutzerkontextversion dieses Worts zu ändern, müssen Sie es selbst zuweisen. Wenn sie in Zukunft den gleichen Wert haben, dann nur deshalb, weil Sie weder den Benutzer- noch den Systemwörtern einen neuen Wert zugewiesen haben.

Alle Wörter im Benutzerkontext sind Wörter, die vom Benutzer erstellt wurden, auch diejenigen, die von lib initialisiert wurden. Der Benutzer hat diese Wörter erstellt, wenn sie sie in Benutzerskripten abgelegt haben. Das ist der entscheidende Punkt für den Benutzerkontext. Also, wenn Sie in Ihrem Skript print verwenden, ist das ein Benutzerwort, das sich nicht von anderen Benutzerwörtern unterscheidet.

Sie könnten hier für weitere Details sehen möchten: How are words bound within a Rebol module? Und auch hier: What is the summary of the differences in binding behaviour between Rebol 2 and 3?

+0

Schätzen Sie die Erklärung - sehr hilfreich. Ich versuche mich selbst zu einer Art Debugging-IDE zu machen. RE: LOAD-GUI Ich bin vielleicht ein wenig Neuling, um die Intentionalität/Unachtsamkeit davon herauszufinden, dass Worte in den Benutzerkontext gelangen, aber ich werde sehen, was ich herausfinden kann – kealist