Home   Archive   Permalink

Testing my understanding of the set function

I know how to accomplish the final result of what I am trying to, but I am wondering if there is a better way. I plan to have a data file that will be one line of text containing values understandable to REBOL. I plan to bring that file into memory with the 'load' function which will result in a block of values. I know that I can modify the values by referring to BLOCK-NAME/1, BLOCK-NAME/2, etc., and then can rewrite the block to the data file with the 'save' function. BUT, I an wondering if there is a better way, specifically, by referring to BLOCK-NAME/1, BLOCK-NAME/2, etc. with more meaningful names to indicate what those values really are. The demo script below shows my attempt, which does not work. I am wondering if this can be done at all.    
Thank you.
R E B O L [
;; -- This file contains one line of text, containing:
;; -- 'john' 'quincy' 'adams'
DATAFILE-NAME: %set-test.txt
;; -- We want to load the data into memory with one line of code.
;; -- We want these three words to refer to the three values in the file.
;; -- Set the above words to refer to the three values in the file.
;; -- Test the 'set' to see that it worked.
print 'Starting values:'
print [DATAFILE/1 ' = ' FIRSTNAME]
print [DATAFILE/3 ' = ' LASTNAME]
;; -- Try to change the middle name by referring to the word.
;MIDDLENAME: 'steven'
MIDDLENAME: copy 'steven'
;; -- Test to show that it did not do as we hoped.
;; -- We hope to be able to save the new values with one line of code.
;; -- We would like the saved file to contain:
;; -- 'john' 'steven' 'adams'
print 'Check saved data.'
print 'The data file remains unchanged.'

posted by:   Steven White       1-Jun-2015/11:29:42-7:00

Hi Steven,
after you used 'set, you have to references to the same string from within the file.
(in my case, the file contains ["peter" "paul" "mary"])
"peter" -
when you are setting firstname afterwards, you are removing the second link to the
same value, with a new link to a new value
     >> firstname: "john"
"john" ---- firstname
"peter" --- datafile/1
What you really want to do is change the value, that is linked
     >> change clear firstname "john"
"john" --

posted by:   Ingo       1-Jun-2015/16:38-7:00

data: [John Baines Adams]
names: [first middle last]
forall data [         ; to set a block of names
     set names/1 data/1     ; to a block of data
     names: next names     ; perhaps for ease of reference
]                         ;
names: head names     ;    
middle: 'Quincy      ; to edit the middle name
forall data [             ;
     data/1: get names/1    ;
     names: next names     ;
]                         ; gets the edits to the data block
names: head names
data: [John Quincy Adams] ; data ready to save

posted by:   Lyndon       3-Jun-2015/22:25:47-7:00