2010-07-25
| 00:19 | Bahman | Hi all! |
| 00:59 | rdsr | while constructing an uberjar with lein, why does lein do a cleanup first, could this also be the reason why my uberjar does contain any of my dependencies |
| 00:59 | rdsr | s/does/doesn't/ |
| 00:59 | sexpbot | while constructing an uberjar with lein, why doesn't lein do a cleanup first, could this also be the reason why my uberjar doesn't contain any of my dependencies |
| 01:01 | rdsr | crap, substitution fail |
| 01:01 | rdsr | well the first one is "does" and the next one is "doesn't" |
| 01:03 | technomancy | it does a cleanup followed by a compile, which will force deps to be fetched |
| 01:04 | technomancy | I mean, it should |
| 01:11 | rdsr | in my case my standalone jar just contains my files |
| 01:12 | technomancy | rdsr: does an explicit call to deps before calling uberjar fix it? |
| 01:12 | technomancy | rdsr: anyway, if you have a simple repro case please create an issue |
| 01:13 | rdsr | nope, I tried that |
| 01:13 | rdsr | ok I will do that, thanks |
| 01:26 | rubydiamond | hi guys.. |
| 01:26 | rubydiamond | clj script/run.clj |
| 01:26 | rubydiamond | Exception in thread "main" java.io.FileNotFoundException: Could not locate ring/adapter/jetty__init.class or ring/adapter/jetty.clj on classpath: (run.clj:0) |
| 01:26 | rubydiamond | at clojure.lang.Compiler.eval(Compiler.java:4658) |
| 01:26 | rubydiamond | I am going thru this http://mmcgrana.github.com/2010/07/develop-deploy-clojure-web-applications.html |
| 01:28 | seancron | Hi everyone. Does anyone know how can I do (while swing-window-is-open ...) in clojure? |
| 01:29 | rdsr | rubydiamond: ring.jetty.adaptor should be on your classpath |
| 01:29 | rubydiamond | rdsr: but that tutorial is not mentioning it.. |
| 01:29 | rubydiamond | rdsr: is there any other command I should try.. may be lein specific |
| 01:29 | rdsr | I see that the tutorial is using lein |
| 01:30 | technomancy | rubydiamond: everyone has their own definition of the "clj" script. it appears yours differs from the one used by the author of the tutorial |
| 01:30 | rdsr | is clj your custom script |
| 01:30 | rubydiamond | rdsr: nope.. I have installed clojure.. |
| 01:30 | rubydiamond | it's coming with it |
| 01:30 | rubydiamond | technomancy: I have installed it with homebrew |
| 01:31 | technomancy | rubydiamond: clojure doesn't come with a shell script |
| 01:31 | seancron | rubydiamond: check the version of clojure and clojure-contrib in your project.clj file. Is it 1.2.0-beta1? |
| 01:31 | rubydiamond | technomancy: there are 18 jars in lib folder and i don't want to manually set classpath for each .. will lein help me to run it |
| 01:32 | technomancy | though whoever repackaged it for homebrew may have added one |
| 01:32 | technomancy | sure |
| 01:32 | technomancy | but the project has to be set up for it. the lein-run plugin might help though |
| 01:35 | rubydiamond | is installing the lein-run plugin |
| 01:36 | rubydiamond | technomancy: it helped ... but another error looks like in tutorial |
| 01:36 | rubydiamond | lein run script/run.clj |
| 01:36 | rubydiamond | [null] Exception in thread "main" java.lang.Exception: Unable to resolve symbol: a in this context (core.clj:17) |
| 01:37 | rubydiamond | https://gist.github.com/fc22629ac2fb6f30e144 here is code |
| 01:37 | rubydiamond | I don't see any symbol 'a' there |
| 01:40 | seancron | rubydiamond: Try cloning the example from the tutorial and see if you can get that working http://github.com/mmcgrana/adder |
| 01:43 | rubydiamond | seancorfield: ok |
| 01:43 | rubydiamond | _seancron: ok |
| 01:48 | rubydiamond | _seancron: that cloned rep worked... so looks like a bug in tutorial.. |
| 01:48 | rubydiamond | :) |
| 02:11 | seancron | rubydiamond: Glad to hear that it worked for you |
| 02:11 | rubydiamond | seancron: clone worked .. but if you follow tutorial till clj run script.. it doesn't work |
| 02:19 | rubydiamond | https://gist.github.com/9462c30f0b86bed809d8 technomancy get this error for lein repl |
| 02:19 | rubydiamond | seancron: if you know more |
| 02:27 | seancron | rubydiamond: Maybe take a look at the clj script that was linked to at the beginning of the tutorial? http://mmcgrana.github.com/2010/03/clojure-setup.html |
| 02:28 | seancron | rubydiamond: I'm going to bed though. Good luck. |
| 02:34 | rubydiamond | seancron_: thanks |
| 02:48 | Derander | rubydiamond: how did you install lein-run? |
| 02:49 | rubydiamond | Derander: adding dependency for it |
| 02:49 | Derander | I did that, but "lein run" in the project root says undefined task lein, after I've run lein deps and it appeared to have installed |
| 02:56 | rubydiamond | Derander: let me help you |
| 02:57 | rubydiamond | Derander: add "[lein-run "1.0.0-SNAPSHOT"]" in your project.clj as dependency.. |
| 02:57 | Derander | done |
| 03:01 | slyrus_ | surely an equivalent to this is built in somewhere: (defn position [coll x] (some (fn [[a b]] (when (= b x) a)) (indexed coll))) |
| 03:03 | Derander | rubydiamond: I am failing at the next step. lein reports that it has installed the dependency. lein run does not work, however. |
| 03:05 | Chousuke | slyrus_: maybe in contrib, but not in core. |
| 03:13 | slyrus_ | yay: (map clojure.pprint/pprint (map #(vector % (graph-distance-matrix %)) (connected-components q10))) works. now i can go to bed. |
| 03:16 | rubydiamond | Derander: hmm |
| 03:16 | rubydiamond | is it the same proj |
| 03:16 | Derander | rubydiamond: I got it figured out -- had to add it as a dev-dependency |
| 03:16 | Derander | for some reason |
| 03:16 | Derander | I am not certain what the difference between the two is, but it worked |
| 03:16 | rubydiamond | Derander: hmm.. ok |
| 04:28 | rubydiamond | guys.. if I run a clojure factorial program for number 100 |
| 04:28 | rubydiamond | does it mean .. it's using mutiple cores while processing it |
| 04:37 | gregh | I suppose that depends on how you've written your program |
| 04:52 | rubydiamond | gregh: okay.. |
| 04:52 | rubydiamond | also I am getting error while loading compojure from command line |
| 04:52 | rubydiamond | http://yfrog.com/f/jy2dvp/ |
| 04:54 | rubydiamond | anybody there |
| 05:00 | Chousuke | Is your classpath properly configured? |
| 05:00 | Chousuke | also unless you're using an old version of compojure, you'll need to require compojure.core instead |
| 05:00 | Chousuke | the namespace was renamed because single-segment namespaces cause problems. |
| 05:12 | rubydiamond | Chousuke: hmm |
| 05:13 | rubydiamond | Chousuke: I am running lein swank |
| 05:13 | rubydiamond | and I have compojure and clojureql as deps in it |
| 05:14 | rubydiamond | Chousuke: somehow (use 'compojure.core) worked |
| 05:15 | rubydiamond | but not able to use clojureql |
| 05:15 | rubydiamond | (use 'clojureql) |
| 05:15 | bpsm | i've added patches for clojure #413, #410, #408, #277 if anyone's awake an bored and wants to look at them. |
| 05:16 | rubydiamond | bpsm: okay.. I hope.. I can learn clojure fast and I understand your patches so that I can take a look at them |
| 05:16 | rubydiamond | bpsm: hey.. (use 'clojureql) not working for me |
| 05:17 | bpsm | not working, in what sense? exception? |
| 05:17 | bpsm | rubydiamond: not working, in what sense? exception? |
| 05:18 | rubydiamond | bpsm: I have added it in project.clj as deps [org.clojars.snuxoll/clojureql "1.0.0"] |
| 05:18 | rubydiamond | using lein |
| 05:18 | rubydiamond | now trying to use those using REPL .. swank clojure |
| 05:18 | rubydiamond | (use 'compojure.core) |
| 05:18 | Chousuke | rubydiamond: probably the namespace is wrong again |
| 05:18 | rubydiamond | that worked.. |
| 05:18 | Chousuke | right |
| 05:18 | rubydiamond | but not clojureql |
| 05:19 | rubydiamond | Chousuke: how do I know what to use |
| 05:19 | Chousuke | rubydiamond: you read the documentation for the library to see what namespaces there are |
| 05:19 | Chousuke | libraryname.core is a common convention (because clojure uses it) |
| 05:19 | rubydiamond | Chousuke: hmm |
| 05:19 | Chousuke | for the main namespace, that is |
| 05:19 | rubydiamond | Chousuke: .core seems to be not working |
| 05:19 | Chousuke | there are often others too. |
| 05:22 | Chousuke | rubydiamond: the namespace is dk.bestinclass.clojureql |
| 05:22 | Chousuke | rubydiamond: http://gitorious.org/clojureql/pages/Home#Documentation |
| 05:22 | rubydiamond | hmm? |
| 05:22 | rubydiamond | let me try that |
| 05:22 | rubydiamond | oh yeah .. it worked.. |
| 05:22 | Chousuke | rubydiamond: clojure libraries contain namespaces, and you load those with use or require (prefer require; use pollutes your namespace) |
| 05:23 | Chousuke | so to start using a library you need to figure out what namespace you want to load. |
| 05:23 | rubydiamond | Chousuke: hmm |
| 05:23 | rubydiamond | Chousuke: thanks very much.. trying out http://vimeo.com/8356990 |
| 05:24 | Chousuke | hmm |
| 05:24 | Chousuke | that video is probably outdated |
| 05:24 | rubydiamond | Chousuke: yeah |
| 05:24 | Chousuke | so don't be too confused if some more things don't work :) |
| 05:24 | rubydiamond | btw do you know where lein copies jars |
| 05:24 | rubydiamond | Chousuke: right |
| 05:24 | Chousuke | in the maven repo |
| 05:25 | Chousuke | ~/.m2 on unixoids :P |
| 05:25 | clojurebot | It's greek to me. |
| 05:26 | rubydiamond | Chousuke: looks like now I am stuck at open-global |
| 05:26 | rubydiamond | open-global is not available for my clojure |
| 05:27 | Chousuke | it's probably a compojure or clojureql function |
| 05:27 | Chousuke | that has been either renamed or moved to some other namespace |
| 05:27 | rubydiamond | Chousuke: :( |
| 05:28 | Chousuke | rubydiamond: here's a more uptodate compojure tutorial http://mmcgrana.github.com/2010/07/develop-deploy-clojure-web-applications.html |
| 05:29 | Chousuke | no emacs though, but the tutorial uses lein too so you can just use lein swank |
| 05:29 | rubydiamond | Chousuke: yeah I have tried that today morning.. |
| 06:41 | rubydiamond | isn't it wrong http://sicpinclojure.com/?q=print/book/export/html/16 |
| 06:41 | rubydiamond | define is not defined in clojure.. |
| 06:42 | fyuryu | rubydiamond: yes, seems like a mistake |
| 06:43 | rubydiamond | fyuryu: right.. |
| 06:52 | Nikelandjelo | rubydiamond: Isn't it about scheme? |
| 06:53 | rubydiamond | Nikelandjelo: it's sicp in clojure |
| 06:53 | rubydiamond | so the syntax should be in clojure.. as I undestand |
| 06:55 | Nikelandjelo | rubydiamond: Actually I don't see any example of clojure syntax in this site. Weird... |
| 06:56 | fyuryu | rubydiamond: http://sicpinclojure.com/?q=sicp/1-1-2-naming-and-environment#comment-12 |
| 06:56 | rubydiamond | lol |
| 06:57 | fyuryu | seems like a work in progress |
| 07:02 | Raynes | It's definitely a work in progress. |
| 07:02 | Raynes | I'm not sure how much *progress* is actually being made though. |
| 07:02 | Raynes | Everything looks the same as it did about a year ago. |
| 07:03 | rubydiamond | hope I can contribute to it in future |
| 07:03 | rubydiamond | I have recently started reading SCIP a |
| 07:03 | rubydiamond | nd learnig clojure too |
| 07:38 | Raynes | chouser: ping |
| 10:02 | jli | hm, strange. I'm using a fixed thread pool executor to handle all my tasks, which all just commutatively add stuff to a set. but it seems like I only see actual concurrency when I have (println @ref) in my task function |
| 10:02 | jli | (cpu% goes over 100%, I see stuff printed at the same time) |
| 10:03 | jli | when I remove the println, I see everything printed all at once (my "getting future" and "thread pool shutting down" messages), and the code is capped at 100% |
| 10:03 | jli | the answer is still correct, but not sure what's gong on |
| 10:04 | jli | going |
| 10:05 | Raynes | The fact that there isn't a Clojure openid library yet makes a happy Raynes a sad Raynes. |
| 10:10 | raek | </3 |
| 10:10 | raek | I would want one too |
| 10:11 | Raynes | raek: If I can grok the spec, I'm considering writing one. |
| 10:12 | Raynes | raek: The Java openID libraries make my eyes bleed. |
| 10:15 | raek | OpenId4Java? |
| 10:15 | Raynes | raek: I don't read Java very well. |
| 10:15 | raek | it woulde be nice to build the clojure library on another working library |
| 10:15 | Raynes | I don't think I'd be able to do that. |
| 10:17 | raek | AFAIK, there are two versions of OpenID in use |
| 10:18 | Raynes | http://code.google.com/p/openid4java/wiki/SampleConsumer |
| 10:18 | raek | maybe I'l check out OpenId4Java later this evening |
| 10:19 | Raynes | I'm not familiar with this httpservlet nonsense. |
| 10:19 | raek | that example shouldn't be too hard to port to clojure |
| 10:19 | raek | maybe we could use some of clojure |
| 10:19 | raek | 's web frameworks for that |
| 10:20 | Raynes | Good luck with that. |
| 10:20 | raek | ring (and thus compojure) is servlet-based |
| 10:20 | raek | I'll invsetigate it it's worth the effort |
| 10:20 | jli | okay, I think it's because I'm concat'ing onto my result ref, and concat is lazy |
| 10:20 | jli | does that make any sense? |
| 10:22 | raek | well, lazy sequences (concat is one of them) and side-effects doesn't play very well together |
| 10:23 | raek | what do you mean with "concat |
| 10:23 | raek | 'ing onty my result ref" |
| 10:23 | raek | onto the contents of the ref?? |
| 10:24 | jli | I have my reference to a set. I have a thread pool. the tasks that I run generate collections. I want to collect all the collections, so I concat each one to the set in a dosync |
| 10:24 | jli | maybe I should be using pcalls, or something? |
| 10:24 | jli | oh, I should use doseq to force it, right? |
| 10:25 | dnolen_ | jli: doall |
| 10:25 | raek | doall forces a lazy sequence |
| 10:25 | raek | doseq is just (dorun (for ...)) |
| 10:26 | jli | nice! that was it. thanks dnolen_, raek. |
| 10:28 | dnolen_ | jli: concat will convert your PersistentHashSet into a LazySequence |
| 10:28 | dnolen_ | ,(reduce conj #{} [1 2 3 4]) |
| 10:28 | clojurebot | #{1 2 3 4} |
| 10:29 | Raynes | -> (into #{} [1 2 3 4]) |
| 10:29 | sexpbot | => #{1 2 3 4} |
| 10:32 | dnolen_ | Raynes: yeah into is better |
| 10:33 | jli | (into current-ref new-data), yay |
| 10:51 | otfrom | Is anyone about who is familiar with pallet? |
| 11:15 | slyrus_ | is there a built-in function to convert a java 2d array to a vector of vectors? |
| 11:16 | slyrus_ | (vec (map vec (vec ...))) ? |
| 12:38 | notsonerdysunny | is adding an additional argument the only way to simulate return-type polymorphism ... or is there a better way? |
| 12:41 | raek | the polymorphism mechanisms provided by clojure only does dispatch based on the arguments |
| 12:42 | notsonerdysunny | yea I know .. that is why I said "simulate return-type polymorphism" .. :) .. but I see what you are saying .. |
| 12:42 | raek | notsonerdysunny: you want to dispatch differently based on what type the function is expected to return? |
| 12:43 | notsonerdysunny | raek: yes |
| 12:43 | raek | I guess the called would need tell the function what it want it to return |
| 12:43 | daaku | i'm a defmacro n00b, and can't quite get why this doesn't work: http://gist.github.com/489676 or how to debug what the hell is going on :) -- it's a 2 line macro which involves calling another macro |
| 12:43 | notsonerdysunny | so the function would be lazy .. probably created by application of partial |
| 12:44 | raek | daaku: have you tried using macroexpand-1 ? |
| 12:44 | raek | you can use that to see what the macro expands to |
| 12:44 | lozh | You've missed the ` off the start of the macro form I think |
| 12:44 | raek | ,(macroexpand-1 '(and a b)) |
| 12:44 | clojurebot | (clojure.core/let [and__3464__auto__ a] (if and__3464__auto__ (clojure.core/and b) and__3464__auto__)) |
| 12:45 | daaku | cool, let me try those things |
| 12:45 | raek | the asgument you pass to it should be the code, and since macroexpand-1 is a function it needs to be quoted so that it isn't evaluated by clojure first |
| 12:45 | clojurebot | clojure-stub is http://github.com/nakkaya/clojure-stub/tree/master |
| 12:47 | raek | daaku: it often helps if you write a sample input and the the code you want that to become |
| 12:47 | raek | in the simple cases, it's often just a matter of putting everything in a syntax-quote (`) and putting unquotes at the right places |
| 12:48 | raek | also, you should not (except under special circumstances) need to resort to ~' |
| 12:50 | daaku | raek: cool, thanks for the info -- i've been trying different things to see how it plays |
| 12:50 | daaku | i added sample input and output as you suggested: http://gist.github.com/489676 |
| 12:50 | daaku | i think what makes this trickier is that inside the macro i'm using another macro |
| 12:51 | raek | macros are simply functions from code to code |
| 12:51 | daaku | the (select ...) is a macro |
| 12:51 | raek | if the macro expansion contains a macro, that will be expanded when the compiler gets to it |
| 12:51 | raek | but that's after you macro is done with the code |
| 12:53 | daaku | does the compiler to macroexpand or just the first level? i think what i'm running into is that i want the compiler to not expand the (select ..) macro at load time, but don't quite have that figured out |
| 12:53 | raek | that would be (defmacro entity-exists [kind conditions] `(= 1 (count (:result (select-batch (where ~kind (~conditions)) 1))))) |
| 12:54 | raek | if the compiler sees a macro, it does the expansion |
| 12:54 | daaku | raek: nice. that works |
| 12:54 | daaku | raek: now to understand why :) |
| 12:54 | raek | then, it continues with the new code |
| 12:54 | raek | just like if you had typed that instead |
| 12:55 | daaku | it's like a really smart s/macro-call/expanded/ before the compilation |
| 12:55 | daaku | or as part of the compilation rather? |
| 12:56 | raek | it's done somewher in the "compler parts" of clojure... that all i know. :) |
| 12:58 | raek | also, ` is just a convenience feature so one does not have to make tons of nested (list ...) calls to build the new code |
| 12:58 | raek | the code outside the syntax quote is executed during expand-time |
| 12:59 | daaku | raek: yeah, that was what i didn't get |
| 12:59 | daaku | i thought everything inside a defmacro is part of expand-time |
| 12:59 | daaku | but now that seems obviously limiting :) so it all kinda makes more sense |
| 13:02 | tommg | Hi! I'm just starting to learn Clojure and I came across a tutorial that uses leiningen - I'm using snow leopard and have this installed but whenever I use the command: lein deps I always get errors saying it cannot satisfy dependencies. It looks like its downloading what it needs then errors with '7 artifacts are missing' error - is this the best place to ask? |
| 13:03 | raek | here and in #leiningen is fine, I think |
| 13:04 | ihodes | try running lein clean; lein deps |
| 13:04 | ihodes | and make sure you're not behind something like WebSense (or another firewall) that could stop access to Clojars.org. |
| 13:04 | raek | I don't have much advice, but if everything else fails, try removing the local repository |
| 13:04 | raek | ~/.m2 in unix |
| 13:05 | ihodes | truth, you can rm ~/.m2 and try again |
| 13:05 | clojurebot | it's a UNIX system! I know this! |
| 13:05 | tommg | thanks, ill try again with it - it just seems like it failing to download from the repo's but it doesn't mention this - although I have checked the sites and the paths do exist |
| 13:05 | hiredman | also likely you have the wrong names/versions of artifacts so of course those artifacts cannot be found |
| 13:07 | tommg | ahah! |
| 13:07 | tommg | removed my local repo and its working now |
| 13:07 | tommg | thanks! simple |
| 13:08 | ihodes | great! lein is a great tool. learn to love it ^^. i'd also check out cljr (http://github.com/liebke/cljr) for jus ttestign out ideas you have with a quick repl |
| 13:18 | ihodes | does anyone have any suggestions for a Java or Clojure lib that can handle drawing a hundred thousand point xy-plot in under 30 seconds? Incanter isn't able to on my c2duo |
| 13:19 | ihodes | (which uses JFreeChart) |
| 13:29 | notsonerdysunny | given a function can I find out how arguments it needs in a programmatic way ... ( i know slime does ... this ..) but otherwise ..is it possible? |
| 13:31 | rhudson | ,(:arglists (meta #'reduce)) |
| 13:31 | clojurebot | nil |
| 13:31 | rhudson | hmm, that worked in my repl |
| 13:32 | ihodes | *clojure-version* |
| 13:32 | ihodes | ,*clojure-version* |
| 13:32 | clojurebot | {:interim true, :major 1, :minor 2, :incremental 0, :qualifier "master"} |
| 13:33 | ihodes | ,(meta #'reduce) |
| 13:33 | clojurebot | {:ns #<Namespace clojure.core>, :name reduce, :file "clojure/core.clj", :line 773} |
| 13:33 | ihodes | odd... |
| 13:33 | ihodes | doesn't have as much here... |
| 13:33 | ihodes | works in my repl as well. |
| 13:34 | rhudson | -> (:arglists (meta #'reduce)) |
| 13:34 | sexpbot | => ([f coll] [f val coll]) |
| 13:35 | rhudson | -> (clojure-version) |
| 13:35 | sexpbot | => "1.2.0-beta1" |
| 13:36 | tomoj | but it doesn't really work |
| 13:36 | tomoj | (:arglists (meta #'apply)) gives ([f args* argseq]) for instance |
| 13:36 | hiredman | and only works on vars |
| 13:37 | rhudson | But it's all that's available at runtime, unless there's some IFn method that can cough up info |
| 13:38 | raek | hrm, I'm looking for a blog which recently compared the "craft of coding" to being a cook |
| 13:38 | raek | anyone seen that? |
| 13:38 | notsonerdysunny | thanks rhudson .. |
| 13:39 | raek | ,(:arglists (meta #'map)) |
| 13:39 | clojurebot | ([f coll] [f c1 c2] [f c1 c2 c3] [f c1 c2 c3 & colls]) |
| 13:39 | raek | reduce is a protocol method now |
| 13:39 | rhudson | ? |
| 13:39 | raek | those should also set the arglists metadata, imho |
| 13:40 | raek | but apparently, the doesn't now |
| 13:40 | daaku | anyone using compojure? i'm wondering how i'm supposed to get the ring request object (need to access cookies) |
| 13:40 | hiredman | rhudson: fns are just objects, so you can do various reflection things to them |
| 13:40 | rhudson | right |
| 13:40 | raek | daaku: the request map is what is handed to your handler |
| 13:42 | raek | ok, I take it back: reduce is not a procol method (internal-reduce is) |
| 13:42 | daaku | raek: isn't that for a ring handler? my compojure handlers (the ones setup using defroutes) seem to get url/form/query params |
| 13:42 | raek | the old 0.3 versions binds the request map to the magic variable 'request' |
| 13:43 | raek | in the 0.4 versions one has to provide a name for the request manually |
| 13:44 | raek | defroutes makes a ring handler |
| 13:46 | raek | hrm, I can't find the docs where I saw it |
| 13:48 | daaku | raek: i see, i'm using 0.4. i can't find docs, and i'm not smart enough to figure out what's going on looking at the source here http://github.com/weavejester/compojure/blob/master/src/compojure/core.clj |
| 13:50 | raek | (defn- compile-route [method route bindings body] |
| 13:50 | raek | (GET "toute" <bindings> <body>) |
| 13:50 | raek | *route |
| 13:50 | raek | now I found where the bindings should go |
| 13:51 | daaku | bind-request does the heavy lifting? |
| 13:51 | rhall | tomoj: thanks for your help yesterday with swank.core/break... turns out my project was polluted with some version mismatches... I cleaned it up and everything is fine now |
| 13:52 | raek | appears so |
| 13:53 | raek | try (GET "..." request <body>) |
| 13:55 | raek | as far as I can tell from the code, that should result in a (let [request <request-map>] <body>) |
| 13:55 | daaku | raek: so that worked, but i can't understand why -- i see that we get into the else clause of the if in bind-request |
| 13:55 | daaku | cool, i think i get it now |
| 13:56 | raek | I can swear I have seen some docs exaplining this |
| 13:56 | raek | but compojure seems to be a turbulent project |
| 13:57 | raek | apparently, a lot of it's functionality was accumulated into ring |
| 13:57 | raek | I've only used the 0.3 versions |
| 13:58 | daaku | i'm just getting started, and i'm not so sure i should be using compojure or ring directly |
| 13:58 | daaku | i started off with a sample app engine project, so kinda stuck with it |
| 13:59 | raek | the projects I'm aware of are: compojure, ring, moustache and aleph |
| 14:04 | daaku | aleph seemed cool. i've been using nodejs for random projects, and while the async nature gave huge perf gains, the callback model sucked. i was surprised to see aleph perform so well. |
| 14:06 | raek | I'm considering using moustache, due to it's nestable nature |
| 14:07 | raek | I want to generate the routes from another hierarchy |
| 14:07 | raek | like saying, foos has many bars, and automatically get urls like /foo/1/bar/2 |
| 14:08 | daaku | i hadn't see this -- i thought you were refering to the templating language |
| 14:08 | daaku | *seen |
| 14:12 | daaku | i think i need to try this |
| 14:12 | daaku | thanks for pointing it out raek |
| 14:40 | gfrlog | test |
| 14:42 | gfrlog | Does anybody know about why functions like split-with are implemented so inefficiently? (http://github.com/richhickey/clojure/blob/a1eff35124b923ef8539a35e7a292813ba54a0e0/src/clj/clojure/core.clj#L2212) |
| 14:42 | gfrlog | like is it a subtlety involving lazy seqs, or has nobody gotten to it yet? |
| 14:42 | gfrlog | (basically I'd be happy to do it, just wanted to make sure it wouldn't be wasted effort) |
| 14:45 | qbg | gfrlog: The results of take-while and drop-while are lazy, so they won't be evaluated until needed |
| 14:45 | gfrlog | but that implementation will still evaluate them twice, won't it? |
| 14:46 | qbg | Evaluate what twice? |
| 14:46 | gfrlog | the predicate |
| 14:47 | qbg | If you are forcing both of them all the way, yes |
| 14:47 | gfrlog | so is there no way to do it lazily without double evaluation? |
| 14:49 | qbg | You should be able to, but it wouldn't make much of a difference unless the predicate was expensive |
| 14:50 | qbg | Benchmarking would be needed to see if there would be any real gain |
| 14:50 | somnium | gfrlog: it returns two different lazy-seqs, I think you would have to do the take-while part eagerly to only evaluate the predicates once |
| 14:51 | gfrlog | off the top of my head I would think something like this: |
| 14:52 | qbg | I'm going try to write it with only one evaluation of pred |
| 14:52 | gfrlog | map the collection to pairs of the elements and the results of the function, then create a take-while and a drop-while that just examines the computed result, and return something that maps the elements back out |
| 14:52 | gfrlog | I was gonna write code, but then I thought explaining it might be clearer. Now I think I would've been better with code |
| 14:52 | gfrlog | one sec |
| 14:53 | gfrlog | '(1 [:a :b :c]) |
| 14:54 | gfrlog | ,(1 [:a :b :c]) |
| 14:54 | clojurebot | java.lang.ClassCastException: java.lang.Integer cannot be cast to clojure.lang.IFn |
| 14:54 | ihodes | other way around |
| 14:54 | gfrlog | ,([:a :b :c] 1) |
| 14:54 | clojurebot | :b |
| 14:54 | gfrlog | very good |
| 14:56 | gfrlog | okay |
| 14:56 | gfrlog | http://gist.github.com/489785 |
| 14:56 | gfrlog | (my-split-with #(> % 0) [5 1 2 3 -2 -1 0 1 2]) |
| 14:56 | gfrlog | [(5 1 2 3) (-2 -1 0 1 2)] |
| 14:57 | gfrlog | I've never contributed anything to the codebase before -- does anyone know if this sort of thing would be welcome? |
| 15:01 | qbg | Your split-with is about 3.27 times slower that the built in one for a simple predicate |
| 15:01 | somnium | gfrlog: that version does add an extra lazy seq that both close over. some cases (eg: my-split-with identity [ ... ]) might get slower too. |
| 15:02 | qbg | #(< % 0) on the coll (range -10000 10000) |
| 15:02 | somnium | gfrlog: in any case, you may want to read: |
| 15:02 | somnium | http://clojure.org/contributing |
| 15:07 | gfrlog | So I suppose this has already been thought through, and the conclusion is that for large predicates the programmer should create his own implementation? |
| 15:10 | gfrlog | ,((fn [x] (x x)) (fn [x] (x x))) |
| 15:10 | clojurebot | java.lang.StackOverflowError |
| 15:12 | raek | nice, my CA got in |
| 15:17 | raek | can somewhone here who's a member on the assembla space bump up my membership from watcher to member? |
| 15:25 | gfrlog | , (* |
| 15:25 | clojurebot | EOF while reading |
| 15:25 | gfrlog | (* |
| 15:25 | gfrlog | (+ |
| 15:25 | gfrlog | (+ (*) (*)) |
| 15:25 | gfrlog | (*)) |
| 15:25 | gfrlog | (+ |
| 15:25 | gfrlog | (* |
| 15:25 | gfrlog | (+ (*) (*)) |
| 15:25 | gfrlog | (+ |
| 15:25 | gfrlog | (+ (*) (*)) |
| 15:25 | gfrlog | (*))) |
| 15:25 | gfrlog | (*))) |
| 15:25 | gfrlog | (+ (*) (*))) |
| 15:26 | gfrlog | ,(* (* (+ (+ (*) (*)) (*)) (+ (* (+ (*) (*)) (+ (+ (*) (*)) (*))) (*))) (+ (*) (*))) |
| 15:26 | clojurebot | 42 |
| 15:28 | serp_ | ,(*) |
| 15:28 | clojurebot | 1 |
| 15:40 | chouser | cute |
| 15:41 | rhall | can anyone point me to doc on the contents of the project.clj file? |
| 15:42 | raek | rhall: http://github.com/technomancy/leiningen |
| 15:42 | raek | rhall: http://github.com/technomancy/leiningen/blob/master/sample.project.clj |
| 15:42 | raek | the second link contains more details |
| 15:43 | rhall | ok, yeah... read that... I was wondering if there was an actual manual, or if that sample contains all the options |
| 15:43 | map_reduce | hey, i've got a memory management question: I've got about 1.3M lines of data split over 32 files. I open up the files using (map #(duck-streams/read-lines %) file-list)) . Then I pass the map into seq-utils/flatten. Everything works just fine, but when I was doing some tests, I noticed that just asking for (count (flatten etc... )) my memory usage skyrockets. Does this mean i'm some how maintaing a reference |
| 15:43 | raek | there's not much more than that |
| 15:43 | rhall | (thx, tho raek... didn't mean that to sound so "short") |
| 15:43 | raek | other plugins may more keys to the defproject form, of course |
| 15:44 | rhall | yeah... what I'm really trying to work out is how to include a fairly large directory of jars |
| 15:44 | rhall | without coping them all to my lib dir |
| 15:45 | raek | now I will attempt to use leiningens new checkout dependecy feature |
| 15:45 | Drakeson | which swank-clojure is most common? technomancy's ore jochu's? |
| 15:45 | raek | technomancy's |
| 15:45 | raek | jochu was the original maintainer, but technomancy is the current, IIRC |
| 15:46 | chouser | map_reduce: probably |
| 15:47 | Drakeson | I see. could someone with commit access please fix the completion? (src/swank/commands/completion.clj and .../contrib/swank_c_p_c.clj need a very minor fix) |
| 15:47 | map_reduce | chouser: are there some basic things I should look for to debug this? |
| 15:47 | lozh | map-reduce: try running java with a reduced heap size, if it doesn't go oom it could just be a garbage collection artifact |
| 15:47 | Drakeson | technomancy: ping |
| 15:48 | map_reduce | lozh: cool thanks, i'll try that |
| 15:48 | raek | Drakeson: if you have a github accound, you can fork it, patch it, and send a pull request to technomancy |
| 15:49 | Drakeson | raek, yeah I know, I am probably being lazy. the fix is basically a typo, though |
| 15:51 | raek | he might be busy with his job, but he will take a look at your pull request eventually |
| 15:51 | Drakeson | raek: nevermind, I'll do that if I cannot reach him |
| 15:51 | raek | I made a small 2-line patch for clojure-mode once |
| 15:53 | raek | can one delegate commit acces on github? |
| 15:54 | Drakeson | raek: there is this "organization" thing, targeted at businesses that pay monthly, ... |
| 15:55 | map_reduce | lozh: thanks, i just played with the heap size and set it to a uselessly small number. The reported memory usage went down by about 40% and the thing still didn't squak |
| 15:55 | Drakeson | apparently they occasionally allow free software projects to use that, though. |
| 15:56 | raek | yeah, saw that clojure got an organization account recently |
| 15:58 | Derander | Drakeson: yeah, I think that suitably large foss can get those accounts because they figure it'll draw in more profitable users than it costs |
| 15:58 | hiredman | huh? |
| 15:59 | hiredman | I think you can just start an organization |
| 15:59 | hiredman | seajure (seattle clojure group) has one |
| 15:59 | Derander | oh, yes. I'm wrong |
| 15:59 | Derander | I was mixing private/public in my head |
| 16:01 | edbond | how to create a subclass of java class in clojure? |
| 16:02 | raek | edbond: |
| 16:02 | raek | http://clojure.github.com/clojure/clojure.core-api.html#clojure.core/proxy |
| 16:02 | hiredman | edbond: don't |
| 16:04 | raek | ifaik, proxy is for interfacing with java when the api requires subclassing |
| 16:05 | edbond | I want to subclass Folder from javax.mail but don't want to do this in java. |
| 16:05 | raek | hiredman: what are the alternatives? |
| 16:06 | raek | edbond: proxy will let you do it. |
| 16:06 | edbond | ok, thanks |
| 16:06 | Raynes | raek: He sells magic wands. |
| 16:08 | raek | inheriting from classes is not very clojure-ish, and should not be used when designing clojure code |
| 16:08 | raek | but clojure cannot fix java |
| 16:24 | daaku | is there a way to figure out what's pulling in a specific dependency in lein? |
| 16:46 | hugod | daaku: you could run "mvn dependency:tree", which would use the lein generated pom.xml |
| 16:47 | daaku | hugod: cool, it's running |
| 16:48 | daaku | nice, that worked |
| 17:07 | Bahman | Hi all! |
| 17:11 | daaku | anyone know of a good library (or plugin) for running app engine via lein repl? i have a bunch of hacks that work from various places atm, looking for something better |
| 17:12 | raek | there is a lein-gae plugin |
| 17:12 | raek | I have never used it nor app engine, though |
| 17:15 | daaku | looks like that's for setting up the stub xml and the dependencies |
| 17:31 | raek | anyone know if Apache License v2.0 is compatible with the EPL (clojure's license)? |
| 17:37 | Raynes | raek: I believe so. |
| 17:38 | raek | just investigating if openid4java can be used at all |
| 17:38 | raek | it's really sad that there are incompatible free software licenses |
| 17:39 | raek | but at least the clojure world seems to use the same license |
| 17:40 | raek | someone should make a license compability graph... |
| 17:40 | raek | that would be awesome! |
| 17:41 | raek | like this, but not only to/from GPL: http://www.gnu.org/licenses/quick-guide-gplv3-compatibility.png |
| 17:48 | quidnunc | Is there a specific reason clojure wasn't GPL licensed? |
| 17:49 | quidnunc | nvm, clojure.org/funding |
| 17:54 | raek | hrm, TagSoup has that license too, and I recall that I found out that its license should be compatible with the EPL |
| 17:57 | raek | then, what license should a openid4java wrapper library for clojure have? Apache or EPL? |
| 17:57 | raek | both? |
| 18:24 | gfrlog | ,(take 11 (iterate dec 10)) |
| 18:24 | clojurebot | (10 9 8 7 6 5 4 3 2 1 0) |
| 18:29 | seancron | Does anyone know how can I do (while swing-window-is-open ...) in clojure? |
| 18:31 | raek | I suspect you could do an event handler for the close event and update an atom, or something |
| 18:34 | seancron | I'm working with Incanter and I want it to continuously set-data until I close the table window |
| 18:39 | raek | maybe you could subclas WindowAdapter with proxy and implement windowClosing/windowClosed |
| 18:39 | raek | and add it to the frame with addWindowListner |
| 18:39 | seancron | raek: here's the code I'm using right now http://gist.github.com/489954 |
| 18:40 | raek | you'd need to get access to te JFrame |
| 18:41 | raek | I'm not an incater user (yet), so I don't know how |
| 18:43 | seancron | It looks like (view ...) returns the JFrame |
| 18:45 | raek | then you could invoke .addWindowLister on it and pass your proxy object |
| 18:59 | seancron | Is there a break statement in clojure? |
| 19:00 | gfrlog | what would it do? |
| 19:01 | seancron | Break out of an infinite loop that's updating a window |
| 19:03 | raek | no, you'll have to "not loop" instead |
| 19:04 | raek | (loop [] (when @running (do-stuff) (recur))) |
| 19:04 | raek | (here running could be an atom containing a boolean) |
| 19:06 | seancron | what does the @ do? |
| 19:06 | gfrlog | dereferences the atom |
| 19:07 | gfrlog | 'running' refers to the atom, while '@running' refers to its current value |
| 19:07 | gfrlog | (it could also be a ref or agent with the same syntax) |
| 19:08 | seancron | Thank you. Still getting the hang of clojure |
| 19:08 | gfrlog | np |
| 19:08 | raek | @foo is the same as (deref foo), if you need to lookup some details about it |
| 19:08 | gfrlog | ,(let [a (atom true)] (println a) (println @a)) |
| 19:08 | clojurebot | #<Atom@17d8325: true> true |
| 19:09 | gfrlog | (doc deref) |
| 19:09 | clojurebot | "([ref]); Also reader macro: @ref/@agent/@var/@atom/@delay/@future. Within a transaction, returns the in-transaction-value of ref, else returns the most-recently-committed value of ref. When applied to a var, agent or atom, returns its current state. When applied to a delay, forces it if not already forced. When applied to a future, will block if computation not complete" |
| 19:10 | raek | the concurrency primitives (ref/agent/var/atom) are used rather than mutating variables |
| 19:11 | raek | names introduced by let aren't even called "local variables" (instead, often just "locals") since they cannot be changed |
| 19:12 | raek | the concurrency primitives provide different solutions for doing "variable assignment" in a multithreaded environment |
| 19:14 | seancron | Okay, thanks |
| 19:45 | seancron | Is there a more idiomatic way to pause for 10 seconds than (. Thread (sleep 10000)) ? |
| 19:47 | gfrlog | there sure oughta be |
| 19:47 | raek | (Thread/sleep 10000) |
| 19:47 | Lajla | raek, does Clojure support the COMEFROM statement to create a new thread? |
| 19:48 | raek | but other than that, none what I'm aware of |
| 19:48 | raek | Lajla: never heard of that |
| 19:49 | Lajla | raek, essentially an inverted GOTO. |
| 19:49 | Lajla | If the program hits a certain line number, it automatically jumps back to the point where you put the COMEFROM statement. |
| 19:49 | Lajla | Like, if you put COMEFROM 120: |
| 19:49 | Lajla | The moment you hit line 120, execution continues at that label. |
| 19:50 | rlb | http://en.wikipedia.org/wiki/COMEFROM |
| 19:50 | Lajla | Irrespective of what is on line 120 |
| 19:50 | Lajla | So, if you have COMEFROM 120: on different palces in your program. |
| 19:50 | Lajla | You start different threads if you end up at 120. |
| 19:50 | raek | ah |
| 20:03 | Lajla | raek, but does it? |
| 20:04 | raek | Lajla: what do you think? :) |
| 20:07 | daaku | is there a url query string parsing/generating library for clojure (maybe full blown url parsing library)? |
| 20:08 | Lajla | raek, who made the bot ignore me? |
| 20:09 | aldebrn | I have an xml-derived hash map, with a key :tag which can take on multiple values such as :title, :section, and :paragraph. For each of these possibilities, I have an eponymous function. What's the right way to invoke e.g. the paragraph function when the value is :paragraph? |
| 20:09 | aldebrn | (Multiple values as in, one of a finite set of values) |
| 20:09 | raek | daaku: java.net.URL could be used |
| 20:09 | raek | ,(bean (java.net.URL. "http://clojure.org/api")) |
| 20:09 | clojurebot | java.lang.reflect.InvocationTargetException |
| 20:10 | raek | user=> ,(bean (java.net.URL. "http://clojure.org/api")) |
| 20:10 | raek | {:path "/api", :protocol "http", :authority "clojure.org", :host "clojure.org", :ref nil, :content #<HttpInputStream sun.net.www.protocol.http.HttpURLConnection$HttpInputStream@1ae90c>, :class java.net.URL, :defaultPort 80, :port -1, :query nil, :file "/api", :userInfo nil} |
| 20:10 | daaku | clojurebot fail? |
| 20:11 | daaku | oh, wow. bean huh |
| 20:11 | raek | probably the sandbox disallowing it |
| 20:12 | raek | basically, it turns the object into a read-only map, with each key representing a getter method |
| 20:13 | daaku | i'm not a java guy, so forgive me if it's obvious, but isn't that a bad thing to go call every getter function? |
| 20:13 | daaku | or are beans special in that getters are always light weight? |
| 20:14 | raek | it only calls the function when you get the value of the key |
| 20:14 | raek | it returns an object that implements APersistentMap |
| 20:14 | daaku | of course, lazy clojure |
| 20:15 | daaku | i'm ashamed of how much code i keep deleting. i had 200 lines of code this morning, now i'm down to 160. |
| 20:15 | daaku | and that's after _adding_ functionality |
| 20:15 | raek | I had the same experience when I started with clojure |
| 20:15 | raek | the more I coded, the more the code shrank |
| 20:16 | daaku | it's both gratifying and demoralizing at the same time |
| 20:17 | raek | aldebrn: if I understood your question correctly, you could use multimethods |
| 20:17 | raek | (defmulti some-fn :tag) |
| 20:18 | raek | (defmethod some-fn :title [m] code-for-when-tag-is-title) |
| 20:18 | raek | the third argument to defmulti is the dispatch function |
| 20:18 | raek | (keywords are functions too and works like this: #(get % :tag) ) |
| 20:19 | raek | the distpatch function is applied to the arguments of a some-fn call and returns a value |
| 20:19 | raek | that value is used to choose which implementation to invoke |
| 20:19 | raek | hope this helps, now I need to sleep |
| 20:20 | aldebrn | Thanks raek, I could implement just that |
| 20:20 | raek | Lajla: I have no idea |
| 20:20 | raek | good night |
| 20:20 | Lajla | raek, it was you wasn't it. |
| 20:20 | Lajla | beause you're angry that yu couldn't have me. |
| 21:44 | seancron | raek: I realize you're asleep right now, but thanks for your help. I finally my code working. It now updates the data table every 10 seconds and actually exits on closing the window. If you want to see what I ended up with, you can check it out at http://gist.github.com/489954 |
| 21:46 | Lajla | seancorfield, an I take the thanks instead then? |
| 21:47 | seancorfield | huh? oh you mean seancron |
| 21:52 | Lajla | seancorfield, I do. |
| 21:52 | Lajla | Damned autocomplete. |
| 21:52 | Lajla | Any way, you can thank and worship My Shadow too. |
| 22:13 | daaku | is there a private equivalent of def? i need to hold a private vector which will never change |
| 22:18 | gfrlog | (def #^{:private true} my-vector [:a :b :c]) |
| 22:18 | gfrlog | I think |
| 22:19 | hiredman | #^ is deprecated, use ^ |
| 22:19 | gfrlog | ooh nice |
| 22:19 | gfrlog | I always thought that looked clunky |
| 22:19 | hiredman | if you are on master I think ^:private should work |
| 22:19 | daaku | beta1? |
| 22:19 | hiredman | but maybe not for 1.2-beta? |
| 22:20 | hiredman | I think the ^:private stuff comes with the static branch, which isn't part of 1.2 |
| 22:20 | hiredman | so in 1.3 ^:foo is equiv of ^{:foo true} |
| 22:21 | daaku | hiredman: yep, didn't work in 1.2 |
| 22:21 | hiredman | :/ |
| 22:21 | daaku | the map syntax did, so good for now :) |
| 22:22 | gfrlog | also, a shortcut when using defn is defn- |
| 22:22 | gfrlog | at least in the tired worn out versions of clojure that I use |
| 22:22 | daaku | yep, i was hoping there'd be def- |
| 22:23 | daaku | hehe |
| 22:25 | daaku | how "moving" would you say the clojure core/libraries are? do things change in breaking ways often? |
| 22:25 | daaku | just trying to get a rough idea, i know this is subjective |
| 22:30 | brehaut | is there a way to create a set (eg hash-set) from a seq where it discards duplicates rather than raising an exception? |
| 22:33 | rhudson | brehaut, I think you only get exceptions with duplicates in set literals |
| 22:33 | brehaut | i had thought that |
| 22:33 | rhudson | ,(into #{} [:a :a :a :a :a :a]) |
| 22:33 | clojurebot | #{:a} |
| 22:33 | brehaut | ,(apply hash-set [:a :a :a]) |
| 22:33 | clojurebot | java.lang.IllegalArgumentException: Duplicate key: :a |
| 22:34 | brehaut | thats probably why im having a problem ;) |
| 22:34 | rhudson | but that's equivalent to (hash-set :a :a :a) |
| 22:34 | gfrlog | ,(hash-set :a :a :a) |
| 22:34 | clojurebot | java.lang.IllegalArgumentException: Duplicate key: :a |
| 22:36 | brehaut | yes it is |
| 22:36 | brehaut | but its what im doing ;) i dont hav ea literal vector to fill from |
| 22:36 | brehaut | into ftw anyway |