2010-05-15
| 00:06 | notostraca | For some reason I can't send messages on my other computer, so here goes: Leiningen is setting my hair on fire. |
| 00:06 | notostraca | I have gotten a variety of error messages, most recently and frequently something about ant's taskdefs |
| 00:09 | ninjudd | notostraca: what version are you using? |
| 00:09 | notostraca | 1.1.0 |
| 00:09 | notostraca | I am getting the paste set up |
| 00:11 | notostraca | http://pastebin.com/kr9J9Zme |
| 00:14 | notostraca | Should I be using the master branch? |
| 00:17 | ninjudd | notostraca: not sure. i'm getting error with lein 1.1 on my machine to |
| 00:17 | ninjudd | though they are totally different errors |
| 00:17 | notostraca | Oh I really should have mentioned that I am on windows... that was the main thing... |
| 00:17 | notostraca | I can get it to work on my mac |
| 00:18 | notostraca | but it refuses to work on win |
| 00:18 | ninjudd | cygwin? |
| 00:19 | notostraca | good idea |
| 00:19 | ninjudd | try: http://github.com/teropa/leiningen |
| 00:26 | notostraca | ninjudd: for some reason I have part of cygwin on my machine but not all of it -- probably because I upgraded to windows 7 but did not reinstall cygwin |
| 01:23 | technomancy | ninjudd: did that fork help for you? |
| 01:23 | technomancy | I can apply those changes now. I just can't do much on my own since I can't test on Windows. |
| 01:24 | ninjudd | technomancy: no, i don't use windows |
| 01:24 | technomancy | oh, sorry. must be getting my IRC conversations mixed up. |
| 01:24 | ninjudd | just saw that fork and thought it might help notostraca |
| 01:25 | notostraca | technomancy: I did see a new fork earlier |
| 01:25 | notostraca | hm, cygwin is still reinstalling |
| 02:43 | notostraca | crud |
| 02:43 | notostraca | leiningen on cygwin is having some issues |
| 02:44 | notostraca | I am using teropa's cygwin fork |
| 02:44 | notostraca | and it seems to look for \dev\null |
| 02:44 | notostraca | not /dev/null |
| 06:15 | Chousuke | http://data-sorcery.org/2010/05/14/infix-math/ somebody had to do it :P |
| 06:15 | sexpbot | "Infix mathematical notation in Incanter « Data Sorcery with Clojure" |
| 06:15 | Chousuke | I like the vector/matrix ops though. |
| 06:26 | schemer999 | following clojure seems like a full time job ;) |
| 06:26 | schemer999 | re: infix math. |
| 06:26 | schemer999 | so much great stuff. |
| 06:28 | Chousuke | disclojure.org and planet.clojure.in and the clojure pipe are helpful :P |
| 07:57 | naeu | If i have a vector, how would I split it into two vectors: one that contains the list of els that match a given conditional function and another that contains the list of els that doesn't match it |
| 07:57 | Fossi | contrib split-with or such |
| 08:01 | naeu | Fossi: that only seems to work when the vector is already sorted into the two sets, and it just needs to partition them |
| 08:02 | naeu | ooh, looks like i can use filter |
| 08:18 | chouser | (doc group-by) |
| 08:18 | clojurebot | "([f coll]); Returns a sorted map of the elements of coll keyed by the result of f on each element. The value at each key will be a vector of the corresponding elements, in the order they appeared in coll." |
| 08:19 | raph_amiard | hi there |
| 08:20 | raph_amiard | i'm searching for a simple way to interact with a telnet server in clojure |
| 08:20 | raph_amiard | anybody has interresting leads for me ? |
| 08:25 | naeu | is there a clojure equivalent of Ruby's compact? Or should I roll my own: (filter (complement nil?) sequence) |
| 08:49 | Chousuke | naeu: (remove nil? sequence) is somewhat better :) |
| 08:49 | naeu | Chousuke: indeed it is... |
| 08:49 | kotarak | Isn't there now keep? |
| 08:50 | naeu | it'll be a while before Clojure's complete suite of functions are cached in my brain :-) |
| 08:50 | naeu | it's always great to find new ones |
| 08:52 | Chousuke | oh, right, keep. |
| 08:52 | Chousuke | hmm |
| 08:52 | Chousuke | new in 1.2 though |
| 09:26 | raph_amiard | hi |
| 09:26 | raph_amiard | i'm getting a strange error when i try to launch swank-clojure-project in emacs |
| 09:27 | raph_amiard | java.lang.Exception: No such var: swank.swank/start-server (NO_SOURCE_FILE:5) |
| 09:27 | raph_amiard | just after running a 'lein deps' command |
| 09:31 | zakwilson | I'm not sure if swank-clojure-project knows where to find swank-clojure. I've been using lein swank in the shell followed by slime-connect in Emacs. |
| 09:32 | raph_amiard | ok i'm gonna try that |
| 09:32 | raph_amiard | it worked 10 seconds ago though |
| 09:32 | raph_amiard | maybe some kind of update in swank-clojure ? |
| 09:33 | zakwilson | It sounds more like a classpath issue, but I'm no expert on this. Upon finding that lein swank does what I want, I started doing that and haven't bothered to research further. |
| 09:35 | raph_amiard | lein swank doesn't exist in lein 1.1.0 right ? |
| 09:36 | raph_amiard | i didn't change my classpath or anything, i just added a dep to my project.clj file and ran lein update |
| 09:44 | zakwilson | I think the swank command is an addon for lein. Should be easy to find if you google it. |
| 09:52 | raph_amiard | zak: thank you |
| 10:42 | heaumer | hi, i'm having a problem with assoc function: http://paste.awesom.eu/lwylchtuh&hl=clojure; does anyone understand why the second call doesn't (seem) to work as the first one ? |
| 10:47 | Chousuke | heaumer: it's working just right as far as I can tell |
| 10:47 | Chousuke | heaumer: maybe you meant to assoc a key that is not in the map already? |
| 10:48 | heaumer | Chousuke: indeed :p |
| 10:58 | naeu | what's a good way of mapping one map to another? |
| 10:59 | naeu | Is there a way to do it with destructuring? |
| 11:16 | elean | why it is not possible to do #([%]) ? |
| 11:18 | Chousuke | because #(...) expands to (fn [] (...)) |
| 11:18 | Chousuke | and a vector doesn't work a a nullary function :P |
| 11:19 | elean | hm but I am able to do |
| 11:19 | elean | fn [a] [a] |
| 11:20 | Chousuke | yes. that's different. |
| 11:20 | elean | oh |
| 11:20 | Chousuke | (fn [] [a]) <- no parentheses around [a] |
| 11:20 | naeu | elean: I was looking at exactly the same thing and being surprised in exactly the same way 5 mins ago, so you're not alone :-) |
| 11:20 | mefesto | elean: i dunno the "why" but you could do: #(vector %) |
| 11:20 | Chousuke | that works because vector is a function |
| 11:21 | rhudson | ,(macroexpand-1 '#(foo %1 %2)) |
| 11:21 | clojurebot | (fn* [p1__16487 p2__16488] (foo p1__16487 p2__16488)) |
| 11:21 | mefesto | which i guess you could just dump the annon func and simple use vector instead |
| 11:21 | elean | mefesto: yep I just discovered that .. and you can even drop whole #() then |
| 11:21 | Chousuke | you can think of # turning the function call/macro call expression into a function |
| 11:21 | mefesto | hah |
| 11:21 | Chousuke | rhudson: it's not even macroexpand |
| 11:21 | Chousuke | ,'#(foo %1) |
| 11:21 | clojurebot | (fn* [p1__16492] (foo p1__16492)) |
| 11:21 | rhudson | But it can't be that it always goes to fn [] -- it obviously pays attention to the %s |
| 11:22 | Chousuke | well, yeah, I simplified the thing a bit. |
| 11:22 | rhudson | A bit too much, I opine |
| 11:22 | Chousuke | the main point is that the expression that is made into a function is not what goes in the list, but it IS the list |
| 11:23 | naeu | ooh, I love the word opine |
| 11:23 | Chousuke | so if you do #(foo bar) it's not "foo bar" being made into a function, but (foo bar) |
| 11:23 | elean | Chousuke: oh I guess I get that now :) |
| 11:24 | elean | Chousuke: I did try to write: fn [a] ([a]) and it does throw the same exception |
| 11:24 | elean | Chousuke: thx |
| 11:24 | Chousuke | yeah. |
| 11:24 | Ankou | hi, is it possible to unload something? |
| 11:24 | naeu | so, what's the idiomatic way of mapping one map to another? Is it to use reduce? |
| 11:24 | Chousuke | naeu: use into |
| 11:24 | Chousuke | (into {} (map (fn [[k v]] ...) somemap)) |
| 11:25 | naeu | Chousuke: what would you place in the body of that function? |
| 11:25 | Chousuke | or you can use contrib's fmap |
| 11:25 | naeu | that's the thing that's confusing me |
| 11:25 | Chousuke | naeu: something that returns [k v] or {k v} |
| 11:25 | elean | these are the things that annoy me when coming to a different language .. like I was angry I can't find "zip" method (as scala's zip) |
| 11:25 | Chousuke | where k and v of course don't have to be the parameters k and v :P |
| 11:26 | elean | and then I discover all I have to do is (map list a b c) |
| 11:26 | elean | and now it's just amazing |
| 11:26 | Chousuke | hmm |
| 11:27 | Chousuke | ,(conj {:foo :bar} {:a :b :c :d}) |
| 11:27 | clojurebot | {:c :d, :a :b, :foo :bar} |
| 11:27 | Chousuke | interesting. |
| 11:28 | Chousuke | naeu: so apparently you can return [k v] to have a single key/value pair in the result, or an entire map of things to conjoin into the result |
| 11:28 | naeu | oh nice |
| 11:29 | Chousuke | into probably uses reduce internally but it also uses transients so it's faster than just simply using (reduce conj ...) |
| 11:36 | defn | anyone here doing BDD with clojure? |
| 12:46 | technomancy | hugod: hey, I'm thinking about doing the 1.2.0 release of swank-clojure soon. should I wait for the autodoc/hyperdoc issues to be resolved? |
| 12:48 | AWizzArd | technomancy: don't wait please :-) |
| 13:12 | hugod | technomancy: I'm not going to get to it very soon - don't wait for me... |
| 13:31 | LauJensen | Good evening all |
| 13:32 | hamza | evening.. |
| 13:44 | LauJensen | Anybody strong in nginx rewrite rules who can spend a couple of minz with me ? |
| 13:44 | chouser | there's no function to apply a change to a thread-bound var, is there? |
| 13:46 | chouser | you always need to do like: (set! *print-length* (inc *print-length*)) |
| 13:48 | LauJensen | chouser: alter-var-root is not for thread-bound ? |
| 13:49 | Chousuke | it alters the root value |
| 13:49 | Chousuke | curiously enough, it doesn't affect thread-bound values :) |
| 13:49 | LauJensen | oh |
| 13:51 | Borkdude | do functions always run in their own thread? |
| 13:51 | Borkdude | because I am a little confused about thread-bound. does binding spawn a new thread? |
| 13:55 | notostraca | any leiningen users here know why "leiningen run" works but "lein uberjar" followed by "java -jar " and the generated jar will not work? |
| 13:55 | notostraca | I am trying to get a jar of mire |
| 13:55 | notostraca | the one from the peepcode screencast? |
| 13:56 | notostraca | the :main namespace is set to mire.server and that works for lein run |
| 13:56 | notostraca | err |
| 13:56 | notostraca | not leiningen run, lein run |
| 13:57 | notostraca | but I get a claspath exception when I run the uberjar |
| 13:58 | notostraca | Exception in thread "main" java.lang.NoClassDefFoundError: mire/server |
| 13:58 | chouser | Borkdude: functions run in the same thread that calls them. thread-bound refers to a specific feature of the Var reference type. |
| 13:59 | chouser | Anyone here going to my talk in Chicago next week? |
| 14:00 | notostraca | chouser: if I say yes, would you believe me? |
| 14:01 | notostraca | what is it about? |
| 14:01 | chouser | notostraca: I wouldn't know why not to. :-)_ |
| 14:01 | chouser | clojure's treatment of concurrency |
| 14:01 | chouser | I'll be discussing, among other things, what thread-bound vars are for. |
| 14:01 | notostraca | sounds worthwhile, but I will be in sunny southern California |
| 14:02 | chouser | ah, well. Plenty of other Clojure stuff going on in that vicinity I would imagine. |
| 14:02 | notostraca | I suppose, I haven't yet looked |
| 14:03 | chouser | Less here in the Illinois/Indiana locale. |
| 14:03 | chouser | I should try to get over to one of the Ohio meetups sometime. |
| 14:03 | notostraca | Silicon Valley is pretty far north when you account for traffic |
| 14:04 | chouser | still closert than it is to here. :-) But you're right, I tend to underestimate distances within California. |
| 14:04 | notostraca | yeah, traffic is an abysmal beast |
| 14:04 | notostraca | I once saw a garbage truck overturned on the freeway as I drove past on the other side |
| 14:05 | notostraca | the freeway on their side was a parking lot for over a mile, probably two |
| 14:05 | notostraca | and the backup was only growing... |
| 14:06 | chouser | bleh |
| 14:06 | notostraca | but other than traffic and earthquakes, southern california is pretty nice |
| 14:06 | LauJensen | You can get pretty cheap helicopters in the US though |
| 14:06 | chouser | I'm happy I drive to/through Chicago less than I used to. I hardly ever deal with traffic of any kind. |
| 14:06 | notostraca | talking about earthquakes, I have been hearing about "The Big One" coming for probably most of my life |
| 14:07 | notostraca | but so far, it has just been Northridge and that other one, and I was very young when those happened |
| 14:08 | notostraca | chouser: have you looked at Joaml's model for concurrency? |
| 14:08 | notostraca | err, JoCaml |
| 14:09 | notostraca | http://jocaml.inria.fr/ |
| 14:09 | sexpbot | "The JoCaml system" |
| 14:10 | chouser | nope. I did learn OCaml once upon a time, but I don't think I did anything concurrent with it. |
| 14:10 | notostraca | it would probably make more sense to you than it does to me |
| 14:11 | notostraca | but Join Calculus is supposed to be very powerful |
| 14:11 | notostraca | as in, 1-line change to make a parallel program a distributed parallel program |
| 14:11 | chouser | ooh, magic! |
| 14:11 | arohner | notostraca: yes, but how well does it run? |
| 14:12 | notostraca | faster than Erlang by a factor of 2 |
| 14:12 | Borkdude | hmm, did anyone answer my 'threads' question in the mean time? |
| 14:12 | arohner | notostraca: I'm sure it's possible, but I'm highly skeptical that you can convert a shared memory program to a distributed memory one, *and have it run well* in the general case |
| 14:12 | notostraca | http://eigenclass.org/hiki/fast-widefinder |
| 14:12 | sexpbot | "eigenclass - Aim for the Top! Beating the former #1 Wide Finder log analyzer with the join-calculus." |
| 14:13 | arohner | Borkdude: no, functions don't always run in their own thread. binding affects the current thread |
| 14:13 | arohner | Borkdude: vars have 1) a root value 2) an optional thread-local value |
| 14:13 | notostraca | arohner: yeah, it probably just treats memory for multiple cores as if they are multiple machines |
| 14:13 | arohner | reading var says "does the current thread have a thread-local value? if not, return the root value" |
| 14:14 | notostraca | but there is some serious behind-thepscenes magic going on |
| 14:14 | arohner | Borkdude: binding sets the thread-local value of the var, for the duration of the binding |
| 14:15 | Borkdude | arohner: am I right when I say that you can def from only one "mother" thread, program-wise? |
| 14:15 | arohner | Borkdude: no, you can def from anywhere (I'm not aware of anywhere you can't def from) |
| 14:16 | Borkdude | so if you have a thread A in which you def a, and spawn a thread, and def a again, what is the root value of a? |
| 14:16 | Borkdude | spawn a thread B, in which you def a again |
| 14:17 | arohner | Borkdude: the last def wins |
| 14:17 | arohner | though in general, you shouldn't be re-defing |
| 14:17 | Borkdude | arohner: do thread A and B each have their own root value for a? |
| 14:17 | arohner | no, there's only one root value for a given var |
| 14:18 | arohner | but they can each have their own thread local value |
| 14:18 | Borkdude | so if you re-def in B, the root value in A get's changed? |
| 14:18 | arohner | yes |
| 14:18 | Borkdude | ok |
| 14:21 | Borkdude | arohner: I try this: (do (def a 1) (future def a 2) (println a)) |
| 14:21 | Borkdude | arohner: it says it can't resolve def |
| 14:22 | arohner | Borkdude: def is a special form. It only works as (def a 1) |
| 14:23 | arohner | Borkdude: if you really want to change the value of a, use alter-var-root! |
| 14:23 | arohner | *the root value |
| 14:23 | arohner | though for most stateful changes, it would be better to make a point to an atom or ref |
| 14:23 | Borkdude | arohner: "you can def from anywhere (I'm not aware of anywhere |
| 14:23 | Borkdude | you can't def from)" |
| 14:23 | notostraca | http://jocaml.inria.fr/manual/distributed.html |
| 14:23 | sexpbot | "Distributed programming" |
| 14:23 | Chousuke | Borkdude: def is not a function |
| 14:23 | notostraca | I can't find where I got 1-line, it seems like it is just a semi-standard thing that you just customize for the occasion |
| 14:24 | Chousuke | Borkdude: and future takes an expression anyway. You need to do (future (def a 2)) |
| 14:24 | arohner | Borkdude: right. you can def in any thread. since def is not a function, (future def a 2) will break everywhere |
| 14:24 | notostraca | less than 15 lines though |
| 14:24 | Borkdude | o wait, Chousuke you're right |
| 14:24 | Borkdude | typo |
| 14:24 | Chousuke | Borkdude: but you don't want to do that. using def to overwrite old values is ugly. |
| 14:24 | arohner | a better way would be (do (def a (atom 1)) (future #(swap! a 2)) (println @a)) |
| 14:25 | Borkdude | Chousuke: I realize that, I'm just trying to find out how it works |
| 14:25 | arohner | err, take the # out of my expression |
| 14:25 | Borkdude | That example I just gave (with typo corrected) prints 1 and sometimes 2 |
| 14:25 | Borkdude | that's nice |
| 14:25 | arohner | Borkdude: right, it races on when the future finishes |
| 14:26 | arohner | sometimes the future will run before the println, sometimes not |
| 14:26 | Borkdude | arohner: so this demonstrates that re-def from another thread alters it everywhere yes |
| 14:26 | Borkdude | ? |
| 14:26 | arohner | Borkdude: yes |
| 14:27 | notostraca | has anyone tried mire, or seen the peepcode screencast on clojure? |
| 14:27 | Borkdude | ok got it |
| 14:28 | notostraca | for that matter, have any users of leiningen run into trouble with NoClassDefFoundError s when they uberjar a project? |
| 14:29 | notostraca | it seems like a difference between lein run and lein uberjar |
| 14:29 | ninjudd | notostraca: are you in the LA area? |
| 14:29 | notostraca | yep |
| 14:29 | notostraca | pasadena-region |
| 14:30 | ninjudd | cool, lancepantz and i have been talking about getting some LA meetups together |
| 14:31 | Jevgeni | hi, I am using leiningen project. When I start swank-clojure-project and then (use 'core), then it tells be that file not found. The core.clj is under src.. what do I do wrongly? |
| 14:31 | notostraca | I managed to get an independent study at Pasadena City College (I attend there now) for haXe that since has evolved into Clojure -- I think the lab would tolerate a small meetup, though I would have to ask |
| 14:32 | notostraca | Jevgeni is probably getting the same error I am |
| 14:32 | ninjudd | i think we could probably use the conference room at my work too |
| 14:32 | ninjudd | we're in west hollywood |
| 14:32 | Jevgeni | ah, sorry, false alarm. double checked the file and noticed that this is in prj.core .. |
| 14:32 | notostraca | Jevgeni: were you getting "Exception in thread "main" java.lang.NoClassDefFoundError: mire/server" |
| 14:32 | notostraca | ? |
| 14:33 | notostraca | except not mire/server |
| 14:33 | Jevgeni | notostraca> no, just FileNotFoundException |
| 14:33 | notostraca | oh, different thing then |
| 14:34 | ninjudd | notostraca: do you know other clojure people in the la area? |
| 14:36 | notostraca | ninjudd: not really, though I might be able to muster up some novices who want to learn it |
| 14:38 | notostraca | ninjudd: what days are you planning? |
| 14:40 | ninjudd | notostraca: haven't gotten that far. we're still trying to find clojure people other than us in the area |
| 14:53 | arohner | is there a way to detect that a given multimethod dispatch value will get the default? |
| 14:54 | arohner | I'd like to set a different default for certain dispatch values that don't have a specific implementation |
| 14:55 | arohner | oh, I guess I can use derive, right? |
| 14:57 | Jevgeni | I have problems with emacs/swank. I have a single file where I define 2 functions: deps which returns a number and "my-fun" which calls the reps. If I use "load file C-C C-L" then I can use "my-fun" from REPL. However, if I try to compile the my-fun separately (C-C C-C), then I get "Unable to resolve symbol: deps in this context [Thrown class java.lang.Exception]". Any hints what may be wrong? |
| 15:04 | Jevgeni | oh, strange, the problem was in the fact, than my (ns ..) contained some metadata before namespace definition. after removing it and putting the namespace on the same line with ns, it started to work.. |
| 15:05 | arohner | Jevgeni: I think swank parses the file to figure out which ns you're in, for C-c C-c |
| 15:05 | arohner | otherwise it would eval your function in the current ns of the repl |
| 15:06 | Jevgeni | arohner: most probably. shall I report it somewhere or is it just a feature? |
| 15:07 | arohner | Jevgeni: I'm not sure. technomancy is the maintainer, he's on this channel often. I'd ask him before reporting it |
| 15:39 | SynrG | join #iccm |
| 15:39 | SynrG | meh |
| 16:04 | notostraca | OK, that was the error. Mire couldn't be turned into an executable jar because it didn't gen-class in its main namespace |
| 16:04 | notostraca | so with that fixed, poof, it works |
| 16:32 | LauJensen | cool |
| 16:33 | LauJensen | :) |
| 17:04 | somnium | pointless ml-style let-in to complement incanter's infix math (maybe worth a chuckle) |
| 17:04 | somnium | http://gist.github.com/402394 |
| 18:35 | tcrayford | man tree-seq is confusing |
| 19:50 | tcrayford | cemerick: how's the work on that clojure dev environment spec going? |
| 19:52 | cemerick | tcrayford: it's hardly a real spec, just a summary / stream of consciousness |
| 19:52 | tcrayford | aye |
| 19:52 | cemerick | but yeah, it's in progress. I'll tweet it on Monday. |
| 19:53 | tcrayford | nice then |
| 19:53 | tcrayford | I've been working on some static code analysis (for fun), looking promising atm |
| 20:17 | cemerick | tcrayford: sounds good |
| 20:18 | cemerick | I took a tour through the rest of the plugins last night; pretty satisfied with my continued use of enclojure. |
| 20:18 | cemerick | counterclockwise is definitely the next best -- lots of potential there |
| 20:22 | rhudson | cemerick, did you try La Clojure (IntelliJ)? How did that compare? |
| 20:24 | cemerick | rhudson: not well, I'm afraid. The basic editor and such seem like a very good start, but I struggled and eventually failed to get a REPL going. |
| 20:24 | cemerick | I didn't thoroughly review either of them by any means -- just thrashed around for a while until I hit a hurdle tall enough I didn't want to try jumping. |
| 20:25 | cemerick | rhudson: you'd prefer an intellij environment, I presume? |
| 20:26 | rhudson | I got used to using IntellJ for Groovy development, and stuck with it for Clojure. |
| 20:26 | rhudson | When I first got into clojure, it seemed to get the most favorable mention among the IDEs |
| 20:26 | rhudson | So I wonder what I've been missing. |
| 20:26 | cemerick | rhudson: oh, so what's your impression/experience of the plugin? |
| 20:26 | rhudson | Everyone hereabouts seems to use emacs, but I'm not going back |
| 20:27 | rhudson | The editor is pretty decent. I like the highlighting of the function symbol if it can resolve it. |
| 20:27 | rhudson | And Cmd-B takes you to the declaration, even into the clojure-core.clj file. |
| 20:28 | rhudson | But it doesn't understand destructuring. I've filed a bug on that, haven't heard back yet. |
| 20:28 | cemerick | what do you mean by "function symbol"? |
| 20:29 | rhudson | f in (f a b c) |
| 20:29 | rhudson | sorry for bad terminology |
| 20:30 | rhudson | So it'll highlight f is it knows where f is declared. Except for the destructuring thing, it's pretty good about that |
| 20:30 | rhudson | [is it => if it] |
| 20:32 | cemerick | are you able to use the REPL? |
| 20:34 | rhudson | I haven't tried in some time. Mostly I want to run the code in the file I'm working on. It's good about that -- both the Run and Debug commands behave sensibly. |
| 20:36 | rhudson | Just started a REPL up. Seems to behave ok. |
| 20:41 | rhudson | Well, typing in the REPL seems to work OK. The other repl-related commands seem iffy at best. I'm starting to remember why I don't use its repl. |
| 20:52 | cemerick | rhudson: hrm, I only ever get "Clojure home path not configured correctly" |
| 20:59 | rhudson | When you set up a Project, you need to tell it you're using Clojure so it can create a Facet for that. When you do so, it asks you where to find the clojure.jar you want to use. |
| 21:03 | ninjudd | cemerick: just sent a message to clojure-dev. i couldn't reproduce the problem in NetBeans |
| 21:03 | cemerick | ninjudd: yeah, I'm composing a reply |
| 21:03 | cemerick | I really think you're playing with fire in general. :-) |
| 21:03 | cemerick | rhudson: yeah, I did that, and it said it had all the libraries it needed. Still getting the error. :-( |
| 21:04 | ninjudd | you mean with NativeClassLoader? |
| 21:04 | ninjudd | or with trying to fix this bug? |
| 21:06 | cemerick | well, I don't know enough about the matter at hand to say that there's a bug |
| 21:06 | cemerick | I'm talking more about the NCL. |
| 21:07 | ninjudd | fine, we can discuss that separately |
| 21:07 | ninjudd | it really has no bearing on this bug except that it revealed it |
| 21:08 | ninjudd | perhaps i should have started a separate thread once i found that *use-context-classloader* wasn't working |
| 21:09 | cemerick | is it not working? If you bind it to false, does clojure not use its own classloader? |
| 21:11 | ninjudd | the problem is that clojure doesn't use the context classloader when it is bound to true |
| 21:11 | ninjudd | once Compiler.LOADER is bound |
| 21:11 | cemerick | oh, I see |
| 21:12 | cemerick | you want to bind LOADER |
| 21:12 | ninjudd | no |
| 21:12 | cemerick | ha |
| 21:13 | ninjudd | LOADER gets bound no matter what |
| 21:13 | ninjudd | in the three places within Compiler that call makeClassLoader |
| 21:14 | ninjudd | any code that happens within those thread bindings though, doesn't obey *use-context-classloader* |
| 21:14 | cemerick | well, I shouldn't bother saying more unless I really go look at things. |
| 21:15 | cemerick | My presumption is that the context classloader is being used by default, insofar as our Netbeans RCP apps aren't going up in smoke. :-) |
| 21:16 | cemerick | Before the change of the default value of *use-context-classloader*, we had to bind it manually in our Java-based module bootstrap code in order to load any clojure code from other moduels. |
| 21:16 | cemerick | modules* |
| 21:16 | ninjudd | would you mind trying my fork in your setup? |
| 21:17 | tcrayford | woop, got static analysis of repetition in code working |
| 21:17 | ninjudd | or tell me how to get NetBeans to use a classloader that will break things |
| 21:18 | cemerick | tcrayford: sweetness :-) |
| 21:18 | cemerick | is that slime-only? |
| 21:18 | tcrayford | nope |
| 21:18 | tcrayford | its just a jar file |
| 21:18 | tcrayford | that runs via java -jar |
| 21:18 | cemerick | nice |
| 21:19 | tcrayford | it does analysis on symbols only atm |
| 21:19 | tcrayford | but is pretty sexy |
| 21:19 | cemerick | ninjudd: usually I'd say sure, but the build process for the apps in question isn't trivial. It'd be a couple hours to roll everything up from a custom clojure build :-( |
| 21:19 | cemerick | That's the last vestige of ant we have. |
| 21:20 | cemerick | ninjudd: I'm certain that Rich will ping back on Monday; he was @ training all last week. That'll probably be a quick yay or nay on your patches. :-) |
| 21:20 | chouser | tcrayford: what kind of static analysis? |
| 21:20 | ninjudd | any tips on how to configure NetBeans to your setup |
| 21:20 | cemerick | tcrayford: definitely pester the toolmakers about such things. |
| 21:21 | cemerick | ninjudd: You just need to create a netbeans module that wraps your build of clojure, and then create another module that depends on the clojure wrapper and loads some code. |
| 21:21 | tcrayford | chouser: it flies through your source code, looking for any AST nodes that are similar in different functions |
| 21:22 | ninjudd | cemerick: thanks, i'll play with it |
| 21:24 | tcrayford | clojure has all these nice things that makes writing tools like this *really* easy |
| 21:30 | chouser | tcrayford: oh, so it can suggest refactoring? |
| 21:30 | chouser | you're writing this in clojure so all the IDEs can borrow it, right? :-) |
| 21:31 | tcrayford | chouser: yeah |
| 21:32 | tcrayford | it just runs from a jar file atm (as mentioned above), might be a lein plugin at some point |
| 21:32 | defn | sigh...i finally start to feel really good with emacs and now i need to use vim for work |
| 21:32 | tcrayford | /me uses both vim and emacs daily |
| 21:33 | defn | dont you hit C-x and meta and stuff all the time? |
| 21:33 | tcrayford | nope |
| 21:33 | defn | smarter muscle memory than me |
| 21:33 | tcrayford | I guess my use is very split though |
| 21:34 | tcrayford | emacs for clojure, vim keybindings for everything else (ie no sexps) |
| 21:34 | defn | this isnt like casual editing in vim, it's like a full blown Rails IDE type thing |
| 21:34 | tcrayford | yeah |
| 21:35 | defn | i can hit A, i, :w, :x, etc. -- but this is heavy |
| 21:35 | tcrayford | about the same here (ish) |
| 21:35 | defn | anyway, shrug |
| 21:35 | tcrayford | rails.vim is so nice, so eh |
| 21:35 | cemerick | gawd, I'm gonna get so much hatemail on Monday :-D |
| 21:35 | defn | yeah i know i know -- they showed me how they use it in a pairing session yesterday and my jaw dropped |
| 21:35 | tcrayford | wherabouts you working? |
| 21:36 | defn | i see the value, i just kind of dislike filling my brain with vim stuff after i went to the trouble of getting emacs working |
| 21:36 | defn | Madison WI |
| 21:36 | tcrayford | (meant the company) |
| 21:36 | defn | Bendyworks |
| 21:37 | defn | small shop, 4-5 people, im not officially working there, just had a few pairing sessions so far, sort of auditioning i guess |
| 21:37 | tcrayford | about the same as the shop I'm apprenticing at over the summer then |
| 21:37 | defn | good word for -- id say im sort of an apprentice |
| 21:37 | defn | for it* |
| 21:38 | defn | they do all sorts of cool BDD + TDD + Continuous Integration stuff, of which there is very little in my area |
| 21:38 | tcrayford | aye, there's only like two-three places in the UK like that (that don't use .net/java) |
| 21:39 | tcrayford | does anybody have experience with using clojure.contrib.find-namespaces? |
| 21:40 | tcrayford | or any experience with lein's `test` implementation for that matter |
| 21:43 | defn | tcrayford: your refactoring stuff is cool as heck btw |
| 21:43 | defn | tcrayford: have you done any BDD/TDD with clojure? |
| 21:43 | chessguy | can someone explain to me how uncle bob's code at http://blog.objectmentor.com/articles/2010/05/15/clojure-prime-factors works? i'm confused |
| 21:43 | sexpbot | "Clojure Prime Factors" |
| 21:43 | defn | chessguy: more specific please |
| 21:43 | chessguy | is the [n]/[factors n candidates] thing some sort of pattern matching? |
| 21:44 | tcrayford | chessguy: will watch and tell |
| 21:44 | tcrayford | oh he didn't post the recording yet |
| 21:44 | tcrayford | chessguy: that's a function with different arity |
| 21:44 | defn | chessguy: it's just two different arities |
| 21:45 | tcrayford | so it cane take one argument (n) |
| 21:45 | tcrayford | or three arguments (factors, n, candidate) |
| 21:45 | tcrayford | now to beat that version |
| 21:45 | chessguy | oh wait |
| 21:45 | chessguy | duh, ok |
| 21:45 | chessguy | sorry |
| 21:45 | defn | no problem |
| 21:45 | chessguy | ignore me |
| 21:45 | tcrayford | nah its fine |
| 21:45 | tcrayford | you learn some |
| 21:46 | defn | i didnt know how that worked at first either |
| 21:46 | defn | i didnt know what arities were before actually |
| 21:46 | chessguy | i saw "of []" and was thinking he wasn't passing any arguments |
| 21:46 | chessguy | brain fart |
| 21:46 | tcrayford | heh |
| 21:48 | chessguy | is the number of parameters the only thing you can pattern-match that way on? |
| 21:48 | tcrayford | its not pattern matching |
| 21:48 | tcrayford | so don't think of it like that |
| 21:48 | chessguy | well, call it whatever you like |
| 21:48 | tcrayford | thinking about it closer, guess it is |
| 21:48 | defn | sort of yeah |
| 21:48 | tcrayford | yeah, you can get more using the matchjure library (which does full matching with macros and stuff) |
| 21:48 | hiredman | if you use a multimethod you can use any kind of function you want to dispatch |
| 21:48 | defn | it's more pattern matchish if you do stuff like [foo & bars] |
| 21:49 | chessguy | don't get me started on multimethods :) |
| 21:49 | defn | rodney dangerfield? is that you? |
| 21:49 | hiredman | why not? |
| 21:49 | defn | i tell ya i get no respect |
| 21:49 | defn | dont even get me started on multimethods! |
| 21:50 | chessguy | is there a link for matchjure |
| 21:50 | chessguy | google doesn't know of it |
| 21:51 | tcrayford | http://spin.atomicobject.com/2010/04/25/matchure-serious-clojure-pattern-matching |
| 21:51 | sexpbot | "Matchure: Serious Clojure Pattern Matching | Atomic Spin" |
| 21:51 | tcrayford | turns out it was matchure |
| 21:51 | defn | that's just confusing |
| 21:51 | defn | if it doesnt have a j in it, it ain't clojure! :) |
| 21:51 | chessguy | lol |
| 21:51 | defn | leininjin |
| 21:51 | tcrayford | nah the one on lein new |
| 21:52 | tcrayford | leinjure |
| 21:52 | defn | haha oh no |
| 21:52 | defn | ive always wanted to do a project called ewq |
| 21:52 | defn | in fact i like the idea in general of selecting names for projects based on keyboard patterns |
| 21:53 | tcrayford | technomancy: ping |
| 21:53 | defn | awsedr for instance |
| 22:13 | technomancy | tcrayford: pong |
| 22:13 | technomancy | defn: svn is possibly the most awkward three consecutive letters possible to type in dvorak |
| 22:17 | defn | technomancy: yeah my combos wouldnt work for dvorak |
| 22:17 | technomancy | I've heard there's an aoeu system aiming to replace CL's asdf |
| 22:19 | tcrayford | technomancy: nvm for now I think, going to have to end up writing this as a lein plugin after all |
| 22:19 | defn | sounds like a real blockbuster event. the insanely large dvorak community will no doubt turn out for that one ;) |
| 22:20 | tcrayford | looks like loading clojure files from a jar is kinda funky |
| 22:20 | chouser | bleh. this talk is dull. I've got to figure out how to up my game. |
| 22:21 | tcrayford | you giving a talk? |
| 22:29 | tcrayford | I put my code for reporting clojure AST repetition on github, but pretty sure I just found a large bug in it |
| 22:29 | tcrayford | http://github.com/tcrayford/umbrella |
| 22:29 | defn | cool name for a project |
| 22:30 | defn | tcrayford: are you gonna roll refactoring and this together into a mode? |
| 22:31 | tcrayford | defn: no |
| 22:31 | tcrayford | defn: though this will likely steal some stuff from refactoring (the stuff about bound-vars inside an ast) |
| 22:32 | tcrayford | defn: I don't have the desire to learn enough elisp to make that a mode (or several) |
| 22:33 | defn | tcrayford: you gotta recruit technomancy or something |
| 22:35 | tcrayford | not sure he's that interested in tooling like this. |
| 22:36 | tcrayford | the java IDE's will overtake emacs at some point anyway |
| 22:36 | tcrayford | *IDEs |
| 22:36 | defn | people say that but ive never been happy with eclipse or netbeans :\ |
| 22:37 | defn | i see why people say that, but i guess i dont think it's inevitable or something |
| 22:38 | tcrayford | if clojure ever gets big enough, the java IDE people can (and will) put in the work for that level of tool support |
| 22:38 | tcrayford | its pretty easy to do anyway, refactoring-mode proves that |
| 22:39 | technomancy | tcrayford: so it sounds like you ported flay? http://ruby.sadi.st/Flay.html |
| 22:39 | sexpbot | "Confessions of a Ruby Sadistsudo gem install flay" |
| 22:39 | tcrayford | not yet |
| 22:39 | tcrayford | it only works off the AST atm |
| 22:40 | tcrayford | but something like that, yeah |
| 22:40 | technomancy | slick! |
| 22:41 | tcrayford | cheers |
| 22:41 | tcrayford | fixing the rest of it so it doesn't rely on literal values as much shouldn't be too hard, given that there's code for doing that kinda stuff in refactoring-mode |
| 22:44 | tcrayford | the same stuff can probably be reworked to do flog (just have to decide on what metrics to use) |
| 22:45 | technomancy | tcrayford: I think it wouldn't be too hard to generalize clojure-test-mode's highlight-clojure-defns-based-on-info-from-swank functionality |
| 22:46 | technomancy | seems like you could get a lot of mileage out of that |
| 22:46 | tcrayford | and use that for similarity? I don't have character data available atm though |
| 22:46 | tcrayford | I guess you can highlight functions and then have the minibuffer stuff show what's similar |
| 22:46 | tcrayford | could be interesting |
| 22:50 | technomancy | yeah, just like c-t-m marks failures and lets you see the details when you ask for them |
| 22:50 | tcrayford | aye |
| 23:13 | lespea | So I'm in the process of doing the google code jams in clojure (did them in perl originally) and I'm stuck on how to do the theme-park the "right way" without it taking forever/a TON of memory. Here's my working code http://paste.lisp.org/+24M2 that has a fast way of doing it and an idiomatic one (get-income-fast and get-income) and I was wondering if anybody could help me with why the second version is so slow |
| 23:15 | tcrayford | as a tiny first off, replace the calls to apply with calls to reduce |
| 23:16 | ataggart | (set! *warn-on-reflection* true) |
| 23:16 | tcrayford | heh, I don't think that's his problem hre |
| 23:16 | tcrayford | *here |
| 23:17 | ataggart | prob not |
| 23:17 | ataggart | but I noticed no type hints even in parse-int |
| 23:17 | tcrayford | type-hints don't matter *that* much |
| 23:17 | ataggart | agreed |
| 23:17 | tcrayford | given that his his fast one is faster, and isn't hinted |
| 23:18 | lespea | for the most part, my program goes pretty fast except for the difference between get-income get-income-fast |
| 23:18 | lespea | as in get-income-fast is ~1 minute and the other one is >10 |
| 23:18 | tcrayford | lespea: do you have tests for this? |
| 23:18 | lespea | and uses twice the memory (at least) |
| 23:18 | lespea | http://code.google.com/codejam/contest/dashboard?c=433101#s=p2 |
| 23:18 | sexpbot | "Qualification Round 2010: Dashboard" |
| 23:19 | lespea | it runs correctly using either function |
| 23:19 | tcrayford | (meant clojure tests) |
| 23:19 | tcrayford | yeah |
| 23:19 | lespea | oh... no :S |
| 23:19 | lespea | haven't progressed that far in my clojure learning :( |
| 23:21 | tcrayford | can you give me some sample input for get-income? |
| 23:21 | tcrayford | like, the shortest possible you'd need to figure out it was doing the right thing |
| 23:24 | lespea | (def test-struct '(4 6 (1 4 2 1))) |
| 23:24 | lespea | (== (apply get-income test-struct) 21) |
| 23:32 | defn | lespea: there was a link the other day that was a table of clojure performance guarantees for various structures |
| 23:35 | lespea | Here is an example of the difference in timings (example from codejam) http://paste.lisp.org/+24M3 |
| 23:35 | lespea | defn: yeah my program wasn't even running until I read up on lists and saw that nth is O(n) so I switched it to a vector and suddenly it worked :D |
| 23:38 | lespea | Could the problem be that `(iterate #(nth ride-map (first %)) [0, 0])` is saving the entire list in memory? |
| 23:38 | lespea | or is it not doing that? |
| 23:40 | defn | lespea: hmmmmmm, reading |
| 23:40 | defn | and you have type hinted this? |
| 23:41 | lespea | where would i do that? (and how haha) |
| 23:41 | lespea | in the 'reduce +' ? |
| 23:42 | defn | well, do you know how the typing works in clojure for numbers? |
| 23:42 | lespea | (oh btw the + shouldn't be there in the map, I was messing with stuff and accidentally didn't delete it before I put it on paste.lisp) |
| 23:42 | lespea | defn: not really |
| 23:43 | defn | im a little foggy myself, but basically you scale up the type as needed |
| 23:43 | defn | so if you add 1230123 to 123891281283 (not a real example, just pseudo) |
| 23:43 | defn | clojure will say oh, you have a new type here, and it makes it bigger |
| 23:44 | defn | err it uses the new type |
| 23:44 | defn | im failing to explain this correctly, someone save me :) |
| 23:45 | defn | lespea: long story short if you tell clojure that the argument it receives to a given function will always be a BigNum, it doesnt have to do any of the thinking involved to make it the right type |
| 23:47 | defn | lespea: (defn foo [#^String s] [(str s "!")]) |
| 23:47 | defn | lespea: is this helping at all? :) |
| 23:47 | lespea | defn: ah, makese sense |
| 23:47 | lespea | defn: yeah |
| 23:48 | defn | lespea: so the other thing to consider, but to be very careful with are the unchecked functions |
| 23:48 | defn | unchecked-add, inc, raminder, dev, multiply, substract, divide, negate |
| 23:48 | defn | remainder* |
| 23:49 | lespea | defn: so I would do that in the reduce + ? so it knows that everything coming in is a bignum? |
| 23:49 | defn | like we were just talking about, clojure does some stuff in the background to make sure you have the type you need, scaling to a bignum if necessary |
| 23:49 | defn | unchecked-* don't enforce that check |
| 23:49 | lespea | ah |
| 23:50 | lespea | so should i change my Integer/parseInt to coercing to a bignum also? |
| 23:50 | defn | so you could potentially have a wrong answer, but if you know that it will never be larger than an Integer, then you could use unchecked-* |
| 23:50 | defn | lespea: that's a question i really dont know the answer to |
| 23:50 | defn | i know this stuff from reading bits and pieces here and there, but i dont have much experience with optimization with type hints and such |
| 23:51 | lespea | oh, well some of the answers are bigger than an int... |
| 23:51 | defn | lespea: do you have stuart's book? |
| 23:51 | defn | lespea: also, try checking out the clojure euler solutions wiki |
| 23:51 | defn | i bet there is some optimization stuff in there you could learn from |
| 23:51 | lespea | defn: no, should i get ti? |
| 23:51 | lespea | dern: I'll check that wiki out :) |
| 23:52 | technomancy | http://p.hagelb.org/swank-readme.html <= revamped the readme for swank-clojure 1.2.0; do you think it's clearer now? |
| 23:52 | sexpbot | "README.md" |
| 23:52 | defn | lespea: debatable since it's sort of 1.0 clojure and things have evolved quite a bit since then |
| 23:52 | defn | but he did have an optimization section i believe that basically pointed out the two things i just showed you, hinting and unchecked |
| 23:52 | technomancy | four different ways to connect (from the old version) seems like it was confusing people |
| 23:56 | defn | lespea: #(+ (second %)) looks kind of weird to me for some reason |
| 23:57 | lespea | defn: yeah that's the part I put into paste.lisp wrong <should just be #(second %)> |
| 23:59 | defn | do you need the rest on iterate? |
| 23:59 | defn | could you just do (take runs (iterate #(nth ride-map...))) |
| 23:59 | lespea | then it includes the [0 0] |
| 23:59 | defn | oh right |