OK, here's a slightly more elaborate toy example that works.  In this
example, foo-main.clj needs foo-a.clj, and they both need
foo-util.clj.  I was expecting the (in-ns) call in foo-a to have a
":load" keyword, just like (ns) in foo-main, but it doesn't, so I just
called (load) afterwards.

Anyway, this will work for me.  If there is a more idiomatic way to do
it, let me know.

It might be helpful if the documentation at
http://clojure.org/namespaces mentioned how to split out a namespace
into multiple files.  It mentions (in-ns) in regards to REPL, but for
scripting it doesn't really explain how multi-file namespaces are
supposed to work.

;; foo-main.clj
(ns foo (:load "foo-a" "foo-util"))

(defn main []
  (print "hello from main\n")
  (aaa "FOO-MAIN")
  (util "FOO-MAIN"))

(main)

;; foo-a.clj
(in-ns 'foo)
(load "foo-util")

(defn aaa [arg]
  (print (format "hello from aaa: %s\n" arg))
  (util "FOO-A"))

;; foo-util.clj
(in-ns 'foo)

(defn util [arg]
  (print (format "hello from util: %s\n" arg)))


On Fri, Feb 5, 2010 at 5:26 PM, Mike Jarmy <mja...@gmail.com> wrote:
> Greg: your code works, if I go back to the original classpath.
> Thanks.  The 2nd classpath I posted was purely out of desperation, I
> didn't think it was really going to work.
>
> What your code implies to me is that for each namespace, there should
> be one source file that is sort of the 'master' file -- foo.clj in the
> case of my toy example.  The other files in the namespace should use
> (in-ns).  I'm going to experiment now with loading one of these
> subsidary files from another.  Maybe the lesson will be that you
> aren't supposed to do that, we'll see.
>
> I wouldn't say that closure's documentation is barren per se.  I've
> got "Programming in Clojure" and
> http://java.ociweb.com/mark/clojure/article.html, which are both
> helping a lot (plus clojure.org of course).  Clojure is still pretty
> new, I'm sure the documentation will improve.  I would say that the
> documentation does a good job on the lispy parts of clojure, but not
> so good of a job explaining namespaces, code organization, etc.
>
> On Fri, Feb 5, 2010 at 5:09 PM, Greg <g...@kinostudios.com> wrote:
>> Mike, I'd say this is not your fault. I'm a clojure newbie too and the 
>> answer to your question is nowhere to be found in Clojure's barren 
>> documentation.
>>
>> You're using the right command line stuff, but you need to change your code:
>>
>> ;; foo.clj
>> (ns foo (:load "foo-util"))
>>
>> (defn main []
>>  (print "hello from main\n")
>>  (frob))
>>
>> (main)
>>
>> ;; foo-util.clj
>> (in-ns 'foo)
>>
>> (defn frob []
>>  (print "hello from frob\n"))
>>
>> - Greg
>>
>> On Feb 5, 2010, at 4:38 PM, Mike Jarmy wrote:
>>
>>> That yields ".;lib/clojure.jar", just as we'd expect.  I also tried,
>>> "java -cp foo.clj;foo-util.clj;lib/clojure.jar clojure.main foo.clj",
>>> but that gave the same error.  All of these classpaths work when I
>>> comment out the calls to "(require 'foo-util)" and "(frob)" -- which
>>> you would expect, since at that point foo.clj is just a trivial hello
>>> world script.
>>>
>>> So we are agreed that my clojure code *ought* to work, given the
>>> correct class path, but it does not?  So this must be some clojure
>>> classloader thing?  Maybe I'm doing something out of the ordinary
>>> here, and there's a more closure-idiomatic way to do it?  It does seem
>>> like the right approach to me that every file in a given directory
>>> should have the same namespace.
>>>
>>> On Fri, Feb 5, 2010 at 4:16 PM, Meikel Brandmeyer <m...@kotka.de> wrote:
>>>> Hi,
>>>>
>>>> Am 05.02.2010 um 22:13 schrieb Sean Devlin:
>>>>
>>>>> This expression will provide a string that is the classpath
>>>>>
>>>>> ((into {} (System/getProperties)) "java.class.path")
>>>>>
>>>>> There's probably a more elegant way...  anyone?
>>>>
>>>> Simply (System/getProperty "java.class.path")?
>>>>
>>>> Sincerely
>>>> Meikel
>>>>
>>>> --
>>>> 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
>>>
>>> --
>>> 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
>>
>> --
>> 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
>

-- 
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