is the behavior that I'd expect to see, since the macro was expanded at compile time, when test-m was defined.
The behavior of 'if at the REPL is interesting, perhaps it is to support conditional compilation? However it is a special case, since only at the REPL would we be able to evaluate the test argument to the 'if before compiling the then or else forms. Doing so little as wrapping the 'if statement in a lambda causes the macro to be expanded regardless of the test argument:
OK here. You're right about the REPL vs normal time eval.
The lambda example says everything.
So the 'each of my dreams will be very difficult to have :-D! Maybe with lazy evaluation/JIT compilation [hmmm maybe not needed, see edit below].
Thanks for everything CatDancer!
EDIT:
Lol this stuff has no end. CatDancer I really enjoy all this, but it is late here and I will have to go to bed, seriously!
OK, so no REPL.
In if.lisp:
(defmacro m () (print "Hello via mac!") 42)
(defmacro fm () ; remember, myeach would also be a macro...
`(if (eq (read) 'CALLMAC)
(m)
(print "Hello via func")))
(fm)
Oops, I should have said "top level" not "REPL". My mistake!
"Only at the top level would we be able to evaluate the test argument to the 'if before compiling the then or else forms".
> So the 'each of my dreams will be very difficult to have
Well you know, the Arc compiler knows whether a variable is in the lexical scope. So you could implement your myeach in ac.scm, not using macros, but instead compiling to Scheme.
No sorry me because my examples should be better. I use the command line but yes it's still "top level" and this is not enough to test this, right?
But here; OK, if 'fm is a function, the behaviour is "like in Arc". But if it's a macro, it seems to behave "like I want". Or is my example not good? (Sorry I'm really tired here, I can't even realize this :-D).
I mean, don't you think 'myeach as a CL macro would work?
> (mac ech args `(each _ ,@args))
Actually I'm currently using that. I'm just using the name 'each_ instead and define it using the macro currying stuff of twilightsentry (see id=10139, very interesting).
arc> (= each_ (>_ each '_))
But still you know, one extra character ('_') to type... :-D
> But if it's a macro, it seems to behave "like I want". Or is my example not good?
Shall I wait until tomorrow to reply so that you can get some sleep? :)
Try
((lambda () (fm)))
you can see that only if (fm) is invoked directly from the top level will the macro expansion be avoided.
> I mean, don't you think 'myeach as a CL macro would work?
What you need, in CL or in Arc, is a way to tell if a variable is defined at macro expansion time. Suppose Arc could tell you at macro expansion time if a variable was defined. Then you could say