2010-12-12
| 03:07 | kumarshantanu | hi, is there a shorter way to write this: #(and (number? %) (pos? %)) |
| 03:38 | pppaul | write your own function and call it (positive-number?) |
| 03:39 | kumarshantanu | pppaul: that's what I just did :) |
| 03:39 | pppaul | you may be able to get away with just (pos?) no? |
| 03:39 | kumarshantanu | ,(pos? :hello) |
| 03:39 | clojurebot | java.lang.ClassCastException: clojure.lang.Keyword cannot be cast to java.lang.Number |
| 03:39 | pppaul | ewww |
| 03:39 | pppaul | oh well |
| 03:42 | kumarshantanu | is there a function to find out the index in a vector? (foo [:a :b :c]) --> [0 1 2] |
| 03:43 | kumarshantanu | not exactly like the foo above, but some variations |
| 03:43 | G0SUB | kumarshantanu: you mean given [1 2 3] and 2, the result should be 1? |
| 03:44 | kumarshantanu | G0SUB: I want to find out the indexes of positive numbers in a vector |
| 03:45 | G0SUB | kumarshantanu: there is no built-in fn for that, but can be written trivially. |
| 03:58 | G0SUB | kumarshantanu: did you write the function? |
| 03:59 | kumarshantanu | G0SUB: almost..I zipmap'ed (take elem-count (iterate 0)) and the vector |
| 04:00 | kumarshantanu | and then filter'ed to find out which keys were affected |
| 04:01 | kumarshantanu | not sure if this is the most efficient way though |
| 04:03 | kumarshantanu | s/iterate 0/iterate inc 0/ |
| 04:04 | G0SUB | kumarshantanu: you can use for. let me give you a quick example. |
| 04:05 | kumarshantanu | G0SUB: sure |
| 04:08 | G0SUB | kumarshantanu: http://paste.lisp.org/display/117598 |
| 04:12 | kumarshantanu | G0SUB: version 1 is cool (short) but it returns the indices in reverse order |
| 04:12 | kumarshantanu | version 2 maintains the order |
| 04:12 | kumarshantanu | both are cool though |
| 04:12 | G0SUB | kumarshantanu: yes. you can do a reverse on it if you care about the order. |
| 04:13 | raek | there's map-indexed in core too... |
| 04:13 | raek | ,(doc map-indexed) |
| 04:13 | clojurebot | "([f coll]); Returns a lazy sequence consisting of the result of applying f to 0 and the first item of coll, followed by applying f to 1 and the second item in coll, etc, until coll is exhausted. Thu... |
| 04:14 | G0SUB | raek: yes. that got added in 1.2. completely forgot :) |
| 04:15 | raek | too bad stuarthalloway's 'indexed' from Programming Clojure isn't there |
| 04:15 | kumarshantanu | learned today -- map-indexed and remove (I should be reading the core/docs often) |
| 04:16 | raek | (defn indexed [coll] (map vector (iterate inc 0) coll)) |
| 04:16 | kumarshantanu | G0SUB: thanks! |
| 04:16 | G0SUB | raek: yes, that's useful when the fn takes k & v |
| 04:16 | G0SUB | kumarshantanu: you are welcome. |
| 04:17 | raek | to just get the indices, consider ##(range (range 0 (count [:a :b :c]))) |
| 04:18 | sexpbot | java.lang.ClassCastException: clojure.lang.LazySeq cannot be cast to java.lang.Number |
| 04:18 | raek | &(range 0 (count [:a :b :c])) |
| 04:18 | sexpbot | ⟹ (0 1 2) |
| 04:19 | G0SUB | kumarshantanu: (defn take-idx-when [coll pred] (remove nil? (map-indexed #(when (pred %2) %1) coll))) |
| 04:19 | G0SUB | kumarshantanu: that should solve your problem. |
| 04:21 | kumarshantanu | raek: G0SUB: yup, this is cool |
| 04:22 | kumarshantanu | G0SUB: is it idiomatic to place pred after coll? |
| 04:24 | G0SUB | kumarshantanu: no. put the coll after pred. In this case, IMHO pred should come first. |
| 04:24 | kumarshantanu | G0SUB: okay |
| 04:42 | kumarshantanu | G0SUB: found a shorter version -- (keep-indexed #(if (pos? %2) %1) [-9 0 2 -7 45 3 -8]) |
| 04:42 | kumarshantanu | ,(keep-indexed #(if (pos? %2) %1) [-9 0 2 -7 45 3 -8]) |
| 04:42 | clojurebot | (2 4 5) |
| 06:20 | kumarshantanu | does println work asynchronously is 1.2? |
| 06:20 | kumarshantanu | s/is/in/ |
| 06:20 | sexpbot | <kumarshantanu> does println work asynchronously in 1.2? |
| 06:45 | auser | hola |
| 06:45 | auser | what does the '*' (star) mean after a function |
| 06:48 | kumarshantanu | auser: generally used for helper implementation fns |
| 06:49 | auser | not sure I understand... what does it mean though? |
| 06:51 | kumarshantanu | auser: assuming 'foo' is the function that is for public use, foo* is the functin that actually carries out the job and 'foo' just delegates the work to foo* |
| 06:51 | auser | ah |
| 06:51 | kumarshantanu | 'foo' calls 'foo*' to the actual work with some pre-configuration |
| 06:51 | auser | so it really could be either, but foo* used inside the namespace doesn't have to push off to the delegate |
| 06:51 | auser | cool |
| 07:02 | auser | thanks kumarshantanu |
| 07:03 | auser | I've got one more question... is there a way to "fork" off a process? |
| 07:04 | auser | I want to continuously poll for a queue to see if there's an item in it (unless I can "push" from the queue) |
| 07:05 | auser | maybe like an agent |
| 07:05 | auser | (from: http://faustus.webatu.com/clj-quick-ref.html) |
| 07:06 | kumarshantanu | auser: not a process, AFAICT |
| 07:06 | auser | (sorry, I come from the erlang world) |
| 07:06 | kumarshantanu | auser: but you can use threads, whiich is what jvm supports |
| 07:07 | kumarshantanu | look at ConcurrentLinkedQueue |
| 07:07 | auser | k |
| 07:08 | auser | So you're suggesting I fork off a thread that does the "take" |
| 07:08 | kumarshantanu | tehnically you can, but forking off a thread is not so inexpensive as BEAM |
| 07:09 | kumarshantanu | so you can use a task executor thread-pool during the runtime of the operation |
| 07:09 | auser | yeah... that's one thing I'll miss with erlang in this current project |
| 07:09 | auser | oh. okay? |
| 07:09 | kumarshantanu | a thread-pool maintains a pool of runnning threads, and returns the thread to the pool (but not killing it) |
| 07:10 | auser | oh that would work nicely I think |
| 07:11 | kumarshantanu | also, though not mentioned in the clojure docs, you may find hava.util.concurrent package very useful |
| 07:11 | kumarshantanu | s/hava/java/ |
| 07:11 | sexpbot | <kumarshantanu> also, though not mentioned in the clojure docs, you may find java.util.concurrent package very useful |
| 07:12 | kumarshantanu | http://download.oracle.com/javase/6/docs/api/java/util/concurrent/package-summary.html |
| 07:12 | auser | that's funny, I was just looking at that |
| 07:12 | auser | http://download.oracle.com/javase/6/docs/api/java/util/concurrent/ThreadPoolExecutor.html |
| 07:13 | kumarshantanu | auser: yes, and you will probably find some clojure wrappers written by people to work with the task-executor framework |
| 08:20 | fliebel | Is Clojure a JSR 223 script engine? And what about other JVM languages? I came across the term a few times, and I'm wondering if it'd be possible to create a generic REPL for all these languages. (inside an applet?) |
| 08:28 | kumarshantanu | fliebel: Did you notice this? http://code.google.com/p/clojure-jsr223/ |
| 08:28 | fliebel | kumarshantanu: No, I didn't |
| 08:28 | kumarshantanu | seems to be bringing 223 to clojure |
| 08:29 | AWizzArd | Does swank-clojure work with fresh builds of clojure.jar ? |
| 08:29 | fliebel | kumarshantanu: I did notice this: https://github.com/tinkerpop/mutant/wiki |
| 08:31 | kumarshantanu | fliebel: I noticed Mutant few days ago too...maybe useful for glue-work |
| 09:44 | Nikelandjelo | How can I disable auto-casting (+ Integer/MAX_VALUE 1) to long? I need it to convert into Integer/MIN_VALUE? |
| 09:45 | mcav | ,(unchecked-add Integer/MAX_VALUE 1) |
| 09:45 | clojurebot | -2147483648 |
| 09:46 | Nikelandjelo | Thanks |
| 09:46 | mcav | yw |
| 10:14 | Tordmor | Question: How would you generate a random sequence of digits of arbitrary size? |
| 10:17 | mcav | ,(take 5 (repeatedly #(rand-nth (range 10)))) |
| 10:17 | clojurebot | (0 8 8 9 5) |
| 10:20 | mcav | ,(take 5 (repeatedly #(rand-int 10))) |
| 10:20 | clojurebot | (6 3 0 5 8) |
| 10:27 | Tordmor | mcav: Thanks, that looks great |
| 10:27 | mcav | Tordmor: glad to help |
| 10:37 | jk__ | if i need to build a function that returns true or false, is it sufficient to have the function return non-nil or nil? |
| 10:39 | fliebel | jk__: Most of the time, yes. |
| 10:39 | jk__ | this is for calling tree-seq |
| 10:40 | jk__ | fliebel: i have functions that return a result or nil. wanted to know if there is any problem using them directly in tree-seq |
| 10:40 | jk__ | fliebel: when you say "most of the time" that makes me nervous :) |
| 10:40 | fliebel | mcav: Why use rand-nth rather than rand-int? |
| 10:41 | fliebel | jk__: The only problem is when you chekc explicitly for false? |
| 10:41 | mcav | fliebel: I wasn't thinking the first time; that's why I put rand-int right after that |
| 10:42 | fliebel | &(false? nil) |
| 10:42 | sexpbot | ⟹ false |
| 10:42 | jk__ | i see. so only false is false |
| 10:42 | jk__ | according to the predicate i mean |
| 10:42 | fliebel | but #(when nil true) |
| 10:42 | fliebel | &(when nil true) |
| 10:42 | sexpbot | ⟹ nil |
| 10:43 | jk__ | ,(doc when) |
| 10:43 | clojurebot | "([test & body]); Evaluates test. If logical true, evaluates body in an implicit do." |
| 10:43 | fliebel | So in the context of tree-seq, you should be fine I guess. |
| 10:43 | jk__ | fliebel: because if i return a nil, it's not going to be true? |
| 10:44 | jk__ | &(true nil) |
| 10:44 | sexpbot | java.lang.ClassCastException: java.lang.Boolean cannot be cast to clojure.lang.IFn |
| 10:44 | jk__ | &(true? nil) |
| 10:44 | sexpbot | ⟹ false |
| 10:44 | fliebel | jk__: Everything except false and nil are true. |
| 10:44 | jk__ | fliebel: but for (false?) only false is false |
| 10:45 | jk__ | i think a part of my brain just exploded but that works for me |
| 10:45 | fliebel | (map boolean [1 [] true false nil 0]) |
| 10:45 | fliebel | &(map boolean [1 [] true false nil 0]) |
| 10:45 | sexpbot | ⟹ (true true true false false true) |
| 10:45 | jk__ | got it |
| 10:45 | jk__ | thx! |
| 10:46 | fliebel | false? really checks of the argument IS false, not if it would be falsy. |
| 10:47 | jk__ | it's like nil is just an unknown. it's neither true nor false |
| 10:47 | jk__ | well no, that's not right either |
| 10:47 | jk__ | nm |
| 10:47 | pdk | ,(boolean nil) |
| 10:47 | clojurebot | false |
| 10:47 | pdk | nil = false |
| 10:47 | jk__ | .(boolean []) |
| 10:48 | jk__ | ,(boolean []) |
| 10:48 | clojurebot | true |
| 10:48 | jk__ | ,(false? nil) |
| 10:48 | clojurebot | false |
| 10:49 | jk__ | nil is neither (true?) nor (false?) |
| 10:49 | jk__ | ,(true? nil) |
| 10:49 | clojurebot | false |
| 10:49 | jk__ | ,(= nil false) |
| 10:49 | clojurebot | false |
| 10:50 | jk__ | ok sorry for the spam. i understand how it works. thx fliebel |
| 10:53 | raek | 'if' checks whether things are truthy or falsy |
| 10:54 | raek | false and nil are falsy, everything else is truthy |
| 10:54 | raek | 'false?' checks whether something is the value false, rather than falsy |
| 10:55 | raek | and vice versa for 'true?' |
| 10:56 | raek | use (boolean ...) when you really need the value true of false |
| 10:56 | raek | *true or false |
| 11:02 | jk__ | raek: well that's the thing. tree-seq, for example, wants a function that returns true if a node has children, for example. if i do some sort of existence check and it returns a non-boolean thing, or nil, i wanted to just use it |
| 11:02 | raek | now for something that will cause your world to fall apart ;) |
| 11:02 | raek | ,(true? (Boolean. true)) |
| 11:02 | clojurebot | false |
| 11:02 | jk__ | raek: wanted to know if i really had to transform the result to a real boolean |
| 11:02 | fliebel | raek: How mean! |
| 11:03 | raek | ("solution": no one should ever use that constructor.) |
| 11:03 | fliebel | jk__: You don't. It uses when, so nil will just work fine. ##(source tree-seq) |
| 11:03 | sexpbot | java.lang.Exception: Unable to resolve symbol: source in this context |
| 11:04 | raek | jk__: in most clojure code, you usually don't have to do that. for java interop though, you might need to do it. |
| 11:04 | jk__ | ,(true? Boolean/FALSE) |
| 11:04 | clojurebot | false |
| 11:05 | jk__ | ,(Boolean. true) |
| 11:05 | clojurebot | true |
| 11:05 | raek | ,(identical? true Boolean/TRUE) |
| 11:05 | clojurebot | true |
| 11:05 | jk__ | ,(identical? false Boolean/FALSE) |
| 11:05 | clojurebot | true |
| 11:07 | jk__ | ,(true? (Boolean. "true")) |
| 11:07 | clojurebot | false |
| 11:07 | jk__ | ok gonna do real work now |
| 11:07 | jk__ | thx guys |
| 11:07 | raek | :-) |
| 11:07 | fliebel | :) |
| 11:15 | gfrlog | ,(into {} [[1 2] [3 4 ][5 6]]) |
| 11:15 | clojurebot | {1 2, 3 4, 5 6} |
| 11:41 | gfrlog | anybody got any ideas for the easiest way to plot a simple X-Y graph from clojure? |
| 11:52 | raek | gfrlog: incanter. |
| 11:52 | gfrlog | I had just gotten into that |
| 11:52 | gfrlog | has good features |
| 11:52 | gfrlog | no telling how much documentation browsing it will take before I can take a bunch of (x,y) pairs and save a basic line graph |
| 11:54 | fliebel | gfrlog: I found plot-fn to be useful for these things. |
| 11:54 | gfrlog | fliebel: thanks for the tip |
| 11:55 | gfrlog | xy-plot also looks promising |
| 11:57 | fliebel | gfrlog: Then you'd have to change the direction of your seq I think |
| 11:59 | gfrlog | what do you mean? |
| 11:59 | gfrlog | it takes an x seq and a y seq |
| 11:59 | fliebel | xy-plot takes [x x x x x x] [y y y y y y y] rather than x y pairs |
| 12:01 | fliebel | What you could do is a plot-fn over the result of (into {} pairs) using (range (max-key pairs)) |
| 12:01 | fliebel | uhm, function-plot |
| 12:02 | gfrlog | it takes an arbitrary function? |
| 12:03 | fliebel | gfrlog: Yea, it takes a function, and invokes it for all xs and uses the result as y. |
| 12:04 | fliebel | But xy-plot is probably better. Only you need to convert the input. |
| 12:05 | gfrlog | thanks for the help; I think xy-plot will work |
| 12:07 | fliebel | hmmm http://liebke.github.com/incanter/charts-api.html#incanter.charts/add-lines |
| 12:28 | jk__ | $see cemerick |
| 12:28 | jk__ | $seen cemerick |
| 12:28 | sexpbot | cemerick was last seen joining on :#clojure-casual 3 hours and 38 minutes ago. |
| 12:28 | cemerick | jk__: what's up? |
| 12:28 | cemerick | Raynes: there's a bug for you ^^ |
| 12:28 | jk__ | cemerick: hey, you're one of the main committers on CCW right? |
| 12:29 | cemerick | I'm a commiter, yes. Not sure what constitutes "main", but whatever. |
| 12:30 | jk__ | heh... i just had a question about whether "reformat" in the editor is in the plans. like if your indentation is broken in java, i hit ctl-shift-f to reformat the whole file. that doesn't work in ccw. note that i'm not whining here, i love ccw |
| 12:31 | jk__ | that's really the only thing i miss |
| 12:31 | cemerick | jk__: I think Laurent has that in his working copy right now. Line-by-line reindentation is there -- just hit tab at the beginning of a line. |
| 12:32 | jk__ | cemerick: aha! i didn't know that about tab |
| 12:32 | ordnungswidrig | hi |
| 12:33 | jk__ | cemerick: that helps. i find that i frequently add a let or something and that skews the whole rest of a function. i was doing <end><enter><select to next line><del> |
| 12:33 | jk__ | cemerick: <tab> is certainly much quicker :D |
| 12:33 | ordnungswidrig | what's the advantage of using letfn over let? |
| 12:33 | cemerick | jk__: yeah -- it's sort of a hack at the moment, IIRC. |
| 12:34 | cemerick | I'm afraid the editor stuff itself is not my area of specialty in the codebase. |
| 12:34 | jk__ | cemerick: btw, this plugin allowed me to avoid adding another monstrous learning curve (emacs) to the already big one with clojure. good work! i always used vi in the past |
| 12:34 | cemerick | All that stuff needs to get bound to the usual commands (e.g. Cmd-I, Cmd-Shift-F, etc) |
| 12:35 | cemerick | jk__: are you using the 0.0.59 release, or the RC? |
| 12:35 | cemerick | I'm really a bit-player -- thank lpetit when you see him. :-) |
| 12:36 | jk__ | 0.0.64-STABLE01 |
| 12:36 | cemerick | er, right, that :-) |
| 12:36 | jk__ | :) i just looked |
| 12:36 | cemerick | jk__: there's an 0.2.0-RC1 available now, that has a much-improved REPL |
| 12:37 | jk__ | cemerick: thanks for the tip. i'll upgrade my plugin then. this one is working well for me |
| 12:37 | cemerick | jk__: FYI: http://groups.google.com/group/clojuredev-users/browse_frm/thread/339b0347f6d15b17 |
| 12:37 | jk__ | ahh, nice. i didn't know about that group |
| 12:37 | cemerick | it's an RC, so eclipse won't present it as an upgrade. You'd have to uninstall and reinstall. Perhaps only for the brave :-) |
| 12:38 | jk__ | cemerick: no problem. i've done that procedure hundreds of times on other plugins |
| 12:38 | cemerick | we'll probably have 1 or 2 more RCs, then release it (which will then offer it up as an upgrade) |
| 12:38 | jk__ | well... maybe dozens :) |
| 12:38 | cemerick | That's definitely the place to post questions, issues, etc. |
| 12:39 | cemerick | Laurent and I monitor it pretty regularly. |
| 12:39 | jk__ | cemerick: when i hear people talking about emacs/swank or vi/nailgun stuff, i never really hear anything that seems to be lacking from CCW. it's really a nice plugin |
| 12:40 | cemerick | It's getting there :-) |
| 12:40 | fliebel | ordnungswidrig: letfn saves you some typing, but afaik the only real advantage is that you get to have mutually recursive functions. |
| 12:41 | cemerick | It has a ways to go in some areas, but what's there is very solid. And, eclipse is a great foundation. |
| 12:41 | jk__ | cemerick: i use the maven plugin too and wrote an archetype for generating a clojure app with compojure and a couple other goodies added. your site gave me the added incentive to go full-bore with the maven and clojure plugins in eclipse |
| 12:42 | cemerick | :-) |
| 12:42 | cemerick | jk__: I suspect that Mark (@talios, maintainer of clojure-maven-plugin) might be interested in archetypes. |
| 12:43 | cemerick | One for "plain" projects and one for compojure webapps would make a lot of sense. |
| 12:44 | jk__ | cemerick: i agree. my simple archetype just includes the dependencies, config to do src-only jar and a sample clojure file. i need to do another one to create an AOT compile war file |
| 12:46 | jk__ | cemerick: i can give it to talios. i'll have to take out the repository entry for our internal artifactory :) everything goes through that internally |
| 12:46 | cemerick | right |
| 12:46 | cemerick | I keep throwing example projects out there, but never get around to an archetype |
| 12:47 | jk__ | yes, i started by cloning my sample project and renaming it, including in the .project file all the time, but it was getting too tedious. i finally broke down and whipped out the archetype so i could quickly start new small test projects |
| 12:48 | raek | ordnungswidrig: with letfn, the function can refer to itself. this can be done with let too. (letfn [(foo [...] ...)] ...) ~ (let [foo (fn foo [...] ...)] ...) |
| 12:48 | cemerick | I usually just copy a simple pom around a tweak :-) |
| 12:49 | jk__ | cemerick: yes i should have done that. but that would work well enough that i'd be too lazy to do the archetype :D |
| 12:49 | raek | (however, mutually recursive functions using let can only be done with the letfn variant) |
| 12:50 | ordnungswidrig | raek: so it's just saving some typing |
| 12:50 | raek | pretty much |
| 12:50 | ordnungswidrig | ok |
| 12:50 | raek | except for the self-referring stuff |
| 12:51 | raek | ,(let [foo (fn [] foo)] (foo)) |
| 12:51 | clojurebot | java.lang.Exception: Unable to resolve symbol: foo in this context |
| 12:51 | raek | ,(letfn [(foo [] foo)] (foo)) |
| 12:51 | clojurebot | #<sandbox$eval159$foo__160 sandbox$eval159$foo__160@32a325> |
| 12:51 | raek | stupid example, but you get the idea... :-) |
| 12:53 | raek | the only time I have used letfn is when I needed a helper function to implement a lazy sequence |
| 13:00 | Lajla | raek, |
| 13:00 | Lajla | I am the second best programmer in the world. |
| 13:00 | Lajla | Ever told you that. |
| 13:00 | Lajla | cemerick, how about my named recur |
| 13:00 | Lajla | I want it. |
| 13:00 | Lajla | If you can give this to me. |
| 13:01 | Lajla | Then I will reward you handsomely. |
| 13:01 | bmh | What's a reasonable way to compare two doubles with a desired precision? |
| 13:07 | ordnungswidrig | raek: ok, thanks for explaining |
| 13:17 | npoektop | Adamant: hi! is there a way to make slime-autodoc work with clojure? |
| 13:17 | Adamant | don't know offhand |
| 13:45 | kumarshantanu | Question: how can I convert a string to a regex? |
| 13:45 | kumarshantanu | "hello" --> #"hello" |
| 13:46 | raek | ,(re-pattern "[0-9]+") |
| 13:46 | clojurebot | #"[0-9]+" |
| 13:46 | kumarshantanu | raek: thanks! |
| 14:20 | bobo_ | raek: yeh that one is awesome |
| 14:22 | jkkramer | hey thanks :) i guess i should probably write the promised follow-up |
| 14:26 | raek | jkkramer: I'm looking throught the docstrings of loom and I came across the word "read-only". what does it mean in this case? |
| 14:26 | raek | all the graphs are immutable, right? |
| 14:27 | raek | does it mean that you cannot create modified copies of them? |
| 14:27 | jkkramer | raek: meaning the add/remove fns won't work. it's for when graphs are created on the fly (e.g. from some function) |
| 14:28 | jkkramer | raek: i.e., there's no stored data to "modify" -- just functions which generate neighbors and such on-demand |
| 14:28 | jkkramer | i should mention that loom's implementation may still change a lot. in particular, i plan on having it use deftype instead of defrecord |
| 14:29 | jkkramer | haven't had time to work on it recently |
| 14:29 | raek | if I just use the public function, that wouldn't affect me, right? |
| 14:30 | jkkramer | right, ideally the API wouldn't change much |
| 14:31 | jkkramer | i might rethink fly graphs...maybe just creating something like graph-seq, analogous to tree-seq |
| 14:31 | raek | I have only used the lib for about 10 minutes, but I really like what I have seen so far :) |
| 14:31 | jkkramer | cool, thanks. let me know if you have any comments/suggestions |
| 14:32 | raek | only one small one so far: |
| 14:32 | raek | you might want to consider to put the ubigraph integration in a separate artifact/jar |
| 14:33 | jkkramer | yeah, that might make sense |
| 14:33 | raek | I assume that the core of loom only uses a few deps |
| 14:34 | jkkramer | just clojure.core, yup |
| 14:34 | raek | and the most of the deps seemed to be used only by the ubigraph parts |
| 14:34 | raek | neat |
| 14:34 | raek | is there any autodoc up for loom? |
| 14:35 | jkkramer | not yet |
| 14:36 | raek | btw, it's truly wonderful to be able to just send a graph to GraphViz... |
| 14:37 | jkkramer | turned out to be quite easy, compared to integrating a java lib for visualization, or writing my own |
| 14:55 | fuchsd | Howdy! What's the best/most idiomatic way to re-bind *command-line-args* in a test with Lazytest? |
| 14:56 | fuchsd | I tried this: https://gist.github.com/738277 |
| 14:56 | fuchsd | and it didn't seem to work. |
| 14:56 | fuchsd | However, if I move that bindings form to within the it form, |
| 14:57 | fuchsd | the test passes and fails as it should, but the reporting isn't the best (it reports the whole bindings expression instead of just the tests) |
| 14:57 | fuchsd | Is there a better way to do this? |
| 14:59 | cemerick | Is anyone aware of a way to compile Java apps down to Javascript to be run within the browser? |
| 14:59 | cemerick | chouser, perhaps? |
| 15:00 | lpetit | GWT |
| 15:00 | lpetit | ahem |
| 15:01 | bobo_ | souns alot like GWT yes |
| 15:02 | cemerick | yeah |
| 15:02 | cemerick | What I just heard about was something Oracle-sponsored, though. |
| 15:03 | cemerick | I can't find anything about oracle being involved in such a project though… |
| 15:17 | bobo_ | can someone tell me why i should name a argument for username "s" instead of "user-name"? or "n" instead of "size" if it is the size of something? |
| 15:17 | bobo_ | or am i missunderstanding the coding standards? |
| 15:22 | ossareh | bobo_: I guess since a username is a string and size is a number. IMHO I prefer the longer variants but have found myself using the shorter ones as I spend more time hacking clojure. |
| 15:24 | bobo_ | i have tried to like the short once for a long while now. dont get it at all |
| 15:25 | ossareh | The regular short ones I use are "n" for number and "x" for some anonymous data, (map (fn [x] (do-something-with-x x)) coll) |
| 15:27 | bobo_ | and that seems to be the correct way to do it according to the standards, but would be nice to know why it is the standard. |
| 15:34 | fuchsd | ('let' or 'given' don't work in this case either) |
| 15:51 | cemerick | lpetit, bobo_: http://cemerick.com/2010/12/12/oracle-vp-we-have-a-strategy-to-run-java-inside-a-javascript-environment/ |
| 15:59 | fliebel | Why the f*ck does the RSS icon on twitter.com give my my favorites? |
| 16:00 | fliebel | oops, that was meant for my twitter feed |
| 16:05 | bobo_ | cemerick: that sounds realy weird, i dont get why they would develop such a thing |
| 16:05 | raek | ok, now I got loom hooked up with ring and moustache. now I can make graphs of clojure data available from the web! |
| 16:07 | cemerick | bobo_: Oracle can't keep ceding client-side stuff to everyone else. |
| 16:07 | cemerick | Especially if they're working on something like orto, that would be *huge* |
| 16:08 | bobo_ | orto? |
| 16:09 | cemerick | bobo_: there's a link about it in my post |
| 16:09 | bobo_ | ah! im blind =) |
| 16:09 | bobo_ | ah yes that would be huge |
| 16:12 | bobo_ | if people are crazy enough to do a flash runtime in javascript oracle could very well be building a java runtime in it. |
| 17:00 | ordnungswidrig | uh, so they want to keep java but not then jvm? |
| 17:00 | brehaut | marketting? |
| 17:01 | brehaut | they were talking in terms of desktop applications |
| 17:01 | ordnungswidrig | Uh, you mean the desktop machines that will have 12 cores in 4 years by default? |
| 17:02 | ordnungswidrig | Sounds like java compiled to javascript would be a perfect fit *g* |
| 17:02 | brehaut | my guess is that the JVM is unattractive to users as a platform for desktop apps but web apps are great. java applets are dead. whats next? try to make java run in the one platform everyone has |
| 17:03 | brehaut | i was only imply that it did seem like they were discarding the JVM wholesale |
| 17:03 | npoektop | Does lazytest run tests in a separate thread? |
| 17:03 | brehaut | only that they implied it wasnt part of desktop plan |
| 17:05 | ordnungswidrig | brehaut: you mean, desktop apps in the browser |
| 17:05 | ordnungswidrig | ? |
| 17:06 | brehaut | ordnungswidrig: im guessing and reading through the lines but yes |
| 17:07 | ordnungswidrig | brehaut: how scary, in the browser we already have a nice function language named ecmascript. who, really, will need java, here ? |
| 17:07 | brehaut | ordnungswidrig: java developers? GWT developers? |
| 17:09 | ordnungswidrig | brehaut: Shouldn't a developer be able to program in multiple languages? |
| 17:10 | brehaut | ordnungswidrig: i dont think its any more sane than you do, im just trying to suggest why they might think its a good idea |
| 17:10 | ordnungswidrig | brehaut: However, I see that there is no strongly language in the browser |
| 17:10 | ordnungswidrig | brehaut: …strongly typed... |
| 17:11 | ordnungswidrig | (There is a haskell to js compiler, IIRC) |
| 17:11 | brehaut | ordnungswidrig: im very much a polyglot myself, but im also aware of how much of a minority view that is with a lot of developers |
| 17:11 | ordnungswidrig | brehaut: then, they should do a vba to js compiler :-) |
| 17:11 | brehaut | ordnungswidrig: good god no |
| 17:11 | brehaut | ordnungswidrig: vba needs to be shot |
| 17:12 | brehaut | im still recovering from the trauma of programming vaste quanitities of VBA professionally |
| 17:12 | ordnungswidrig | brehaut: by the number of developers then yes! |
| 17:16 | brehaut | ordnungswidrig: my last gig i was working on legacy systems where basicly everything was VBA. most of our servers had several million lines of it in production |
| 17:17 | ordnungswidrig | brehaut: fascinating that such systems work |
| 17:17 | ordnungswidrig | brehaut: often without a glimpse of qa |
| 17:17 | brehaut | ordnungswidrig: aint that the truth :P |
| 17:18 | brehaut | no more of that for me |
| 17:18 | ordnungswidrig | brehaut: beside end-to-end testing done by a horde of tester running test scripts by hand an entering results into excel sheets? |
| 17:18 | brehaut | word docs rather than excel sheets for us but yeah ;) |
| 17:18 | arrummzen | How do I import clojure functions from one namespace to another so I don't have to append the other namespace/ to every function call? |
| 17:19 | brehaut | arrummzen: first, aliasing the namespace is a prefered choice |
| 17:19 | brehaut | arrummzen: otherwise 'use' |
| 17:19 | arrummzen | What do you mean by aliasing the namespace? |
| 17:19 | brehaut | (require '[clojure.xml :as 'xml]) |
| 17:19 | brehaut | oh sorry |
| 17:19 | brehaut | (require '[clojure.xml :as xml]) |
| 17:20 | brehaut | then you can do (xml/emit nodes) |
| 17:20 | brehaut | frinstance |
| 17:20 | brehaut | arrummzen: this is the recommended approach |
| 17:20 | arrummzen | hmm... require seems to only work if I have the functions I need compiled to disk? |
| 17:20 | brehaut | arrummzen: it should work for any clj file you have. its the typical way of loading code |
| 17:20 | arrummzen | Use has the same problem... |
| 17:21 | brehaut | arrummzen: you have a deeper problem i think? |
| 17:22 | brehaut | arrummzen: do you have your project anywhere public? |
| 17:23 | brehaut | arrummzen: or are you dabbling in a repl? |
| 17:23 | ordnungswidrig | arrummzen: is the source file with the used function on the classpath? |
| 17:23 | arrummzen | Never mind, it seems that it can load a .clj file as well. |
| 17:23 | brehaut | yes |
| 17:24 | arrummzen | Sorry, I'm new to this REPL stuff. I'm used to the C/Makefile style of working. |
| 17:24 | brehaut | arrummzen: no worries |
| 17:26 | brehaut | arrummzen: if you must import a function into your namespace rather than requiring the namespace, it is suggested that you restrict what you import to a specific set of symbols. |
| 17:27 | brehaut | arrummzen: eg (use '[clojure.contrib.zip-filter.xml :only [xml-> xml1-> text]) |
| 17:28 | brehaut | arrummzen: are you using a project management / 'build' tool? |
| 17:29 | arrummzen | No.... |
| 17:30 | brehaut | arrummzen: may i suggest you look into github.com/technomancy/leiningen for managing your projects |
| 17:30 | arrummzen | I'm using eclipse which manages the Java part of the build. But counterclockwise doesn't seem to support a unified build system. |
| 17:30 | brehaut | arrummzen: and its sibling project github.com/liebke/cljr |
| 17:31 | brehaut | arrummzen: sure. I've used lein for the buildy bits of a project with eclipse + ccw |
| 17:33 | arrummzen | Sounds good. I've only 2 files at this point but as the project grows I'll have to start thinking about a build system. |
| 17:34 | brehaut | arrummzen: importantly lein will maintain the dependancies for you, both fetching them and sticking them on the projects classpath. ahead of time compilation is the exception, not the rule, in clojure, so 'build' ussually just means producing an uberjar with your clj + all dependant jars. |
| 17:37 | arrummzen | brehaut: what do you mean by fetch? Does it automatically download updates? |
| 17:37 | brehaut | arrummzen: it will download any dependancies you specifiy with the version you specify |
| 17:38 | brehaut | and handle dependancy resolution for those too. It is built on the maven dependancy system |
| 17:38 | arrummzen | sounds interesting =) |
| 17:40 | gfrlog | isn't there a histogrammy function in clojure that does [1,3,3,4,5,4,6] => {1 1, 3 2, 4 2, 5 1, 6 1} ? |
| 17:41 | gfrlog | clojure.core/frequencies |
| 17:44 | hiredman | (apply merge-with + (map (fn [x] {x 1}) [1,3,3,4,5,4,6])) |
| 17:44 | hiredman | ,(apply merge-with + (map (fn [x] {x 1}) [1,3,3,4,5,4,6])) |
| 17:44 | clojurebot | {6 1, 5 1, 4 2, 3 2, 1 1} |
| 17:45 | brehaut | hiredman: cunning :) also he answered his own question with clojure.core/frequencies i think |
| 17:46 | gfrlog | yeah |
| 17:46 | gfrlog | that's cute though |
| 17:47 | hiredman | ~def frequencies |
| 17:47 | hiredman | clojurebot: you suck |
| 17:47 | clojurebot | It's greek to me. |
| 18:11 | rata_ | hi |
| 18:11 | brehaut | rata_ [temporally appropriate greeting] |
| 18:12 | rata_ | :) |
| 18:13 | raek_ | rata_: good morning (Universal Greeting Time) |
| 18:17 | Licenser | night everyone! |
| 18:27 | jk__ | arrummzen: it's pretty easy to build clojure project with the maven clojure plugin inside eclipse. if you're already using the maven plugin that is |
| 18:59 | gfrlog | does incanter have a feature for drawing a basic graph on a log scale? |
| 18:59 | gfrlog | (i.e., y-axis is log scale) |
| 19:42 | jcromartie | I made a map function that prints progress over large lazy seqs https://gist.github.com/738505 |
| 19:43 | jcromartie | oops, updated to include the missing dot-points :) |
| 19:59 | tomoj | jcromartie: try not to count the seq |
| 19:59 | tomoj | er, coll |
| 19:59 | jcromartie | hm, yeah I guess that might spoil things |
| 20:00 | jcromartie | then it's kind of hard to do |
| 20:00 | jcromartie | oh well |
| 20:00 | tomoj | I don't see why you need the progress atom |
| 20:00 | tomoj | can't you just map-indexed? |
| 20:00 | jcromartie | well you still need to know where in the collection you are at |
| 20:00 | tomoj | oh, of course |
| 20:00 | tomoj | :) |
| 20:01 | tomoj | so it only makes sense anyway for colls you can fit in memory |
| 20:01 | jcromartie | it's more for the evaluation of (f x), not the coll of x's |
| 20:01 | jcromartie | yeah |
| 20:02 | tomoj | doprogress? |
| 20:02 | tomoj | I dunno, I guess using map like that is ok |
| 20:02 | tomoj | as long as people know the thing they get back will behave weirdly |
| 20:03 | tomoj | but if they were going to use map to do it, they'd know that anyway |
| 20:16 | jcromartie | yeah |
| 20:16 | jcromartie | I have a better idea |
| 20:16 | jcromartie | how about with-progress |
| 20:16 | jcromartie | which binds *progress* and lets you use fns like (progress "Doing stuff") (progress 0.5) to show meters |
| 20:22 | laurus | Does anyone know a way in Clojure to do something similar to http://briancarper.net/blog/527/printing-a-nicely-formatted-plaintext-table-of-data-in-clojure , but with commands that would allow the selection of data based on certain criteria, say, for that example, age < 29 ? |
| 20:23 | tomoj | filter the data before passing it to the table function? |
| 20:23 | tomoj | maybe I'm not following you |
| 20:23 | laurus | tomoj, how? |
| 20:24 | tomoj | (table (filter #(< (:age %) 29) data) [:age :name]) ? |
| 20:24 | laurus | Ah, I see. |
| 20:24 | tomoj | depends on the data I guess |
| 20:30 | Darmani | user> (- 0 -9223372036854775808) |
| 20:30 | Darmani | -9223372036854775808 |
| 20:30 | Darmani | *sigh* |
| 20:31 | Darmani | How should I report this? |
| 21:07 | hippiehunter | is there a way to un-zip a collection of maps with x elements into x collections? |
| 21:07 | gfrlog | example of input and output? |
| 21:08 | brehaut | have you tried (apply map col) ? |
| 21:08 | brehaut | sorry |
| 21:09 | hippiehunter | [{:item1 "hello" :item2 "again"}] into ["hello"] and ["again"] with some way to name the resulting collections |
| 21:10 | brehaut | hippiehunter: you might need to be a bit more explicit |
| 21:11 | brehaut | hippiehunter: do you want say [{:i1 1 :i2 4} {:i1 3 :i2 5}] |
| 21:11 | hippiehunter | yes |
| 21:11 | brehaut | to become say {:i1 [1 3] :i2 [4 5]} |
| 21:11 | hippiehunter | that would certainly do the trick since i could destructure it |
| 21:12 | brehaut | i think merge-with would be a good start |
| 21:13 | brehaut | (apply merge-with + col) for example would sum those for you |
| 21:14 | brehaut | so replace + with a fun that conjs acc [i] or returns [item] |
| 21:15 | gfrlog | I think he'd still have potential problems with that |
| 21:15 | brehaut | id noodle about in a repl to work it out for you, but i just sliced mu finger open |
| 21:15 | hippiehunter | im unsure of how to pass the arguments into merge-with with considering they would be in vector form |
| 21:15 | gfrlog | for keys present in the first map and none of the ethors |
| 21:15 | brehaut | hippiehunter: apply |
| 21:15 | gfrlog | hippiehunter: I'll try to scratch something up real quick, one sec |
| 21:15 | hippiehunter | the maps are homogeneous |
| 21:16 | gfrlog | oh |
| 21:16 | gfrlog | they all have the same keys? |
| 21:16 | hippiehunter | yes |
| 21:16 | gfrlog | much easier |
| 21:16 | gfrlog | lessee... |
| 21:18 | gfrlog | (into {} (map (comp vector (apply comp coll)) (keys coll))) |
| 21:18 | gfrlog | no way that'll work on the first try |
| 21:19 | gfrlog | yeah, the (keys coll) at the end should be (keys (first coll)) |
| 21:21 | gfrlog | I could clean it up even better if I knew of a good way to take a set of keys and a fn and spit out a map |
| 21:21 | gfrlog | using (into {} and-some-pairs) is the only way I know how |
| 21:24 | hippiehunter | im a little hazy on (apply comp coll) |
| 21:25 | hippiehunter | coll doesnt contain functions, doest comp try to run things? |
| 21:25 | gfrlog | coll contains maps, right? |
| 21:25 | hippiehunter | yeah |
| 21:25 | gfrlog | maps are functions |
| 21:25 | gfrlog | in this case we want to take each key, and run it through each one of those maps/functions and get a vector of the results |
| 21:26 | gfrlog | which should be what (apply comp coll) does |
| 21:26 | gfrlog | there's a bug in there still that I'm trying to work out |
| 21:27 | gfrlog | ah hah |
| 21:27 | gfrlog | comp is not what I want :) |
| 21:27 | gfrlog | it's...the other thing |
| 21:27 | gfrlog | lemme find the cheatsheet... |
| 21:28 | gfrlog | juxt I bet |
| 21:29 | gfrlog | got it: |
| 21:29 | gfrlog | (into {} (map (juxt identity (apply juxt coll)) (keys (first coll)))) |
| 21:30 | gfrlog | so (apply juxt coll) is a function that takes a key and returns a vector of values |
| 21:30 | gfrlog | the (juxt identity ...) part will return a pair, where the first element is the key and the second element is the vector of values |
| 21:30 | gfrlog | so map creates a list of pairs, and into shoves them all in a map |
| 21:32 | hippiehunter | ,(let [coll [{:i1 1 :i2} {:i1 3 :i2 4}]] (into {} (map (juxt identity (apply juxt coll)) (keys first coll)))) |
| 21:32 | clojurebot | 3 |
| 21:33 | gfrlog | your first map looks incomplete |
| 21:33 | hippiehunter | ahh thanks |
| 21:33 | hippiehunter | (let [coll [{:i1 1 :i2 2} {:i1 3 :i2 4}]] (into {} (map (juxt identity (apply juxt coll)) (keys first coll)))) |
| 21:33 | hippiehunter | oops |
| 21:33 | gfrlog | I'm surprised that doesn't throw an error |
| 21:33 | hippiehunter | ,(let [coll [{:i1 1 :i2 2} {:i1 3 :i2 4}]] (into {} (map (juxt identity (apply juxt coll)) (keys first coll)))) |
| 21:33 | clojurebot | java.lang.IllegalArgumentException: Wrong number of args (2) passed to: core$keys |
| 21:34 | gfrlog | you want (keys (first coll)) |
| 21:34 | hippiehunter | ,(let [coll [{:i1 1 :i2 2} {:i1 3 :i2 4}]] (into {} (map (juxt identity (apply juxt coll)) (keys (first coll))))) |
| 21:34 | clojurebot | {:i1 [1 3], :i2 [2 4]} |
| 21:34 | gfrlog | woohoo |
| 21:34 | hippiehunter | awsome |
| 22:41 | Derander | I wonder if it'd be possible to implement a swank server for ruby |
| 23:03 | hippiehunter | when I do a full macro expand, it tends to produce a single line of mega doom that I would like to have nicely formatted. Is there such a feature or must I reflow by hand? |
| 23:04 | brehaut | hippiehunter clojure.contrib.pprint might contain what you want? |
| 23:04 | brehaut | hippiehunter: http://richhickey.github.com/clojure-contrib/pprint-api.html |
| 23:12 | hippiehunter | thanks that got me in the right direction |
| 23:18 | Synt_x | Quiet in here |
| 23:32 | technomancy | clojurebot: wake up, sluggard. |
| 23:32 | clojurebot | It's greek to me. |
| 23:33 | technomancy | clojurebot: well then Ξυπνήστε, οκνηρός |
| 23:33 | clojurebot | Huh? |
| 23:33 | brehaut | (inc technomancy) |
| 23:33 | sexpbot | ⟹ 1 |
| 23:33 | technomancy | ಠ_ಠ |
| 23:34 | Raynes | (inc brehaut) |
| 23:34 | sexpbot | ⟹ 2 |
| 23:35 | brehaut | wow im quickly approaching my HN karma score |
| 23:42 | Lajla | ,(+ 1 1) |
| 23:42 | clojurebot | Lajla: Excuse me? |
| 23:42 | Lajla | I'm still ignored. =( |
| 23:42 | ossareh | &(+ 1 1) |
| 23:42 | sexpbot | ⟹ 2 |
| 23:42 | ossareh | speak to bots that listen |
| 23:43 | ossareh | is clojurebot's code in github? |
| 23:44 | technomancy | clojurebot: source? |
| 23:44 | clojurebot | source is http://github.com/hiredman/clojurebot/tree/master |
| 23:44 | ossareh | ^_^ |
| 23:45 | Lajla | &(set! * +) |
| 23:45 | sexpbot | java.lang.IllegalStateException: Can't change/establish root binding of: * with set |
| 23:54 | Raynes | ossareh: sexpbot isn't a clojurebot. |
| 23:54 | ossareh | Raynes: what is the core difference? |
| 23:55 | Raynes | ossareh: They are entirely different bots designed in entirely different ways with totally different goals. |
| 23:55 | Raynes | The core difference is 'everything'. :p |
| 23:55 | ossareh | hah. |
| 23:55 | Raynes | I've never looked at the clojurebot source code outside of it's sandbox code. |
| 23:56 | Raynes | sexpbot: whatis source |
| 23:56 | sexpbot | source does not exist in my database. |
| 23:56 | Raynes | sexpbot: whatis sexpbot |
| 23:56 | sexpbot | sexpbot = the bestest sexpbot ever |
| 23:56 | Raynes | Heh, I nixed my own link. |
| 23:56 | Raynes | $learn sexpbot http://github.com/Raynes/sexpbot |
| 23:56 | sexpbot | My memory is more powerful than M-x butterfly. I wont forget it. |
| 23:58 | ossareh | Raynes: btw - saw your tweet about your mum burning things. I know how that roles, best thing that ever happened to me because I was forced to cook. Such a great skill to have! |
| 23:59 | Raynes | I have a high respect and admiration for proper chefs. If programming wasn't my thing, cooking would be. |
| 23:59 | Raynes | Too bad I suck at cooking. |