Hi, Mark

> My MACRO function takes three arguments
> which are these
>
> 'name [word!] args [block!] body [block!]
>
> here are some simple examples of what I mean
>
> >> MACRO nil ['word] [set word zero]
> >> nil b
> == (set 'b zero)   ; or func [] [set 'b zero]
> >> source b
> b: (set 'b zero)   ; or func [] [set 'b zero]
> >> b
> == 0
> >> source b
> b: 0
>
> and another example
>
> >> MACRO printer ['word 'value] [print value]
> >> printer test "Hello"
> == (print "Hello)  ; or func [] [print "Hello"]
> >> source test
> test: (print "Hello") ; or func [] [print "Hello"]

A solution (not a guru's one) could be:

macro: func ['w spec body][
 set :w func spec compose/deep [set get (first spec) does compose/deep
[(body)]]
]

which must be used with this syntax:

macro printer ['word 'value] [print (value)]

The substitution is made by compose, so the 'value must be between parens,
this limits the use of parens in the body (but there is a workaround:
(to-paren [])).
Another more general solution could be a closure func.

In this example:

>> MACRO nil ['word] [set word zero]
> b: (set 'b zero)   ; or func [] [set 'b zero]

the arg 'word is used twice:

1) like the name of word to assign the macro
2) like a value in the macro body

The result is a macro which changes the word which points to itself. I think
should be better to distingue the two.

BTW, with my solution, the nil should be:

macro nil ['word] [set (:word) zero]
nil 'b
source b
b: func [][set 'b zero]

hope this helps

---
Ciao
Romano



-- 
To unsubscribe from this list, please send an email to
[EMAIL PROTECTED] with "unsubscribe" in the 
subject, without the quotes.

Reply via email to