2010-07-18
| 00:31 | Raynes | TimMc: Github is nice. Email works as well. |
| 00:47 | Bahman | Hi all! |
| 01:09 | TakeV | So, if I have a large list of data that my program is working on, and everything is kept inside that list, and multiple agents will be using it, then it would be best to use an atom, right? |
| 01:47 | vishsingh | It depends. You could potentially get more concurrency in other ways if you have constraints on how the list will be modified. |
| 01:47 | vishsingh | e.g. if it is being used as a queue |
| 01:50 | TakeV | vishsingh: It's a list of hashes, each of which will probably be modified. |
| 01:54 | vishsingh | you mean, each thread will modify almost every hash in its operation on the list? then, yes, it seems right to use one atom for the whole list. |
| 01:59 | TakeV | Well, one thread will. Everything else will just read from it. |
| 02:09 | bobo_ | is there any simple way to make map/filter and so on use multiple cores? |
| 02:09 | bobo_ | just out of curiosity |
| 02:11 | TakeV | bobo_: Isn't that was pmap does? |
| 02:11 | TakeV | (doc pmap) |
| 02:11 | clojurebot | "([f coll] [f coll & colls]); Like map, except f is applied in parallel. Semi-lazy in that the parallel computation stays ahead of the consumption, but doesn't realize the entire result unless required. Only useful for computationally intensive functions where the time of f dominates the coordination overhead." |
| 02:11 | bobo_ | oh i did not know that |
| 02:11 | bobo_ | awesome |
| 02:14 | TakeV | I don't know if there is a pfilter, though. Let's see... |
| 02:14 | TakeV | (doc pfilter) |
| 02:14 | clojurebot | Pardon? |
| 02:14 | TakeV | Yeah... |
| 02:47 | holoway | hi - if I have a function that I pull the arguments in to with &, and then I want to pass them directly to another function, how do I do that? |
| 02:48 | holoway | ie: http://gist.github.com/480189 |
| 02:49 | vishsingh | if I understand what you're asking correctly, you can use 'apply' to do that |
| 02:49 | vishsingh | (doc apply) |
| 02:49 | clojurebot | "([f args* argseq]); Applies fn f to the argument list formed by prepending args to argseq." |
| 02:50 | vishsingh | it basically lets you call a function with a list of parameters, rather than the parameters themselves |
| 02:51 | holoway | gotcha! |
| 02:51 | holoway | that's exactly it |
| 02:51 | holoway | thank you |
| 02:51 | vishsingh | happy to help |
| 02:52 | holoway | vishsingh: I imagine that's a fairly common idiom, if you wind up with a sequence and you want to turn it in to function arguments? |
| 02:53 | vishsingh | yes, that's the way you do it, in Clojure and in many other Lisps too |
| 02:53 | holoway | cool - I've written all of like 10 lines of clojure so far, and never touched a lisp, so I appreciate the super-newbie help :) |
| 02:54 | vishsingh | no prob :) clojure is a great way to get into lisp |
| 03:36 | holoway | how do I set a public variable, for example the json-keyword-keys var on the clojure.contribjson.read lib? |
| 03:38 | mikem | holoway: you can probably wrap calls to functions which care about json-keyword-keys in a (binding ...) |
| 03:38 | mikem | ,(doc binding) |
| 03:38 | clojurebot | "([bindings & body]); binding => var-symbol init-expr Creates new bindings for the (already-existing) vars, with the supplied initial values, executes the exprs in an implicit do, then re-establishes the bindings that existed before. The new bindings are made in parallel (unlike let); all init-exprs are evaluated before the vars are bound to their new values." |
| 03:39 | holoway | mikem: ahh, that makes sense |
| 03:39 | holoway | clever! |
| 03:42 | holoway | mikem: thank you |
| 03:42 | mikem | holoway: no problem :) |
| 03:42 | holoway | how does anyone learn a new language without irc? :) |
| 03:52 | gregh | travel? |
| 04:18 | mikem | why does this happen? |
| 04:18 | mikem | ,(do (def *tester* "test") (var-set *tester* "change")) |
| 04:18 | clojurebot | DENIED |
| 04:18 | mikem | eh... |
| 04:18 | mikem | at my REPL I get: CompilerException java.lang.ClassCastException: java.lang.String cannot be cast to clojure.lang.Var |
| 04:18 | mikem | am I misunderstanding var-set? |
| 04:19 | mikem | if I initially have (def *tester* 14), the exception says java.lang.Integer cannot be cast |
| 04:24 | hoeck | mikem: var-set requires a var |
| 04:24 | hoeck | so either (var-set (var *tester*) 'foo) or (var-set #'tester 'foo) |
| 04:25 | mikem | hoeck: so should I do (var-set #'*tester* "new") |
| 04:25 | mikem | ok |
| 04:25 | mikem | actually, I tried this, and got CompilerException java.lang.IllegalStateException: Can't change/establish root binding of: *tester* with set |
| 04:25 | hoeck | right, #'the-var returns the var-object instead of resolving the vars value |
| 04:26 | hoeck | mikem: yes, you can only use var-set if you rebound the var with (binding ...) |
| 04:26 | hoeck | to alter the root binding, use (alter-var-root #'*tester* (constantly 'foo)) |
| 04:26 | mikem | hoeck: ah, that makes sense :) |
| 04:27 | mikem | great, alter-var-root is probably what I was looking for |
| 07:10 | octe | when using slime-connect from emacs to connect to a seperate swank-process i will only get output from the main thread in the slime-repl, not the other ones |
| 07:10 | octe | anyone know how to get all output? |
| 07:19 | msappler | hi |
| 07:21 | raek | maybe one could set the root binding of *out* to swank thread's value |
| 07:21 | raek | haven't tried this, though |
| 07:21 | msappler | How can I thread a form through a variable number of functions? |
| 07:22 | msappler | apply -> does not work because -> is a macro |
| 07:22 | raek | maybe reduce could be used |
| 07:23 | raek | (reduce #(apply %2 %1) val [fn1 fn2 fn3]) |
| 07:25 | raek | ,(reduce #(apply %2 [%1]) 1 [inc #(* % 2) even?]) |
| 07:25 | clojurebot | true |
| 07:26 | msappler | hmm but my functions only have 1 argument |
| 07:26 | msappler | so i need to re-write the apply somehow |
| 07:26 | msappler | the anonymous |
| 07:27 | raek | octe: this works: (alter-var-root #'*out* (constantly *out*)) |
| 07:27 | raek | (future (println "hello world!")) |
| 07:27 | raek | now prints in slime |
| 07:28 | raek | msappler: in my second code example, the functions will always be applied with one argument |
| 07:28 | raek | hence the one-element vector |
| 07:29 | msappler | ah nice it works! thx |
| 07:29 | msappler | you just wrote the '->' macro with reduce lol |
| 07:30 | shachaf | ((reduce comp identity [f1 f2 f3]) val) |
| 07:31 | raek | whoa, that was far more elegant |
| 07:31 | msappler | and that will take me a few minutes to understand ;) |
| 07:37 | somnium | ,(letfn [(p [x] (prn x) x)] ((reduce comp (interleave (repeat p) (take 10 (repeat inc)))) 42)) |
| 07:37 | clojurebot | 52 |
| 07:37 | clojurebot | 43 44 45 46 47 48 49 50 51 52 |
| 07:48 | shachaf | ,(letfn [(p [x] (prn x) x)] ((reduce comp (take 20 (cycle [p inc])) 42)) |
| 07:48 | clojurebot | EOF while reading |
| 07:48 | shachaf | ,(letfn [(p [x] (prn x) x)] ((reduce comp (take 20 (cycle [p inc]))) 42)) |
| 07:48 | clojurebot | 52 |
| 07:48 | clojurebot | 43 44 45 46 47 48 49 50 51 52 |
| 07:51 | somnium | shachaf: haskell? |
| 07:52 | shachaf | somnium: Yep. :-) |
| 07:53 | somnium | shachaf: the `reduce comp ...' gave you away :) |
| 07:54 | shachaf | somnium: I guessed so. The #(apply %2) thing didn't even occur to me, what with being used to homogeneous lists and all. |
| 07:57 | shachaf | somnium: If `reduce comp ...' gave me away, what's the standard way of doing in Clojure? The #(apply ...) thing? |
| 08:07 | somnium | shachaf: hmm, probably #(apply ...). without currying comp seems to be used less often (?), but its common to structure fn args to work with -> and ->> threading macros for composition |
| 08:11 | somnium | ,(letfn [(p [x] (prn x) x)] ((->> (cycle [p* inc]) (take 20) (apply comp)) 42)) |
| 08:11 | clojurebot | java.lang.Exception: Unable to resolve symbol: p* in this context |
| 08:11 | somnium | doh |
| 08:39 | Bahman | Hi all! |
| 11:19 | bobo_ | is there a simple way to turn 12345 into [1 2 3 4 5]? |
| 11:20 | SinDoc | 12345 being a number? |
| 11:20 | bobo_ | yes |
| 11:21 | SinDoc | you could turn it into a string |
| 11:23 | bobo_ | ah re-seq looks nice |
| 11:24 | bobo_ | ,(req-seq #"[1-5]" (str 12345)) |
| 11:24 | clojurebot | java.lang.Exception: Unable to resolve symbol: req-seq in this context |
| 11:24 | bobo_ | ,(re-seq #"[1-5]" (str 12345)) |
| 11:24 | clojurebot | ("1" "2" "3" "4" "5") |
| 11:24 | Hodapp | take the number modulo 10 for the last digit, then divide the number by 10 and repeat |
| 11:28 | SinDoc | The mod 10 solution works too but then you need a loop |
| 11:29 | bobo_ | regexp feels faster. atleast to type |
| 11:30 | mefesto | ,(map #(Integer/parseInt %) (map str "12345")) |
| 11:30 | clojurebot | (1 2 3 4 5) |
| 11:31 | Hodapp | SinDoc: well, it could be done recursively as well. |
| 11:31 | bobo_ | oh yes, strings are seqs, didnt think of that |
| 11:32 | Nikelandjelo | ,(map bigint (seq (str 12345))) |
| 11:32 | clojurebot | java.lang.IllegalArgumentException: No matching ctor found for class java.math.BigInteger |
| 11:33 | SinDoc | (map #(- (int %) (int \0)) (seq (str 12345))) |
| 11:34 | SinDoc | i came up with this |
| 11:34 | SinDoc | Hodapp: iteration is obviously better, and hey, mine ended up being iterative too |
| 11:36 | SinDoc | that of mefesto sounds nice too |
| 12:15 | mfex | ,((fn [n] (map #(-> n (/ (Math/pow 10 %)) (Math/floor) (mod 10) (int)) (range (Math/floor (/ (Math/log n) (Math/log 10))) -1 -1))) 12345) |
| 12:15 | clojurebot | (1 2 3 4 5) |
| 12:18 | eshira | hi, i'm trying to use the clj-processing. I am new to the whole java classpaths business. basically, i need to: (:use [rosado.processing]), and I have a rosado.process.jar. how would i hook these two things up? |
| 12:20 | mefesto | eshira: what is your classpath set to? |
| 12:20 | eshira | in my bashrc, i wrote: export CLASSPATH=${CLASSPATH}:/Users/eshira/code/clj-processing/ |
| 12:20 | eshira | that folder contains the jars |
| 12:21 | mefesto | i think the java command needs to see *.jar in order to add the jars, otherwise it has no way to distinguish between a folder of class files and jar files |
| 12:22 | mefesto | for testing you could do: java -cp clojure.jar:rosado.process.jar file.clj |
| 12:22 | raek | jar files are treated the same as directories in the class path |
| 12:22 | raek | i.e. all of them have to be listed |
| 12:23 | raek | potentially with an asterisk * |
| 12:24 | eshira | thanks, i will look into this |
| 12:24 | mefesto | oops forgot clojure.main :) |
| 12:24 | eshira | ill add it |
| 12:24 | mefesto | http://download-llnw.oracle.com/docs/cd/E17409_01/javase/6/docs/technotes/tools/windows/java.html |
| 12:24 | mefesto | the -cp flag describes what raek said |
| 12:24 | eshira | i should probably use something like leiningen rather than haphazardly modifyling CLASPATH |
| 12:39 | slyrus | hrm... so I have a record, let's call it Foo, that uses a make-foo helper function and I want to call this from protocol methods. I can't have the make-foo defn before the record, and I can't have the defrecord first as its methods want to call make-foo. what am I missing? |
| 12:40 | TimMc | Circular dependency? |
| 12:40 | opqdonut | (declare make-foo)? |
| 12:42 | slyrus | thanks! |
| 12:56 | rubydiamond | How is Programming Clojure peepcode video? |
| 12:58 | eshira | so now i'm using lein, which is much better than having to mess w/ classpaths crap. but now, I want to run my app w/o having to do a "lein uberjar". In other words, I want to be able to "lein jar" and then "java -jar myapp.jar". But this means that I would need the clojure jars in my CLASSPATH, right? |
| 12:58 | polypus | how are protocols used from javaland? |
| 12:58 | polypus | eshira: yeah |
| 12:59 | eshira | can i run my app w/o doing a "lein jar" then? |
| 13:03 | polypus | eshira: you can run it from the repl with 'lein repl', or through a swank connection, else you must have clojure on your classpath either in an uberjar or some other way. |
| 13:08 | eshira | interestingly, 'lein repl' gives me: Exception in thread "main" java.lang.ClassNotFoundException: clojure.main. any ideas? |
| 13:10 | rhudson | re jars and classpaths: in Java 6 you can do something like java -cp "~/.cljr/lib/*" clojure.main -- it includes all the jar files in the directory. Note that the -cp arg has to be in quotes (otherwise the shell would try to expand the * |
| 13:11 | polypus | eshira: you might be interested in my http://github.com/polypus74/cajual |
| 13:11 | polypus | or you could check out cljr on github |
| 13:17 | eshira | i've never gotten cljr to work. "cljr repl" produces the same error as above. |
| 13:18 | eshira | i probably have some other dependencies out there screwing w/ it |
| 13:19 | eshira | but i think the problem could be jline, because i've alwaays had trouble w/ getting a REPL running w/ jline. I switched to a jline alternative and everythign works. |
| 13:21 | rhudson | eshira: what OS? what JVM? |
| 13:21 | eshira | ok, fixed it w/ a super simple solution: $ rm /Library/Java/Extensions |
| 13:22 | eshira | i mean: rm /Library/Java/Extensions/jline.jar |
| 13:22 | rhudson | ah, that sounds a likely culprit |
| 13:22 | eshira | i am on OS X 10.6 |
| 13:23 | polypus | eshira, cajual mentioned above keeps jline up to date with a simple lein deps |
| 13:23 | slyrus | what is the properly idiomatic way to do (drop 1 [1 2 3]) and get [2 3] instead of (2 3)? |
| 13:23 | polypus | works for me on 10.6 |
| 13:25 | slyrus | or, put another way, why doesn't (rest [1 2 3]) return [2 3]? |
| 13:26 | polypus | slyrus: because it is a sequence function, not a vector manipulation function |
| 13:27 | slyrus | ok... but why not return a sequence of the same type as what was passed in? why default to a list? |
| 13:27 | slyrus | presumably it's because things like dropping the first item of a vector are pretty expensive |
| 13:28 | polypus | slyrus: it's not a list |
| 13:28 | polypus | ,(class (drop 1 [1 2 3])) |
| 13:28 | clojurebot | clojure.lang.LazySeq |
| 13:30 | polypus | if you want a vec you can (vec (drop ...)) or use subvec. sequnce functions deal with sequence abstractions, and you shouldn't care what the return type is. only that the return value behaves like a sequence |
| 13:30 | slyrus | fair enough |
| 13:35 | eshira | polypus, thanks. i'l check it out |
| 13:36 | polypus | eshira: np |
| 13:36 | raek | vectors are not sequences |
| 13:37 | raek | vectors and lists are collections, and sequences are sequential views of collections |
| 13:38 | polypus | or even abstact sequence with no underlying collection (repeat :foo) |
| 13:42 | raek | although, when treated as collections (e.g. when using conj), sequences behave as if they were lists |
| 13:43 | polypus | and lists are sequences as ell as collections |
| 13:43 | polypus | ,(seq? '(1 2 3)) |
| 13:43 | clojurebot | true |
| 13:43 | polypus | well* |
| 13:47 | raek | I really like how clojure makes all these different data structures and the traditional cons cells work so beatifully together... |
| 13:48 | polypus | i have a java object f, which has an invoke method. if i write (.invoke f 5) it works. but if i write ((memfn invoke) f 5) i get a wrong number of args passed error. the invoke method is variable arity, could that be causing the error? |
| 13:49 | raek | hrm, I dont't know.... but I do know that #(.invoke %1 %2) is preferred now |
| 13:49 | raek | ...voer memfn |
| 13:49 | raek | *over |
| 13:49 | raek | hrm, "voer" looks dutch :) |
| 13:50 | SinDoc | raek: inderdaad ;) |
| 13:50 | xcthulhu | raek, I'm new to clojure but I've been hacking on haskell and clisp for a few years. Any gotchas I should watch out for when I'm doing stuff like (map vector (iterate inc 1) coll)? |
| 13:52 | polypus | raek: problem is i need to (apply (memfn invoke) args) |
| 13:54 | raek | polypus: why not make the class inhertir from AFn and use it as a function? |
| 13:55 | polypus | raek: i don't have access to the class. in fact it's dynamically generated. it's a javafx anonymous function |
| 13:56 | raek | xcthulhu: that code looks fine if you want [index value] pairs |
| 13:56 | raek | it's identical to "indexed" in http://media.pragprog.com/titles/shcloj/flow.pdf |
| 13:57 | Chousuke | xcthulhu: are you using 1.2? |
| 13:57 | raek | hrm |
| 13:57 | raek | polypus: tricky |
| 13:57 | Chousuke | xcthulhu: it has a map-indexed IIRC |
| 13:58 | xcthulhu | 1.0 |
| 13:58 | xcthulhu | I'm gonna be lame here, but is there something like Haskell's "zip" for clojure? |
| 13:58 | xcthulhu | (not zippers) |
| 13:59 | polypus | zipmap? i don't know haskell |
| 13:59 | raek | what does Haskell's zip do? I haven't gotten into Haskell yet... |
| 13:59 | raek | (I have a strong feeling that I will one day) |
| 13:59 | rhudson | xcthulhu: (map vector a b) is Clojure's equivalent |
| 14:00 | xcthulhu | (zip [1 2 3] ["A" "B" "C]) would return ([1 "A"] [2 "B"] [3 "C"]) |
| 14:00 | xcthulhu | rhudson: awesome. Thanks |
| 14:00 | raek | (zipmap [:a :b :c] [1 2 3]) => {:a 1, :b 2, :c 3) |
| 14:01 | polypus | zipmap does same but returns a map |
| 14:01 | polypus | jinx |
| 14:02 | raek | zipmap is wonderful to have when implementing a lisp |
| 14:02 | rhudson | xthulhu: As a rule of thumb, most things that produce a sequence produce a lazy sequence, and mostly nothing else is lazy |
| 14:02 | raek | (let [new-env (extend-env env (zipmap formal-params actual-params))] ...) |
| 14:06 | LauJensen | Good evening all |
| 14:07 | xcthulhu | raek, I'm trying to teach myself clojure by writing something that solves http://www.dourish.com/goodies/aptitude-test.html |
| 14:08 | raek | heh |
| 14:08 | xcthulhu | raek, The first question is about the index of the first question with "B" as an answer. zipmap would be nice but I really want to call "find-first" here |
| 14:08 | raek | polypus: maybe you could to a macro that expands into (.invoke f foo bar ...) |
| 14:09 | xcthulhu | You can't use find-first with a map, right? |
| 14:09 | raek | that problem should be fairly straight forward to solve with the non-deterministic interpreter from SICP |
| 14:10 | raek | find-first? |
| 14:10 | xcthulhu | raek, It's in clojure.contrib.seq |
| 14:10 | raek | you could use "some" |
| 14:10 | raek | ah |
| 14:10 | raek | a sequence would be made for the map |
| 14:10 | raek | ,(seq {:a 1, :b 2, :c 3}) |
| 14:10 | clojurebot | ([:a 1] [:b 2] [:c 3]) |
| 14:11 | polypus | raek: memfn is implemented like this `(fn [target# ~@args] |
| 14:11 | polypus | (. target# (~name ~@args)))) |
| 14:12 | polypus | i don't think there is a way of doing it w/o dropping into javaland |
| 14:12 | raek | what error did you get again? |
| 14:13 | polypus | wrong number of args. i think it's because the invoke method of the javafx functions is variable arity |
| 14:13 | xcthulhu | raek, Thanks a bunch. I'll rewrite some of this... |
| 14:13 | lpetit | ,(re-seq #"[0-9]*(?!\.)" "10") |
| 14:13 | clojurebot | ("10" "") |
| 14:13 | lpetit | ,(re-seq #"[0-9]*(?!\.)" "10.0") |
| 14:13 | clojurebot | ("1" "" "0" "") |
| 14:14 | raek | is #"(?!foo)" some special re syntax? |
| 14:14 | qbg | Yes |
| 14:15 | lpetit | Hello, do you know a way, with regexps, to discard the "whole" match if we encounter a character (here the dot char) while matching. e.g. I want ,(re-seq #"[0-9]*(?!\.)" "10.0") to return ("0" "") and not > ("1" "" "0" "") |
| 14:15 | lpetit | (when I say ("0" "") I'm talking about the 2d "0", not the first |
| 14:16 | lpetit | raek: (?!f) means "negative lookahead for char \f" |
| 14:16 | lpetit | raek: zero-width negative lookahead, that is |
| 14:17 | lpetit | is there a possibility to have the desired behaviour via the use of greedy ... operators ? |
| 14:18 | raek | it matches the first 1 since it's not followed by a period |
| 14:20 | raek | (re-seq #"[0-9]*(?!\.|[0-9])" "10.0") |
| 14:20 | raek | ,(re-seq #"[0-9]*(?!\.|[0-9])" "10.0") |
| 14:20 | clojurebot | ("0" "") |
| 14:20 | slyrus | what's the equivalent of CL's find? that is (cl-find item seq) returns item if it's in seq, nil otherwise? (some #(when (= % obj) %) seq) ? |
| 14:20 | raek | added criterium: the matched digits should not have any following digits |
| 14:20 | qbg | ,(some #{3} [1 2 3 4 5 6]) |
| 14:20 | clojurebot | 3 |
| 14:21 | slyrus | ok, thanks qbg |
| 14:24 | raek | lpetit: did #"[0-9]*(?!\.|[0-9])" solve the problem? |
| 14:24 | lpetit | was gone |
| 14:25 | lpetit | ,(re-seq #"[0-9]*(?!\.|[0-9])" "1000.0") |
| 14:25 | clojurebot | ("0" "") |
| 14:25 | lpetit | ,(re-seq #"[1-9](?!\.)[0-9]*(?!\.|[0-9])" "1110.0") |
| 14:25 | clojurebot | nil |
| 14:26 | lpetit | ,(re-seq #"[0-9]*(?!\.|[0-9])" "110000") |
| 14:26 | clojurebot | ("110000" "") |
| 14:26 | lpetit | raek: seems so |
| 14:26 | lpetit | thx |
| 14:32 | raek | btw, does someone recommend any atricles/blog posts/books on Clojure program design/architecture? |
| 14:33 | raek | Programming Clojure touches on this a bit when suggesting that one could divide the program into a purely functional part and one mutation part |
| 14:34 | slyrus | here's an improved version of my undirected graph implementation. now with bfs and dfs: http://gist.github.com/479786 |
| 14:34 | raek | these slides (from a different background) suggests something similar: http://www.st.cs.uni-sb.de/edu/seminare/2005/advanced-fp/docs/sweeny.pdf |
| 14:35 | raek | some algorithms are better of being purely functional |
| 14:35 | raek | and the mutation part benefits from a STM |
| 14:35 | slyrus | is my use of lazy-seq correct in the {breadth,depth}-first-traversal functions? |
| 14:38 | raek | a lazy-seq often looks like something like this: |
| 14:38 | raek | (defn lazy-something [] |
| 14:38 | raek | (if more-elements? |
| 14:38 | raek | no wait |
| 14:39 | raek | http://clojure.org/lazy |
| 14:39 | raek | the second to last example is a pretty good example |
| 14:41 | raek | slyrus: here is an example I made for experementing with lazy sequences: http://gist.github.com/480608 |
| 14:42 | raek | it can be useful for getting the feel for when items in the lazy sequence are realized |
| 14:43 | slyrus | ok, I think I've got all that, but can/should I just drop a lazy-seq call in before recurring (not using recur, per se) as I did in the traversal routines? |
| 14:43 | raek | (lazy-seq (if there-is-more-elements (cons one element (call-to-make-rest ...)))) |
| 14:43 | slyrus | is there a penalty for sprinkling in excess lazy-seq calls? |
| 14:44 | raek | IMHO, you shold not have to worry about the performance of making it lazy |
| 14:44 | slyrus | ah, but perhaps I should move the lazy-seq call outside of the (if (seq queue) |
| 14:45 | raek | the body of lazy-seq should result in a sequence |
| 14:45 | raek | of which a part most often is a call to make the rest |
| 14:46 | raek | slyrus: yes, then the check for whether is's empty or not is lazy too :) |
| 14:47 | raek | very often, you can make a sequence making function lazy by just wrapping everything in a lazy-seq |
| 14:47 | raek | (and also changing (recur) forms into normal function calls) |
| 14:50 | raek | hrm, I don't think your function in it's current form is lazy at the moment |
| 14:50 | raek | try to add a prinln to trace when it's realized |
| 14:50 | lpetit | ,(re-seq #"[0-9]*(?!\.|[0-9])" "12.3") |
| 14:50 | clojurebot | ("3" "") |
| 14:50 | lpetit | ,(re-seq #"[0-9]*(?!\.|[0-9])" "12.3") |
| 14:50 | clojurebot | ("3" "") |
| 14:51 | chouser | does anyone know off the top of their head an enlive selector for matching a tag with a specific title attr? |
| 14:52 | chouser | I see examples for class and id attrs, but not title. |
| 14:53 | raek | slyrus: I would do it something like this: http://gist.github.com/480615 |
| 14:53 | raek | (warning: not tested) |
| 14:54 | LauJensen | chouser: You just need to check if the title tag matches some predicate? |
| 14:55 | chouser | equal to a value, yes. |
| 14:55 | raek | slyrus: also, there is a clojure.lang.PersistentQueue class (which is fairly unknown) |
| 14:55 | LauJensen | (select node (has [[:title (pred #(= "something" (text %)))]])) |
| 14:55 | LauJensen | I think that should get you there |
| 14:57 | raek | slyrus: it supports conj, peek and pop |
| 15:02 | slyrus | hmm... yeah, I wrote the equivalent of that for the original impls in common lisp. it would be nice if the queue class were exposed with clojure primitives |
| 15:03 | raek | ,Q |
| 15:03 | clojurebot | java.lang.Exception: Unable to resolve symbol: Q in this context |
| 15:03 | raek | naw, where did the fish-queue-syntax go? |
| 15:04 | raek | who did the fish-queue pprint fork? replaca? |
| 15:05 | raek | http://clojure-log.n01se.net/date/2010-05-12.html#12:55 |
| 15:05 | slyrus | thanks raek, that's nicer |
| 15:14 | slyrus | raek: http://gist.github.com/479786 seems to be properly lazified now. thanks again! |
| 15:15 | polypus | raek: check it http://gist.github.com/480630 |
| 15:15 | slyrus | gists are pretty nice, btw |
| 15:15 | polypus | agreed |
| 15:16 | chouser | LauJensen: isn't :title for a <titile> tag? |
| 15:16 | chouser | I want the title attribute, like <a title="indexme">...</a> |
| 15:17 | LauJensen | chouser: ah, (select node [[:a (has ...)]]) with the code above inserted |
| 15:17 | chouser | 'has' is for attributes? |
| 15:17 | LauJensen | no wait, thats actually for nested tags Im thinking |
| 15:17 | LauJensen | lemme check the docs |
| 15:18 | LauJensen | chouser you need attr? or attr= depending on wether you are checking for existance or content |
| 15:18 | chouser | 'attr?' is for the existence of an attribute but seems to ignore the contents |
| 15:18 | chouser | oh! |
| 15:18 | LauJensen | http://enlive.cgrand.net/syntax.html |
| 15:18 | chouser | ah, attr= looks right. thanks! |
| 15:23 | duck1123 | Does anyone know of any ring middleware that will force params such as ?foo[]=7 to always appear in a vector? (ie. {:params {"foo[]" ["7"]}} ) |
| 15:23 | duck1123 | or perhaps a better way to do what I'm doing? |
| 15:28 | LauJensen | duck1123: I dont know one off the top of my head, but it should be trivial to write your own |
| 15:29 | duck1123 | I figured it would be, except it turns out the keys I was trying to modify aren't available where I was placing my middleware. Looking through compojure source now |
| 15:30 | slyrus | is there a zero-arg iterate like function? |
| 15:30 | slyrus | surely there's a better way than: (drop 1 (take 10 (iterate (fn [_] (rand-int 300)) nil))) |
| 15:30 | LauJensen | slyrus: repeatedly |
| 15:31 | slyrus | thanks LauJensen! |
| 15:53 | bleakgadfly | Hey |
| 15:55 | bleakgadfly | I am trying to do a "lein jar" on clj-plaza (http://github.com/antoniogarrote/clj-plaza and get this: http://gist.github.com/480006 |
| 15:55 | bleakgadfly | As you can see in the link, if I do it in Compojure I get the jar file I want |
| 15:55 | chouser | have a lot of trouble understanding the enlive docs |
| 15:55 | chouser | I have |
| 15:56 | bleakgadfly | Could anyone tell me after reading the java output if the error is in Clojure, leiningen or in the library? |
| 15:57 | chouser | bleakgadfly: leiningen is passing a nil to Clojure's name fn, which then throws. |
| 15:57 | chouser | ,(name nil) |
| 15:57 | clojurebot | java.lang.NullPointerException |
| 15:57 | bleakgadfly | Hmm |
| 15:57 | chouser | it's not clear to me where that nil is coming from -- perhaps the lein config file? |
| 16:00 | bleakgadfly | Okay |
| 16:00 | bleakgadfly | Thanks |
| 16:05 | technomancy | who's ready for a Leiningen release? |
| 16:07 | LauJensen | technomancy: adding more cenjureship? :) |
| 16:07 | technomancy | LauJensen: why, do you have a suggestion? =) |
| 16:07 | LauJensen | "Ver 1.2: Now forbidding all names that rhyme, all camelcased names, all names inspired from contemporary music" |
| 16:07 | clojurebot | amespaces are (more or less, Chouser) java packages. they look like foo.bar; and corresponde to a directory foo/ containg a file bar.clj in your classpath. the namespace declaration in bar.clj would like like (ns foo.bar). Do not try to use single segment namespaces. a single segment namespace is a namespace without a period in it |
| 16:07 | chouser | a sugjesjion. |
| 16:08 | technomancy | "Now you must name all your projects using names from literature, so START READING, you philistines." |
| 16:08 | LauJensen | Awesome :) |
| 16:09 | holoway | technomancy: leiningen is very cool |
| 16:09 | technomancy | holoway: thanks. |
| 16:09 | holoway | technomancy: kind of delightful, honestly |
| 16:09 | LauJensen | Yea dont get me wrong phil, its good stuff :) |
| 16:11 | technomancy | LauJensen: of course; all in good fun. =) |
| 16:29 | slyrus | so, parallel to the MyNiftyDatatype class and MyNiftyDatatypeI interface from javaland, what should one do when confronted with the urge to name both a protocol and a record the same thing? |
| 16:35 | jneira | hi people |
| 16:36 | jneira | another clojure novice looking for a better version of his poor implementation ;-) |
| 16:37 | Chousuke | slyrus: does the same name really describe a set of data AND a set of operations? |
| 16:37 | jneira | this time for a function (in-range? [[0 0 0][0 0 0]] [0 2]) -> true |
| 16:38 | jneira | (in-range? [[0 0 0][0 0 0]] [1 3]) --> false |
| 16:38 | slyrus | Chousuke: yeah, i dunno... i started off with protocol Edge and record UndirectedEdge. I don't think that's right. |
| 16:38 | slyrus | i'm needing new names as I think about protocols and records for things like directed graphs and edges. |
| 16:38 | Chousuke | slyrus: "Edge" doesn't sound like it's a protocol |
| 16:39 | slyrus | next you're going to tell me that Graph doesn't either :) |
| 16:39 | Chousuke | well, hmm |
| 16:39 | slyrus | not that you'll be wrong... |
| 16:40 | Chousuke | what you want to name is the set of operations you can perform on graph-like things |
| 16:40 | slyrus | Chousuke: http://gist.github.com/479786 is what I'm working on |
| 16:40 | slyrus | yeah, that's what I'm starting to realize |
| 16:41 | Chousuke | you might call them GraphOps or something like that |
| 16:41 | jneira | my take of in-range? http://gist.github.com/480694 |
| 16:49 | slyrus | Chousuke: well, it's maybe not quite there yet, but having NodeSet and EdgeSet protocols cleaned things up a bit. Now an UndirectedGraph implements (?) NodeSet and EdgeSet while UndirectedEdge only implements NodeSet. |
| 16:50 | slyrus | makes it easier to see how, say, DirectedGraph and DirectedEdge can fit in. |
| 16:53 | lpetit | raek: seems like using a possessive quantifier also solves the problem: |
| 16:53 | lpetit | ,(re-seq #"[0-9]*+(?!\.)" "10.0") |
| 16:53 | clojurebot | ("0" "") |
| 16:53 | lpetit | ,(re-seq #"[0-9]*+(?!\.)" "10") |
| 16:53 | clojurebot | ("10" "") |
| 17:02 | raek | a typographical question about Joy of Clojure: Aren't the footnotes supposed to be at the bottom of the page? |
| 17:02 | clojurebot | you mean clojure.main |
| 17:04 | raek | clojurebot: here, have some bot snack |
| 17:04 | clojurebot | botfight is http://raek.se/botfight.html |
| 17:04 | raek | whoa! luckily I deleted that page |
| 17:05 | raek | the title contained an instruction for sexpbot |
| 17:06 | raek | no wait, sexpbot printed the title, which was a comman to clojurebot, which in turn outputed the url again |
| 17:06 | raek | => infinite loop |
| 17:08 | slyrus | why do folks seem to use one name space per file? seems that if I'm working on a bunch of files in a project they might just share one namespace (at least that's what I usually do with CL packages). the clojure convention seems a bit different. |
| 17:08 | chouser | raek: fluke of the MEAP/PDF tool. Presumably the footnotes will actually be at the foot of the page in the final book. |
| 17:09 | chouser | though actually, most of the footnotes will be gone I suspect. |
| 17:10 | chouser | brb |
| 17:12 | raek | chouser: also, in the section illustrating the character syntax: "\u30DE ; The unicode katakana character „Éû}" |
| 17:12 | chouser | hm. unfortunate. |
| 17:13 | raek | looks like a double encoding issue to me |
| 17:14 | technomancy | slyrus: yes, one-namespace-per-file simplifies a lot of things in Clojure |
| 17:15 | slyrus | technomancy: how so? |
| 17:16 | technomancy | slyrus: well, there's less jumping around needed; you can see everything right in front of you |
| 17:18 | slyrus | i suppose if you like big files, sure. the question isn't can everything in a namespace live in one file, it's why do people use multiple namespaces for related files instead of just sharing one namespace? there's no right/wrong answer here, just style conventions and the clojure way seems opposite from what I'm used to. |
| 17:19 | chouser | I guess it's not surprising that zip-filter/xml is more suited to my specific needs than enlive is. |
| 17:19 | raek | slyrus: you can still divide the code in multiple files |
| 17:19 | raek | the user might only need to use one of the files/namespaces |
| 17:20 | raek | the others can be for splitting up the implementation of the "main" namespace |
| 17:20 | technomancy | it forces you to think about the relationship between the functions |
| 17:21 | technomancy | since all sharing between namespaces is explicit |
| 17:22 | chouser | which is likely desirable between truly separate modules, and undesirable within things that are actually interdependent. |
| 17:28 | lpetit | maybe the little "hidden" secret is that if one-namespace-per-file where the norm (one rule to rule them all :) ), then it would simplify tooling |
| 17:28 | lpetit | s/where/were/g |
| 17:28 | sexpbot | lpetit: Format is sed [-<user name>] s/<regexp>/<replacement>/ Try $help sed |
| 17:28 | lpetit | s/where/were/ |
| 17:28 | sexpbot | s/were/were/g |
| 17:28 | lpetit | gargl |
| 17:31 | technomancy | lpetit: yes, I must confess that's part of what appeals to me. =) |
| 17:31 | lpetit | technomancy: ahah, I was sure about that one :-) |
| 17:32 | technomancy | breaking one-namespace-per-file also forces you to use load-file instead of use/require, which is icky |
| 17:35 | chouser | so nobody else using enlive has needed something to extract all the textual content from a node? |
| 17:41 | bortreb | If I make a mistake when uploading a jar to clojars, then is there any way to reverse it? |
| 17:50 | lpetit | technomancy: congrats for Lein 1.2 ! |
| 17:57 | rhudson | There's :syms too, but I've never used anything but :keys |
| 17:59 | raek | the version of compojure I have been using (pre 0.4) passed http headers as maps with string keys |
| 18:00 | raek | I think the most common usage scenario would be when one gets map-like data from another data format |
| 18:00 | raek | e.g. Json |
| 18:01 | xcthulhu | Is there a prime? function for clojure? |
| 18:06 | rhudson | xcthulhu: not to my knowledge. There's clojure.contrib.lazy-seqs/primes, which as you might guess is a lazy sequence of the primes. |
| 18:09 | xcthulhu | rhudson, The SICP book presents Fermat's probabilistic algorithm but it's not in a library: |
| 18:09 | xcthulhu | http://sicpinclojure.com/?q=sicp/1-2-6-example-testing-primality |
| 18:10 | rhudson | Right, you could use the 'primes seq as test divisors for up to (sqrt n) |
| 18:11 | raek | is autopromotion still in 1.2? |
| 18:14 | rhudson | Interesting about the Fermat test; hadn't heard of that |
| 18:17 | xcthulhu | rhudson, it's not perfect; there's lots of refinements |
| 18:17 | xcthulhu | For instance: http://en.wikipedia.org/wiki/Miller%E2%80%93Rabin_primality_test |
| 19:04 | bortreb | this looks like a good implementation of various primality tests http://code.google.com/p/clj-primetest/ |
| 19:05 | bortreb | the clj stands for , of course, "command line java" |
| 19:22 | Raynes | Woot! Leiningen 1.2.0! |
| 19:26 | xcthulhu | bortreb, Well... I ended up implementing the brute force algorithm myself. |
| 19:27 | erikcw1 | Is there a function that will loop through a seqence and return the first non-False item it finds (without evaluating the rest of the items in the list)? I tried (first (filter ...)) but it evaluates each item in the seq before returning thing first true item. It is an expensive operation, so I wan to avoid that... |
| 19:29 | xcthulhu | To be honest, I know that the numbers I am checking are bounded above by 20, so my efficiency concerns are a bit silly... |
| 19:34 | xcthulhu | An issue with this library is that it restricts itself to machine precision, which I will admit is fine in practice, but the mathematician in me would prefer an algorithm that supports BigIntegers |
| 19:43 | xcthulhu | erikcw1, Sorry, I missed your post |
| 19:44 | erikcw1 | np |
| 19:44 | xcthulhu | find-first in clojure.contrib.seq is what you want |
| 19:44 | erikcw1 | Just found that |
| 19:44 | xcthulhu | :( |
| 19:44 | erikcw1 | looks like chunking of lazy seqs is a problem though |
| 19:44 | erikcw1 | I only have about 8 items in the seq |
| 19:44 | Raynes | -> (some identity [nil false 1 nil false]) |
| 19:44 | sexpbot | => 1 |
| 19:45 | erikcw1 | so they all get pulled |
| 19:45 | konr | Guys, I'm using clojure again, yet for some reason swank-clojure-project is failing to load (http://bf416618019831fa.paste.se/) - I have clojure-1.2, clojure-contrib-1.2 and swank-clojure-1.1 on my src/ lib: do I need anything else? Do you know what might be happening? |
| 19:46 | Raynes | erikcw1: (some identity ...) works. |
| 19:48 | erikcw1 | Raynes: thanks -- not really sure how that works. I'll have to dig into the source. I haven't used identity before |
| 19:49 | xcthulhu | , (identity 5) |
| 19:49 | clojurebot | 5 |
| 19:49 | xcthulhu | , (identity "Hello") |
| 19:49 | clojurebot | "Hello" |
| 19:50 | xcthulhu | In Haskell it's called id |
| 19:50 | tomoj | konr: are you not using leiningen? |
| 19:50 | erikcw1 | xcthulhu: Where would I put my predicated in this example? |
| 19:51 | konr | tomoj: I am. Perhaps clojure-1.1 is required, let me see... |
| 19:51 | tomoj | clojure 1.1 is not required |
| 19:51 | xcthulhu | , (some odd? [2,4,6,8,7,9,9,10,11]) |
| 19:51 | clojurebot | true |
| 19:51 | tomoj | konr: paste you project.clj |
| 19:53 | tomoj | does clojure play nice with gcj? |
| 19:53 | chouser | gnu classpath doesn't implement all the classes clojure.core uses |
| 19:53 | tomoj | konr: that could be your problem? |
| 19:54 | xcthulhu | erikcw1, Hmm... I'm not sure. |
| 19:54 | konr | tomoj: not really, the error changed, but I still got an error, haha... let me paste the file |
| 19:54 | xcthulhu | erikcw1, this is kind of ugly, but what about: |
| 19:55 | xcthulhu | , (some identity (map #(and (even? %) %) [1,3,5,7,11,12,14,16]) |
| 19:55 | clojurebot | EOF while reading |
| 19:55 | xcthulhu | , (some identity (map #(and (even? %) %) [1,3,5,7,11,12,14,16])) |
| 19:55 | clojurebot | 12 |
| 19:56 | xcthulhu | erikcw1, I think that has the semantics you want... |
| 19:56 | xcthulhu | throw in pred for even? and coll for [1,3,...] |
| 19:57 | erikcw1 | , (some identity (map #(do (print \.) (and (even? %) %)) [1,3,5,7,11,12,14,16])) |
| 19:57 | clojurebot | 12 |
| 19:57 | clojurebot | ........ |
| 19:58 | erikcw1 | xcthulhu: seems like it looses its de-chunkified lazyiness |
| 19:59 | xcthulhu | hmm |
| 20:01 | konr | tomoj: http://884e867afd61073a.paste.se/ - apparently slime keeps polling and *inferior-lisp* contains http://c8096c7945723343.paste.se |
| 20:01 | chouser | map will do chunks on a vector |
| 20:01 | chouser | 'some' will pull individual cons cells from that |
| 20:03 | tomoj | konr: http://94e90f3e196645be.paste.se/ try that |
| 20:03 | tomoj | but if what chouser says is true, I think you will need to get sun or openjdk and switch |
| 20:04 | tomoj | konr: and do `lein clean` and `lein deps` before trying `lein swank` again |
| 20:07 | konr | hmmm, lein couldn't find the files and suggested me to download them manually |
| 20:07 | tomoj | err |
| 20:09 | tomoj | I screwed up |
| 20:10 | tomoj | konr: http://66a7040ca1ad624f.paste.se/ |
| 20:24 | konr | tomoj: strange, now I got another kind of error: http://2dd5ecc0568d2d09.paste.se/ |
| 20:36 | tomoj | konr: again, you need to switch to sun or openjdk |
| 20:53 | thunk | It seems the new version of "lein repl" doesn't accept arguments. How do I replicate "lein repl src/project/core.clj" without loading the file manually?? |
| 21:07 | chouser | yeah |
| 21:08 | slyrus | or maybe #[(last %) (count %)] |
| 21:08 | slyrus | nah, that's crazy talk |
| 21:09 | slyrus | yeah, bfs and dfs traversal with and without paths (--> lengths). i should be able to go back to representing molecules instead of arbitrary graphs now. |
| 21:10 | konr | tomoj: that was the problem in the end! Thanks! :) |
| 21:35 | cais2002 | morning |
| 21:46 | slyrus | i want a take-while that includes the first failing item, or something like a (take-until ...) that takes items up to and including the first true item |
| 21:51 | rhudson | slyrus: you can use split-with |
| 21:58 | pdk | can regular clojure (a b c) type lists be serialized in a standardized way that preserves nested lists |
| 22:01 | konr | Do you know where I might find non-trivial examples of QT in Clojure? It seems that I'll have to use proxy on IFn to connect functions to the interfaces, and some examples of that would be nice |
| 22:03 | slyrus | my graph library is no longer (or soon will not be) just for undirected graphs. I guess I can't use ugraph any more... darn. need a name then. |
| 22:03 | pdk | the everyman's graph! |
| 22:04 | slyrus | huh? |
| 22:04 | pdk | it's a catchy name no |
| 22:05 | slyrus | no |
| 22:50 | slyrus | when does the "WARNING: spit already refers to..." warning go away? |
| 22:58 | slyrus | how about shortcut for the name of my graph library? |
| 23:01 | slyrus | ok, so now I've got two "projects", one my graph library, one my chemistry library. everything was all well and good when they were in one project. now how do I hack on both at the same time without having to do lein jar; lein install; cd ... ; lein deps ; lein swank ; (reload all my clojure stuff) ... every few minutes? |
| 23:02 | Raynes | -> (partition 2 [1 2 3 4 5]) |
| 23:02 | sexpbot | => ((1 2) (3 4)) |
| 23:02 | Raynes | Is wish it would do something meaningful with the last odd numbered element. :\ |
| 23:12 | chouser | -> (parition-all 2 [1 2 3 4 5]) |
| 23:12 | sexpbot | java.lang.Exception: Unable to resolve symbol: parition-all in this context |
| 23:13 | chouser | -> (parition 2 2 [1 2 3 4 5] [0 0]) |
| 23:13 | sexpbot | java.lang.Exception: Unable to resolve symbol: parition in this context |
| 23:13 | chouser | -> (partition 2 2 [1 2 3 4 5] [0 0]) |
| 23:13 | sexpbot | => ((0 0)) |
| 23:13 | chouser | -> (partition 2 2 [0 0] [1 2 3 4 5]) |
| 23:13 | sexpbot | => ((1 2) (3 4) (5 0)) |
| 23:14 | chouser | -> (partition-all 2 [1 2 3 4 5]) |
| 23:14 | sexpbot | => ((1 2) (3 4) (5)) |
| 23:14 | chouser | there you go. sorry for the noise. |
| 23:14 | Raynes | chouser: You're my hero. |
| 23:22 | technomancy | slyrus: you can use checkout dependencies for the situation youv'e described |
| 23:23 | technomancy | slyrus: put a symlink from the dependency into the "checkouts" directory in the other project and it will be put on the classpath |
| 23:23 | technomancy | no need for the lein install/lein deps dance |
| 23:24 | technomancy | it's mentioned in the faq in the readme |
| 23:30 | slyrus | oh, ok. thanks technomancy! |
| 23:32 | slyrus | technomancy: what does "symlink some other projects into it" mean? |
| 23:33 | slyrus | other projects.clj or their enclosing directories? |
| 23:33 | slyrus | my-project.lng, or similar, would have made more since, IYAM, which you didn't :) |
| 23:36 | drewr | slyrus: C-h f toggle-uniquify-buffer-names RET |
| 23:37 | slyrus | bah... i still hate having multiple files with the same name. but, then again, it's probably just because i'm used to my-project.asd files |
| 23:43 | Bahman | Hi all! |
| 23:48 | cais2002 | hi Bahman |
| 23:48 | Bahman | Hi cais2002! |