Hi Kees-Jochem, Am 29.12.2008 um 20:37 schrieb Kees-Jochem Wehrmeijer:
I created a small file foo.clj with the following contents: (defn foo [] :bar)Then from a REPL I try the following: (do (load-file "foo.clj") (foo)) but this gives an error message: java.lang.Exception: Unable to resolve symbol: foo in this context (NO_SOURCE_FILE :1)
You have to distinguish compile time from runtime. The load-file happens during runtime. However the compiler looks about foo already during compile time. But since the file is not loaded, the compiler doesn't find foo and, hence, complains.
Strangely enough, the following does work: (do (load-file "foo.clj") (ns-interns 'user)) This returns {foo #'user/foo} (as expected)
Not at all strange: Since the *call* to ns-interns happens at runtime, the foo.clj is already loaded. Hence, foo is defined and everything is fine.
So, while it seems that the file gets loaded and the function gets added to the namespace, calling it from within the do doesn't seem to work. What's going on?
So it's not actually the do, but the different times when things happen. Instead of load-file, use a namespace. Although, this may already be a bit involved depending how far you already got with your learning. Create a file named foo/bar.clj in your classpath. In this file put the following: (ns foo.bar) (defn foo [] :bar) Then do at the Repl: (use 'foo.bar) (foo) This should work without problems, since use loads the file at compile time. So the compiler knows about the foo definition and everything works out. Hope this helps. Sincerely Meikel
smime.p7s
Description: S/MIME cryptographic signature