2013-02-14 13 views
5

Ich versuche, ein paar Zeichenfolge Werte in einem Block zu speichern, so dass ich diesen Block in eine Textdatei speichern kann. Ich erhalte diese Werte von einem Formular mit VID.Speichern Sie einen Wert in einem Block anstelle der Wortbezeichnung, die es darstellt

Eine Möglichkeit, dies zu tun, wäre einfach Strings in der Datei zu speichern. Aber ich würde es vorziehen, die Daten als Block abrufen zu können.

Dies ist, was ich zu tun beabsichtigen:

view layout [ 
    contact-name: field 
    save-button: btn "Save" [ 
     saved-data-block: copy [] 
     append saved-data-block [[contact-name: contact-name/text]] ;problem here 
     save my-file saved-data-block 
    ] 
] 

Für eine Eingabe wie Rebol User im Namensfeld, wird der Inhalt in der Datei gespeichert soll, ist so etwas wie [contact-name: "Rebol User"], aber der Inhalt seine [contact-name: contact-name/text]

Ich verstehe, dass das Problem darin besteht, dass der Block nicht als Code ausgewertet wird, wenn ich ihn an saved-data-block anschließe. Was kann ich tun, um den Zeichenfolgenwert blockweise in der Textdatei zu speichern? Sollte ich etwas anderes tun, um dies zu erreichen? Alle Kommentare/Anfragen sind willkommen.

Antwort

3

Wenn Sie nicht speziell verwenden müssen reduzieren, komponieren können die Teile rief einen besseren Weg geben Sie „allein gelassen“ werden. Nur Dinge in Klammern werden ausgewertet, alles andere bleibt unberührt. So zum Beispiel:

append/only saved-data-block compose [contact-name: (get-face contact-name)] 

Compose ist oft der klarste Weg vorformulierten auszudrücken mit kleinen Teile festgestellt, dass Sie ausgewertet werden sollen. Natürlich ist es gut zu verstehen, auch zu reduzieren.

1

Reduce wird auch den Namen des Feldes zurücksetzen, das auch "contact-name" ist.

So wäre dies besser

append/only saved-data-block reduce [ to-set-word contact-name get-face contact-name ] 
3

Grahams beantworten tatsächlich vermisst eine Zecke :-)

append/only saved-data-block reduce [ to-set-word 'contact-name get-face contact-name ] 

Ohne die 'reduzieren reduziert Kontaktnamen, um seinen Wert, ein Objekt! bevor es an ein gesetztes Wort übergeben wird.

Also, Sie müssen Kontaktname zu einem lit-Wort ändern! 'Kontaktname .

Reduzieren reduziert dies auf ein Wort !, das dann an das Setzwort übergeben wird.

3

Und hier ist eine andere Idee:

append/only saved-data-block repend [contact-name:] get-face contact-name 

Diesmal Kontaktname: nicht reduziert wird, so dass es eine Set-Wort !, und der Wert aus dem Formelement bleibt angehängt.

Sieht nicht gut mit dem Doppelanhang, aber spart Tastenanschläge.