AltME: Rebol School

Messages

PatrickP61
What am I doing wrong with this code in r3:
start:  func [block-name] [
    print rejoin ["start " block-name]
    do  block-name
    print rejoin ["stop " block-name]
]
count-to-10:    [
    for x 1 10 1 [prin x prin " "]
    print " "
]
print "ready to start"
start count-to-10
I get this:
ready to start
start for x 1 10 1 prin x prin   print
1 2 3 4 5 6 7 8 9 10
stop for x 1 10 1 prin x prin   print
-- but I wanted:
ready to start
start count-to-10
1 2 3 4 5 6 7 8 9 10
stop count-to-10
-- how do I pass to START the string of the block to eventually DO?  I want the function to expect a string -- even if that string has already been defined as a block.  i.e.  I don't want the block to be evaluated just yet.
If I use START 'COUNT-TO-10   instead, and then use DO REDUCE BLOCK-NAME, It still doesn't work right.
I want to pass BLOCK-NAME unevaluated (as a string) to START
Have it print the message of what it is starting and the string name
then perform the DO and evaluate the string into a block
then print the stop message of the string name
Just unsure how to control evaluations
DocKimbel
The following version should run just fine:
start:  func [block-name] [
    print ["start" mold block-name]
    do get block-name
    print ["stop" mold block-name]
]
count-to-10:    [
    for x 1 10 1 [prin x prin " "]
    print " "
]
print "ready to start"
start 'count-to-10
PatrickP61
I understand the quote ' will tell rebol this is a string.
Is it at all possible to define a function to accept a string, even if it is defined as a block?  i.e. be able to say START COUNT-TO-10   (without the quote '   )?
DocKimbel
"I understand the quote ' will tell rebol this is a string."
No, the quote denotes a literal word (lit-word! datatype). Strings are enclosed in "..." or {...}.
In your previous posts, you incorrectly use "string" (sequence of characters) to talk about words (which are symbols).
PatrickP61
Yes,  I see what you mean now, I meant words!
DocKimbel
"Is it at all possible to define a function to accept a string, even if it is defined as a block?" Even if I replace "string" by "word" in your sentence, it is still very confused. Words are not "variables" in Rebol-like languages, they exist by themselves (unlike in most other languages). So a word is not "defined as", but "refers to". A word can refer to a value. A word is a value too.
" i.e. be able to say START COUNT-TO-10   (without the quote '   )?" This part is correctly formulated. :-) The answer is yes, you simply define the argument of the function as a lit-word. For example:
start:  func ['block-name] [
    print ["start" mold block-name]
    do get block-name
    print ["stop" mold block-name]
]
PatrickP61
Wow, that worked perfectly!!!   I'm not sure why it works, but it does.
Thank you DocKimbel
Just to clarify:  when rebol sees the word START, it knows that I've already defined some code and will reference that block with a following argument for block-name.
when rebol sees the word COUNT-TO-10, it also knows that is already defined etc and will reference that code, but because the argument is defined as a lit-word in START, it is not evaluated yet.
Do I have that right?
Just getting my head around it!
Bo
PatrickP61:  Yes, that is correct.
Ladislav
Doc wrote: 'Words are not "variables" in Rebol-like languages' - that contradicts the documentation. Documentation states that words can be used as variables if they are bound to a context.
DocKimbel
The notion of "variable" is different in most other programming languages, that is why I put it between double quotes. The documentation should be extra careful when using that term, because it implies a different underlying model for most newcomers learning Rebol. I would personaly ban it completely from the documentation to avoid confusion.
Ladislav
Also, for Patrick: you confused the things, indeed. This is how you could have done it, alternative #1:
start:  func ['block-name] [
    print rejoin ["start " block-name]
    do get block-name
    print rejoin ["stop " block-name]
]
count-to-10:    [
    for x 1 10 1 [prin x prin " "]
    print " "
]
print "ready to start"
start 'count-to-10
What you should realize is that if you define
start:  func [block-name] [
    print rejoin ["start " block-name]
    do get block-name
    print rejoin ["stop " block-name]
]
and cal the function like this:
start count-to-10
then the START function does not obtain block name, in fact.
Ladislav
Doc wrote: "The answer is yes, you simply define the argument of the function as a lit-word." - again, contradicts the documentation. The specification
start: func ['block-name] ...
does not define the argument as a lit-word. Instead (see the documentation) it specifies that literal argument passing shall be used, passing words literally (without getting their value).
Yet another alternative is:
start:  func [block-name] [
    print rejoin ["start " block-name]
    do get block-name
    print rejoin ["stop " block-name]
]
, in which case, however, the function must be called like this:
start 'count-to-10
, which literally passes the word count-to-10 to the function
DocKimbel
If you want to be nit-picking (as usual), try to be at least accurate when quoting me. I said "you define the argument", not "the specification defines the argument". In the specification block, the 'block-name is a lit-word defined as-is by the user, that doesn't contradict the documentation.
Ladislav
I quoted you using cut and paste, so I do not know what you are talking about.
Also, it is you who is criticinzing the documentation while proving you haven't read it
DocKimbel
You wrote: "The specification [...] does not define the argument as a lit-word." This is a strawman, this is not what I said. But as usual, talking to you is like talking to a brick wall. Your condescendence gets in the way of any normal discussion.
Ladislav
Ok, if you insist, I can adjust the wording:
Using the specification
start: func ['block-name] ...
you do not not define the argument as a lit-word. Instead (see the documentation) you specifiy that literal argument passing shall be used, passing words literally (without getting their value).

Last message posted 161 weeks ago.