Re: looking for a simpler implementation of a function I'm using
On Sun, Aug 8, 2010 at 10:32 PM, Meikel Brandmeyer m...@kotka.de wrote: I'm bit confused about what you mean here, but vector append (read: conj) is O(1) (don't nail me down on whether it's amortised). There is no array copying going on underneath. Assuming vector is implemented in some form of array(well it seems to have the characteristic of an array where accessing any element would be O(1)), appending one element can be O(1) if there are space reserved for some extra items but if that action is repeated till the slack is filled up, some form of re-shuffling is needed. This compares to a single link list which is just a nested cons. So I fail to see how it can be O(1) in the cons sense where no reshuffling would occur no matter how many cons are there. As I said, I am not questioning the performance difference(I am pretty sure it is very efficient), but curious. -- 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
Re: looking for a simpler implementation of a function I'm using
On Sun, Aug 8, 2010 at 10:50 PM, Meikel Brandmeyer m...@kotka.de wrote: Hi, On Aug 8, 6:19 pm, gary ng garyng2...@gmail.com wrote: I wrote a similar version in F# which does have the advantage of handling infinite input or a very long partition in the sense that I can still consume the first element immediately and can skip to the second, third group ... In a sense, the result is a lazy list of lazy list and if the consumer doesn't hold on to any of them, the memory usage is constant. I don't think it is possible to do this. At least not in a functional way. Assume your first item of the resulting sequence is a lazy sequence representing the first group. To define the rest of the sequence you have to know the end of the first group in the input sequence. However this can only be found by traversing the input sequence. So this must again be some lazy sequence like a drop-while or so. But no matter how it is directly implemented, it must retain the head of the input sequence for traversal. So, if I traverse the first group, its items cannot be GC'd because of the rest definition of the sequence. But the same holds true if I skip to the second group without realising the first one: to find the actual second group I have to realise the rest of the sequence, which will also realise the items of the first group. So there is no point in not realising the groups: its done anyway, no matter what. You just introduce unnecessary laziness overhead. Yes and No. I have experiemented it a bit back when I was doing it and in certain cases, there are some advantages(mostly in memory usage) even though the front of the list still needs to be realized. Say I want the 'head of each group'. I think the Haskell implementation has this characteristic too. -- 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
why the def of run-jetty looks like defn #^Server run-jetty
The follow is the ring's source, and I am a newbie in Clojure. what the defn of run-jetty looks like this form, what's the meaning of #^Server in the defn and let? Thanks in advance. Limux. (defn #^Server run-jetty Serve the given handler according to the options. Options: :configurator - A function called with the Server instance. :port :host :join? - Block the caller: defaults to true. :ssl? - Use SSL. :ssl-port - SSL port: defaults to 443, implies :ssl? :keystore :key-password :truststore :trust-password [handler options] (let [#^Server s (create-server (dissoc options :configurator))] (when-let [configurator (:configurator options)] (configurator s)) (doto s (.setHandler (proxy-handler handler)) (.start)) (when (:join? options true) (.join s)) 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 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
Re: why the def of run-jetty looks like defn #^Server run-jetty
On Aug 9, 8:25 am, limux liumengji...@gmail.com wrote: what's the meaning of #^Server in the defn and let? (defn #^Server run-jetty ... (let [#^Server s (create-server (dissoc options :configurator))] It's a type hint. In the defn it specifies the type of the return value, in the let it gives the type of the var. #^... is the Clojure 1.1 syntax, in 1.2 it has changed to ^... Type hints are optional. See http://clojure.org/java_interop#Java%20Interop-Type%20Hints Regards jf -- 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
Re: looking for a simpler implementation of a function I'm using
Hi, On Aug 9, 8:06 am, gary ng garyng2...@gmail.com wrote: Assuming vector is implemented in some form of array(well it seems to have the characteristic of an array where accessing any element would be O(1)), appending one element can be O(1) if there are space reserved for some extra items but if that action is repeated till the slack is filled up, some form of re-shuffling is needed. It doesn't use arrays underneath (not in the one big array sense), but a tree. So copying of array contents is limited to arrays sizes of 32 elements, which still counts as O(1). So it is in general faster than using cons + reverse, which is O(n) and doesn't work with infinite input. See here for more info: http://blog.higher-order.net/2009/02/01/understanding-clojures-persistentvector-implementation/ Accessing an element in a vector is actually O(log32 n), not O(1). 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
Re: why the def of run-jetty looks like defn #^Server run-jetty
I see, heartly thanks, and there is no any words about it in API doc of clojure.org yet! Regards limux. On 8月9日, 下午3时04分, j-g-faustus johannes.fries...@gmail.com wrote: On Aug 9, 8:25 am, limux liumengji...@gmail.com wrote: what's the meaning of #^Server in the defn and let? (defn #^Server run-jetty ... (let [#^Server s (create-server (dissoc options :configurator))] It's a type hint. In the defn it specifies the type of the return value, in the let it gives the type of the var. #^... is the Clojure 1.1 syntax, in 1.2 it has changed to ^... Type hints are optional. Seehttp://clojure.org/java_interop#Java%20Interop-Type%20Hints Regards jf -- 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
Re: why the def of run-jetty looks like defn #^Server run-jetty
The type hint can be placed on function parameters, let-bound names, var names, and expressions. And it can be placed behind or ahead of them. Isn't it? On 8月9日, 下午3时31分, limux liumengji...@gmail.com wrote: I see, heartly thanks, and there is no any words about it in API doc of clojure.org yet! Regards limux. On 8月9日, 下午3时04分, j-g-faustus johannes.fries...@gmail.com wrote: On Aug 9, 8:25 am, limux liumengji...@gmail.com wrote: what's the meaning of #^Server in the defn and let? (defn #^Server run-jetty ... (let [#^Server s (create-server (dissoc options :configurator))] It's a type hint. In the defn it specifies the type of the return value, in the let it gives the type of the var. #^... is the Clojure 1.1 syntax, in 1.2 it has changed to ^... Type hints are optional. Seehttp://clojure.org/java_interop#Java%20Interop-Type%20Hints Regards jf -- 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
Re: why the def of run-jetty looks like defn #^Server run-jetty
I am not 100% sure, but it seems they are always ahead. (defn ^Bar foo ...) tells that function foo returns something of class Bar. (f ^Bar expr) says that expr is of type Bar. (let [ ^Bar e expr] ... says that e is of type Bar. (Bar can be a class or an interface.) The main usage (at least for me) is avoiding reflection in the context of direct call to a Java method. if you write: (defn foo [x] (.clone x)) For Clojure, x is an object and so it does not know anything about its interface (the methods it understands). So it cannot do better than a dynamic dispatch, looking at x class by reflection and searching for a method named clone with the right signature. It can be long, and so should be avoided on code that is called more than rarely. To avoid that: (defn foo [^Clonable x] (.clone x)) Now, Clojure knows at compile-time that x is Clonable. It can check that clone is in the known interface and use a direct method call, which is faster. (set! *warn-on-reflection* true) makes the compiler emit a warning in the first case. You should remark that this kind of problem only occurs when interfacing directly with the host language. Other usages may happen, like when a specific signatures is needed for interoperability. Hope I am not too wrong and that helps. Nicolas -- 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
Re: slow raw io
On Sat 07/08/10 14:02 , Stuart Halloway stuart.hallo...@gmail.com sent: No. We want to collect more information and do more comparisons before moving away from the recommended Java buffering. Stu This isn't an issue with the buffering, it is an issue with the massive overhead of doing character at a time i/o - it is something that you really should never ever do. I'd say something somewhere doing character at a time i/o is probably the number one cause of crippling performance problems that I've seen in Java. -- Dave -- 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
zipping sequences
Dear all, I can't find a function in the library and don't see any easy way to write it. I am looking for something like (zip seqs) such that (zip [a1 an] [b1 bn]) = [[a1 b1] . [an bn]] Any function like that or easy way to construct it? Best regards, Nicolas. -- 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
Re: zipping sequences
Hi, On Aug 9, 12:21 pm, Nicolas Oury nicolas.o...@gmail.com wrote: (zip [a1 an] [b1 bn]) = [[a1 b1] . [an bn]] (map vector [a1 ... an] [b1 ... bn]) 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
Re: slow raw io
This isn't an issue with the buffering, it is an issue with the massive overhead of doing character at a time i/o - it is something that you really should never ever do. I'd say something somewhere doing character at a time i/o is probably the number one cause of crippling performance problems that I've seen in Java. Just to add, the implementation really ought to use the stream copy stuff from clojure.java.io, which copies streams using a 1k buffer by default. -- Dave -- 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
Re: zipping sequences
Thank you very much, it works great. On Mon, Aug 9, 2010 at 11:23 AM, Meikel Brandmeyer m...@kotka.de wrote: Hi, On Aug 9, 12:21 pm, Nicolas Oury nicolas.o...@gmail.com wrote: (zip [a1 an] [b1 bn]) = [[a1 b1] . [an bn]] (map vector [a1 ... an] [b1 ... bn]) 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
Re: slow raw io
On Aug 7, 5:43 am, Peter Schuller peter.schul...@infidyne.com wrote: Interesting. Why do you consider it recommended to read one character at a time in a case like this? Maybe there is such a recommendation that I don't know about, but in general I would consider it contrary to expected practice when doing I/O if performance is a concern. That's not a practice I'm familiar with either. Everything I've ever read on I/O tuning suggests that reading single char is worst-case performance, which seems borne out here. Maybe this seems like a low-priority issue but I think slurp is likely to be very commonly used. For instance, the Riak tutorial just posted to Hacker News uses it: http://mmcgrana.github.com/2010/08/riak-clojure.html -- miles -- 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
Re: TextMate users, what bundle are you using?
David - Thanks for the tip. I look forward to your REPL interaction; I think this is important for TextMate users to have a good time. On Aug 7, 11:38 pm, David Nolen dnolen.li...@gmail.com wrote: On Sat, Aug 7, 2010 at 4:47 PM, frou m...@frou.org wrote: Searching Google, I see there are several TextMate bundles for Clojure support. Some old, some new-ish. I'm sure there are others I didn't find. Who's using TextMate for Clojure? What's your tip for the best bundle / auxiliary tools? Thank you I don't think there are any that are satisfactory beyond syntax highlighting. For that I've find Mark McGranaghan's to be the best:http://github.com/mmcgrana/textmate-clojure. I've forked it and have been working on adding decent REPL interactions via cake:http://github.com/ninjudd/cake. cake supports persistent REPLs and allows for quickly eval'ing sexprs from the command line. This makes TextMate integration pretty straightforward. Been a bit busy so it might a be a week or two before I have anything worth using. David -- 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
Re: slow raw io
Maybe this seems like a low-priority issue but I think slurp is likely to be very commonly used. For instance, the Riak tutorial just posted to Hacker News uses it: http://mmcgrana.github.com/2010/08/riak-clojure.html In the past I've steered clear of using slurp because it didn't hand character encodings, so I had to write my own version (which did do block at a time copying), but now that the API has been fixed, I'd hope to be able to use the version in core, but only if the implementation is usable. -- Dave -- 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
ANN : random-hash-tries SNAPSHOT
Dear all, I have made a very small library, which is very preliminary but usable. It allows to create a distribution and draw from it. Insertions, deletions, drawing are in O(log n). example: (def dist (distribution-from-seqable {:a 1 :b 2})) (draw dist) = :a with proba 1/3, :b with proba 2/3 There is still a lot of work to do. It is currently slower than Clojure hash-maps, for insertions, but not ridiculously so. It takes more memory too, but it will improve. User, suggestions and contributions are more than welcome. You can mail me if you have any question on how to use it. It is on clojars: nicolasoury.random-hash-tries. There is also a public repository: git://nicolasoury.repositoryhosting.com/nicolasoury/random-hash-tries.git Best regards, Nicolas. -- 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
jna Java Native Acess and clojure ....
Hello everybody, I have been trying to use the native libraries in clojure. I have found clj-native and clojure-jna which may serve the purposes. I would like to get a feed back from the community .. Which of these is good to use .. Or do you have any other suggestions.. Thanks in advances... Sunil. -- 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
Re: jna Java Native Acess and clojure ....
On Mon, Aug 9, 2010 at 10:55 AM, Sunil Nandihalli sunil.nandiha...@gmail.com wrote: Hello everybody, I have been trying to use the native libraries in clojure. I have found clj-native and clojure-jna which may serve the purposes. I would like to get a feed back from the community .. Which of these is good to use .. Or do you have any other suggestions.. I wrote clojure-jna, but although I haven't had a chance to use clj-native yet I understand it's significantly more advanced and efficient than clojure-jna. So I'd recommend at least starting with clj-native to see if it will meet your needs. --Chouser http://joyofclojure.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 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
Re: System calls
Thanks jf, that worked: (ns msms (:gen-class) (:use [clojure.contrib.shell-out :only (sh)])) (defn get-msms-pts-OSX [{pdb-file :pdb-file density :density radius :radius :as all :or {density 1.0 radius 1.5}}] (if (contains? all :pdb-file) (sh bash :in (str /Users/daviddreisigmeyer/msms_MacOSX_2.6.1/ pdb_to_xyzr pdb-file /Users/daviddreisigmeyer/lisps/clojure/dpa/src/hold.xyzr msms.MacOSX.2.6.1 -if /Users/daviddreisigmeyer/lisps/clojure/dpa/src/hold.xyzr -of /Users/daviddreisigmeyer/lisps/clojure/dpa/src/hold - no_header -density density -probe_radius radius rm -f /Users/daviddreisigmeyer/lisps/clojure/dpa/src/hold.xyzr /Users/daviddreisigmeyer/lisps/clojure/dpa/src/hold.face)) (println No pdb-file provided in get-msms-pts-OSX.))) Without the in the system call: (defn get-msms-pts-OSX [{pdb-file :pdb-file density :density radius :radius :as all :or {density 1.0 radius 1.5}}] (if (contains? all :pdb-file) ((sh bash :in (str /Users/daviddreisigmeyer/msms_MacOSX_2.6.1/ pdb_to_xyzr pdb-file /Users/daviddreisigmeyer/lisps/clojure/dpa/src/hold.xyzr)) (sh bash :in (str msms.MacOSX.2.6.1 -if /Users/daviddreisigmeyer/lisps/clojure/dpa/src/hold.xyzr -of /Users/daviddreisigmeyer/lisps/clojure/dpa/src/hold - no_header -density density -probe_radius radius)) (sh bash :in (str rm -f /Users/daviddreisigmeyer/lisps/clojure/ dpa/src/hold.xyzr /Users/daviddreisigmeyer/lisps/clojure/dpa/src/hold.face))) (println No pdb-file provided in get-msms-pts-OSX.))) I'd get the error: java.lang.String cannot be cast to clojure.lang.IFn Here it would only call the first command. If I added a println statement (defn get-msms-pts-OSX ((println Hi) (sh bash :in (str /Users/daviddreisigmeyer/msms_MacOSX_2.6.1/ pdb_to_xyzr pdb-file /Users/daviddreisigmeyer/lisps/clojure/dpa/src/hold.xyzr)) (sh bash :in (str msms.MacOSX.2.6.1 -if /Users/daviddreisigmeyer/lisps/clojure/dpa/src/hold.xyzr -of /Users/daviddreisigmeyer/lisps/clojure/dpa/src/hold - no_header -density density -probe_radius radius)) (sh bash :in (str rm -f /Users/daviddreisigmeyer/lisps/clojure/ dpa/src/hold.xyzr /Users/daviddreisigmeyer/lisps/clojure/dpa/src/hold.face))) (println No pdb-file provided in get-msms-pts-OSX.))) it would run all three commands, and then print this error: No message. [Thrown class java.lang.NullPointerException] Can you see why this would be? Thanks again for your help, -Dave On Aug 8, 12:00 am, j-g-faustus johannes.fries...@gmail.com wrote: On Aug 7, 4:46 pm, Dave david.dreisigme...@gmail.com wrote: (execute (str /../pdb_to_xyzr pdb-file /..))) Here it seemed to run (the above error isn't shown) but nothing happened and the REPL become unresponsive again. I think the issue is that Runtime.exec doesn't start a shell, just a subprocess, so things that are normally handled by the shell (like redirection and pipes) doesn't work. On (execute env | grep PATH) I get env: |: no such file or directory - pipes and redirections are passed as arguments to the first command rather than being handled by the shell. When I try: (sh :in (str /...pdb_to_xyzr pdb-file /...hold.xyzr))) I get the following: No matching method found: exec for class java.lang.Runtime :in is the standard in for a command, but you haven't specified which command. If you use sh as the command you get a shell and can use normal shell syntax for the :in parameter. So this works: user= (sh sh :in env | grep PATH) PATH=/usr/bin:/bin:/usr/sbin:/sbin\n user= (sh sh :in env tmp.txt) Does anyone know why this doesn't seem to work: (defn test-execute [ls-arg1 ls-arg2] (execute (str ls - ls-arg1)) (execute (str ls - ls-arg2))) As far as I can tell it does - it executes both commands, but returns only the result of the last one. If you want both, wrap them in a list or vector: (defn test-execute [ls-arg1 ls-arg2] (list (execute (str ls - ls-arg1)) (execute (str ls - ls-arg2 Regards jf -- 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
Basic Lisp Compiler: How to tell which functions to compile?
Hello everyone, Just for educational purposes, I'm writing a simple lisp compiler and am stuck on a small problem. I'm trying to write a function called (compile-function), which will take a function as input and compile it. If that function calls other functions, I would like (compile- function) to automatically compile the called functions as well. But I'm stuck on how to tell whether a function will be called or not. Particularly when functions are passed around as objects. So the question is this: Given a function f, how can I find all the functions that f depends on? Thanks a lot for your help -Patrick -- 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
Re: Basic Lisp Compiler: How to tell which functions to compile?
On Aug 9, 7:54 pm, CuppoJava patrickli_2...@hotmail.com wrote: Hello everyone, Just for educational purposes, I'm writing a simple lisp compiler and am stuck on a small problem. I'm trying to write a function called (compile-function), which will take a function as input and compile it. If that function calls other functions, I would like (compile- function) to automatically compile the called functions as well. But I'm stuck on how to tell whether a function will be called or not. Particularly when functions are passed around as objects. So the question is this: Given a function f, how can I find all the functions that f depends on? I don't think that's feasible, if it's even possible in the first place. Functions that the parent function calls directly you can of course try to compile whatever you encounter in a function call form; just check if the operator is a known global function, and compile it. However, if the operator is a local variable (ie. a function passed as a parameter) there's no reliable way to find out what function it is. It might even be a runtime-generated function (by eval) Since you can't know what functions will be called, the generated code must somehow verify that it's calling a function in the first place, perhaps invoke the compiler (if all functions must be compiled), and then execute it. -- Jarkko -- 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
Re: System calls
On Mon, 9 Aug 2010 09:37:14 -0700 (PDT) Dave david.dreisigme...@gmail.com wrote: Thanks jf, that worked: (ns msms (:gen-class) (:use [clojure.contrib.shell-out :only (sh)])) (defn get-msms-pts-OSX [{pdb-file :pdb-file density :density radius :radius :as all :or {density 1.0 radius 1.5}}] (if (contains? all :pdb-file) (sh bash :in (str /Users/daviddreisigmeyer/msms_MacOSX_2.6.1/ pdb_to_xyzr pdb-file /Users/daviddreisigmeyer/lisps/clojure/dpa/src/hold.xyzr msms.MacOSX.2.6.1 -if /Users/daviddreisigmeyer/lisps/clojure/dpa/src/hold.xyzr -of /Users/daviddreisigmeyer/lisps/clojure/dpa/src/hold - no_header -density density -probe_radius radius rm -f /Users/daviddreisigmeyer/lisps/clojure/dpa/src/hold.xyzr /Users/daviddreisigmeyer/lisps/clojure/dpa/src/hold.face)) (println No pdb-file provided in get-msms-pts-OSX.))) Without the in the system call: (defn get-msms-pts-OSX [{pdb-file :pdb-file density :density radius :radius :as all :or {density 1.0 radius 1.5}}] (if (contains? all :pdb-file) ((sh bash :in (str /Users/daviddreisigmeyer/msms_MacOSX_2.6.1/ ^ You've got an extra open paren here, so it's trying to use the value returned by sh (presumably a string) as a function - which fails with this message: java.lang.String cannot be cast to clojure.lang.IFn Here it would only call the first command. If I added a println statement (defn get-msms-pts-OSX ((println Hi) ^ Same problem. In this case, println returns a null, so the error is: No message. [Thrown class java.lang.NullPointerException] Can you see why this would be? mike -- Mike Meyer m...@mired.org http://www.mired.org/consulting.html Independent Network/Unix/Perforce consultant, email for more information. O ascii ribbon campaign - stop html mail - www.asciiribbon.org -- 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
Re: Basic Lisp Compiler: How to tell which functions to compile?
Thanks for the reply Jarkko. That helps quite a lot. I have some hacks in place that works most of the time, but was stuck trying to figure out a general solution. Knowing that there isn't one puts my mind at ease. -Patrick On Aug 9, 1:56 pm, Jarkko Oranen chous...@gmail.com wrote: On Aug 9, 7:54 pm, CuppoJava patrickli_2...@hotmail.com wrote: Hello everyone, Just for educational purposes, I'm writing a simple lisp compiler and am stuck on a small problem. I'm trying to write a function called (compile-function), which will take a function as input and compile it. If that function calls other functions, I would like (compile- function) to automatically compile the called functions as well. But I'm stuck on how to tell whether a function will be called or not. Particularly when functions are passed around as objects. So the question is this: Given a function f, how can I find all the functions that f depends on? I don't think that's feasible, if it's even possible in the first place. Functions that the parent function calls directly you can of course try to compile whatever you encounter in a function call form; just check if the operator is a known global function, and compile it. However, if the operator is a local variable (ie. a function passed as a parameter) there's no reliable way to find out what function it is. It might even be a runtime-generated function (by eval) Since you can't know what functions will be called, the generated code must somehow verify that it's calling a function in the first place, perhaps invoke the compiler (if all functions must be compiled), and then execute it. -- Jarkko -- 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
Eclipse and Compojure
I was going to try out a compojure tutorial in Eclipse. It appears that only .clj files and not the .class files are included in the compojure jar file. I'm seeing the following error: java.io.FileNotFoundException: Could not locate compojure/ core__init.class or compojure/core.clj on classpath:core.clj/web- app-adder/src/adder line 1 Clojure Compilation Problem I assume the problem is that there are no .class files in the jar. I tried to rebuild the compojure jar using lein jar but still didn't get .class files, even though: lein help jar Create a $PROJECT.jar file containing the compiled .class files as well as the source .clj files. Any suggestions would be appreciated - thanks. Scott Hickey -- 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
Re: Eclipse and Compojure
Hi, How could I help you from the Eclipse side ? I don't totally understand the steps you're following in Eclipse / counterclockwise (but maybe it's not an eclipse / counterclockwise problem ?) 2010/8/9 scott jscotthic...@gmail.com I was going to try out a compojure tutorial in Eclipse. It appears that only .clj files and not the .class files are included in the compojure jar file. I'm seeing the following error: java.io.FileNotFoundException: Could not locate compojure/ core__init.class or compojure/core.clj on classpath:core.clj /web- app-adder/src/adder line 1 Clojure Compilation Problem I assume the problem is that there are no .class files in the jar. I tried to rebuild the compojure jar using lein jar but still didn't get .class files, even though: lein help jar Create a $PROJECT.jar file containing the compiled .class files as well as the source .clj files. Any suggestions would be appreciated - thanks. Scott Hickey -- 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.comclojure%2bunsubscr...@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
Re: Generics in PersistentXXX classes
On Aug 4, 5:33 pm, Alex Tkachman alex.tkach...@gmail.com wrote: Guys, Thanks fo reference. I am still be curious if it should be done directly in Clojure runtime and available if clojure.jar is in classpath Hello Alex, You can easily use clojure.jar but there are a number of disadvantages when all you use from clojure.jar are the data structures. See the companion blog post: http://blog.higher-order.net/2010/06/11/clj-ds-clojures-persistent-data-structures-for-java/ /Karl -- 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
drop-while for noobs
Hi all, I'm new to the group; I have some experience with both CL and Java, though it's been a while for each. Anyway I really like Clojure as a way of combining the best parts of the two languages, but I'm still getting the hang of it and there are often things that confuse me. For example, I wanted to define a ring function, which takes as input N objects, and returns a hash table mapping object N to object N+1 (mod N). I intended to use this to describe a compass object: (ring :w :n :e :s) should result in {:w :n, :n :e, :e :s, :s :w}. I could have done this with basic recursion or as a list comprehension using (for), (count), and (rem), but it seemed there must be a more elegant solution with lazy sequences, like maybe combining cycle and map to gloss over the N==0 wraparound issue. What I came up with was frankly a monstrosity; I don't have the source with me at work, but it looked roughly like: (defn ring [ elts] (apply assoc {} (map #(list %1 (fnext (drop-while (comp (partial or (partial not= %1) nil)) (cycle elts)) elts Since then I've realized I could have used nth and map-indexed to get a less ugly result, but I was baffled by the awkwardness of drop- while: is there a reason it demands nil or not-nil, instead of treating false and nil as logical false? Converting false to nil was a real bear (and retyping this from memory I'm pretty sure my syntax for comp/partial/or is wrong somewhere), and in my experience clojure is too clever make me do crap like this; what am I missing? -- 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
Re: Generics in PersistentXXX classes
On Aug 4, 3:51 pm, Matt Fowles matt.fow...@gmail.com wrote: Alex~ There is a project on github that does exactly this. http://github.com/krukow/clj-ds I don't know much about the current state of it, but I have plans in the next month or so to try it out at work. http://github.com/krukow/clj-dsMatt Matt, If you find any problems, please don't drop clj-ds :) report them as issues in the github project. I will strive for clj-ds to be as stable as Clojure itself. /Karl -- 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
Re: drop-while for noobs
you can do this using partition. let's assume I first define a user= (def a [:w :n :e :s]) #'user/a user= (partition 2 1 (conj a (first a))) ((:w :n) (:n :e) (:e :s) (:s :w)) gives you the pairs you need. then you just need to turn it into hash-map by doing (map #(apply hash-map %) (partition 2 1 (conj a (first a On Mon, Aug 9, 2010 at 3:09 PM, Alan a...@malloys.org wrote: Hi all, I'm new to the group; I have some experience with both CL and Java, though it's been a while for each. Anyway I really like Clojure as a way of combining the best parts of the two languages, but I'm still getting the hang of it and there are often things that confuse me. For example, I wanted to define a ring function, which takes as input N objects, and returns a hash table mapping object N to object N+1 (mod N). I intended to use this to describe a compass object: (ring :w :n :e :s) should result in {:w :n, :n :e, :e :s, :s :w}. I could have done this with basic recursion or as a list comprehension using (for), (count), and (rem), but it seemed there must be a more elegant solution with lazy sequences, like maybe combining cycle and map to gloss over the N==0 wraparound issue. What I came up with was frankly a monstrosity; I don't have the source with me at work, but it looked roughly like: (defn ring [ elts] (apply assoc {} (map #(list %1 (fnext (drop-while (comp (partial or (partial not= %1) nil)) (cycle elts)) elts Since then I've realized I could have used nth and map-indexed to get a less ugly result, but I was baffled by the awkwardness of drop- while: is there a reason it demands nil or not-nil, instead of treating false and nil as logical false? Converting false to nil was a real bear (and retyping this from memory I'm pretty sure my syntax for comp/partial/or is wrong somewhere), and in my experience clojure is too clever make me do crap like this; what am I missing? -- 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 -- Omnem crede diem tibi diluxisse supremum. -- 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
Re: Bug: contains? doesn't work on transient maps or sets
Does someone know if there is a ticket open for this already? Best, Nicolas. -- 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
Re: Eclipse and Compojure
I have the tutorial described below working, using Emacs and Leiningen. http://mmcgrana.github.com/2010/07/develop-deploy-clojure-web-applications.html I created a new Clojure project in Eclipse. I created a lib directory, imported the dependent jar files that Leiningen pulled from a repo into the lib directory, and added all of the jars to the project build path. When I imported the core.clj into the Eclipse project src folder, I got: java.io.FileNotFoundException: Could not locate compojure/ core__init.class or compojure/core.clj on classpath: core.clj/web- app-adder/src/adder line 1 Clojure Compilation Problem It just occurred to me to start the REPL and see if the error still shows up in the error console; it doesn't - the error disappears. I shut down Eclipse and restarted, and I don't see the error in the error console anymore - irregardless of the REPL running. I assumed the problem had to do with the JDT finding no .class files in the compojure jar file, but there is no error in the error console now. Thanks for offering to help - it seems to work now. Scott Hickey On Aug 9, 1:41 pm, Laurent PETIT laurent.pe...@gmail.com wrote: Hi, How could I help you from the Eclipse side ? I don't totally understand the steps you're following in Eclipse / counterclockwise (but maybe it's not an eclipse / counterclockwise problem ?) 2010/8/9 scott jscotthic...@gmail.com I was going to try out a compojure tutorial in Eclipse. It appears that only .clj files and not the .class files are included in the compojure jar file. I'm seeing the following error: java.io.FileNotFoundException: Could not locate compojure/ core__init.class or compojure/core.clj on classpath: core.clj /web- app-adder/src/adder line 1 Clojure Compilation Problem I assume the problem is that there are no .class files in the jar. I tried to rebuild the compojure jar using lein jar but still didn't get .class files, even though: lein help jar Create a $PROJECT.jar file containing the compiled .class files as well as the source .clj files. Any suggestions would be appreciated - thanks. Scott Hickey -- 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.comclojure%2bunsubscr...@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
Re: drop-while for noobs
It works with booleans: user= (drop-while neg? [-3 -2 -1 0 1 2 3 ]) (0 1 2 3) user= (class (neg? -5)) java.lang.Boolean On Aug 9, 12:09 pm, Alan a...@malloys.org wrote: Hi all, I'm new to the group; I have some experience with both CL and Java, though it's been a while for each. Anyway I really like Clojure as a way of combining the best parts of the two languages, but I'm still getting the hang of it and there are often things that confuse me. For example, I wanted to define a ring function, which takes as input N objects, and returns a hash table mapping object N to object N+1 (mod N). I intended to use this to describe a compass object: (ring :w :n :e :s) should result in {:w :n, :n :e, :e :s, :s :w}. I could have done this with basic recursion or as a list comprehension using (for), (count), and (rem), but it seemed there must be a more elegant solution with lazy sequences, like maybe combining cycle and map to gloss over the N==0 wraparound issue. What I came up with was frankly a monstrosity; I don't have the source with me at work, but it looked roughly like: (defn ring [ elts] (apply assoc {} (map #(list %1 (fnext (drop-while (comp (partial or (partial not= %1) nil)) (cycle elts)) elts Since then I've realized I could have used nth and map-indexed to get a less ugly result, but I was baffled by the awkwardness of drop- while: is there a reason it demands nil or not-nil, instead of treating false and nil as logical false? Converting false to nil was a real bear (and retyping this from memory I'm pretty sure my syntax for comp/partial/or is wrong somewhere), and in my experience clojure is too clever make me do crap like this; what am I missing? -- 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
Re: drop-while for noobs
On Aug 9, 2:09 pm, Alan a...@malloys.org wrote: Hi all, I'm new to the group Welcome! I wanted to define a ring function, which takes as input N objects, and returns a hash table mapping object N to object N+1 (mod N). I intended to use this to describe a compass object: (ring :w :n :e :s) should result in {:w :n, :n :e, :e :s, :s :w}. Here's a quick way that seems pretty close to your original: user (def x [:w :n :e :s]) #'user/x user (zipmap x (rest (cycle x))) {:s :w, :e :s, :n :e, :w :n} - Jeff -- 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
Re: leiningen-war
On Aug 9, 5:08 am, rob r.p.l...@gmail.com wrote: As far as I can tell, based on using it so far, the war plugin for leiningen requires writing a web.xml file. I was just wondering why it doesn't generate that xml file for you based on the information you've specified already in leiningen. Would that be a good contribution to make, or are there reasons why it is preferable to write out the xml file? I hadn't thought about that. If you can come up with a way of doing it that would be supercool and I'd be happy to pull in your changes. One thing to look out for is that some people (me included) mix Java and Clojure servlets and so there still needs to be a way of manually writing a web.xml for people that want it. Possible approaches I can think of are: 1. making automatic generation only happen if there is no web.xml 2. add automatic generation as an option (either in project.clj or on the command line) 3. write an alternative plugin (e.g lein-webxml) that uses the hooks feature of leiningen to produce a web.xml when lein war is called. Saul -- 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
Re: Basic Lisp Compiler: How to tell which functions to compile?
As far as I know, the book Lisp In Small Pieces should be a tremendous help for anyone who builds a Lisp interpreter or compiler. You might want to check it out. On Mon, Aug 9, 2010 at 2:21 PM, CuppoJava patrickli_2...@hotmail.comwrote: Thanks for the reply Jarkko. That helps quite a lot. I have some hacks in place that works most of the time, but was stuck trying to figure out a general solution. Knowing that there isn't one puts my mind at ease. -Patrick On Aug 9, 1:56 pm, Jarkko Oranen chous...@gmail.com wrote: On Aug 9, 7:54 pm, CuppoJava patrickli_2...@hotmail.com wrote: Hello everyone, Just for educational purposes, I'm writing a simple lisp compiler and am stuck on a small problem. I'm trying to write a function called (compile-function), which will take a function as input and compile it. If that function calls other functions, I would like (compile- function) to automatically compile the called functions as well. But I'm stuck on how to tell whether a function will be called or not. Particularly when functions are passed around as objects. So the question is this: Given a function f, how can I find all the functions that f depends on? I don't think that's feasible, if it's even possible in the first place. Functions that the parent function calls directly you can of course try to compile whatever you encounter in a function call form; just check if the operator is a known global function, and compile it. However, if the operator is a local variable (ie. a function passed as a parameter) there's no reliable way to find out what function it is. It might even be a runtime-generated function (by eval) Since you can't know what functions will be called, the generated code must somehow verify that it's calling a function in the first place, perhaps invoke the compiler (if all functions must be compiled), and then execute it. -- Jarkko -- 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.comclojure%2bunsubscr...@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
Re: Basic Lisp Compiler: How to tell which functions to compile?
It is impossible (undecidable) to tell precisely which functions a function will call. Therefore you will need to consider not exactly set of functions that a function will call, but some superset of that. Why not take as your superset all functions? That is, always compile all functions. On Aug 9, 6:54 pm, CuppoJava patrickli_2...@hotmail.com wrote: Hello everyone, Just for educational purposes, I'm writing a simple lisp compiler and am stuck on a small problem. I'm trying to write a function called (compile-function), which will take a function as input and compile it. If that function calls other functions, I would like (compile- function) to automatically compile the called functions as well. But I'm stuck on how to tell whether a function will be called or not. Particularly when functions are passed around as objects. So the question is this: Given a function f, how can I find all the functions that f depends on? Thanks a lot for your help -Patrick -- 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
Re: drop-while for noobs
Also sorry the indentation is so awful. How do I get Google to let me compose/edit in a fixed-width font? On Aug 9, 12:09 pm, Alan a...@malloys.org wrote: Hi all, I'm new to the group; I have some experience with both CL and Java, though it's been a while for each. Anyway I really like Clojure as a way of combining the best parts of the two languages, but I'm still getting the hang of it and there are often things that confuse me. For example, I wanted to define a ring function, which takes as input N objects, and returns a hash table mapping object N to object N+1 (mod N). I intended to use this to describe a compass object: (ring :w :n :e :s) should result in {:w :n, :n :e, :e :s, :s :w}. I could have done this with basic recursion or as a list comprehension using (for), (count), and (rem), but it seemed there must be a more elegant solution with lazy sequences, like maybe combining cycle and map to gloss over the N==0 wraparound issue. What I came up with was frankly a monstrosity; I don't have the source with me at work, but it looked roughly like: (defn ring [ elts] (apply assoc {} (map #(list %1 (fnext (drop-while (comp (partial or (partial not= %1) nil)) (cycle elts)) elts Since then I've realized I could have used nth and map-indexed to get a less ugly result, but I was baffled by the awkwardness of drop- while: is there a reason it demands nil or not-nil, instead of treating false and nil as logical false? Converting false to nil was a real bear (and retyping this from memory I'm pretty sure my syntax for comp/partial/or is wrong somewhere), and in my experience clojure is too clever make me do crap like this; what am I missing? -- 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
Re: drop-while for noobs
Weird. I wonder if I was using an outdated version of Clojure or (more likely) assumed from (doc drop-while) that it wouldn't handle false the way I wanted. When doc says not nil should I assume it means neither nil nor false, or should the doc for drop-while be updated? user= (doc drop-while) - clojure.core/drop-while ([pred coll]) Returns a lazy sequence of the items in coll starting from the first item for which (pred item) returns nil. On Aug 9, 1:01 pm, Armando Blancas armando_blan...@yahoo.com wrote: It works with booleans: user= (drop-while neg? [-3 -2 -1 0 1 2 3 ]) (0 1 2 3) user= (class (neg? -5)) java.lang.Boolean On Aug 9, 12:09 pm, Alan a...@malloys.org wrote: Hi all, I'm new to the group; I have some experience with both CL and Java, though it's been a while for each. Anyway I really like Clojure as a way of combining the best parts of the two languages, but I'm still getting the hang of it and there are often things that confuse me. For example, I wanted to define a ring function, which takes as input N objects, and returns a hash table mapping object N to object N+1 (mod N). I intended to use this to describe a compass object: (ring :w :n :e :s) should result in {:w :n, :n :e, :e :s, :s :w}. I could have done this with basic recursion or as a list comprehension using (for), (count), and (rem), but it seemed there must be a more elegant solution with lazy sequences, like maybe combining cycle and map to gloss over the N==0 wraparound issue. What I came up with was frankly a monstrosity; I don't have the source with me at work, but it looked roughly like: (defn ring [ elts] (apply assoc {} (map #(list %1 (fnext (drop-while (comp (partial or (partial not= %1) nil)) (cycle elts)) elts Since then I've realized I could have used nth and map-indexed to get a less ugly result, but I was baffled by the awkwardness of drop- while: is there a reason it demands nil or not-nil, instead of treating false and nil as logical false? Converting false to nil was a real bear (and retyping this from memory I'm pretty sure my syntax for comp/partial/or is wrong somewhere), and in my experience clojure is too clever make me do crap like this; what am I missing? -- 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
Please help! Really simple function not working.
Hi to everyone, I'm trying to create a function that takes a simple list and returns the number of zeros in the list. So I'm assuming that they will enter a list containing only numbers. This is what I have so far, but it only works when the list empty. Can somebody tell me what I'm missing? (defn count-zeros Returns the numbers of zero in a simple sequence of numbers [list1] (cond (empty? list1) 0 (not (zero? (first list1))) 0 :else (recur (+ 1 (count-zeros (rest list1)) --Carlos -- 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
Re: Please help! Really simple function not working.
On Aug 9, 2010, at 7:24 PM, Carlos Torres wrote: I'm trying to create a function that takes a simple list and returns the number of zeros in the list. user= (count (filter zero? [0 1 2 3 0 4 5 6 0 7 8 9])) 3 -- 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
Re: Please help! Really simple function not working.
On Mon, Aug 9, 2010 at 5:24 PM, Carlos Torres carlos.torr...@upr.edu wrote: Hi to everyone, I'm trying to create a function that takes a simple list and returns the number of zeros in the list. So I'm assuming that they will enter a list containing only numbers. This is what I have so far, but it only works when the list empty. Can somebody tell me what I'm missing? (defn count-zeros Returns the numbers of zero in a simple sequence of numbers [list1] (cond (empty? list1) 0 (not (zero? (first list1))) 0 :else (recur (+ 1 (count-zeros (rest list1)) --Carlos I believe your second codition break the recursion but in general, don't write your own unless you are learning how to write recursive code in clojure. this is textbook filter then count or foldl(i.e. reduce). -- 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
Re: Please help! Really simple function not working.
2010/8/10 Carlos Torres carlos.torr...@upr.edu Hi to everyone, I'm trying to create a function that takes a simple list and returns the number of zeros in the list. So I'm assuming that they will enter a list containing only numbers. This is what I have so far, but it only works when the list empty. Can somebody tell me what I'm missing? (defn count-zeros Returns the numbers of zero in a simple sequence of numbers [list1] (cond (empty? list1) 0 (not (zero? (first list1))) 0 :else (recur (+ 1 (count-zeros (rest list1)) Hi Carlos, your function can be written: (defn count-zeros [l] (reduce #(if (zero? %2) (inc %1) %1) 0 l)) or less cryptic with variable names (defn count-zeros [l] (reduce (fn [nb-zeros elem] (if (zero? elem) (inc nb-zeros) nb-zeros)) 0 l)) But if you really want to write it recursively, then you must understand you cannot recur with the partial sum when your function expects a list. And it does not make sense to recur and call count-zeros at the same time. here is a working version, using recur: (defn count-zeros [list1] (loop [list1 (seq list1) nb-zeros 0] (if list1 (recur (next list1) (if (zero? (first list1)) (inc nb-zeros) nb-zeros)) nb-zeros))) HTH, -- Laurent -- 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
Re: Please help! Really simple function not working.
On Mon, Aug 9, 2010 at 5:24 PM, Carlos Torres carlos.torr...@upr.edu wrote: (defn count-zeros Returns the numbers of zero in a simple sequence of numbers [list1] (cond (empty? list1) 0 (not (zero? (first list1))) 0 :else (recur (+ 1 (count-zeros (rest list1)) Michael's solution works too, but the problem here is that you're calling recur in a way that doesn't make sense. You'd want to replace the call to count-zeros with recur rather than calling both, but it's not in the tail-position, so it can't be TCO'd. Just remove the call to recur and it will work, albeit only for lists small enough to not blow the stack. -Phil -- 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
Re: Please help! Really simple function not working.
On Mon, Aug 9, 2010 at 6:00 PM, Phil Hagelberg p...@hagelb.org wrote: Just remove the call to recur and it will work, albeit only for lists small enough to not blow the stack. I'm assuming from the tone of the original post that the author is trying to generally understand how to write recursive functions in Clojure, rather than use built-ins, and that processing arbitrary-sized lists is a primary goal. The posted code (minus the call to recur), is an elegant recursive formulation that is idiomatic in Scheme because Scheme is (typically) implemented in a way that makes stack limitations (mostly) a non-issue. In Clojure, you have to work around stack limitations imposed by Java, and recursive functions must be translated to work on largish lists in Clojure. There is no one recipe to make that translation, but there are several common patterns. If the recursive call is in tail position, you can usually write the function the same way, but replace the self-call with the word recur. If not in tail position and the function is a list-building function, you may be able to solve the stack problem with a call to lazy-seq -- I touched on this topic in a recent blog post: http://programming-puzzler.blogspot.com/2010/07/translating-code-from-python-and-scheme.html The solution to most recursive problems in Clojure is to build your answer in an accumulator, so you must learn how to design and develop accumulator-style recursive functions. For an in-depth look at this process (in Scheme), I recommend: http://www.htdp.org/2001-11-21/Book/node156.htm For mutually recursive problems, a trampoline may be an option. If none of these options work, you may have to simulate your own call stack (ugh). It can sometimes be frustrating to write code in a language that is built around recursion rather than iteration constructs, and then has such severe limitations on how and when recursion can be safely used, but with practice, the vast majority of code can be easily rewritten in a manner conducive to Clojure. -- 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
Re: Please help! Really simple function not working.
On Mon, Aug 9, 2010 at 9:00 PM, Phil Hagelberg p...@hagelb.org wrote: On Mon, Aug 9, 2010 at 5:24 PM, Carlos Torres carlos.torr...@upr.edu wrote: (defn count-zeros Returns the numbers of zero in a simple sequence of numbers [list1] (cond (empty? list1) 0 (not (zero? (first list1))) 0 :else (recur (+ 1 (count-zeros (rest list1)) Michael's solution works too, but the problem here is that you're calling recur in a way that doesn't make sense. You'd want to replace the call to count-zeros with recur rather than calling both, but it's not in the tail-position, so it can't be TCO'd. Just remove the call to recur and it will work, albeit only for lists small enough to not blow the stack. -Phil -- 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.comclojure%2bunsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en I totally forgot about how to use recur. Thanks to all for the fast help and for pointing out my errors, and even suggesting corrections and alternatives. This is by far the best mailing list I've ever participated in. As you can see I'm still learning Clojure, and I've a long way to go to master it. Again thank you all for your help. --Carlos -- 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
Re: drop-while for noobs
When doc says not nil should I assume it means neither nil nor false Nope, false won't be taken as nil; in boolean expressions nil evaluates to false. drop-while's doc mentions only nil but since it's the predicate's return value it should be clear enough, I think. -- 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
Re: Running on .Net
I was able to build ClojureCLR using the DLR 1.0 source and the latest clojure-clr in VS 2010. I am able to run Clojure.Main.exe and Clojure.Compile.exe. Is there a way to integrate these into VS, so that I can add .clj files to a project and set the build action to Build or Build with Clojure.Compile.exe and get a .dll out the other side? On Aug 4, 8:45 pm, dmiller dmiller2...@gmail.com wrote: the 7/23 date is, as they say, not operational. I've edited that out. I'll go as far as 'soon'. (The new PC I was going supposed to move to and install VS2010 on has to be replaced due to the possibility that the hard disk will fry.) You cannot use DLR 1.0. I need things that are not in that release. As stated on the wiki page: 'For the time being go http://dlr.codeplex.com/SourceControl/ changeset/changes/48032:here to get version 48032.' With a binary distribution, at least I can package an approved version of the DLR. -David On Aug 4, 1:59 pm, eyeris drewpvo...@gmail.com wrote: I tried to build the latest ClojureCLR using VS 2008. I used the DLR 1.0 release. I successfully replaced your DLR project references and built them: http://imgur.com/SgUmu.jpg Then I added a DLR reference to the Clojure project and built it, resulting in these two errors The extern alias MSC was not specified in a /reference option: http://imgur.com/LWjOs.jpg Your installing-clojureclr page says I know for sure that will work. I hope to bring everything up to VS2010 (and because of DLR, no more VS2008 for building) by 7/23/2010. but I didn't see anything in the commit history to suggest that you've done this. On Aug 4, 12:25 am, eyeris drewpvo...@gmail.com wrote: I would like a zip of DLLs that are as widely compatible as possible across CLR/DLR versions accompanied by a clear list of which versions are compatible. Regarding releases, I'm glad to lag behind the bleeding edge by a lot in order to have a stable platform. What I want to be able to do is grab the DLLs, add them as references to my VS project, and compile, much like I do with NetBeans and the JVM clojure. I have to admit that I haven't tried ClojureCLR since right around the 1.1 release, so I don't remember the details of the problems that I encountered. I am in the process of migrating a lot of stuff from VS 2008 to VS 2010. Once I finish that I will try ClojureCLR again and get back to you regarding embedding and AOT. On Aug 3, 3:11 pm, dmiller dmiller2...@gmail.com wrote: I can move creating a binary distribution to the to top of the list. I could use some guidance from the interested on what would serve the purpose on this and other things mentioned here. on the distribution: Do you want just a zip of of DLLs? An installer? Do you want installation to the GAC? on 'stable, dependable': Is there any strategy on creating new releases that makes sense? Assume anyone wanting to stay on the bleeding edge will build for themselves? start-up speed: I'mrunningsome experiments on that. The problem is mostly the monolithic nature of the assemblies created and the amount of environment initialization. Suggestions welcomed. Ease of embeddability: please elaborate on the problems. AOT'ing clj files: Ditto. -David On Aug 3, 12:47 pm, Timothy Baldridge tbaldri...@gmail.com wrote: I really wish that ClojureCLR had a binary distribution. I like clojure a lot but I have a .Netbackground and a lot of .Netcode to interact with. If ClojureCLR had a stable, dependable binary distribution I would be able to use it at work much more than I already do. I don't care much about 1.2 features like defrecord. What I care about is start-up speed, ease of embeddability, and Visual Studio integration (not Intellisense, just AOT'ing .clj files). +1 for all of that That paragraph basically explains why I haven't started using clojure at my work yet. Timothy Baldridge -- 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