> So we have to expand 'amac, in case that branch of the 'if is invoked.
But NO!
cl> (defmacro m () (print "evaluated!"))
M
cl> (setf x 2)
2
cl> (if x t (m))
T
cl> (defun test-m (use-mac?) (if use-mac? (m) nil))
"evaluated!" <--- hmmm...
TEST-M
cl> (test-m t)
"evaluated!"
cl> (test-m nil)
NIL <--- ...no it's OK! (no "evaluated!")
Since 'if is a special form we can expect it to do magic. Common Lisp's 'if does, can we agree on that? (I mean seriously. I'm no expert and I don't really know about all this stuff, but I just see some facts. I totally might be wrong).
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
Well, if I dive deeply into CL one of these days, I'll tell you :-), but this not in my plans for the near future :-/
You are right to refuse "magic".
For Arc, oh this is way too much difficult for me, but if I had to try to solve the problem, I think I'd try to add a level of abstraction between the Scheme runtime and the Arc one (?!)
Macros currently, as you know, directly run in the Scheme environment (am I all right?). I'd try to avoid that, and have more control over them by "compiling" them to a special form (`ar-macall') but not directly execute them (?!)
And so 'if could then have a "higher priority" than macro expansion (?!)
But these are pure ideas in the wild. I am not able even to try, so don't listen this crap :-D