Re: Calling `str' on a LazySeq

2009-03-22 Thread David Sletten


On Mar 21, 2009, at 1:44 PM, Mark Triggs wrote:

   user= (str (filter even? (range 1 10)))
   clojure.lang.lazy...@f1005

 Previously this would readably print the contents of the seq and some
 of my code was relying on this.  Obviously it's not difficult to call
 `prn-str' myself, but I just wondered if this change was made
 consciously.


According to the documentation for 'str':
With one arg x, returns x.toString().

So it looks like toString() on a sequence used to return its contents  
and now doesn't. However, rather than relying on this behavior what  
you probably should be doing is using 'apply':
(apply str (filter even? (range 1 10))) = 2468

If you want commas between those elements, use 'interpose':
(apply str (interpose ,  (filter even? (range 1 10 = 2, 4, 6, 8

Aloha,
David Sletten

--~--~-~--~~~---~--~~
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 
clojure+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/clojure?hl=en
-~--~~~~--~~--~--~---



Re: Calling `str' on a LazySeq

2009-03-22 Thread Mark Triggs

Hi David,

On Mar 22, 5:01 pm, David Sletten da...@bosatsu.net wrote:
 On Mar 21, 2009, at 1:44 PM, Mark Triggs wrote:

    user= (str (filter even? (range 1 10)))
    clojure.lang.lazy...@f1005

  Previously this would readably print the contents of the seq and some
  of my code was relying on this.  Obviously it's not difficult to call
  `prn-str' myself, but I just wondered if this change was made
  consciously.

 According to the documentation for 'str':
 With one arg x, returns x.toString().

 So it looks like toString() on a sequence used to return its contents  
 and now doesn't. However, rather than relying on this behavior what  
 you probably should be doing is using 'apply':
 (apply str (filter even? (range 1 10))) = 2468

 If you want commas between those elements, use 'interpose':
 (apply str (interpose ,  (filter even? (range 1 10 = 2, 4, 6, 8

Yep, that's fine.  In my case I was actually relying on the fact that
`str' was effectively doing a `prn-str' because I would later read it
back using `read-string' elsewhere.  Calling `prn-str' explicitly
isn't a problem--I just thought I'd mention that the semantics have
now changed a little.

Thanks,

Mark
--~--~-~--~~~---~--~~
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 
clojure+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/clojure?hl=en
-~--~~~~--~~--~--~---



Re: Calling `str' on a LazySeq

2009-03-22 Thread David Sletten

On Mar 21, 2009, at 11:30 PM, Mark Triggs wrote:


 Yep, that's fine.  In my case I was actually relying on the fact that
 `str' was effectively doing a `prn-str' because I would later read it
 back using `read-string' elsewhere.  Calling `prn-str' explicitly
 isn't a problem--I just thought I'd mention that the semantics have
 now changed a little.


Sorry Mark. I guess I misunderstood what 'prn-str' does. I thought it  
was for I/O. I missed the print TO string part.

Aloha,
David Sletten


--~--~-~--~~~---~--~~
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 
clojure+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/clojure?hl=en
-~--~~~~--~~--~--~---



Re: March 20th 2009 Rich Hickey Appreciation Day!

2009-03-22 Thread stephaner

I join the crowd too,

I was looking for a language to develop some projects. Then Clojure
appeared, the light was there.

Thank you Rich Hickey

Stephane

On Mar 20, 2:26 pm, Rayne disciplera...@gmail.com wrote:
 I Anthony Simpson, with the support of fellow Clojurists hereby
 declare March 20th, the first day of spring, Rich Hickey appreciation
 day!

 Rich Hickey has certainly done a lot for us, making this wonderful
 language and continuing to take his time to work on it. He is
 dedicated and he wants to bring Clojure along with it's users to
 heights that Lisp has never been before. In just some 2 years, Rich
 has gathered together a vibrant and large community of users and
 contributors who believe in Clojure's future immensely . One such
 contributor who believes in Clojure enough to write an entire book on
 it! Clojure gains more attention and support everyday.

 I believe in the bright future that Rich Hickey believes exists for
 Clojure. I believe that with this community, and with such a wonderful
 creator as Rich Hickey, Clojure will achieve it's goals and meet the
 destiny that Rich is writing for it.

 I thank you Rich Hicky for all your work on Clojure. I thank you for
 all the time you've spent building this community and giving us one of
 the most awesome languages that have existed. Thank you for caring
 about us enough to listen to the community before making big changes,
 I believe in Clojure and I will be here watching it evolve with you!

 If you would like to thank Rich Hickey for all he has done for us, you
 can post in this thread, or tell him yourself in the #Clojure IRC
 channel. :)

 March 20th 2009 Rich Hickey Appreciation Day

 -Rayne
--~--~-~--~~~---~--~~
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 
clojure+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/clojure?hl=en
-~--~~~~--~~--~--~---



Re: atom/swap! question

2009-03-22 Thread Meikel Brandmeyer

Hi,

Am 21.03.2009 um 23:26 schrieb Mark Volkmann:


I'm looking for a suggestion on how I can get new-struct.


The other aspects aside, here an answer for this question.

(defn get-new-struct
  [the-new-map]
  (the-new-map (last (keys the-new-map

Or, to be sure,

(defn get-new-struct
  [the-new-map]
  (the-new-map (apply max (keys the-new-map

This is of course ugly and O(n) as the last indicates.

You could however change your b to take the atom
instead of the map.

(defn b
  [the-atom your-data]
  (let [new-id (get-new-id @the-atom)
new-struct (make-new-struct new-id your-data)]
(swap! the-atom assoc new-id new-struct)
new-struct))

But now the deref and the swap! are not coordinated
anymore. So one needs a Ref or an architecture, where
all other users are only readers of the atom and one
thread does sequentially add the new structs. Then
the value of the atom wouldn't change between the
deref and swap!. This maybe suggests an agent instead
of an atom, but then you cannot return the new struct.
And we would be back with the O(n) thing.

So I agree with Laurent that you want a Ref here.

Sincerely
Meikel



smime.p7s
Description: S/MIME cryptographic signature


Re: atom/swap! question

2009-03-22 Thread Mark Volkmann

Thanks for looking this over! It's interesting how often I find myself
trying to use an Atom because I'm not coordinating changes multiple
things, just one, but the solution still requires using a Ref. I guess
it's wrong to think of what I'm doing as coordinating one value. I'm
really coordinating two, a map and a thing inside the map (the last
value added).

On Sun, Mar 22, 2009 at 6:29 AM, Meikel Brandmeyer m...@kotka.de wrote:
 Hi,

 Am 21.03.2009 um 23:26 schrieb Mark Volkmann:

 I'm looking for a suggestion on how I can get new-struct.

 The other aspects aside, here an answer for this question.

 (defn get-new-struct
  [the-new-map]
  (the-new-map (last (keys the-new-map

 Or, to be sure,

 (defn get-new-struct
  [the-new-map]
  (the-new-map (apply max (keys the-new-map

 This is of course ugly and O(n) as the last indicates.

 You could however change your b to take the atom
 instead of the map.

 (defn b
  [the-atom your-data]
  (let [new-id (get-new-id @the-atom)
        new-struct (make-new-struct new-id your-data)]
    (swap! the-atom assoc new-id new-struct)
    new-struct))

 But now the deref and the swap! are not coordinated
 anymore. So one needs a Ref or an architecture, where
 all other users are only readers of the atom and one
 thread does sequentially add the new structs. Then
 the value of the atom wouldn't change between the
 deref and swap!. This maybe suggests an agent instead
 of an atom, but then you cannot return the new struct.
 And we would be back with the O(n) thing.

 So I agree with Laurent that you want a Ref here.

 Sincerely
 Meikel

-- 
R. Mark Volkmann
Object Computing, Inc.

--~--~-~--~~~---~--~~
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 
clojure+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/clojure?hl=en
-~--~~~~--~~--~--~---



Re: Possible Bug In clojure.zip/remove

2009-03-22 Thread Frantisek Sodomka

On Mar 19, 12:58 pm, Jason Sankey ja...@zutubi.com wrote:
 Also, is there somewhere I can contribute test cases for this to
 prevent a future regression?

Tests for clojure.zip can from now on go to test-clojure.clojure-zip:
http://code.google.com/p/clojure-contrib/source/browse/trunk/src/clojure/contrib/test_clojure/clojure_zip.clj

On Mar 20, 1:24 pm, Jason Sankey ja...@zutubi.com wrote:
 3) Test-is reports results for all (is ...) expressions separately, but
 there is no good way to name them separately.  At the moment I am
 reporting on each (is ...) as a separate test case by using the test
 name plus line number, but this is clunky.  I think combining the
 results so one deftest == one JUnit report test case would be more sensible.

If there are any troubles with test-is, you can consult Stuart Sierra
(the author of test-is).

Greetings, Frantisek
--~--~-~--~~~---~--~~
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 
clojure+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/clojure?hl=en
-~--~~~~--~~--~--~---



capturing stdout

2009-03-22 Thread Mark Volkmann

I can't figure out why this function seems to work, but also produces
a NullPointerException.

(defn get-output [fn]
  (let [sw (StringWriter.)]
(binding [*out* sw] (fn))
(.toString sw)))

(get-output (println foo))

-- 
R. Mark Volkmann
Object Computing, Inc.

--~--~-~--~~~---~--~~
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 
clojure+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/clojure?hl=en
-~--~~~~--~~--~--~---



Re: capturing stdout

2009-03-22 Thread Mark Volkmann

Never mind. I think I needed to make this a macro instead of a
function like this:

(defmacro get-output [fn]
  `(let [sw# (StringWriter.)]
(binding [*out* sw#] ~fn)
(.toString sw#)))

On Mar 22, 9:34 am, Mark Volkmann r.mark.volkm...@gmail.com wrote:
 I can't figure out why this function seems to work, but also produces
 a NullPointerException.

 (defn get-output [fn]
   (let [sw (StringWriter.)]
     (binding [*out* sw] (fn))
     (.toString sw)))

 (get-output (println foo))
--~--~-~--~~~---~--~~
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 
clojure+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/clojure?hl=en
-~--~~~~--~~--~--~---



Re: March 20th 2009 Rich Hickey Appreciation Day!

2009-03-22 Thread Jason Warner

Seriously, Rich, you are awesome. Great language.

BTW. Does Rich have an Amazon wish list?

On Mar 20, 11:26 am, Rayne disciplera...@gmail.com wrote:
 I Anthony Simpson, with the support of fellow Clojurists hereby
 declare March 20th, the first day of spring, Rich Hickey appreciation
 day!

 Rich Hickey has certainly done a lot for us, making this wonderful
 language and continuing to take his time to work on it. He is
 dedicated and he wants to bring Clojure along with it's users to
 heights that Lisp has never been before. In just some 2 years, Rich
 has gathered together a vibrant and large community of users and
 contributors who believe in Clojure's future immensely . One such
 contributor who believes in Clojure enough to write an entire book on
 it! Clojure gains more attention and support everyday.

 I believe in the bright future that Rich Hickey believes exists for
 Clojure. I believe that with this community, and with such a wonderful
 creator as Rich Hickey, Clojure will achieve it's goals and meet the
 destiny that Rich is writing for it.

 I thank you Rich Hicky for all your work on Clojure. I thank you for
 all the time you've spent building this community and giving us one of
 the most awesome languages that have existed. Thank you for caring
 about us enough to listen to the community before making big changes,
 I believe in Clojure and I will be here watching it evolve with you!

 If you would like to thank Rich Hickey for all he has done for us, you
 can post in this thread, or tell him yourself in the #Clojure IRC
 channel. :)

 March 20th 2009 Rich Hickey Appreciation Day

 -Rayne
--~--~-~--~~~---~--~~
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 
clojure+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/clojure?hl=en
-~--~~~~--~~--~--~---



Re: Help with the dot operator special form

2009-03-22 Thread Stuart Sierra

On Mar 21, 10:23 pm, Timothy Pratley timothyprat...@gmail.com wrote:
 You may be able to achieve what you want by directly accessing
 Clojure's reflector class instead of using the special form:

You could also call Java's reflection API directly.

-Stuart Sierra
--~--~-~--~~~---~--~~
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 
clojure+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/clojure?hl=en
-~--~~~~--~~--~--~---



Re: What's a convenient way of calling super.method()?

2009-03-22 Thread Stuart Sierra

On Mar 21, 4:38 pm, CuppoJava patrickli_2...@hotmail.com wrote:
 For proxies, I haven't figured out a way yet.

Proxies cannot call superclass methods.  Classes generated with gen-
class can.  However, if you regularly need to call superclass methods
instead of subclass methods, then you may want to rethink your design,
perhaps by using different names for the super and sub methods.

-Stuart Sierra
--~--~-~--~~~---~--~~
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 
clojure+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/clojure?hl=en
-~--~~~~--~~--~--~---



Re: capturing stdout

2009-03-22 Thread Stuart Sierra

On Mar 22, 10:34 am, Mark Volkmann r.mark.volkm...@gmail.com wrote:
 (defn get-output [fn]
   (let [sw (StringWriter.)]
     (binding [*out* sw] (fn))
     (.toString sw)))

This is what clojure.core/with-out-str does.

-Stuart Sierra
--~--~-~--~~~---~--~~
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 
clojure+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/clojure?hl=en
-~--~~~~--~~--~--~---



Re: Method overloading proxy method

2009-03-22 Thread Stuart Sierra

On Mar 21, 6:13 pm, ronen nark...@gmail.com wrote:
 Hello there,
 Iv been trying to implement a proxy on a class 
 (http://code.google.com/p/javaparser/source/browse/trunk/JavaParser/sr...)
 that has multiple overloaded methods (same arity different types),
 trying

 (defn create-visitor []
   (proxy [VoidVisitorAdapter] []
     (visit [method, arg]
       (println method))
     (visit [exp, arg]
       (println type

 This results with compilation error Caused by:
 java.lang.IllegalArgumentException: Method 'visit' redefined.

 Type hints didn't help either:

Proxy doesn't care about argument types.  You need one method with a
conditional:

(defn create-visitor []
  (proxy [VoidVisitorAdapter] []
(visit [arg1 arg2]
  (if (instance? MethodDeclaration arg1)
 ...

You could also define a multimethod and call it from the proxy.

-Stuart Sierra
--~--~-~--~~~---~--~~
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 
clojure+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/clojure?hl=en
-~--~~~~--~~--~--~---



Re: The unshared part of two mostly-shared structures

2009-03-22 Thread Stuart Sierra

On Mar 21, 6:01 pm, rapido robbert.van.da...@gmail.com wrote:
 my programming language enchilada (www.enchiladacode.nl) has
 hash=pointer equality build in.
 i believe it shouldn't be to difficult to introduce some of
 enchilada's internals to clojure.

Hi Robbert,

I imagine that hash-pointer equality would be difficult to impossible
in Clojure, since it relies on Java's hash/pointer/equality semantics.

But Enchilada looks interesting, and a hash-based data structure in
Clojure would also be interesting.

-Stuart Sierra
--~--~-~--~~~---~--~~
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 
clojure+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/clojure?hl=en
-~--~~~~--~~--~--~---



Re: What's a convenient way of calling super.method()?

2009-03-22 Thread pmf

On Mar 22, 5:10 pm, Stuart Sierra the.stuart.sie...@gmail.com wrote:
 On Mar 21, 4:38 pm, CuppoJava patrickli_2...@hotmail.com wrote:

  For proxies, I haven't figured out a way yet.

 Proxies cannot call superclass methods.  Classes generated with gen-
 class can.  However, if you regularly need to call superclass methods
 instead of subclass methods, then you may want to rethink your design,
 perhaps by using different names for the super and sub methods.

I think they can, using proxy-super.
--~--~-~--~~~---~--~~
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 
clojure+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/clojure?hl=en
-~--~~~~--~~--~--~---



Re: Help with the dot operator special form

2009-03-22 Thread David Nolen
Thanks all for the pointers, this looks like a workable approach.  In my
case I'm not bothered by the performance hit from reflection (CPS
transformation creates an obscene number of anonymous functions anyway).
However I am running into an issue.  Here's my dot function:
(def not-seq? (comp not seq?))

(defn dot [obj member-expr]
  (let [member   (str (first member-expr))
arg-or-args(rest member-expr)
args (if (not-seq? arg-or-args)
 [arg-or-args]
 arg-or-args)]
(Reflector/invokeInstanceMethod obj
member
(to-array args

This works fine for:

(dot Hello (list 'substring 1 2))

But throws an exception for this:

(let [myref (ref {})]
  (dot
   clojure.lang.LockingTransaction
   (list 'runInTransaction (fn [] (commute myref assoc :mykey :myval)

I'm getting a instance method not found exception which seems odd. I looked
at LockingTransaction.java and I see that runInTransaction does in fact take
Callable, and fn's are Callable.  Any thoughts?

I knew I would have to really learn Java at some point ;)


On Sun, Mar 22, 2009 at 12:06 PM, Stuart Sierra the.stuart.sie...@gmail.com
 wrote:


 On Mar 21, 10:23 pm, Timothy Pratley timothyprat...@gmail.com wrote:
  You may be able to achieve what you want by directly accessing
  Clojure's reflector class instead of using the special form:

 You could also call Java's reflection API directly.

 -Stuart Sierra
 


--~--~-~--~~~---~--~~
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 
clojure+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/clojure?hl=en
-~--~~~~--~~--~--~---



Re: Help with the dot operator special form

2009-03-22 Thread Eric Tschetter

 (let [myref (ref {})]
   (dot
    clojure.lang.LockingTransaction
    (list 'runInTransaction (fn [] (commute myref assoc :mykey :myval)
 I'm getting a instance method not found exception which seems odd. I looked
 at LockingTransaction.java and I see that runInTransaction does in fact take
 Callable, and fn's are Callable.  Any thoughts?

I haven't double checked the clojure code, but it looks like you are
trying to call a static method, not an instance method, and that is
what is causing the exception.

--Eric Tschetter

--~--~-~--~~~---~--~~
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 
clojure+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/clojure?hl=en
-~--~~~~--~~--~--~---



Re: version of - short-circuiting on nil

2009-03-22 Thread Michael Wood

On Sun, Mar 22, 2009 at 11:42 AM, Laurent PETIT laurent.pe...@gmail.com wrote:
 OK, Stephen checked this in, thank you very much !

 Two new symbols:

As was pointed out to me recently, http://clojure.org/reader says:

Symbols beginning or ending with '.' are reserved by Clojure.

So, is .?. not a symbol (because it's called at compile time and at
runtime there is no such thing as .?.)?  i.e. what exactly is the
definition of a symbol, and do the names of macros count?

 clojure.contrib.core/.?.
 clojure.contrib.core/-?

-- 
Michael Wood esiot...@gmail.com

--~--~-~--~~~---~--~~
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 
clojure+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/clojure?hl=en
-~--~~~~--~~--~--~---



Behavior of clojure.set/union and hinting function arguments

2009-03-22 Thread Frantisek Sodomka

Hello Rich  everybody!

clojure.set/union currently accepts 'nil' as a valid argument:
(union nil) = nil
(union nil nil) = nil

(union nil #{1 2}) = #{1 2}
(union #{1 2} nil) = #{1 2}

(union #{} nil) = #{}
(union nil #{}) = nil   ; not consistent

Possible solution would be to ban 'nil' as an argument. While playing
with type hinting, I discovered things that I don't understand:

(defn f [#^Double x] (+ x 2)) = #'user/f
(f 3) = 5
(f nil) = java.lang.NullPointerException (NO_SOURCE_FILE:0)
; why NPE?

(f 2/3) = 8/3
; why not an error that argument isn't java.lang.Double?

(f a) = java.lang.ClassCastException: java.lang.String cannot be
cast to java.lang.Number (NO_SOURCE_FILE:0)
; wants java.lang.Number, but I was hinting for java.lang.Double

Thank you, Frantisek
--~--~-~--~~~---~--~~
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 
clojure+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/clojure?hl=en
-~--~~~~--~~--~--~---



Re: User contributed packages (Cabel, CPAN, etc)

2009-03-22 Thread Paul Stadig
I had started on something like a package manager called Sauron (one
library to rule them all). My idea was to be able to define dependencies
with something like:

(depends-on :name clojure-json :version 1.2.3)

This would look into a ~/.sauron directory and either add a jar or a
directory to the classpath. If clojure-json did not exist in ~/.sauron, the
it would attempt to download it from a remote repository. The remote
repositories would be either GitHub, or a Maven repo, and there would be a
way to write a plugin for Sauron to add a new type of repository. I had
thought that I would look into if it were possible to somehow plug this into
the 'ns macro so that it could be declared with the namespace. Finally, I
had thought that transitive dependencies could be handled by having a
.sauron file in the root directory of a project so that Sauron would know
how to find the dependencies for clojure-json, etc.

http://github.com/pjstadig/sauron/tree/master

I had thought through all of this, and started on some code, but it's not
finalized. I had heard that dynamically adding to the classpath is not
foolproof and somewhat dependent on the class loader. I'm not sure if I'm
headed in the right direction, or if this is even possible, but it's worked
for my limited testing, and I'm open to suggestions and contributions.


Paul

On Sun, Mar 22, 2009 at 12:57 PM, Bradbev brad.beveri...@gmail.com wrote:


 Is the clojure-contrib portion of Clojure meant to act as a package
 system like Cabel, CPAN, etc?  I suspect not.  Clojure-contrib is more
 like the standard library that comes with Clojure.  I think that going
 forward, Clojure is going to want to have a large and easily
 accessible library of packages.  I would love to see a strong package
 system for Clojure that
 1) Made it very easy to search for packages  download them, along
 with all the packages they depend upon
 2) Made the bar for contributing packages as low as possible so people
 can contribute easily (Ideally, after you have configured the package
 manager, uploading a new package should be as easy as 'packman upload
 mypackage')

 I feel that the next big growth phase for Clojure will be in the user
 community and the code that we can generate.  A good package manager
 will help fuel that growth.

 And now I'll cop out  say that I have no idea about how to actually
 implement this sort of thing - I'm hoping somebody else will want to
 do it for me :)

 Thanks,
 Brad
 


--~--~-~--~~~---~--~~
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 
clojure+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/clojure?hl=en
-~--~~~~--~~--~--~---



Re: March 20th 2009 Rich Hickey Appreciation Day!

2009-03-22 Thread Anand Patil
Clojure's great, thanks very much for making it available  supporting it!
Anand

On Fri, Mar 20, 2009 at 6:26 PM, Rayne disciplera...@gmail.com wrote:


 I Anthony Simpson, with the support of fellow Clojurists hereby
 declare March 20th, the first day of spring, Rich Hickey appreciation
 day!

 Rich Hickey has certainly done a lot for us, making this wonderful
 language and continuing to take his time to work on it. He is
 dedicated and he wants to bring Clojure along with it's users to
 heights that Lisp has never been before. In just some 2 years, Rich
 has gathered together a vibrant and large community of users and
 contributors who believe in Clojure's future immensely . One such
 contributor who believes in Clojure enough to write an entire book on
 it! Clojure gains more attention and support everyday.

 I believe in the bright future that Rich Hickey believes exists for
 Clojure. I believe that with this community, and with such a wonderful
 creator as Rich Hickey, Clojure will achieve it's goals and meet the
 destiny that Rich is writing for it.

 I thank you Rich Hicky for all your work on Clojure. I thank you for
 all the time you've spent building this community and giving us one of
 the most awesome languages that have existed. Thank you for caring
 about us enough to listen to the community before making big changes,
 I believe in Clojure and I will be here watching it evolve with you!

 If you would like to thank Rich Hickey for all he has done for us, you
 can post in this thread, or tell him yourself in the #Clojure IRC
 channel. :)

 March 20th 2009 Rich Hickey Appreciation Day

 -Rayne
 


--~--~-~--~~~---~--~~
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 
clojure+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/clojure?hl=en
-~--~~~~--~~--~--~---



Re: version of - short-circuiting on nil

2009-03-22 Thread Stephen C. Gilardi


On Mar 22, 2009, at 2:28 PM, Michael Wood wrote:


As was pointed out to me recently, http://clojure.org/reader says:

Symbols beginning or ending with '.' are reserved by Clojure.

So, is .?. not a symbol (because it's called at compile time and at
runtime there is no such thing as .?.)?  i.e. what exactly is the
definition of a symbol, and do the names of macros count?



clojure.contrib.core/.?. is a symbol. Thanks for pointing out that it  
is one that's reserved to Clojure.


The reference you gave is the canonical documentation for symbols in  
Clojure. Symbols in Clojure are used to name things including macros.


The name clojure.core/.. works and its name isn't a problem because  
it's part of Clojure. The case of .?. is a little unusual (regarding  
using this kind of name) in that it's named as a variation of .. for  
the purpose of proposing it as a possible addition to Clojure at some  
point.


If we can't get Rich's blessing for this name to be part of contrib,  
we'll rename it.


Rich, should we rename clojure.contrib.core/.?. to avoid using a name  
reserved to Clojure?


--Steve



smime.p7s
Description: S/MIME cryptographic signature


Re: I need help tracking down a performance problem.

2009-03-22 Thread Vincent Foley

How would I do that?  Make a macro that expands into a map literal
with the appropriate calls to .get, .getShort and .getInt?

On Mar 22, 4:20 pm, Christophe Grand christo...@cgrand.net wrote:
 Vincent Foley a écrit : The code is available at this 
 URL:http://code.google.com/p/bwhf/
  (look at the hu.becliza.andras.bwhf.control.[BinRepParser,
  BinReplayUnpacker] files)

  It is definitely not as dynamic, which helps quite a lot, but I wanted
  to have something high level and declarative.

 If you want to go high-level and declarative you can certainly implement
 this as a macro which will compile your declaration into fast static code.

 --
 Professional:http://cgrand.net/(fr)
 On Clojure:http://clj-me.blogspot.com/(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
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
-~--~~~~--~~--~--~---



Re: version of - short-circuiting on nil

2009-03-22 Thread Meikel Brandmeyer

Hi,

Am 22.03.2009 um 20:45 schrieb Stephen C. Gilardi:

clojure.contrib.core/.?. is a symbol. Thanks for pointing out that  
it is one that's reserved to Clojure.


Rich, should we rename clojure.contrib.core/.?. to avoid using a  
name reserved to Clojure?


I'd like to throw in another thought:
Is .?. necessary? - does the same job as .. by
virtue of the .method notation, but is more general.
So, why not get rid of .. and .?. completely?

Sincerely
Meikel



smime.p7s
Description: S/MIME cryptographic signature


Re: Help with the dot operator special form

2009-03-22 Thread David Nolen
That was it! At one point I knew these things. Thanks much.

On Sun, Mar 22, 2009 at 2:18 PM, Eric Tschetter eched...@gmail.com wrote:


  (let [myref (ref {})]
(dot
 clojure.lang.LockingTransaction
 (list 'runInTransaction (fn [] (commute myref assoc :mykey :myval)
  I'm getting a instance method not found exception which seems odd. I
 looked
  at LockingTransaction.java and I see that runInTransaction does in fact
 take
  Callable, and fn's are Callable.  Any thoughts?

 I haven't double checked the clojure code, but it looks like you are
 trying to call a static method, not an instance method, and that is
 what is causing the exception.

 --Eric Tschetter

 


--~--~-~--~~~---~--~~
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 
clojure+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/clojure?hl=en
-~--~~~~--~~--~--~---



Re: User contributed packages (Cabel, CPAN, etc)

2009-03-22 Thread Christian Vest Hansen

I was hoping that we could piggy-back on one of Java's packaging
systems, so our programs can depend on Java libraries just as easy as
Clojure libraries. And in this regard, the Maven repository system is
pretty popular and even supported by build tools other than Maven
(such as Ivy, Buildr and Gradle).

On Sun, Mar 22, 2009 at 5:57 PM, Bradbev brad.beveri...@gmail.com wrote:

 Is the clojure-contrib portion of Clojure meant to act as a package
 system like Cabel, CPAN, etc?  I suspect not.  Clojure-contrib is more
 like the standard library that comes with Clojure.  I think that going
 forward, Clojure is going to want to have a large and easily
 accessible library of packages.  I would love to see a strong package
 system for Clojure that
 1) Made it very easy to search for packages  download them, along
 with all the packages they depend upon
 2) Made the bar for contributing packages as low as possible so people
 can contribute easily (Ideally, after you have configured the package
 manager, uploading a new package should be as easy as 'packman upload
 mypackage')

 I feel that the next big growth phase for Clojure will be in the user
 community and the code that we can generate.  A good package manager
 will help fuel that growth.

 And now I'll cop out  say that I have no idea about how to actually
 implement this sort of thing - I'm hoping somebody else will want to
 do it for me :)

 Thanks,
 Brad
 




-- 
Venlig hilsen / Kind regards,
Christian Vest Hansen.

--~--~-~--~~~---~--~~
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 
clojure+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/clojure?hl=en
-~--~~~~--~~--~--~---



Re: The unshared part of two mostly-shared structures

2009-03-22 Thread mikel

Thanks for the comments, folks. I may be able to raw some ideas from
them. In my specific case, restrictive rules about the types of the
objects may be quite workable. For example, I don't think I'd suffer
if the state-preserving objects were all required to be hash-maps.

I'll think some more about it.

--~--~-~--~~~---~--~~
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 
clojure+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/clojure?hl=en
-~--~~~~--~~--~--~---



Re: Help with the dot operator special form

2009-03-22 Thread David Nolen
Thanks again to all for the help, clj-cont now supports the new and dot
special forms.  This also means that dosync, doto, .. all work perfectly
fine from within a with-call-cc form.
You can now write things like this:
(let [cc (atom nil)]
   [(with-call-cc
  (. (let-cc k
   (reset! cc k)
   (k Hello))
 substring
 2))
(@cc Goodbye)])

- [llo odbye]

One caveat is that you can't use the let-cc form within a dosync block
that's embedded in a with-call-cc. This is probably for the best anyway.
Also since the dot and new forms are being transformed into a version that
relies on reflection you can't expect this code to be super performant.
 That may or may matter depending on your use case ;)

On Sun, Mar 22, 2009 at 5:28 PM, David Nolen dnolen.li...@gmail.com wrote:

 That was it! At one point I knew these things. Thanks much.


 On Sun, Mar 22, 2009 at 2:18 PM, Eric Tschetter eched...@gmail.comwrote:


  (let [myref (ref {})]
(dot
 clojure.lang.LockingTransaction
 (list 'runInTransaction (fn [] (commute myref assoc :mykey
 :myval)
  I'm getting a instance method not found exception which seems odd. I
 looked
  at LockingTransaction.java and I see that runInTransaction does in fact
 take
  Callable, and fn's are Callable.  Any thoughts?

 I haven't double checked the clojure code, but it looks like you are
 trying to call a static method, not an instance method, and that is
 what is causing the exception.

 --Eric Tschetter

 



--~--~-~--~~~---~--~~
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 
clojure+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/clojure?hl=en
-~--~~~~--~~--~--~---



Java Posse exposure

2009-03-22 Thread Mark Volkmann

Many of you may be familiar with the Java Posse podcast. Their
website is http://javaposse.com/. Near the end of the most recent
episode, #235, they mentioned my Clojure article and provided a link
on their website. So more press for Clojure!

BTW, I have made many updates to the article since I first announced
it. Many of the updates were inspired by feedback I received from this
list. Thank you very much for that!

For a list of the updates that were made and a link to the latest
version of the article, see http://ociweb.com/mark/clojure/. I'm
always open to more suggestions and will continue improving it so it
can remain a valuable resource for people that want to learn Clojure.

-- 
R. Mark Volkmann
Object Computing, Inc.

--~--~-~--~~~---~--~~
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 
clojure+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/clojure?hl=en
-~--~~~~--~~--~--~---



Re: User contributed packages (Cabel, CPAN, etc)

2009-03-22 Thread Stuart Sierra

On Mar 22, 12:57 pm, Bradbev brad.beveri...@gmail.com wrote:
 Is the clojure-contrib portion of Clojure meant to act as a package
 system like Cabel, CPAN, etc?  I suspect not.  Clojure-contrib is more
 like the standard library that comes with Clojure.

Speaking as a contributor, I don't think it's big enough to qualify as
a standard library yet.  It's just odds and ends, plus a testing
ground for possible new features in core.

On Mar 22, 5:46 pm, Christian Vest Hansen karmazi...@gmail.com
wrote:
 I was hoping that we could piggy-back on one of Java's packaging
 ... the Maven repository system is pretty popular and even
 supported by build tools other than Maven

Maven is a big, complicated beast, but... it's there, it's widely
deployed, and it's Java.  That makes it a good choice in my book.  The
less new infrastructure Clojure requires, the better, I believe.

-Stuart Sierra
--~--~-~--~~~---~--~~
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 
clojure+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/clojure?hl=en
-~--~~~~--~~--~--~---



contrib mmap/duck_streams for binary data

2009-03-22 Thread zoglma...@gmail.com

While playing around and implementing straight up Humman compression,
I wrote a handful of utilities to conveinently play with byte and bit
streams because I didn't see anything too helpful in the mmap and
duck_stream files.

What I wrote would need to be changed to better work with the existing
code and to increase performance, but does anyone think that it would
be helpful to add these things for playing with binary data into
contrib?

; to exercise everything -- use this to copy a file -- obviously
change the files
(time (to-file /Users/kaz/Desktop/Programming Clojure-copy.pdf (bit-
to-byte-stream (byte-to-bit-stream (to-byte-stream /Users/kaz/Desktop/
Programming Clojure.pdf)

; to play with Huffman compress/decompression
(compress-file /Users/kaz/Desktop/onlisp.pdf /Users/kaz/Desktop/
onlisp.pdf.compress)
(uncompress-file /Users/kaz/Desktop/onlisp.pdf.compress /Users/kaz/
Desktop/onlisp2.pdf)

;
;-- setup files to act like streams at the bit level
-
;
(defn array-to-list [arr list-size]
   (loop [index 0 accum []]
 (if (or (= index (alength arr)) (= index list-size))
   accum
   (recur (inc index) (conj accum (aget arr index))

(defn list-to-array [l array-type arr-size]
  (let [arr-size (min arr-size (count l))
arr (make-array array-type arr-size)]
(loop [index 0 l l]
  (if (= index arr-size)
arr
(do
  (aset arr index (first l))
  (recur (inc index) (rest l)))

(defn num-to-bits [num size]
  (loop [num num size size accum nil]
(if (= size 0)
  accum
  (let [next-n (bit-shift-right num 1)
next-bit (bit-xor num (bit-shift-left next-n 1))]
(recur next-n (dec size) (cons next-bit accum))

(import '(java.io FileInputStream FileOutputStream))
(defn to-byte-stream [filename]
   (let [bufsize 65536
is (FileInputStream. filename)
read-buf
   (fn []
 (let [buf (make-array (Byte/TYPE) bufsize)
   num-read (.read is buf 0 bufsize)]
   (if (= num-read -1)
 (do
   (.close is)
   nil)
 (array-to-list buf num-read
read-all
   (fn read-all []
 (let [next-buf (read-buf)]
   (if (nil? next-buf)
 nil
 (lazy-cat next-buf (read-all)]
 (read-all)))

(defn byte-to-bit-stream [l]
   (if (nil? l)
 nil
 (lazy-cat (num-to-bits (first l) 8) (byte-to-bit-stream (rest
l)

(defn bits-to-num [l num-bit-size]
   (let [cnt (count (take num-bit-size l))]
 (if ( cnt num-bit-size)
(bits-to-num (lazy-cat l (take (- num-bit-size cnt) (repeat
0))) num-bit-size)
   (loop [l l size num-bit-size accum 0]
(if (= size 0)
  (list accum l)
  (recur (rest l) (dec size) (bit-or (bit-shift-left accum 1)
(first l

(defn bit-to-byte-stream [l]
   (if (nil? l)
 nil
 (let [[next-byte rst] (bits-to-num l 8)]
   (lazy-cons next-byte (bit-to-byte-stream rst)

(defn to-file [filename byte-stream]
  (let [os (FileOutputStream. filename)]
(loop [bytes byte-stream bytes-written 0]
  (if (nil? bytes)
(do
  (.close os)
  bytes-written)
(let [[bytes rest-bytes] (split-at 65536 bytes)
  buf (list-to-array (map byte bytes) (Byte/TYPE) 65536)
  wrote-now (alength buf)]
  (do
 (.write os buf 0 wrote-now)
 (recur rest-bytes (+ bytes-written wrote-now

;
;-- Using byte/bit streams to do huffman -
;

(defn get-occurances [l]
 (loop [l l accum {}]
   (if (empty? l)
 accum
 (let [next (first l)
current-count (if (nil? (accum next)) 0 (accum next))
next-accum (assoc accum next (inc current-count))]
(recur (rest l) next-accum)


(defn tree-has-children? [tree]
 (and (not (nil? tree)) (or (not (nil? (tree :left-child))) (not (nil?
(tree :right-child))
(defn tree-has-lchild? [tree]
 (and (not (nil? tree)) (not (nil? (tree :left-child)
(defn tree-has-rchild? [tree]
 (and (not (nil? tree)) (not (nil? (tree :right-child)
(defn tree-count [tree]
 (if (nil? tree)
   0
   (+ 1
  (if (tree-has-lchild? tree) (tree-count (tree :left-child)) 0)
  (if (tree-has-rchild? tree) (tree-count (tree :right-child))
0

(defn get-hufftree [occurances]
 (let [build (fn build [occurances]
(let [sorted-occurances (sort-by (fn [[tree val num-occur]] num-
occur) occurances)]
  (cond (nil? 

Re: Behavior of clojure.set/union and hinting function arguments

2009-03-22 Thread Stuart Sierra

On Mar 22, 2:34 pm, Frantisek Sodomka fsodo...@gmail.com wrote:
 (defn f [#^Double x] (+ x 2)) = #'user/f
 (f 3) = 5
 (f nil) = java.lang.NullPointerException (NO_SOURCE_FILE:0)
 ; why NPE?

nil is Java null.  The Clojure + function eventually compiles to
Java +, which throws an exception on null.

 (f 2/3) = 8/3
 ; why not an error that argument isn't java.lang.Double?

The type tag is just a hint, not a constraint.  This might be an error
in ahead-of-time compiled Clojure, but not at the REPL.

 (f a) = java.lang.ClassCastException: java.lang.String cannot be
 cast to java.lang.Number (NO_SOURCE_FILE:0)
 ; wants java.lang.Number, but I was hinting for java.lang.Double

As above, the type tag is not a constraint.  But + needs a number,
and that *is* a constraint.

-Stuart Sierra
--~--~-~--~~~---~--~~
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 
clojure+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/clojure?hl=en
-~--~~~~--~~--~--~---



Re: version of - short-circuiting on nil

2009-03-22 Thread Stephen C. Gilardi


On Mar 22, 2009, at 4:43 PM, Meikel Brandmeyer wrote:


Is .?. necessary? - does the same job as .. by
virtue of the .method notation, but is more general.
So, why not get rid of .. and .?. completely?


That sounds right to me, Meikel. I'm in favor of keeping only -? .

--Steve



smime.p7s
Description: S/MIME cryptographic signature


Re: Ant and debian 5.0 version issues

2009-03-22 Thread Dan Beauchesne


Michael Wood esiot...@gmail.com writes:

 Are you sure it's not trying to use gcj instead of Sun java?

 What do java -version and javac -version give you?  And does
 update-alternatives --list java or javac print anything?

java -version:
OpenJDK  Runtime Environment (build 1.6.0_0-b11)
OpenJDK Server VM (build 1.6.0_0-b11, mixed mode)

javac -version:
javac 1.6.0_0-internal

update-alternatives --list java:
/usr/bin/gij-4.3
/usr/lib/jvm/java-gcj/jre/bin/java
/usr/lib/jvm/java-6-openjdk/jre/bin/java


I'm stumped, I don't see anything as version 1.4.

--~--~-~--~~~---~--~~
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 
clojure+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/clojure?hl=en
-~--~~~~--~~--~--~---



Re: contrib mmap/duck_streams for binary data

2009-03-22 Thread Sean

Could you throw this on github, so we can easily follow along with
improvements?

On Mar 22, 8:25 pm, zoglma...@gmail.com zoglma...@gmail.com wrote:
 While playing around and implementing straight up Humman compression,
 I wrote a handful of utilities to conveinently play with byte and bit
 streams because I didn't see anything too helpful in the mmap and
 duck_stream files.

 What I wrote would need to be changed to better work with the existing
 code and to increase performance, but does anyone think that it would
 be helpful to add these things for playing with binary data into
 contrib?

 ; to exercise everything -- use this to copy a file -- obviously
 change the files
 (time (to-file /Users/kaz/Desktop/Programming Clojure-copy.pdf (bit-
 to-byte-stream (byte-to-bit-stream (to-byte-stream /Users/kaz/Desktop/
 Programming Clojure.pdf)

 ; to play with Huffman compress/decompression
 (compress-file /Users/kaz/Desktop/onlisp.pdf /Users/kaz/Desktop/
 onlisp.pdf.compress)
 (uncompress-file /Users/kaz/Desktop/onlisp.pdf.compress /Users/kaz/
 Desktop/onlisp2.pdf)

 ;-- 
 --
 ;-- setup files to act like streams at the bit level
 -
 ;-- 
 --
 (defn array-to-list [arr list-size]
    (loop [index 0 accum []]
      (if (or (= index (alength arr)) (= index list-size))
        accum
        (recur (inc index) (conj accum (aget arr index))

 (defn list-to-array [l array-type arr-size]
   (let [arr-size (min arr-size (count l))
         arr (make-array array-type arr-size)]
     (loop [index 0 l l]
       (if (= index arr-size)
         arr
         (do
           (aset arr index (first l))
           (recur (inc index) (rest l)))

 (defn num-to-bits [num size]
   (loop [num num size size accum nil]
     (if (= size 0)
       accum
       (let [next-n (bit-shift-right num 1)
             next-bit (bit-xor num (bit-shift-left next-n 1))]
         (recur next-n (dec size) (cons next-bit accum))

 (import '(java.io FileInputStream FileOutputStream))
 (defn to-byte-stream [filename]
    (let [bufsize 65536
         is (FileInputStream. filename)
         read-buf
            (fn []
              (let [buf (make-array (Byte/TYPE) bufsize)
                    num-read (.read is buf 0 bufsize)]
                (if (= num-read -1)
                  (do
                    (.close is)
                    nil)
                  (array-to-list buf num-read
         read-all
            (fn read-all []
              (let [next-buf (read-buf)]
                (if (nil? next-buf)
                  nil
                  (lazy-cat next-buf (read-all)]
      (read-all)))

 (defn byte-to-bit-stream [l]
    (if (nil? l)
      nil
      (lazy-cat (num-to-bits (first l) 8) (byte-to-bit-stream (rest
 l)

 (defn bits-to-num [l num-bit-size]
    (let [cnt (count (take num-bit-size l))]
      (if ( cnt num-bit-size)
         (bits-to-num (lazy-cat l (take (- num-bit-size cnt) (repeat
 0))) num-bit-size)
        (loop [l l size num-bit-size accum 0]
         (if (= size 0)
           (list accum l)
           (recur (rest l) (dec size) (bit-or (bit-shift-left accum 1)
 (first l

 (defn bit-to-byte-stream [l]
    (if (nil? l)
      nil
      (let [[next-byte rst] (bits-to-num l 8)]
        (lazy-cons next-byte (bit-to-byte-stream rst)

 (defn to-file [filename byte-stream]
   (let [os (FileOutputStream. filename)]
     (loop [bytes byte-stream bytes-written 0]
       (if (nil? bytes)
         (do
           (.close os)
           bytes-written)
         (let [[bytes rest-bytes] (split-at 65536 bytes)
               buf (list-to-array (map byte bytes) (Byte/TYPE) 65536)
               wrote-now (alength buf)]
           (do
              (.write os buf 0 wrote-now)
              (recur rest-bytes (+ bytes-written wrote-now

 ;-- 
 --
 ;-- Using byte/bit streams to do huffman -
 ;-- 
 --

 (defn get-occurances [l]
  (loop [l l accum {}]
    (if (empty? l)
      accum
      (let [next (first l)
             current-count (if (nil? (accum next)) 0 (accum next))
             next-accum (assoc accum next (inc current-count))]
         (recur (rest l) next-accum)

 (defn tree-has-children? [tree]
  (and (not (nil? tree)) (or (not (nil? (tree :left-child))) (not (nil?
 (tree :right-child))
 (defn tree-has-lchild? [tree]
  (and (not (nil? tree)) (not (nil? (tree :left-child)
 (defn tree-has-rchild? [tree]
  (and (not (nil? tree)) (not (nil? (tree :right-child)
 (defn tree-count [tree]
  (if (nil? tree)
    0
    (+ 1
       (if (tree-has-lchild? tree) (tree-count (tree 

Re: version of - short-circuiting on nil

2009-03-22 Thread Graham Fawcett

On Sun, Mar 22, 2009 at 9:05 PM, Stephen C. Gilardi squee...@mac.com wrote:

 On Mar 22, 2009, at 4:43 PM, Meikel Brandmeyer wrote:

 Is .?. necessary? - does the same job as .. by
 virtue of the .method notation, but is more general.
 So, why not get rid of .. and .?. completely?

 That sounds right to me, Meikel. I'm in favor of keeping only -? .

Might I suggest maybe- ? This function has a strong similarity to
the Maybe monad in Haskell and similar languages.

and- would be another less Haskelly candidate, and is reminiscent
of Scheme's and-let* which is also sort-of similar.

Best,
Graham

--~--~-~--~~~---~--~~
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 
clojure+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/clojure?hl=en
-~--~~~~--~~--~--~---



Re: User contributed packages (Cabel, CPAN, etc)

2009-03-22 Thread Phil Hagelberg

Bradbev brad.beveri...@gmail.com writes:

 I feel that the next big growth phase for Clojure will be in the user
 community and the code that we can generate.  A good package manager
 will help fuel that growth.

I agree. The more I work with packages that have dependencies the more I
realize that manually managing them will simply not scale.

 And now I'll cop out  say that I have no idea about how to actually
 implement this sort of thing - I'm hoping somebody else will want to
 do it for me :)

As Paul mentioned, adding to the classpath at runtime supposedly is
fraught with peril, though I've never got a clear answer whether this
applies to Clojure code or just Java code. I suspect it may be workable
to have shell scripts that set up the classpath rather than calculating
it from within Clojure code. This may be the trickiest part of the
implementation since most languages with package managers have a load
path mechanism that's much more flexible than the JVM's.

I definitely think being able to read from the Maven repository format
sounds like a good idea, though I haven't had too much interaction with
the tool itself.

It would probably be good to just start brainstorming about what
features would be needed for such a tool:

* Servers need to host jars as well as indices of metadata about jars
  that would indicate versions, descriptions, and dependencies between
  jars.

* The client needs to be able to download jars and their dependent jars
  and store them on disk. Multiple versions of a library should be able
  to be installed at once. (apt-get doesn't support this natively, and a
  lot of unfortunate hacks are needed to work around this.) Packages
  should be able to specify which servers each dependency should come
  from. Jars should be able to be installed on a system-wide level as
  well as in a user's home directory.

* Code needs to be able to state its dependencies, probably as part of
  the ns macro. Flexible version declarations will be necessary. (eg. I
  need exactly version 1.8.0 of a library, I need at least version 2.3.1
  of a library, or I need any version in the 0.9 series starting with
  0.9.1 but allowing in bugfix point-releases.)

Anything else? I'd love to help out with implementation, whether by
hacking Sauron or some other (hopefully less evil) alternative, but I
think it's important that our efforts be unified.

-Phil
http://technomancy.us

--~--~-~--~~~---~--~~
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 
clojure+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/clojure?hl=en
-~--~~~~--~~--~--~---



Mapping a function over a map's values

2009-03-22 Thread Jon Nadal

I often need to map a function over the values of a map while
preserving keys--something like:

[code]
(defn mapmap [fn m]
  (let [k (keys m)
v (map fn (vals m))]
(zipmap k v)))

(mapmap inc {:a 0, :b 1})
[/code]

Is there a more concise way to do this in Clojure?  If not, is this
something that might be worth putting in the contrib?

-Jon

--~--~-~--~~~---~--~~
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 
clojure+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/clojure?hl=en
-~--~~~~--~~--~--~---



What makes Clojure an easier Lisp?

2009-03-22 Thread Joshua Fox
I dove into Lisp and Scheme several times in the past, but only with Clojure
did Lisp  really catch?
1. Clojure abandons the 1950's cruft, with all-caps and abbreviations like
SETQ and CDR. However, Scheme does this too, without achieving the ease of
Clojure.

2. Clojure is typically illustrated with simple, practical examples. Other
Lisps are often introduced as tools for theory. Not that there's anything
wrong with that, like they said on Seinfeld. On the other hand, Clojure's
examples are often, for better or worse, somewhat more sophisticated than
the typical examples used for teaching other languages.

3. Clojure has some syntax choices that make it more readable. It specifies
the use of fewer parentheses and  uses three types brackets rather than just
parentheses. However, some dialects of Lisp do allow the mixture of bracket
types for visual variety.

4. The connection to Java, even if not essential to most introductory
examples, provides a lifeline for the user.

5. Even though pure-functional  is not what  most programmers are used to,
once you learn it, it makes everything else easier;  in contrast to
non-pure-functional Lisp dialects

Any other thoughts on this?

Joshua

--~--~-~--~~~---~--~~
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 
clojure+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/clojure?hl=en
-~--~~~~--~~--~--~---



Re: STM and useful concurrency

2009-03-22 Thread e
i think it would be awesome if someone worked up a scenario . . . started
using regular old java  . . . and we could walk into a few gotchas,
publicly/transparently, where a serious java guy could chime in ... and
really see what the stm buys.  Then we'd have an even richer appreciation
for the STM model.  Specifically, how learning STM is easier than learning
concurrency as taught in a typical cs curriculum.



On Sun, Mar 22, 2009 at 10:12 PM, Mark Volkmann
r.mark.volkm...@gmail.comwrote:


 I'm trying to understand the degree to which Clojure's STM provides
 more concurrency than Java's blocking approach. I know it's difficult
 to make generalizations and that specific applications need to be
 measured, but I'll give it a go anyway.

 Clearly using STM (dosync with Refs) makes code easier to write than
 using Java synchronization because you don't have to determine up
 front which objects need to be locked. In the Clojure approach,
 nothing is locked. Changes in the transaction happen to in-transaction
 values and there is only a small amount of blocking that occurs at the
 end of the transaction when changes are being committed. Score one for
 Clojure!

 What concerns me though is how often the work done in two transactions
 running in separate threads turns out to be useful work. It seems that
 it will typically be the case that when two concurrent transactions
 access the same Refs, one of them will commit and the other will
 retry. The retry will discard the in-transaction changes that were
 made to the Refs, essentially rendering the work it did of no value.
 So there was increased concurrency, but not useful concurrency.

 Of course there is a chance that the transaction contains some
 conditional logic that makes it so the Refs to be accessed aren't
 always the same, but my speculation is that that's are rare
 occurrence. It's probably more typical that a transaction always
 accesses the same set of Refs every time it executes.

 This makes it seem that Java's locking approach isn't so bad. Well,
 it's bad that I have to identify the objects to lock, but it's good
 that it doesn't waste cycles doing work that will just be thrown away.

 I hope I'm missing some important details and will be set straight by
 someone!

 --
 R. Mark Volkmann
 Object Computing, Inc.

 


--~--~-~--~~~---~--~~
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 
clojure+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/clojure?hl=en
-~--~~~~--~~--~--~---



Re: Mapping a function over a map's values

2009-03-22 Thread Kevin Downey

(defn mapmap [fn m]
(into {} (map #(vector (first %) (fn (second %))) m)))

On Sun, Mar 22, 2009 at 1:10 PM, Jon Nadal jon.na...@gmail.com wrote:

 I often need to map a function over the values of a map while
 preserving keys--something like:

 [code]
 (defn mapmap [fn m]
  (let [k (keys m)
        v (map fn (vals m))]
    (zipmap k v)))

 (mapmap inc {:a 0, :b 1})
 [/code]

 Is there a more concise way to do this in Clojure?  If not, is this
 something that might be worth putting in the contrib?

 -Jon

 




-- 
And what is good, Phaedrus,
And what is not good—
Need we ask anyone to tell us these things?

--~--~-~--~~~---~--~~
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 
clojure+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/clojure?hl=en
-~--~~~~--~~--~--~---



Re: The unshared part of two mostly-shared structures

2009-03-22 Thread e


 my programming language enchilada (www.enchiladacode.nl)


 interesting.  I was thinking today about how STM reminds me of version
control.

--~--~-~--~~~---~--~~
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 
clojure+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/clojure?hl=en
-~--~~~~--~~--~--~---



Re: Mapping a function over a map's values

2009-03-22 Thread Timothy Pratley

Golf time!

(defn mapmap [f m]
(into {} (map (fn [[x y]] [x (f y)]) m)))


On Mar 23, 2:51 pm, Kevin Downey redc...@gmail.com wrote:
 (defn mapmap [fn m]
     (into {} (map #(vector (first %) (fn (second %))) m)))

--~--~-~--~~~---~--~~
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 
clojure+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/clojure?hl=en
-~--~~~~--~~--~--~---



Re: New release 20090320

2009-03-22 Thread Howard Lewis Ship

I'd like to remind people using Clojure and Maven that they can get
nightly builds of Maven via the Tapestry360 maven snapshot repository:

http://tapestry.formos.com/maven-snapshot-repository

To access the nightly snapshot in Maven, you must update your
pom.xml's repositories element (creating it as necessary):

 repositories
   repository
   idtapestry-snapshots/id
   urlhttp://tapestry.formos.com/maven-snapshot-repository//url
   /repository
 /respositories

You can then add a dependency for Clojure:

 dependency
groupIdorg.clojure/groupId
artifactIdclojure-lang/artifactId
version1.0-SNAPSHOT/version
 /dependency

Note that the repository includes a sources JAR (most IDEs will
download it automatically, which may help with debugging).  In
addition, there's a slim variant, where the core library Clojure
sources are NOT pre-compiled:

 dependency
groupIdorg.clojure/groupId
artifactIdclojure-lang/artifactId
version1.0-SNAPSHOT/version
classifierslim/classifier
 /dependency

On Fri, Mar 20, 2009 at 7:15 AM, Rich Hickey richhic...@gmail.com wrote:

 New release 20090320 - 
 http://clojure.googlecode.com/files/clojure_20090320.zip

 Incorporates all the recent additions - fully lazy seqs, :let option
 for doseq/for, letfn for mutually recursive local fns, synchronous
 watches, multi-arg set/union/difference/intersection, counted?, per-
 defmulti hierarchies, #_ ignore form reader macro, future-calls,
 future and pcalls/pvalues, defmulti docstrings and metadata, methods/
 prefers for multimethod reflection, uniform metadata handling for
 atoms/refs/agents/vars/namespaces, condp, release-pending-sends, AOT
 tweaks to support applets and Android, etc. All this in addition to
 many fixes and enhancements.

 The API docs page is now current - changes to the rest of the site
 will come soon.

 This release includes many patches from contributors, and input and
 reports from many users - thanks all!

 Rich

 




-- 
Howard M. Lewis Ship

Creator Apache Tapestry and Apache HiveMind

--~--~-~--~~~---~--~~
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 
clojure+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/clojure?hl=en
-~--~~~~--~~--~--~---