Re: Patch: standalone compiler (almost)

2008-11-18 Thread Rich Hickey


On Nov 18, 2008, at 12:53 AM, Stephen C. Gilardi wrote:


 On Nov 17, 2008, at 11:42 PM, Stephen C. Gilardi wrote:

 It seems there's something not quite right, though. I did a fresh  
 checkout of 1108 and built with ant and ran with java -jar  
 clojure.jar and got an exception:

 Making pushNS public on line 4461 of src/jvm/clojure/lang/ 
 Compiler.java fixes the exception.



Fixed - thanks.

Rich



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



Re: Patch: standalone compiler (almost)

2008-11-17 Thread Stephen C. Gilardi


On Nov 16, 2008, at 10:34 PM, Rich Hickey wrote:

 Since it only requires main, might I suggest you write this in  
 Clojure instead?

I gave that a try.

Here's a simple version of a driver for the compiler, stored in src/ 
clj/clojure/compile.clj:

(ns clojure.compile)

(defn main
  Compiles libs into class files stored at compile-path.
  All args are strings
  [compile-path  libs]
  (printf Compiling %d libs to %s\n (count libs) compile-path)
  (flush)
  (binding [*compile-path* compile-path]
(doseq [lib libs]
(compile (symbol lib)

It works when run from within the Clojure repl:

% ls build/classes/clojure/hello*
ls: build/classes/clojure/*hello*: No such file or directory
% java -cp clojure.jar:src/clj/ clojure.lang.Repl
Clojure
user= (require 'clojure.compile)
nil
user= (clojure.compile/main build/classes clojure.hello)
Compiling 1 libs to build/classes
nil
user=
% ls build/classes/clojure/hello*
build/classes/clojure/hello$main__8.class   build/classes/clojure/ 
hello.class

but when run as a standalone main, it gives an exception that appears  
to be related to static initializers:

% java -cp clojure.jar:src/clj/ clojure.compile build/classes  
clojure.hello
Compiling 1 libs to build/classes
Exception in thread main java.lang.IllegalStateException: Var null/ 
null is unbound. (hello.clj:3)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:4067)
at clojure.lang.Compiler.analyze(Compiler.java:3896)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:4050)
at clojure.lang.Compiler.analyze(Compiler.java:3896)
at clojure.lang.Compiler.access$100(Compiler.java:38)
at clojure.lang.Compiler$DefExpr$Parser.parse(Compiler.java:365)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:4060)
at clojure.lang.Compiler.analyze(Compiler.java:3896)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:4050)
at clojure.lang.Compiler.analyze(Compiler.java:3896)
at clojure.lang.Compiler.analyze(Compiler.java:3869)
at clojure.lang.Compiler.compile(Compiler.java:4498)
at clojure.lang.RT.compile(RT.java:408)
at clojure.lang.RT.load(RT.java:450)
at clojure.lang.RT.load(RT.java:422)
at clojure.core$load__4423$fn__4425.invoke(core.clj:3343)
at clojure.core$load__4423.doInvoke(core.clj:3342)
at clojure.lang.RestFn.invoke(RestFn.java:413)
at clojure.core$load_one__4386.invoke(core.clj:3189)
at clojure.core$compile__4429.invoke(core.clj:3347)
at clojure.compile$main__5162.doInvoke(compile.clj:23)
at clojure.lang.RestFn.invoke(RestFn.java:428)
at clojure.lang.Var.invoke(Var.java:323)
at clojure.lang.AFn.applyToHelper(AFn.java:195)
at clojure.lang.Var.applyTo(Var.java:436)
at clojure.compile.main(Unknown Source)
Caused by: java.lang.IllegalStateException: Var null/null is unbound.
at clojure.lang.Var.get(Var.java:129)
at clojure.lang.Compiler$FnExpr.parse(Compiler.java:2947)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:4058)
... 25 more
%

For reference, here is the test compilee: src/clj/clojure/hello.clj:

(ns clojure.hello)

(defn main
  [greetee]
  (printf Hello, %s wow\n greetee)
  (flush))

I'd appreciate help in getting a standalone invocation of something  
like compile.clj above (i.e., using it's own main without Repl or  
Script) to work.

In working through this, I also found that a compiler driver written  
in Java may be preferable for use via build.xml because of a bootstrap  
problem. Until we compile (something like) compile.clj, we can't  
call it as a standalone main. (One could add a step that builds the  
compiler driver via a clojure.lang.Script invocation.)

--Steve


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



Re: Patch: standalone compiler (almost)

2008-11-17 Thread Rich Hickey



On Nov 17, 8:50 am, Stephen C. Gilardi [EMAIL PROTECTED] wrote:
 On Nov 16, 2008, at 10:34 PM, Rich Hickey wrote:

  Since it only requires main, might I suggest you write this in
  Clojure instead?

 I gave that a try.

 Here's a simple version of a driver for the compiler, stored in src/
 clj/clojure/compile.clj:

 (ns clojure.compile)

 (defn main
   Compiles libs into class files stored at compile-path.
   All args are strings
   [compile-path  libs]
   (printf Compiling %d libs to %s\n (count libs) compile-path)
   (flush)
   (binding [*compile-path* compile-path]
 (doseq [lib libs]
 (compile (symbol lib)

 It works when run from within the Clojure repl:

 % ls build/classes/clojure/hello*
 ls: build/classes/clojure/*hello*: No such file or directory
 % java -cp clojure.jar:src/clj/ clojure.lang.Repl
 Clojure
 user= (require 'clojure.compile)
 nil
 user= (clojure.compile/main build/classes clojure.hello)
 Compiling 1 libs to build/classes
 nil
 user=
 % ls build/classes/clojure/hello*
 build/classes/clojure/hello$main__8.class   build/classes/clojure/
 hello.class

 but when run as a standalone main, it gives an exception that appears
 to be related to static initializers:

 % java -cp clojure.jar:src/clj/ clojure.compile build/classes
 clojure.hello
 Compiling 1 libs to build/classes
 Exception in thread main java.lang.IllegalStateException: Var null/
 null is unbound. (hello.clj:3)
 For reference, here is the test compilee: src/clj/clojure/hello.clj:

 (ns clojure.hello)

 (defn main
   [greetee]
   (printf Hello, %s wow\n greetee)
   (flush))

 I'd appreciate help in getting a standalone invocation of something
 like compile.clj above (i.e., using it's own main without Repl or
 Script) to work.


I think you've got some of the interim work I've done integrating gen-
class. main now needs to be called -main, as all methods will be
defined with leading -.

 In working through this, I also found that a compiler driver written
 in Java may be preferable for use via build.xml because of a bootstrap
 problem. Until we compile (something like) compile.clj, we can't
 call it as a standalone main. (One could add a step that builds the
 compiler driver via a clojure.lang.Script invocation.)


Good point. This may just be an exercise then.

Rich

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



Re: Patch: standalone compiler (almost)

2008-11-17 Thread Stuart Sierra

On Nov 17, 8:50 am, Stephen C. Gilardi [EMAIL PROTECTED] wrote:
 In working through this, I also found that a compiler driver written  
 in Java may be preferable for use via build.xml because of a bootstrap  
 problem.

Yes, that's why I wanted to implement it in Java.
-S
--~--~-~--~~~---~--~~
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
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
-~--~~~~--~~--~--~---



Re: Patch: standalone compiler (almost)

2008-11-17 Thread Stephen C. Gilardi


 I think you've got some of the interim work I've done integrating gen-
 class. main now needs to be called -main, as all methods will be
 defined with leading -.

I'm at SVN 1106 which doesn't appear to have any changes relative to  
1104 in this area. My compiled hello.clj works with its function  
called simply main.

--Steve


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



Re: Patch: standalone compiler (almost)

2008-11-17 Thread Stephen C. Gilardi

On Nov 17, 2008, at 9:51 AM, Rich Hickey wrote:
  main now needs to be called -main, as all methods will be defined  
 with leading -.

Seeing that makes me think of Objective-C where instance methods have  
a leading - and static methods (class methods) having a leading +. I  
think a convention like that might make for an easier read than  
associating #^{:static true} with static methods, so I thought I'd  
mention it.

--Steve


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



Re: Patch: standalone compiler (almost)

2008-11-17 Thread Matt Revelle

I like it and Obj-C inspired syntax on the JVM is cosmic justice.

On Nov 17, 2008, at 2:37 PM, Stephen C. Gilardi [EMAIL PROTECTED]  
wrote:


 On Nov 17, 2008, at 9:51 AM, Rich Hickey wrote:
  main now needs to be called -main, as all methods will be defined  
 with leading -.

 Seeing that makes me think of Objective-C where instance methods  
 have a leading - and static methods (class methods) having a leading  
 +. I think a convention like that might make for an easier read than  
 associating #^{:static true} with static methods, so I thought I'd  
 mention it.

 --Steve


 

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



Re: Patch: standalone compiler (almost)

2008-11-17 Thread Stephen C. Gilardi

On Nov 17, 2008, at 10:33 PM, Rich Hickey wrote:

 Fixed (SVN 1108) - thanks for the report.

Cool, thanks. I especially like loadClassForName.

It seems there's something not quite right, though. I did a fresh  
checkout of 1108 and built with ant and ran with java -jar  
clojure.jar and got an exception:

% java -jar clojure.jar
Exception in thread main java.lang.IllegalAccessError: tried to  
access method clojure.lang.Compiler.pushNS()V from class clojure.core
at clojure.core.clinit(Unknown Source)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:264)
at clojure.lang.RT.loadClassForName(RT.java:1620)
at clojure.lang.RT.load(RT.java:442)
at clojure.lang.RT.load(RT.java:424)
at clojure.lang.RT.doInit(RT.java:461)
at clojure.lang.RT.clinit(RT.java:328)
at clojure.lang.Repl.clinit(Repl.java:23)
Could not find the main class: clojure.lang.Repl. Program will exit.

--Steve


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



Re: Patch: standalone compiler (almost)

2008-11-17 Thread Stephen C. Gilardi

On Nov 17, 2008, at 11:42 PM, Stephen C. Gilardi wrote:

 It seems there's something not quite right, though. I did a fresh  
 checkout of 1108 and built with ant and ran with java -jar  
 clojure.jar and got an exception:

Making pushNS public on line 4461 of src/jvm/clojure/lang/ 
Compiler.java fixes the exception.

--Steve


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



Re: Patch: standalone compiler (almost)

2008-11-16 Thread Rich Hickey



On Nov 16, 9:47 pm, Stuart Sierra [EMAIL PROTECTED]
wrote:
 Hi Rich, and all,

 I took a stab at writing a static compiler class, i.e. a main() that
 just compiles all the .clj files on the command line and saves the
 .class files.  Patch attached.

 It almost works.  The only thing that seems to be missing is creating
 the class for the namespace itself, like clojure/core.class.  Not
 sure what needs to be added to make that work.


Interesting.

I think you've hooked in at the wrong point - better to grab the
clojure.core/compile var and call that. You should also keep the unit
of compilation the lib, not files.

Since it only requires main, might I suggest you write this in Clojure
instead?

Rich

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



Re: Patch: standalone compiler (almost)

2008-11-16 Thread mac



On Nov 17, 4:34 am, Rich Hickey [EMAIL PROTECTED] wrote:
 On Nov 16, 9:47 pm, Stuart Sierra [EMAIL PROTECTED]
 wrote:

  Hi Rich, and all,

  I took a stab at writing a static compiler class, i.e. a main() that
  just compiles all the .clj files on the command line and saves the
  .class files.  Patch attached.

  It almost works.  The only thing that seems to be missing is creating
  the class for the namespace itself, like clojure/core.class.  Not
  sure what needs to be added to make that work.

 Interesting.

 I think you've hooked in at the wrong point - better to grab the
 clojure.core/compile var and call that. You should also keep the unit
 of compilation the lib, not files.

 Since it only requires main, might I suggest you write this in Clojure
 instead?

 Rich

This would be a much welcome addition because as someone who is
writing small desktop apps with clojure it would be great if the
startup time could be reduced and I'm guessing it would help a bunch
to not have to wait for all the code to compile from text every time?

/Markus

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