Re: DISCUSS: clojure.contrib.java-utils/file
On Apr 6, 4:10 am, Stuart Sierra wrote: > I don't see an obvious way of combining them. What about something like: (defn- normalize-separator [filepath] (.. (str filepath) (replace \\ File/separatorChar) (replace \/ File/separatorChar))) (defn file [filepath & more] (reduce (fn [parent path] (File. parent path)) (File. (normalize-separator filepath)) (map normalize-separator more))) - James --~--~-~--~~~---~--~~ 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: DISCUSS: clojure.contrib.java-utils/file
On Mon, Apr 6, 2009 at 10:40 AM, James Reeves wrote: > > On Apr 6, 4:10 am, Stuart Sierra wrote: >> I don't see an obvious way of combining them. > > What about something like: > > (defn- normalize-separator > [filepath] > (.. (str filepath) > (replace \\ File/separatorChar) > (replace \/ File/separatorChar))) What? You mean I won't be able to use backslashes in my filenames anymore? :) (Yes, a backslash is perfectly legal in a filename on Unix filesystems, although I agree it's probably not a good idea to use them.) > (defn file > [filepath & more] > (reduce > (fn [parent path] (File. parent path)) > (File. (normalize-separator filepath)) > (map normalize-separator more))) -- Michael Wood --~--~-~--~~~---~--~~ 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: DISCUSS: clojure.contrib.java-utils/file
James Reeves wrote: > On Apr 6, 4:10 am, Stuart Sierra wrote: >> I don't see an obvious way of combining them. > > What about something like: > > (defn- normalize-separator > [filepath] > (.. (str filepath) > (replace \\ File/separatorChar) > (replace \/ File/separatorChar))) > > (defn file > [filepath & more] > (reduce > (fn [parent path] (File. parent path)) > (File. (normalize-separator filepath)) > (map normalize-separator more))) I think there may be a misunderstanding over "combining" here - I read Stuart's mail to mean there was no obvious way to combine duck-streams/file and java-utils/file, whereas this implementation shows java-utils/file style behaviour only? IMO even if the two functions could be combined, it would be confusing to understand how the arguments passed in would be joined. Better not to try. FWIW, the java-utils version is similar to a utility method that I use pretty heavily in Java code -- so I will find it useful. Cheers, Jason -- Pulse - Continuous Integration made easy. Does your project have a pulse? Try it free at: http://zutubi.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 -~--~~~~--~~--~--~---
Re: ANN: Pretty printer is now part of contrib
Hi Tom, I think that the ant test tasks should depend on the compilation tasks, and that users will just have to specify a clojure.jar. Either that or the default test suite should be smart enough to skip the pretty printer tests with ant.jar not specified. Stuart > By (semi-)popular demand, I have added the pretty printer and the > Common Lisp format function (which are really the same package) into > clojure.contrib. It all lives in the namespace clojure.contrib.pprint. > > Important: If you want to use pretty printing, you will have to > compile all the source code in clojure.contrib and not just put it in > in the jar. To do this, need to tell ant where clojure.jar is so that > it can run the compiler. For example, I use: > > ant -Dclojure.jar=../clojure/clojure.jar > > (This is necessary because pretty printing uses a couple of gen- > classed classes to wrap java Writers.) > > I haven't done that much work on the pretty printer since my last > announcement, but there are a few improvements: > > - I added support for *print-level* and *print-length* to control how > much output you get. > - Support for a bunch more special forms and let-like structures in > *code-dispatch* > - Support for pretty printing Java arrays > - ~3x basic speedup (or 3x less slow, depending on how you look at > it). On my machine, this translates into about 300 lines of code/ > second. More to come here... > - Some fixes to allow for deeper structures (as in "very deep") > without blowing the stack. > > All in all, it should be a pretty serviceable pretty printer. More > coming, though... > > The documentation is still on github, but I've updated it for > clojure.contrib. Look here: http://github.com/tomfaulhaber/cl-format. > > Please let me know if you have issues, suggestions, stuff you'd like > to see first, etc. > > --~--~-~--~~~---~--~~ 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 -~--~~~~--~~--~--~---
lazy seqs (was Re: proposed new contrib: java-utils)
r652 is a breaking change to contrib. (powers-of-2) and (fibs) are now functions and do not hold their heads. primes is still a sequence because it needs to hold past values for efficiency. Stuart > On Apr 5, 2009, at 4:27 PM, Stuart Halloway wrote: > >> At quick glance it looks to me that all three of the lazy-seqs should >> be functions. If you want me to I'll change this and add tests. > > Please do. Thanks. > > --Steve > --~--~-~--~~~---~--~~ You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en -~--~~~~--~~--~--~---
Re: DISCUSS: clojure.contrib.java-utils/file
On Apr 6, 11:29 am, Jason Sankey wrote: > I think there may be a misunderstanding over "combining" here - I read > Stuart's mail to mean there was no obvious way to combine > duck-streams/file and java-utils/file, whereas this implementation shows > java-utils/file style behaviour only? As far as I'm aware, it has most of both behaviours. > IMO even if the two functions could be combined, it would be confusing > to understand how the arguments passed in would be joined. Better not > to try. That's true. Conceptually, I prefer the java-utils/file method, which is basically the same as an identically named function I wrote for Compojure. The problem with having java-utils/file and duck-streams/file is that you lose the ability to load both namespaces at the same time without defining an exception for the file function. This does not seem like an ideal solution. I think we should choose one or the other, give them different names, or attempt to merge their functionality. - James --~--~-~--~~~---~--~~ 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: No I/O in STM transactions?
On Mon, Apr 6, 2009 at 12:58 AM, Dex Wood wrote: > > If you want to do I/O from a transaction, just use an agent to do the > I/O. Since the agent is only sent off at commit, you don't have to > worry about retries. This doesn't answer your questions about > idempotent I/O, but I think it is a strategy that you can use. Yes, thanks very much for this tip! I have to admit I didn't (don't) understand the agent concept. I've been avoiding the subject I guess. Going to have a look now... > > On Apr 5, 2:11 pm, Hugh Winkler wrote: >> Hi all, >> >> Fromhttp://clojure.org/refs: "I/O and other activities with >> side-effects should be avoided in transactions, since transactions >> will be retried. The io! macro can be used to prevent the use of an >> impure function in a transaction." >> >> Isn't it OK to do I/O in a transaction as long as doing the operation >> multiple times has the same effect as doing it once (i.e. it's >> idempotent)? >> >> Isn't it also OK to read data in a transaction, in many circumstances? >> Even if retrying the reads results in a different end state, that's OK >> for lots of systems. Example: couldn't I safely read a stock price >> from a ticker stream within a transaction, if the purpose was only to >> have a cached value from sometime in the last 5 minutes? >> >> (I imagine there are performance considerations. Retrying some I/O >> operations could be expensive. Right now, I'm concerned with the >> logic, not the performance, but if you know something about the >> performance implications, please jump in). >> >> Just hoping someone can straighten me out if I'm wrong... I'd like to >> remove some io! macros from my code! >> >> Thanks, >> Hugh > --~--~-~--~~~---~--~~ 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: DISCUSS: clojure.contrib.java-utils/file
James Reeves wrote: > On Apr 6, 11:29 am, Jason Sankey wrote: >> I think there may be a misunderstanding over "combining" here - I read >> Stuart's mail to mean there was no obvious way to combine >> duck-streams/file and java-utils/file, whereas this implementation shows >> java-utils/file style behaviour only? > > As far as I'm aware, it has most of both behaviours. I guess the confusion is mine :). I saw the primary difference as joining args with or without separators in between. >> IMO even if the two functions could be combined, it would be confusing >> to understand how the arguments passed in would be joined. Better not >> to try. > > That's true. Conceptually, I prefer the java-utils/file method, which > is basically the same as an identically named function I wrote for > Compojure. I also feel the java-utils version is more generally-applicable - it makes composing files easier without any assumptions about its input. The duck-streams version does other handy things like separator normalisation and tilde expansion, but that means it can't be used for all cases. It feels like the latter is convenient for composing filenames from literals or at the repl, but not so good for handling arbitrary files/paths. > The problem with having java-utils/file and duck-streams/file is that > you lose the ability to load both namespaces at the same time without > defining an exception for the file function. This does not seem like > an ideal solution. I think we should choose one or the other, give > them different names, or attempt to merge their functionality. Generally speaking I'm happy to use (require [ ... :as ...]) to solve this problem (I expect as contrib grows name clashes will become inevitable). In any case your point still stands from a conceptual point of view - having two functions named "file" in contrib with similar goals but different semantics is a recipe for confusion. Cheers, Jason -- Pulse - Continuous Integration made easy. Does your project have a pulse? Try it free at: http://zutubi.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 -~--~~~~--~~--~--~---
Re: proposed new contrib: java-utils
Hi Stuart, I had occasion to wrap java.util.Properties. If there's interest, may be a good candidate for c.c.java-utils. It's pasted in below, & attached in the group at http://clojure.googlegroups.com/web/props.clj Feel free to change as you see fit. Best, Perry (ns props ; Convenience lib for interacting with java.util.Properties (:use [clojure.contrib.duck-streams :only (reader writer)] [clojure.contrib.java-utils:only (the-str)]) (:import (java.util Properties))) (defn props-to-map "Convert Properties to map." [p] (into {} p)) (defn map-to-props "Convert map to Properties." {:tag Properties} [m] (let [p (Properties.)] (doseq [[k v] m] (.setProperty p (the-str k) (str v))) p)) (defn read-props "Read Properties from file into map. Uses duck-streams/reader to read from file, so duck-streams/*default-encoding* determines character decoding." [file] (props-to-map (with-open [rdr (reader file)] (doto (Properties.) (.load rdr) (defn write-props "Write Properties from map into file. Uses duck-streams/writer to write to file, so duck-streams/*default-encoding* determines character encoding." {:tag Properties} ([m file] (write-props m file nil)) ([m file comments] (with-open [wtr (writer file)] (doto (map-to-props m) (.store wtr comments) --~--~-~--~~~---~--~~ 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: A syntax feature request: splitting literal strings
On Apr 4, 4:16 pm, Stuart Sierra wrote: > This can be macro-ized: > > (defmacro bigstr [& strings] > "Concatenates strings at compile time." > (apply str strings)) > > user> (macroexpand-1 '(bigstr "This is a really long string " > "that I just felt like using " > "in my program.")) > "This is a really long string that I just felt like using in my > program." Umm...how is bigstr different from str itself? -- Nathan --~--~-~--~~~---~--~~ 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: A syntax feature request: splitting literal strings
2009/4/6 Nathan Kitchen > > On Apr 4, 4:16 pm, Stuart Sierra wrote: > > This can be macro-ized: > > > > (defmacro bigstr [& strings] > > "Concatenates strings at compile time." > > (apply str strings)) > > > > user> (macroexpand-1 '(bigstr "This is a really long string " > > "that I just felt like using " > > "in my program.")) > > "This is a really long string that I just felt like using in my > > program." > > Umm...how is bigstr different from str itself? bigstr is a macro, that will only work at compile with literal strings. 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 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: A syntax feature request: splitting literal strings
2009/4/4 samppi > > I don't really want it so much for documentation strings—they're > already formatted in a standard way [...] Well, they certainly are formatted in *a* standard way :-), e.g. they have a "hard-coded" formatted only suitable as-is for 80 columns wide terminals :-) Indeed, for IDEs that allow users to resize the windows providing this documentation information (e.g. with auto-completion features), they generally end up with lots of unused spaces. Or the IDEs have to guess (but maybe some rules are written somewhere I didn't find) the proper "algorithm" to be used to reconstitutes sentences that should not have been breaked by newlines in the source code. I intend to do the following in clojuredev: split the docstrings at every occurence of 2 consecutive line breaks. For each item of this list, if it is only made of line breaks, leave as is, else remove the line breaks. Recompose a String by interposing 2 consecutive line breaks between each item. -- 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 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: How do you handle different string encodings?
I finally worked it all out. For future reference, here's a record of my research on this: http://stackoverflow.com/questions/715958/how-do-you-handle-different-string-encodings Daniel Jomphe wrote: > I made some progress. > > [By the way, NetBean's console displays *everything* 100% fine. > I decided to use one of the worst repl consoles: that of IntelliJ. > I want to make sure I really understand what's the point behind all > this.] > > (import '(java.io PrintWriter PrintStream FileInputStream) > '(java.nio CharBuffer ByteBuffer) > '(java.nio.charset Charset CharsetDecoder CharsetEncoder) > '(org.xml.sax InputSource)) > > (def utf8 "UTF-8") > (def d-utf8 (.newDecoder (Charset/forName utf8))) > (def e-utf8 (.newEncoder (Charset/forName utf8))) > > (def latin1 "ISO-8859-1") > (def d-latin1 (.newDecoder (Charset/forName latin1))) > (def e-latin1 (.newEncoder (Charset/forName latin1))) > > (defmacro with-out-encod > [encoding & body] > `(binding [*out* (PrintWriter. (PrintStream. System/out true > ~encoding) true)] > ~...@body > (flush))) > > (def s "québécois français") > > (print s) ;quÔøΩbÔøΩcois franÔøΩaisnil > (with-out-encod latin1 (print s)) ;qu?b?cois fran?aisnil > (with-out-encod utf8 (print s)) ;qu?b?cois fran?aisnil > > (def encoded (.encode e-utf8 > (CharBuffer/wrap "québécois français"))) > (def s-d > (.toString (.decode d-utf8 encoded))) > > (print s-d) ;quÔøΩbÔøΩcois franÔøΩaisnil > (with-out-encod latin1 (print s-d)) ;qu?b?cois fran?aisnil > (with-out-encod utf8 (print s-d)) ;qu?b?cois fran?aisnil > > (def f-d > (:content (let [x (InputSource. (FileInputStream. "french.xml"))] > (.setEncoding x latin1) > (clojure.xml/parse x > > (print f-d) ;quÔøΩbÔøΩcois franÔøΩaisnil > (with-out-encod latin1 (print f-d)) ;québécois français > (with-out-encod utf8 (print f-d)) ;québécois français > > So my theory, which is still almost certainly wrong, is: > > 1. When the input is a file whose encoding is, say, latin-1, it's easy > to decode it and then encode it however one wants. > 2. When the input is a literal string in the source file, it looks > like it's impossible to encode it correctly, unless one first decodes > it from the source file's encoding. But then, I don't yet know how to > do this without actually reading the source file. :\ > > Daniel Jomphe wrote: > > I tried under eclipse. > > > Default console encoding configuration (MacRoman): > > > #'user/s > > quÔøΩbÔøΩcois franÔøΩaisnil > > qu?b?cois fran?aisnil > > > #'user/snc > > qu?b?cois fran?aisnil > > qu?b?cois fran?aisnil > > > Console configured to print using ISO-8859-1: > > > #'user/s > > qu�b�cois fran�aisnil > > qu?b?cois fran?aisnil > > > #'user/snc > > qu?b?cois fran?aisnil > > qu?b?cois fran?aisnil > > > Console configured to print using UTF-8: > > > #'user/s > > québécois françaisnil > > québécois françaisnil > > > #'user/snc > > québécois françaisnil > > québécois françaisnil > > > So as I come to understand it, it looks like UTF-8 should be the rolls- > > royce for my needs. > > > May I correctly conclude the following? > > > Don't bother about encodings unless you're displaying something and > > it's unreadable; then, don't bother about it in the code; find a > > proper console or viewer. > > > Doesn't that sound like offloading a problem to users? Isn't there > > something reliable that can be done in the code? > > > Daniel Jomphe wrote: > > > Sorry for all these posts. > > > > I pasted my last post's code into a fresh repl (not in my IDE), and > > > here's what I got (cleaned up): > > > > #'user/s > > > québécois françaisnil > > > qu?b?cois fran?aisnil > > > > #'user/snc > > > québécois françaisnil > > > qu?b?cois fran?aisnil > > > > I'm not sure what to make out of it. > > > > My terminal (Apple Terminal) supports the encoding, and prints > > > correctly s and snc out of the box. > > > When I use with-out-encoded, I actually screw up both s and snc's > > > printing. > > > > Daniel Jomphe wrote: > > > > Now that I know for sure how to bind *out* to something else over > > > > System/out, it's time to bring back my encoding issues into scope: > > > > > (import '(java.io PrintWriter PrintStream)) > > > > > (defmacro with-out-encoded > > > > [encoding & body] > > > > `(binding [*out* (java.io.PrintWriter. (java.io.PrintStream. > > > > System/out true ~encoding) true)] > > > > ~...@body > > > > (flush))) > > > > > (def nc "ISO-8859-1") > > > > > ;;; with a normal string > > > > (def s "québécois français") > > > > > (print s) > > > > ; quÔøΩbÔøΩcois franÔøΩaisnil > > > > > (with-out-encoded nc (print s)) > > > > ; qu?b?cois fran?aisnil > > > > > ;;; with a correctly-encoded
Re: DISCUSS: clojure.contrib.java-utils/file
Hello, On Mon, Apr 6, 2009 at 10:06 AM, James Reeves wrote: > ... > The problem with having java-utils/file and duck-streams/file is that > you lose the ability to load both namespaces at the same time without > defining an exception for the file function. This does not seem like > an ideal solution. I think we should choose one or the other, give > them different names, or attempt to merge their functionality. IMHO. what you want to avoid is having similar utility functions in different projects. Thus, duck-streams could just use the version of file of java-utils, or keep its own version private. Cheers, Victor Rodriguez. > - James > > > --~--~-~--~~~---~--~~ 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 -~--~~~~--~~--~--~---
Simple dosync/alter question
I have a some what (I believe) easy question. Could someone let me know what I'm doing wrong? A simplified version of what I'm trying to do looks like this: user=> (def foo (ref 0)) #'user/foo user=> (defn square [x] (* x x)) #'user/square user=> (defn square-ref [x] (dosync (alter foo square x))) #'user/square-ref user=> (square-ref 2) java.lang.IllegalArgumentException: Wrong number of args passed to: user$square (NO_SOURCE_FILE:0) user=> (doc square) - user/square ([x]) nil nil user=> Thanks, Brandon --~--~-~--~~~---~--~~ 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: Simple dosync/alter question
Alter expects a function that take the current value of the ref it will alter as the first arg. I think what you want to do is ref-set. user=> (doc alter) - clojure.core/alter ([ref fun & args]) Must be called in a transaction. Sets the in-transaction-value of ref to: (apply fun in-transaction-value-of-ref args) and returns the in-transaction-value of ref. nil user=> (doc ref-set) - clojure.core/ref-set ([ref val]) Must be called in a transaction. Sets the value of ref. Returns val. nil user=> (defn square-ref [x] (dosync (ref-set foo (square x #'user/square-ref user=> (square-ref 2) 4 user=> @foo 4 Paul On Mon, Apr 6, 2009 at 3:02 PM, bgray wrote: > > I have a some what (I believe) easy question. Could someone let me > know what I'm doing wrong? A simplified version of what I'm trying to > do looks like this: > > user=> (def foo (ref 0)) > #'user/foo > user=> (defn square [x] (* x x)) > #'user/square > user=> (defn square-ref [x] (dosync (alter foo square x))) > #'user/square-ref > user=> (square-ref 2) > java.lang.IllegalArgumentException: Wrong number of args passed to: > user$square (NO_SOURCE_FILE:0) > user=> (doc square) > - > user/square > ([x]) > nil > nil > user=> > > Thanks, > Brandon > > > --~--~-~--~~~---~--~~ 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: Simple dosync/alter question
I think what you want is: (def foo (ref 0)) (defn square [x] (* x x)) (defn square-ref [x] (dosync (ref-set foo (square x (square-ref 2) On Mon, Apr 6, 2009 at 3:02 PM, bgray wrote: > > I have a some what (I believe) easy question. Could someone let me > know what I'm doing wrong? A simplified version of what I'm trying to > do looks like this: > > user=> (def foo (ref 0)) > #'user/foo > user=> (defn square [x] (* x x)) > #'user/square > user=> (defn square-ref [x] (dosync (alter foo square x))) > #'user/square-ref > user=> (square-ref 2) > java.lang.IllegalArgumentException: Wrong number of args passed to: > user$square (NO_SOURCE_FILE:0) > user=> (doc square) > - > user/square > ([x]) > nil > nil > user=> > > Thanks, > Brandon > > > --~--~-~--~~~---~--~~ 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: ANN: Pretty printer is now part of contrib
There are a bunch of things in the build file that "do nothing without complaining" when clojure.jar isn't set. I didn't want to make a radical change to the build file with this checkin but I didn't want users to not get the pretty printer and wonder why either. More generally, I think we need to think through how we want contrib built and tested. I would say that we probably want to force the compile and fail if clojure.jar isn't specified. And as you say, make test running dependent on clojure-contrib.jar having been built. (In general, ant's predilection for ignoring failure has always befuddled me.) Another question is whether we should duplicate the classes and the .clj files in the jar or should we just compile all of them. Is there some value to having the source there? I'm happy to tweak these things if we have consensus on how we'd like to do it. Tom On Apr 6, 5:37 am, Stuart Halloway wrote: > Hi Tom, > > I think that the ant test tasks should depend on the compilation > tasks, and that users will just have to specify a clojure.jar. > > Either that or the default test suite should be smart enough to skip > the pretty printer tests with ant.jar not specified. > > Stuart > > > By (semi-)popular demand, I have added the pretty printer and the > > Common Lisp format function (which are really the same package) into > > clojure.contrib. It all lives in the namespace clojure.contrib.pprint. > > > Important: If you want to use pretty printing, you will have to > > compile all the source code in clojure.contrib and not just put it in > > in the jar. To do this, need to tell ant where clojure.jar is so that > > it can run the compiler. For example, I use: > > > ant -Dclojure.jar=../clojure/clojure.jar > > > (This is necessary because pretty printing uses a couple of gen- > > classed classes to wrap java Writers.) > > > I haven't done that much work on the pretty printer since my last > > announcement, but there are a few improvements: > > > - I added support for *print-level* and *print-length* to control how > > much output you get. > > - Support for a bunch more special forms and let-like structures in > > *code-dispatch* > > - Support for pretty printing Java arrays > > - ~3x basic speedup (or 3x less slow, depending on how you look at > > it). On my machine, this translates into about 300 lines of code/ > > second. More to come here... > > - Some fixes to allow for deeper structures (as in "very deep") > > without blowing the stack. > > > All in all, it should be a pretty serviceable pretty printer. More > > coming, though... > > > The documentation is still on github, but I've updated it for > > clojure.contrib. Look here:http://github.com/tomfaulhaber/cl-format. > > > Please let me know if you have issues, suggestions, stuff you'd like > > to see first, etc. --~--~-~--~~~---~--~~ 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: Simple dosync/alter question
On Apr 6, 2009, at 9:02 AM, bgray wrote: > > I have a some what (I believe) easy question. Could someone let me > know what I'm doing wrong? A simplified version of what I'm trying to > do looks like this: > > user=> (def foo (ref 0)) > #'user/foo > user=> (defn square [x] (* x x)) > #'user/square > user=> (defn square-ref [x] (dosync (alter foo square x))) > #'user/square-ref > user=> (square-ref 2) > java.lang.IllegalArgumentException: Wrong number of args passed to: > user$square (NO_SOURCE_FILE:0) > Paul and David N. have already given you the right advice. But to help you understand why your square-ref function didn't work, compare it to this: (defn square-ref [x] (dosync (alter foo (fn [_] (square x) Do you see the difference? 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 -~--~~~~--~~--~--~---
Experiments in unit testing
Hi folks, A while ago I started writing a unit testing library called Fact that was a cross between Haskell's QuickCheck, and Ruby's RSpec. I've done a lot of work with it, and some people might conceivably be interested in how I got on with it, so this post is to chart what I found whilst playing around with Fact. I had two basic ideas for Fact. The first was to allow tests to be labelled with a string, rather than with a symbol: (fact "One plus one equals two" [] (= (+ 1 1) 2)) This seemed like a good idea, but it turned out to have some problems. Plain-English descriptions tend to change around more than symbols, so aren't very good at uniquely identifying an object. To get around this, I used gensym to create a random symbol to use as an identifier, but this broke namespace reloading, as each time the file was loaded, it generated completely new symbols. So in retrospect, labelling tests with strings turned out to be a bit more trouble than it was worth. The second major idea for Fact was to make it simple to generate large amounts of random test data, and to apply this data to a single predicate or 'fact': (fact "x + y > x if x > 0" [x (random-int) y (random-int)] (if (> x 0) (> (+ x y) x))) The above syntax generates a list of random numbers and applies them to the bottom predicate. This makes it pretty simple to test predicates with large amounts of data. This seemed like an interesting idea, so I used Fact to unit test my web framework, to see how it would work in practise. It turned out that it worked quite well for functions that manipulated simple data structures, like numbers or strings, and less well for functions that manipulated more complex arrangements of maps and vectors. The problem with this is that functions that manipulate simple data tend to be quite easy to test, anyway. A few carefully chosen points of test data can vastly reduce the probability the function is incorrect. And when your input data becomes more complex, and thus more prone to error, creating a function to randomly generate this complex data becomes difficult enough that I started to find myself avoiding writing tests for these complex cases. So I decided to rewrite my unit tests using test-is. Symbols aren't as descriptive as strings, but they have the advantage of being able to be reloaded easily, so I could run a Nailgun server for seriously quick unit tests. Since I wasn't generating all that random data any more, my tests ran several orders of magnitude faster - down from half a minute to under half a second. I also found that my tests were easier to write, with only a few exceptions. My conclusion is that automatically generated test data is probably more trouble than it's worth in most cases. I'm going to keep Fact around in case anyone wants to play with it, but I think I'll wind up the experiment and mark it down as a lesson learned. - James --~--~-~--~~~---~--~~ 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: Clojure, Android and Emacs on Ubuntu tutorials
I've been trying to get Clojure/Android up and running today. The pure java example in http://riddell.us/tutorial/android/android.html works fine. I tried the "hello world" example as in http://riddell.us/tutorial/clojure_android/clojure_android.html and get the following message from the emulator: "The application TestProject (process us.riddell) has stopped unexpectedly. Please try again." I have no idea where to hit this to get it to be nicer to me. I'm running on Windows, jdk version 1.6.0_13, in case that matters. Thanks in advance. - nick --~--~-~--~~~---~--~~ 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 -~--~~~~--~~--~--~---
clojure + android
Apologies for what might be multiple postings. Looks like google swallowed the first one without chewing. I've been trying to get clojure + android going but without much success. In case it's relevant, I'm on Windows (XP) and the java version is 1.6.0_13. I followed http://riddell.us/tutorial/android/android.html and http://riddell.us/tutorial/clojure_android/clojure_android.html (expect that I'm driving the Android emulator from the command line rather than emacs). I've got the pure Java verison working OK. I've got clojure working OK at the command line. When I try the hello-world example in the clojure_android tutorial I get a message from the Emulator telling me that the application has stopped unexpectedly (and it doesn't say hello). Does anyone know how to debug this? (Other than Eclipse.) Or even: what might cause this message? Thanks, - nick --~--~-~--~~~---~--~~ 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 -~--~~~~--~~--~--~---
keyword and /
Hello, This tripped me up today: user=> (:the/key { :the/key "the val"}) ; ok "the val" user=> (:the/key { (keyword "the/key") "the val"}) ; returns nil? nil Shouldn't both return "the val"? Thanks, Andrew --~--~-~--~~~---~--~~ 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: keyword and /
The call to keyword here: user=> (:the/key {(keyword "the" "key") "the val"}) "the val" creates a keyword whose namespace part is "the" and whose name part is "key" just like :the/key. Does this accomplish what you're after or are you specifically requesting that (keyword "the/key") be made to work? --Steve On Apr 6, 2009, at 2:45 AM, Andrew Rimes wrote: Hello, This tripped me up today: user=> (:the/key { :the/key "the val"}) ; ok "the val" user=> (:the/key { (keyword "the/key") "the val"}) ; returns nil? nil Shouldn't both return "the val"? Thanks, Andrew --~--~-~--~~~---~--~~ 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 -~--~~~~--~~--~--~--- smime.p7s Description: S/MIME cryptographic signature
Re: keyword and /
On 6-Apr-09, at 6:22 PM, Stephen C. Gilardi wrote: > The call to keyword here: > > user=> (:the/key {(keyword "the" "key") "the val"}) > "the val" > > creates a keyword whose namespace part is "the" and whose name part > is "key" just like :the/key. > > Does this accomplish what you're after or are you specifically > requesting that (keyword "the/key") be made to work? Yeah, that is alright. Thanks. > > --Steve > > On Apr 6, 2009, at 2:45 AM, Andrew Rimes wrote: > >> >> Hello, >> >> This tripped me up today: >> >> user=> (:the/key { :the/key "the val"}) ; ok >> "the val" >> >> user=> (:the/key { (keyword "the/key") "the val"}) ; returns nil? >> nil >> >> Shouldn't both return "the val"? >> >> Thanks, >> >> Andrew >> >> >> > --~--~-~--~~~---~--~~ 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 -~--~~~~--~~--~--~---
New release of the enclojure plugin is up.
There is a new release of the Enclojure plugin that addresses many of the items I have seen discuss here recently with regards to managing classpaths in REPLs as well as many other Clojure development scenarios. The plugin supports several use cases for the clojure.main REPL use: a. Project based REPLs where the REPL is started using the dependancies on the project in the IDE. b. Remote REPLs where some shim code can be included in your application(s) and you can attach a REPL (or REPLs) to running VMs. c. Ad-hoc REPLs - manually set your classpaths and start a REPL up. All of these scenarios have strong integration with the editor supporting integrated Clojure/Java completion, debugging with viewable clojure data, syntax highlighting, code loading, expression evaluation, s-expression nav and many more features. There have been well over 100 patches since the last release in February. For more information, please see: http://enclojure.wikispaces.com Plugin can be downloaded at: http://code.google.com/p/enclojure-nb-clojure-plugin/downloads/list Feedback welcome! Eric Eric Thorsen ThorTech Solutions www.thortech-solutions.com (914) 302-7638 [work] (914) 302-7641 [fax] (914) 804-4954 [cell] --~--~-~--~~~---~--~~ 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: clojure + android
On Apr 6, 12:28 pm, Nick Levine wrote: > Apologies for what might be multiple postings. Looks like google > swallowed the first one without chewing. > > I've been trying to get clojure + android going but without much > success. In case it's relevant, I'm on Windows (XP) and the java > version is 1.6.0_13. > > I > followedhttp://riddell.us/tutorial/android/android.htmlandhttp://riddell.us/tutorial/clojure_android/clojure_android.html > (expect that I'm driving the Android emulator from the command line > rather than emacs). > > I've got the pure Java verison working OK. I've got clojure working OK > at the command line. When I try the hello-world example in the > clojure_android tutorial I get a message from the Emulator telling me > that the application has stopped unexpectedly (and it doesn't say > hello). > > Does anyone know how to debug this? (Other than Eclipse.) Or even: > what might cause this message? > Hi Nick, I've been able to get the example app that Remco was kind enough to provide working and I'm pretty sure I got it working on Windows XP (I'm on a MacBook now). I'd try Remco's example and see what you get. -- Onorio --~--~-~--~~~---~--~~ 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: clojure + android
On Apr 6, 12:28 pm, Nick Levine wrote: > Apologies for what might be multiple postings. Looks like google > swallowed the first one without chewing. > > I've been trying to get clojure +androidgoing but without much > success. In case it's relevant, I'm on Windows (XP) and the java > version is 1.6.0_13. > > I > followedhttp://riddell.us/tutorial/android/android.htmlandhttp://riddell.us/tutorial/clojure_android/clojure_android.html > (expect that I'm driving theAndroidemulator from the command line > rather than emacs). > > I've got the pure Java verison working OK. I've got clojure working OK > at the command line. When I try the hello-world example in the > clojure_android tutorial I get a message from the Emulator telling me > that the application has stopped unexpectedly (and it doesn't say > hello). > > Does anyone know how to debug this? (Other than Eclipse.) Or even: > what might cause this message? > Sorry Nick--forgot to include the link: http://github.com/remvee/clojurehelloandroid/ -- Onorio --~--~-~--~~~---~--~~ 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: DISCUSS: clojure.contrib.java-utils/file
In addition, it's a bad idea to have these two superficially similar functions have the same name, "file". If, in the end, both are to be kept public, then I think they should at least be given different names. On Apr 6, 10:35 am, Victor Rodriguez wrote: > Hello, > > On Mon, Apr 6, 2009 at 10:06 AM, James Reeves > > wrote: > > ... > > The problem with having java-utils/file and duck-streams/file is that > > you lose the ability to load both namespaces at the same time without > > defining an exception for the file function. This does not seem like > > an ideal solution. I think we should choose one or the other, give > > them different names, or attempt to merge their functionality. > > IMHO. what you want to avoid is having similar utility functions in > different projects. Thus, duck-streams could just use the version of > file of java-utils, or keep its own version private. > > Cheers, > > Victor Rodriguez. > > > - James --~--~-~--~~~---~--~~ 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: ANN: Pretty printer is now part of contrib
Hi, 2009/4/6 Tom Faulhaber > Another question is whether we should duplicate the classes and > the .clj files in the jar or should we just compile all of them. Is > there some value to having the source there? There certainly some value for both scenario : having classes seems an absolute requirement for some libraries to work, but having .clj files is really interesting for those that want either (show-source) ... in their REPL to work (or in IDEs for jumping to a read-only syntax-colored version of the source file). But there is also certainly value in having a build with just the classes ? (Though since the whole thing is open source, it's not a problem related to rights, but maybe for some platforms such as Android, some people might want the lightest possible jar ?) Regards, -- 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 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 of the enclojure plugin is up.
I downloaded and installed NetBeans and the Enclojure plugin. I am not clear on how to setup the "main" class. I modified the "main" class generated by the template to look like the following: = (defn -main ([args] (startNewAchiTask)) ([ ] (-main nil))) = This works, but I am not sure what is going on. Why are there parentheses around "[args] (startNewAchiTask)"? What is "([ ] (-main nil))"? Thanks for any help on these questions. On Apr 6, 7:43 pm, Eric Thorsen wrote: > There is a new release of the Enclojure plugin that addresses many of > the items I have seen discuss here recently with regards to managing > classpaths in REPLs as well as many other Clojure development > scenarios. The plugin supports several use cases for the clojure.main > REPL use: > a. Project based REPLs where the REPL is started using the > dependancies on the project in the IDE. > b. Remote REPLs where some shim code can be included in your > application(s) and you can attach a REPL (or REPLs) to running VMs. > c. Ad-hoc REPLs - manually set your classpaths and start a REPL up. > All of these scenarios have strong integration with the editor > supporting integrated Clojure/Java completion, debugging with viewable > clojure data, syntax highlighting, code loading, expression > evaluation, s-expression nav and many more features. There have been > well over 100 patches since the last release in February. > For more information, please see:http://enclojure.wikispaces.com > Plugin can be downloaded > at:http://code.google.com/p/enclojure-nb-clojure-plugin/downloads/list > > Feedback welcome! > Eric > > Eric Thorsen > ThorTech Solutionswww.thortech-solutions.com > (914) 302-7638 [work] > (914) 302-7641 [fax] > (914) 804-4954 [cell] --~--~-~--~~~---~--~~ 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 of the enclojure plugin is up.
On Tue, Apr 7, 2009 at 7:45 AM, billh04 wrote: > > I downloaded and installed NetBeans and the Enclojure plugin. > > I am not clear on how to setup the "main" class. > > I modified the "main" class generated by the template to look like the > following: > > = > (defn -main ([args] (startNewAchiTask)) > ([ ] (-main nil))) > = > > This works, but I am not sure what is going on. > > Why are there parentheses around "[args] (startNewAchiTask)"? This function accepts either one or zero arguments. The first list is for the former case. The second one is for the latter. > What is "([ ] (-main nil))"? If it is called with zero arguments: (-main) it will automatically call itself with a single argument of nil: (-main nil) > Thanks for any help on these questions. See also http://clojure.org/special_forms#fn (defn expands into (def ... (fn ...))) and http://clojure.org/api#defn -- Michael Wood --~--~-~--~~~---~--~~ 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 -~--~~~~--~~--~--~---