Hi,

2010/5/26 Quzanti <quza...@googlemail.com>

> Hi,
>
> As a newbie to lisp/clojure one thing I am having real trouble with is
> understanding macro expand time (now having discovered the difference
> between quote and backquote I was hoping I was on the way to nirvana
> but still trip up)
>
> Some newbie questions:
>
> If the macro is run at compile time how can it call functions - or can
> it only call functions that you can guarantee will already have been
> compiled


Yes.


> - so if you have macros calling functions in each other's
> namespaces would the compiler have to compile part of one namespace
> file, then part of the other, then back to the first?
>

No, the compiler will not even be as smart as you describe. It's the (:use)
(:require) (:load) declarations which will have taken place before the macro
is invoked (generally inside an (ns) declaration) that would have made the
required other functions / macros available.


> If there is any error in your file below the macro, will the macro
> have been expanded before the compiler discovers this? Or is there a
> first pass for syntax before the main compile time. So what exactly is
> compile time?
>

The compiler will take each "top level form" one after the other :
  * read one form from the "input stream" (it will then get the famous
"code-as-data"),
  * evaluate it: if the "code-as-data" starts with a list, we face a
function call, so first resolve the function; if it is a real function, then
first evaluate its arguments then pass them to the function; if it is a
macro, then pass the arguments non-evaluated to the macro definition and
substitute the whole macro call with the "code-as-data" returned by the
macro ; if it is a special form, then execute the special form behaviour
('def has a side effect of creating a new var in the current namespace, 'fn
has a side effect of compiling in memory (and on disk if *compile* is true)
the function it defines, etc.

This is certainly not accurate, but hopefully it gives you an overall view
of the mechanisms.

So the "first pass" is  getting just enough information for evaluating the
next "form" in the stream.

HTH,

-- 
Laurent

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en

Reply via email to