> Maybe the reader does _not_ eagerly resolve "c/foo" when the top-level
> enclosing form is a "do", but it _does_ eagerly resolve "c/foo" when
> the top-level enclosing form is a function?
The two forms read are very similar:
coretest=> (read-string "(= 1
(do
(alias 'c 'coretest)
(c/foo true)))")
(= 1 (do (alias (quote c) (quote coretest)) (c/foo true)))
coretest=> (read-string "(do
(alias 'c 'coretest)
(c/foo true))")
(do (alias (quote c) (quote coretest)) (c/foo true))
so I don't think it's to do with the reader.
The trick is probably when c/foo is being resolved/dereferenced (to
call c/foo): 'c' doesn't yet exist in the former, but apparently does
in the latter.
In this case, it appears that a toplevel `do` is being flattened,
possibly by this code in eval:
if(form instanceof IPersistentCollection &&
Util.equals(RT.first(form), DO))
{
ISeq s = RT.next(form);
for(; RT.next(s) != null; s =
RT.next(s))
eval(RT.first(s));
return eval(RT.first(s));
}
else if(form instanceof IPersistentCollection
&& !(RT.first(form) instanceof Symbol
&& ((Symbol)
RT.first(form)).name.startsWith("def")))
{
FnExpr fexpr = (FnExpr)
analyze(C.EXPRESSION, RT.list(FN, PersistentVector.EMPTY, form),
"eval");
IFn fn = (IFn) fexpr.eval();
return fn.invoke();
}
else
{
Expr expr = analyze(C.EVAL, form);
return expr.eval();
}
}
which -- to me -- reads as "if you're a toplevel do, eval each form in
turn; otherwise, eval the whole expression".
That's pure speculation, of course.
--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en