2009-02-19
| 00:00 | cooldude127 | / that is |
| 00:00 | cooldude127 | not // |
| 00:02 | cooldude127 | wait a minute, (def /) actually works in the repl |
| 00:02 | cooldude127 | kinda |
| 00:02 | durka42 | i can unmap /, and (defn / [a b] (+ a b)), but then (/ a b) gives ExceptionInInitializerError which was Invalid Token Exception from the reader |
| 00:03 | cooldude127 | fine, i'll cave and do div for now |
| 00:03 | cooldude127 | but someone needs to get on this |
| 00:03 | cooldude127 | *wink* *wink* |
| 00:03 | hiredman | maybe | |
| 00:04 | cooldude127 | hiredman: you think so? i considered that |
| 00:04 | cooldude127 | durka42: you seem involved, what's your opinion of | |
| 00:04 | durka42 | too much like "or"... |
| 00:04 | durka42 | got it |
| 00:04 | durka42 | (ns-unmap 'clojure.core '/) |
| 00:05 | durka42 | (ns-unmap 'user '/) |
| 00:05 | durka42 | (in-ns 'clojure.core) |
| 00:05 | durka42 | (def / +) |
| 00:05 | durka42 | (in-ns 'user) |
| 00:05 | durka42 | (use 'clojure.core) |
| 00:05 | durka42 | user=> (/ 2 3) |
| 00:05 | durka42 | 5 |
| 00:05 | cooldude127 | that's EVIL |
| 00:05 | durka42 | that could be wrapped into a nice macro... |
| 00:06 | durka42 | actually with-ns would be a useful macro, and not always for evil purposes |
| 00:06 | hiredman | smells like a monkey patch |
| 00:06 | cooldude127 | durka42: the problem is it affects everything else in the running instance of clojure |
| 00:06 | durka42 | user// is an invalid token, but clojure.core// is treated specially by the reader? |
| 00:06 | durka42 | yes, it would do that |
| 00:06 | durka42 | well, maybe |
| 00:06 | durka42 | it doesn't take effect in 'user until after user=> (use 'clojure.core) |
| 00:07 | cooldude127 | durka42: i might do this still just because my new version of / should preserve the old behavior |
| 00:07 | cooldude127 | just augment it |
| 00:07 | durka42 | for your next challenge, redefine in-ns |
| 00:07 | cooldude127 | one thing at a time |
| 00:08 | durka42 | hmm, in-ns became slightly less magic since i last looked at it |
| 00:08 | hiredman | ~def in-ns |
| 00:09 | durka42 | you're right, it does affect other namespaces |
| 00:12 | durka42 | http://code.google.com/p/clojure/source/browse/trunk/src/jvm/clojure/lang/LispReader.java#53 |
| 00:15 | hiredman | you could do direct java class |
| 00:15 | hiredman | calls |
| 00:18 | cooldude127 | yeah this isn't working |
| 00:18 | hiredman | foo=> (clojure.lang.Symbol/create (str *ns*) "/") |
| 00:18 | hiredman | foo// |
| 00:18 | cooldude127 | + already refers to #'math.symbolic/+ ? wtf does + have to do with it |
| 00:19 | hiredman | foo=> (def / 1) |
| 00:19 | hiredman | #'foo// |
| 00:19 | hiredman | foo=> / |
| 00:19 | hiredman | 1 |
| 00:19 | durka42 | ,(symbol *ns* "/") |
| 00:19 | clojurebot | java.lang.ClassCastException: clojure.lang.Namespace cannot be cast to java.lang.String |
| 00:19 | durka42 | ,(symbol (ns-name *ns*) "/") |
| 00:19 | clojurebot | java.lang.ClassCastException: clojure.lang.Symbol cannot be cast to java.lang.String |
| 00:19 | durka42 | ,(symbol "sandbox" "/") |
| 00:19 | clojurebot | sandbox// |
| 00:20 | hiredman | ,`/ |
| 00:20 | clojurebot | clojure.core// |
| 00:21 | cooldude127 | apparently all the NS mucking is messing up other sane stuff. so i'm not gonna bother |
| 00:21 | hiredman | ,(ns-unmap '/) |
| 00:21 | clojurebot | java.lang.IllegalArgumentException: Wrong number of args passed to: core$ns-unmap |
| 00:21 | hiredman | ,(ns-unmap (symbol "/")) |
| 00:21 | clojurebot | java.lang.IllegalArgumentException: Wrong number of args passed to: core$ns-unmap |
| 00:21 | hiredman | ,(ns-unmap *ns* (symbol "/")) |
| 00:21 | clojurebot | java.lang.IllegalArgumentException: Can't unintern namespace-qualified symbol |
| 00:23 | hiredman | ,(/ 1 2) |
| 00:23 | clojurebot | java.lang.ExceptionInInitializerError |
| 00:23 | cooldude127 | this is totally fucking evil and i refuse to be involved anymore |
| 00:24 | cooldude127 | i await a time when / can be redefined at will |
| 00:24 | cooldude127 | in the meantime, div it is |
| 00:30 | durka42 | hey, that's simpler |
| 00:30 | durka42 | (ns-unmap 'user '/) |
| 00:30 | durka42 | (.refer (the-ns 'user) (symbol nil "/") #'+) |
| 00:30 | durka42 | user=> (/ 2 3) |
| 00:30 | durka42 | 5 |
| 00:31 | durka42 | does not affect other namespaces, either |
| 00:32 | cooldude127 | durka42: hmm let's try that |
| 00:32 | durka42 | the second argument must be a Var |
| 00:34 | pjb3 | Is there a build in function better than this? |
| 00:34 | pjb3 | ,(seq (.split "foo=1" "=")) |
| 00:34 | clojurebot | ("foo" "1") |
| 00:34 | cooldude127 | durka42: HOLY SHIT THAT WORKED |
| 00:35 | durka42 | heh :) |
| 00:35 | Chouser | pjb3: what you've got looks good. |
| 00:35 | hiredman | voodoo |
| 00:35 | pjb3 | Chouser: Yeah, I'm just not liking the extra (seq (.split |
| 00:35 | pjb3 | (map #(seq (.split % "=")) (seq (.split "foo=1&bar=2" "&"))) |
| 00:35 | Chouser | pjb3: There aren't many string functions built into Clojure because it's so easy just to use the Java methods. |
| 00:35 | cooldude127 | durka42: wait a minute, we'll see |
| 00:36 | durka42 | there is c.c.str-utils |
| 00:36 | durka42 | with re-split |
| 00:36 | Chouser | pjb3: why do you need those seq's? |
| 00:36 | pjb3 | Does it work on arrays? |
| 00:36 | hiredman | eh? |
| 00:36 | durka42 | Chouser: well, otherwise you get a #<Stringasdf;lkajdf;kajhfdg |
| 00:36 | Chouser | map calls seq on its collection for you |
| 00:37 | pjb3 | yeah, but then I get an array of arrays |
| 00:37 | Chouser | and Java arrays works with seq |
| 00:37 | hiredman | uh |
| 00:37 | hiredman | no |
| 00:37 | Chouser | if you get rid of both, you'll have a seq of arrays |
| 00:37 | cooldude127 | durka42: it works once! then if i try to recompile the file, i'm fucked. so i need to wrap it in something that makes it only happen once |
| 00:37 | durka42 | well, you need the ns-unmap |
| 00:38 | durka42 | or does ns-unmap not undo .refer |
| 00:38 | Chouser | pjb3: but then what are you doing with the inner arrays? Chances are 'seq' will be called for you then too. |
| 00:38 | hiredman | cooldude127: defonce |
| 00:38 | pjb3 | Chouser: yeah, actually that ends up working for this |
| 00:38 | cooldude127 | hiredman: i used that |
| 00:38 | pjb3 | (map #(seq (.split % "=")) (seq (.split "foo=1&bar=2" "&"))) |
| 00:38 | cooldude127 | hiredman: but there's other stuff that's being done that can also only be done once |
| 00:38 | pjb3 | whoops, copy FAIL |
| 00:38 | pjb3 | (apply hash-map (mapcat #(.split % "=") (.split "foo=1&bar=2" "&"))) |
| 00:38 | durka42 | cooldude127: i can do (ns-unmap 'user '/) and then (.refer ...) again at the REPL |
| 00:39 | Chouser | pjb3: yep, looks good |
| 00:39 | hiredman | cooldude127: (defonce _ (do all kinds of stuff here)) |
| 00:39 | pjb3 | Chouser: thanks, did I heard something about a Clojure meet up in Indiana you were planning on going to? |
| 00:39 | cooldude127 | hiredman: maybe that'd be better with a gensym? |
| 00:40 | cooldude127 | hiredman: (defonce `x# ...) |
| 00:40 | Chouser | pjb3: yep, are you in the area? |
| 00:40 | Chouser | ,(into {} (map #(vec (.split % "=")) (.split "foo=1&bar=2" "&"))) |
| 00:40 | clojurebot | {"bar" "2", "foo" "1"} |
| 00:40 | pjb3 | Chouser: nope, in Baltimore |
| 00:40 | Chouser | eh, that's probably not any better. |
| 00:41 | Chouser | um, into I mean, not Baltimore. |
| 00:41 | pjb3 | Just wanted to know what the interest was like out there |
| 00:41 | Chouser | I think it'll be mostly .Net guys, so we'll see... |
| 00:41 | pjb3 | Chouser: Yeah, the into seems like 6 or .5 dozen |
| 00:42 | cooldude127 | nvm that gensym won't work |
| 00:43 | cooldude127 | and even the defonce didn't work |
| 00:43 | durka42 | well if you gensym every time you defonce it will happen more than once, no? |
| 00:43 | pjb3 | I'm head to NC tomorrow for RubyRX, stuarthalloway is giving 2 clojure talks, should be cool |
| 00:43 | cooldude127 | durka42: not gensyming anymore |
| 00:43 | cooldude127 | cuz you can't do that in that case anyway |
| 00:44 | durka42 | user=> (defonce _ (prn "boo")) |
| 00:44 | durka42 | "boo" |
| 00:44 | durka42 | #'user/_ |
| 00:44 | durka42 | user=> (defonce _ (prn "boo")) |
| 00:44 | durka42 | nil |
| 00:44 | cooldude127 | it still throws up errors |
| 00:44 | cooldude127 | OH I THINK I KNOW WHY |
| 00:45 | Chouser | pjb3: cool |
| 00:45 | cooldude127 | it's the ns declaration |
| 00:45 | pjb3 | Chouser: in your into one, how come vec works, but if I change that to seq, it doesn't? |
| 00:45 | cooldude127 | it's pulling in the / from clojure.core, which i've now redefined |
| 00:46 | Chouser | into really wants a seq of MapEntries |
| 00:46 | Chouser | you're allowed to use a 2-element vector most places that want a MapEntry |
| 00:46 | Chouser | i've never looked into how that's allowed or why nothing else is. |
| 00:46 | cooldude127 | durka42: OH HELL YEAH |
| 00:47 | cooldude127 | durka42: once i excluded / from the :refer-clojure, i can recompile successfully, so now mission accomplished |
| 00:47 | pjb3 | Chouser: yeah, interesting, that seems inconsistent |
| 00:47 | cooldude127 | durka42: thank you for your insanely evil help |
| 00:47 | cooldude127 | hiredman: you too |
| 00:48 | durka42 | evil |
| 00:48 | Chouser | pjb3: hm, look at that -- a MapEntry is a Vector |
| 00:48 | Chouser | ,(vector? (first {:a 1})) |
| 00:48 | clojurebot | true |
| 00:48 | Chouser | ,(class (first {:a 1})) |
| 00:48 | clojurebot | clojure.lang.MapEntry |
| 00:49 | Chouser | as shown on the graph: http://tinyurl.com/clojure-classes |
| 00:49 | pjb3 | yeah, I guess that explains it |
| 00:50 | pjb3 | ,(into {} [(vec (.split "x=1" "="))]) |
| 00:50 | clojurebot | {"x" "1"} |
| 00:50 | lisppaste8 | cooldude127 pasted "how i'm thanking durka42" at http://paste.lisp.org/display/75763 |
| 00:50 | pjb3 | ,(into {} [(seq (.split "x=1" "="))]) |
| 00:50 | clojurebot | java.lang.ClassCastException: java.lang.String cannot be cast to java.util.Map$Entry |
| 00:50 | pjb3 | ,[(seq (.split "x=1" "="))] |
| 00:50 | clojurebot | [("x" "1")] |
| 00:53 | pjb3 | I'm sure there's some other internal reason for it, but it would make more sense if clojure.lang.MapEntry were a seq |
| 00:55 | Chouser | it takes longer to get to the second thing in a seq than to the first, which is not true of a vector |
| 00:56 | Chouser | Two elements means it's probably a LazilyPersistentVector, which is a thin wrapper around an array -- no new object required to represent the second item like in a seq. |
| 00:58 | durka42 | cooldude127: this may be one of the few legitimate uses of XML |
| 00:58 | durka42 | to mark evil |
| 00:58 | cooldude127 | lol |
| 00:59 | yangsx | Just a quick check of my understanding, tree recursion is not possible with Clojure and I have to flatten the data structures first. Is that true? |
| 01:00 | cooldude127 | yangsx: you can write your own functions to do tree recursion |
| 01:01 | hiredman | yangsx: what do you mean by tree recursion? |
| 01:02 | yangsx | like recursion over a tree structure |
| 01:02 | hiredman | like a depth first walk? |
| 01:02 | yangsx | hiredman: yes |
| 01:03 | hiredman | clojure.zip |
| 01:03 | hiredman | ,(doc clojure.zip/next) |
| 01:03 | clojurebot | "([loc]); Moves to the next loc in the hierarchy, depth-first. When reaching the end, returns a distinguished loc detectable via end?. If already at the end, stays there." |
| 01:04 | hiredman | cooldude127 was doing avl and redblack trees, but not with zippers |
| 01:04 | cooldude127 | yes i was :) |
| 01:04 | hiredman | zippers are cool |
| 01:04 | cooldude127 | zippers are weird for binary trees |
| 01:04 | hiredman | they can be hard to navigate |
| 01:04 | cooldude127 | cool for more freeform trees |
| 01:05 | Chouser | yangsx: you can absolutely do a depth-first walk over a tree |
| 01:06 | Chouser | yangsx: the most natural way will consume as many stack frames as the depth of your walk, but you'd have to have a very big tree for that to be a problem. |
| 01:06 | hiredman | the transform function my pl macor uses uses zip/next to walk through the s-expressions |
| 01:07 | hiredman | ,(pl (map call � ?+ $ 5 range $ 5)) |
| 01:07 | clojurebot | (5 6 7 8 9) |
| 01:08 | durka42 | what are the precedence rules on that monstrosity? |
| 01:09 | durka42 | ,(macroexpand '(pl (map call � ?+ $ 5 range $ 5))) |
| 01:09 | clojurebot | (do (map (comp call ((uncurry +) 5)) (range 5))) |
| 01:09 | hiredman | $ � ? ? |
| 01:10 | durka42 | as in flip happens first |
| 01:10 | hiredman | call � ?+ is the same thing as (partial + |
| 01:10 | hiredman | no |
| 01:10 | hiredman | flip is last |
| 01:10 | durka42 | but it looks like $ is after uncurry |
| 01:11 | hiredman | nope |
| 01:11 | hiredman | $ is first |
| 01:14 | hiredman | ?+ $ 5 turns into (?+ 5) which turns into ((uncurry +) 5) |
| 01:14 | durka42 | oh oh i see |
| 01:16 | durka42 | i thought we used s-expressions to avoid precedence rules... |
| 01:18 | hiredman | ,(pl inc $ 3) |
| 01:18 | clojurebot | 4 |
| 01:30 | slackorama | Apologies for yet another slime question but I just did a pull from |
| 01:30 | slackorama | git,cvs,svn of the needed libraries and when slime starts up I get this error: |
| 01:30 | slackorama | http://gist.github.com/66759. It seems to run fine after that though. |
| 01:31 | slackorama | Durr,sorry about that. Had fill mode on. |
| 01:32 | durka42 | heh, i was just thinking |
| 01:33 | durka42 | when most people talk about "closure" they mean letting go of something |
| 01:33 | durka42 | but when we say "closure" we mean hanging on to things |
| 01:33 | durka42 | also, my fingers really want to type clojure instead of closure |
| 01:34 | fynn | we're having a discussion in #python |
| 01:34 | fynn | why doesn't Clojure have tail-call-optimization? |
| 01:34 | durka42 | because the JVM doesn't |
| 01:34 | durka42 | (yet) |
| 01:34 | albino | because the jvm doesn't support it |
| 01:34 | fynn | "(yet)"? |
| 01:34 | hiredman | clojure uses java style calls, which do not support tco |
| 01:35 | albino | Is it proposed for jdk version 7? |
| 01:35 | durka42 | there are a couple proposals floating around |
| 01:35 | hiredman | sun is not working on it |
| 01:35 | hiredman | but some grad student is |
| 01:35 | hiredman | *shrug* |
| 01:35 | durka42 | basically |
| 01:36 | albino | sounds like a "don't bet on it" strategy |
| 01:36 | albino | I'm still waiting for sun to include chdir() |
| 01:37 | durka42 | why? |
| 01:37 | fynn | I brought Clojure up as an interesting new language, and it was criticized for not having TCO |
| 01:37 | hiredman | *snort* |
| 01:38 | albino | durka42: because it's a processes basic right to change directories, and to do so is useful |
| 01:38 | fynn | as a supposedly major flaw in a Lisp variant and language aspiring to be functional. |
| 01:38 | hiredman | obviously they have never used clojure |
| 01:38 | fynn | I don't think it's that big of a deal either, but having TCO would be nice. |
| 01:38 | hiredman | clojure has several features that almost entirely get rid of the pain of not having it |
| 01:38 | hiredman | recur and trampoline |
| 01:39 | durka42 | python doesn't have TCO either, does it? |
| 01:39 | fynn | durka42: nope, in fact it actively discourages recursive style. |
| 01:39 | fynn | (the Designer deems it less readable) |
| 01:40 | fynn | hiredman: cool, I linked recur in #python |
| 01:40 | albino | fynn: the Designer being BDFL guido? |
| 01:40 | slashus2 | The stack isn't very large for recursion by default. |
| 01:40 | fynn | albino: yeah |
| 01:40 | hiredman | the other thing is clojure's heavy use of sequences means a lot of things that would be some kind of recursive function are just sequences |
| 01:40 | durka42 | a friend of mine learned haskell and it heavily influenced his python... others who had to read his code were not amused |
| 01:41 | hiredman | ,(take 10 (iterate inc 0)) |
| 01:41 | clojurebot | (0 1 2 3 4 5 6 7 8 9) |
| 01:42 | fynn | verte> fynn, so it only works for single recursives. ugh. |
| 01:42 | fynn | that's wrt recur |
| 01:42 | hiredman | self recursion |
| 01:42 | hiredman | not single |
| 01:42 | durka42 | i mentioned trampoline, which can do mutual recursion if you want to return functions |
| 01:42 | hiredman | but for mutual recursion there is trampoline |
| 01:43 | hiredman | ,(doc trampoline) |
| 01:43 | clojurebot | "([f] [f & args]); trampoline can be used to convert algorithms requiring mutual recursion without stack consumption. Calls f with supplied args, if any. If f returns a fn, calls that fn with no arguments, and continues to repeat, until the return value is not a fn, then returns that non-fn value. Note that if you want to return a fn as a final value, you must wrap it in some data structure and unpack it after trampoline |
| 01:44 | fynn | durka42: yeah, I lined to the group |
| 01:44 | fynn | *linked |
| 01:45 | hiredman | so, basically, #python is full of it |
| 01:48 | fynn | heh, not exactly, but some people are perfectionists. |
| 01:48 | fynn | it's still sort of reassuring to know that you have TCO at your disposal. |
| 01:49 | hiredman | clojurebot: clojure is also far closer to perfection then python |
| 01:49 | clojurebot | In Ordnung |
| 01:49 | durka42 | ~clojure |
| 01:49 | clojurebot | clojure is cheating |
| 01:49 | hiredman | ~clojure |
| 01:49 | clojurebot | clojure is a very attractive hammer with a nice heft to it |
| 01:50 | durka42 | clojurebot: how much do you know about clojure? |
| 01:50 | clojurebot | I know 203 things |
| 01:52 | hiredman | ~perfection |
| 01:52 | clojurebot | I don't understand. |
| 01:55 | fynn | I still think Clojure is possibly the most interesting Lisp implementations. |
| 01:55 | hiredman | definetely the most modern |
| 01:57 | fynn | SBCL is pretty oldstyle iirc |
| 01:57 | durka42 | if "old-style" means "standard-conforming" |
| 01:58 | hiredman | clojurebot: clojure is also <reply>"[Clojure ...] feels like a general-purpose language beamed back from the near future." |
| 01:58 | clojurebot | Ok. |
| 01:58 | fynn | Common Lisp is a fairly broken standard :/ |
| 01:59 | hiredman | don't let AWizzArd hear you say that |
| 01:59 | hiredman | he is pretty into that hyperspec |
| 01:59 | fynn | even Lisp people tend to agree that CL is broken |
| 01:59 | hiredman | uh |
| 02:07 | slashus2 | fynn: Some are pretty stubborn, but that is an irrelevant point. |
| 02:44 | fffej | I don't suppose anyone has ported swank-clojure over to use the latest lazy branch? I'm following the recipe on the Clojure page to port, but not getting very far :( |
| 04:11 | blbrown | ,(+ 1 "0") |
| 04:11 | clojurebot | java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Number |
| 04:11 | blbrown | ,(+ 1 (char "0")) |
| 04:11 | clojurebot | java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Number |
| 04:11 | hiredman | weird |
| 04:12 | hiredman | ,(char "0") |
| 04:12 | clojurebot | java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Number |
| 04:12 | blbrown | hiredman, ..I was having a little trouble with characters |
| 04:12 | hiredman | (+ 1 \0) |
| 04:12 | hiredman | ,(+ 1 \0) |
| 04:12 | clojurebot | java.lang.ClassCastException: java.lang.Character cannot be cast to java.lang.Number |
| 04:12 | blbrown | right |
| 04:13 | hiredman | ,(pl (+ 1 int $ \0)) |
| 04:13 | clojurebot | 49 |
| 04:13 | blbrown | hehe |
| 04:13 | blbrown | ,(doc pol) |
| 04:13 | clojurebot | java.lang.Exception: Unable to resolve var: pol in this context |
| 04:13 | blbrown | ,(doc pl) |
| 04:13 | clojurebot | "([& forms]); " |
| 04:13 | eevar2 | (doc test) |
| 04:13 | clojurebot | test [v] finds fn at key :test in var metadata and calls it, presuming failure will throw exception; arglists ([v]) |
| 04:13 | hiredman | pl is magic |
| 04:39 | rfgpfeiffer_ | ,(source pl) |
| 04:39 | clojurebot | java.lang.Exception: Unable to resolve symbol: source in this context |
| 05:20 | Lau_of_DK | Hey guys |
| 05:24 | cgrand1 | Hi Lau_of_DK! |
| 05:25 | Lau_of_DK | cgrand1: Hi - You working on anything interesting these days ? |
| 05:27 | cgrand1 | Lau_of_DK: dabbling with a code specializer |
| 05:28 | Lau_of_DK | cgrand1: Google is blank on code specializers... what are they ? |
| 05:28 | cgrand1 | partial evaluation |
| 05:29 | cgrand1 | user=> (binding [*locals* {'x 'x}] (partial-eval '(let [y (* 4 5)] (+ x y)))) |
| 05:29 | cgrand1 | (clojure.core/+ x 20) |
| 05:30 | Lau_of_DK | Where would you find use for that? :) |
| 05:30 | blbrown | Lau_of_DK, heay |
| 05:30 | Lau_of_DK | hey :) |
| 05:31 | cgrand1 | Lau_of_DK: it's could prove useful when optimizing the output of a dsl |
| 05:32 | cgrand1 | Lau_of_DK: it could prove useful when optimizing the output of a dsl |
| 05:32 | Lau_of_DK | Ok, cool, I'll look forward to seeing what comes out of it - Hopefully some blogposts :) |
| 05:34 | cgrand1 | and you, what are you working on? |
| 05:37 | Lau_of_DK | We are the final steps in getting clojureQL to version1, which I'll hopefully get done within a small month, but as a side project, I've decided to extend af 3d gaming engine and kick it off with a game for 2-3 year olds, just some fun with colors, music and rotating objects responding to keyboard input (Read: a kid slamming the keyboard) |
| 05:38 | cgrand1 | cool, it explains you asking about jmonkey |
| 05:38 | Lau_of_DK | Exactly right :) |
| 05:40 | Lau_of_DK | Its actually running now, in so far that you can build the class from Clojure and pop a settings dialog, choosing resolution, driver, and fullscreen yes/no. Then that'll start the main window and main loop, which responds to keyboard input. All that is working, now I just need to get the scene set up |
| 06:10 | Bracki | ,(reduce conj '() '(1 2 3 4 5)) |
| 06:10 | clojurebot | (5 4 3 2 1) |
| 06:10 | Lau_of_DK | How do I add a type-hint to a javaclass? |
| 06:11 | Bracki | Why does that reduce call invert the list? |
| 06:11 | Bracki | Shouldn't it just copy it? |
| 06:12 | djpowell | if you are writing new code that works with sequences, should you typically use the new 'rest'? |
| 06:15 | djpowell | the porting instructions say to replace 'next' with 'rest', but is that just for easy porting? The name 'rest' seems the most obvious friend of 'first', so I'm hoping that it is what you are supposed to use? |
| 06:19 | Bracki | (fn [x y] (+ x y)) Whats the form using #(..) for this? |
| 06:20 | Bracki | #(+ % %1)? |
| 06:21 | cgrand1 | Lau_of_DK: code sample? |
| 06:22 | cgrand1 | djpowell: it depends whether you want nil-punning (next) or not (rest) |
| 06:22 | Raynes | Bracki: #(+ % %1) |
| 06:24 | Lau_of_DK | (defn -render |
| 06:24 | Lau_of_DK | [this interpolation] |
| 06:24 | Lau_of_DK | (.. ($get :display) (getRenderer) (clearBuffers)) |
| 06:24 | Lau_of_DK | (.. ($get :display) (getRenderer) (.draw #^{:type com.jme.scene.Spatial} ($get :rootNode)))) |
| 06:24 | Lau_of_DK | |
| 06:24 | Lau_of_DK | @ cgrand1 |
| 06:28 | cgrand1 | Lau_of_DK: what are these $getDisplay? your genclassed getters/setters? |
| 06:28 | cgrand1 | the .draw looks suspect |
| 06:28 | Lau_of_DK | cgrand1: ($get :rootNode) returns a Node. I need to cast that to a special, _because_ Clojure it self doesnt resolve it through reflection, no idea why |
| 06:28 | Lau_of_DK | cgrand1: Its just pulling objects out of a hash-map that I use for globals |
| 06:29 | Lau_of_DK | Node is inherited from Spatial - In my head, Clojure should work this out on its own, when it sees that draw has no method for Node. |
| 06:29 | hoeck | Bracki: conj uses cons to add something to a list, and cons applies the element always on top of the list |
| 06:29 | hoeck | Bracki: for appending at the end use conj and a vector |
| 06:29 | hoeck | ,(reduce conj [] '(1 2 3)) |
| 06:29 | clojurebot | [1 2 3] |
| 06:30 | cgrand1 | Lau_of_DK: is $get hinted? (can you paste with more context?) |
| 06:39 | Lau_of_DK | cgrand1: 2 secs |
| 06:40 | lisppaste8 | Lau pasted "Typehints for Mr. Grande" at http://paste.lisp.org/display/75777 |
| 06:40 | Lau_of_DK | There u go - thats the relevant context |
| 06:40 | Lau_of_DK | But its a pretty big problem, if Clojure doesnt recognize superclasses inheriances |
| 06:46 | cgrand1 | Lau_of_DK: ($get XXX) can return anything, you have to hint each $get call |
| 06:46 | cgrand1 | #^Node ($get :rootNode) |
| 06:47 | Lau_of_DK | Yea, but lets say I want to hint it to a Spatial, shouldnt (class #^Spatial ($get :rootNode)) return Spatial ? |
| 06:49 | Lau_of_DK | @ cgrand1 |
| 06:50 | Lau_of_DK | (defn -render |
| 06:50 | Lau_of_DK | [this interpolation] |
| 06:50 | Lau_of_DK | (.. ($get :display) (getRenderer) (clearBuffers)) |
| 06:50 | Lau_of_DK | (.. ($get :display) (getRenderer) (.draw #^Spatial ($get :rootNode)))) |
| 06:50 | Lau_of_DK | |
| 06:50 | Lau_of_DK | This will fail, because .draw sill only sees a Node - and Clojure doesnt realize that Node is an extended Spatial. |
| 06:50 | Lau_of_DK | Oh - And (.draw ) should be (draw) |
| 06:54 | AWizzArd | Where again was this nice compilation that visualizes the differences between Agents, Atoms and Refs? |
| 06:54 | AWizzArd | it was a 2x2 table or something like that |
| 06:58 | AWizzArd | Ah oki, that was it: |
| 06:58 | AWizzArd | http://groups.google.com/group/clojure/msg/fd0371eb7238e933 |
| 07:37 | Bracki | Raynes: no that doesnt work |
| 07:37 | Raynes | Hrm. |
| 07:37 | Bracki | ,(reduce #(+ % %1) '(1 2 3)) |
| 07:37 | clojurebot | java.lang.IllegalArgumentException: Wrong number of args passed to: sandbox$eval--1574$fn |
| 07:37 | Raynes | Word for me. |
| 07:38 | Raynes | works for me* |
| 07:38 | Raynes | ,(do #(println % %1) "lol" "lol") |
| 07:38 | clojurebot | "lol" |
| 07:38 | Raynes | Well, close enough. |
| 07:39 | Raynes | ,(do #(println (str % %1)) "lol" "lol") |
| 07:39 | clojurebot | "lol" |
| 07:40 | jdz | Raynes: that code does nothing actually |
| 07:40 | jdz | it only returns the last "lol" |
| 07:40 | Raynes | jdz: I gathered. |
| 07:40 | Raynes | jdz: I realized. |
| 07:42 | Bracki | ,(reduce #(+ %1 %2) '(1 2 3)) |
| 07:42 | clojurebot | 6 |
| 07:42 | Bracki | Ah. |
| 07:42 | Bracki | % is a synonnym for %1 |
| 07:42 | Raynes | Oh. |
| 07:43 | Raynes | I was just reading that. |
| 07:56 | danlarkin | + is already a function that takes two ( or more or less ) args, so no need to wrap it in a lambda there |
| 07:56 | danlarkin | ,(reduce + '(1 2 3)) |
| 07:56 | clojurebot | 6 |
| 08:05 | AWizzArd | ,(apply + [1 2 3]) |
| 08:05 | clojurebot | 6 |
| 08:07 | Bracki | danlarkin: yeah that was just an example for a more difficult lambda. |
| 08:07 | Bracki | ,(doc apply) |
| 08:07 | clojurebot | "([f args* argseq]); Applies fn f to the argument list formed by prepending args to argseq." |
| 08:19 | AWizzArd | Bracki: you can think of apply as removing the parens/brackets of its last argument: (apply + [1 2 3]) ==> (apply + 1 2 3). After that step apply removes itself. So this all becomes: (+ 1 2 3) |
| 08:20 | djpowell | it only works for + because + supports var args, if the function only supports 2 arguments, then you'd need to use reduce as above |
| 08:20 | Hun` | one method to implement vararg-+ is in fact to use reduce with an initial arg of 0 |
| 08:23 | Lau_of_DK | rhickey__: Can you please add some syntactic sugar for floats? |
| 08:24 | djpowell | Lau_of_DK: what like? |
| 08:24 | djpowell | Lau_of_DK: you mean for floats as opposed to doubles? |
| 08:24 | djpowell | ,(class 1.0) |
| 08:24 | clojurebot | java.lang.Double |
| 08:24 | Lau_of_DK | 5.0 double |
| 08:24 | Lau_of_DK | 5.0f float |
| 08:24 | Lau_of_DK | For instance |
| 08:25 | gnuvince | Hey Guys |
| 08:25 | gnuvince | I got to tell you about a dream I had of Rich |
| 08:26 | djpowell | ,(class (float 1.0)) |
| 08:26 | clojurebot | java.lang.Float |
| 08:26 | Lau_of_DK | gnuvince: shoo :) |
| 08:26 | Lau_of_DK | t |
| 08:27 | gnuvince | He was showing me his Jor-El impersonnation, while sticking a fiber optics cable into his arm, after which he put on his Superman suit, flew a couple times around the Earth and came back with George W. Bush's face. That's when he was chosen as the DNC's chairman and he refused to meet with Gerald Ford because he had a bug in Clojure. |
| 08:28 | Lau_of_DK | Sounds healthy enough :) |
| 08:30 | gnuvince | Indeed |
| 08:31 | gnuvince | It's nice to know that even when he's head of the DNC, Clojure still has priority |
| 08:32 | Lau_of_DK | True |
| 08:34 | cemerick | federal gravy train, here we come! :-P |
| 08:35 | AWizzArd | Lau_of_DK: I would also like it if we could use the existing syntax for declaring types: (loop [#^java.util.Hashtable ht ...] ...) |
| 08:36 | AWizzArd | maybe #^float, #^int, etc could be used. vs. #^Float #^Integer, ... |
| 08:37 | AWizzArd | djpowell: |
| 08:37 | AWizzArd | ,(apply (fn [a b] (+ a b)) [10 20]) |
| 08:37 | clojurebot | 30 |
| 08:37 | AWizzArd | the use of apply has nothing to do with the function taking rest-args |
| 08:37 | Lau_of_DK | AWizzArd: Hinting is business as usual, but I just want shorthand for producing something of the actual type/class |
| 08:38 | AWizzArd | Lau_of_DK: yes, would be cool. And on top of that I like consistency. #^int x vs (int x) |
| 08:38 | AWizzArd | as declarations for Java classes is typically done via #^ |
| 08:40 | AWizzArd | is --> are |
| 08:41 | jkantz | gah do I really have to create a gensym for every lexically bound variable in a macro? |
| 08:43 | Hun` | you don't `have' to... but it helps |
| 08:43 | cemerick | jkantz: generally yes, but it's very easy with the reader syntax for gensyms |
| 08:43 | Hun` | there are macros to make that easier (iirc with-gensyms) |
| 08:43 | Hun` | oh. thought this was #lisp :) |
| 08:44 | jkantz | ah reader syntax for gynsyms ... nice |
| 08:46 | cemerick | what is the use case for :factory in gen-class? i.e. why are static factory fns desirable in addition to constructors (since the latter are always available as well with the current gen-class impl)? |
| 08:46 | cemerick | maybe it's just a style thing? |
| 08:50 | ericthorsen | VerifyError with genclass? http://paste.lisp.org/display/75781 |
| 08:50 | ericthorsen | I'm trying to expose a method of the super class so I can derive from this clojure generated class and forward calls to a multimethod. |
| 08:51 | ericthorsen | Do I need to do anything else besides what is in the paste? |
| 08:52 | ericthorsen | The error is CLjTreeCellRenderer overrides final method |
| 08:56 | cemerick | ericthorsen: a quick peek at the source makes me think that the docs are wrong -- that the mapping is actually {exposed-name super-method-name} |
| 08:56 | cemerick | or, that's what I get from the names of the destructuring bindings in the relevant section of genclass |
| 09:00 | ericthorsen | cemerick: I'm wondering if it is because I'm not overriding the function in question? Trying to see if that makes a difference noe |
| 09:00 | ericthorsen | now |
| 09:01 | cemerick | ericthorsen: not sure -- I've never used :expose-methods, so I'm groping in the dark there. |
| 09:02 | ericthorsen | cemerick: That was it..I'll post it to the group. not a big deal and probably not a bug. |
| 09:02 | ericthorsen | cemerick: thanks |
| 09:03 | cemerick | ericthorsen: that being, the args were in the wrong order, or that you weren't overriding the function in question? |
| 09:11 | ericthorsen | cemerick: I was not overriding the function in the new genned class. |
| 09:18 | BigTom_ | hi |
| 09:18 | BigTom_ | dumb question time |
| 09:18 | BigTom_ | is there a logical XOR equivalent in clojure? |
| 09:38 | tashafa | quick question all |
| 09:38 | tashafa | im sure this is easy but its escaping me right now |
| 09:39 | tashafa | how do you find the index of a value in a seq |
| 09:39 | Chouser | BigTom_: I don't think so |
| 09:41 | Chouser | BigTom_: Jason Wolfe wrote this, though: (defn xor [& args] (odd? (count (filter identity args)))) |
| 09:41 | cooldude127 | tashafa: i had to write it myself. (indexed) in clojure.contrib.seq-utils helps |
| 09:42 | cooldude127 | tashafa: i'll paste what i had |
| 09:43 | lisppaste8 | cooldude127 pasted "position (index of an item)" at http://paste.lisp.org/display/75787 |
| 09:43 | tashafa | oh thank you guys |
| 09:44 | cooldude127 | no problem, i was just in here the other day asking the same damn question |
| 09:44 | cooldude127 | the real one is why is it not built-in |
| 09:45 | tashafa | yeah |
| 09:45 | BigTom_ | Chouser: cheers, I think that'll do it |
| 09:45 | tashafa | thats why I thought it was a simple built in function that i couldnt find in the api |
| 09:46 | cooldude127 | tashafa: yeah i looked for it |
| 09:48 | AWizzArd | clojurebot: max people |
| 09:48 | clojurebot | max people is 149 |
| 09:49 | Chouser | indexes aren't used so much in Clojure. |
| 09:49 | Chouser | and a linear search to find the index will of course only be desirable on small lists |
| 09:50 | shoover` | desire is subjective. I plug in computers and run linear searches to warm my house. |
| 09:51 | cooldude127 | lol |
| 09:51 | BigTom_ | If you are after a heating system then totally pure Functional Programming is for you! |
| 09:52 | jdz | BigTom_: that would not be pure functional programming because heat is a side effect! |
| 09:52 | shoover` | BigTom_: ooh, rework that to fewer words, include "HVAC", and make another clojure t-shirt |
| 09:52 | ozy` | jdz: I dunno about clojure, but in haskell there's a Thermodynamics monad |
| 09:53 | BigTom_ | jdz: I was just thinking that, refrigerated monads anyone? |
| 09:54 | jdz | what's more, you cannot run a purely functional program -- all the computation would be done in compilation step. |
| 09:54 | jdz | since nobody said anything about running functional programs i'll intall latest software updates |
| 09:56 | shoover` | jdz: not running programs is kinda depressing. back to clojure I can run things :) |
| 09:56 | BigTom_ | ozy: The clojure logo would make a nice button, shame zazzle doesn't do them |
| 09:59 | ozy` | BigTom_: I'd rather have an ominous-looking button with that Illuminati logo on it. but the haskell people don't want to pick that logo.... |
| 10:00 | jdz | btw, what's the point of logical XOR? |
| 10:02 | BigTom_ | jdz: I have two pairs of thngs and I am interested when the first pair is the same but the second different (and vice versa) |
| 10:03 | BigTom_ | well, thats why I want it |
| 10:07 | jdz | not= |
| 10:07 | jdz | ? |
| 10:07 | Chouser | yeah, like (not= (= a b) (= c d)) |
| 10:09 | bstephenson | would that not return true if c=d but a not = b? |
| 10:09 | BigTom_ | Ah well, that's what i was looking for |
| 10:09 | Chouser | ,(not= (= 1 2) (= 3 3)) |
| 10:09 | clojurebot | true |
| 10:12 | jdz | isn't that what is required? |
| 10:21 | cemerick | I can't wait to see rhickey's response to not-empty? in the group :-P |
| 10:23 | AWizzArd | cemerick: what was the suggestion? To add some compiler magic to all functions that end with a "?" and begin with at "not-"? :) |
| 10:24 | Chouser | AWizzArd: http://groups.google.com/group/clojure/msg/f99178dd8c5fb85d |
| 10:24 | cemerick | AWizzArd: No, a request for a separate not-empty? fn -- similar to if => if-not, at least in terms of order of the conditional branches. I know rhickey strongly prefers affirmative clauses to come first (probably didn't get that terminology right). |
| 10:25 | cemerick | I've always preferred having the shortest clause first, so I pushed for if-not to make that cleaner. |
| 10:26 | Chouser | cemerick: Since you brought that up I've experimented with that layout, and I can certainly see the appeal. |
| 10:26 | cemerick | Chouser: IMO, it's far easier for later readers of code |
| 10:27 | Chouser | but the double-negative of "not empty" is simply worse than the positive of "seq" |
| 10:27 | Chouser | same order of then/else |
| 10:28 | cemerick | that, and in a lot of algorithms, the shorter clause is often just a single value, so it's nice to "get that out of the way" and concentrate on the real hunk of code. |
| 10:28 | Chouser | to reverse the order I've used (if (empty? ...)) |
| 10:29 | Chouser | that gets you out of the null-pun and a 'not' in a single intuitive word. |
| 10:29 | cemerick | Chouser: I strongly dislike using (if (seq ...)) -- I always use (if (empty? coll) ...) -- again, makes it easier for readers who may not have internalized the meaning of the former as a conditional |
| 10:29 | cemerick | yeah, I haven't looked at the lazy stuff at all yet, so we'll see where I settle after I've understood the implications there |
| 10:30 | Chouser | cemerick: but what if you have to reverse the order? Do you use (if-not (empty? coll) ...)? |
| 10:31 | cemerick | Chouser: I can't say I've ever written that -- looks hairy to me. Chances are, the shorter clause is always needed first when the coll in question is empty. |
| 10:31 | Chouser | but as for you original point, I'm not about to suggest (if-not (empty? coll) ...) to the poor soul who's asking for 'not-empty?' for fear Rich flog me. |
| 10:31 | Chouser | will flog |
| 10:32 | cemerick | if-not is handy when there's some non-collection conditional you need to reverse |
| 10:32 | Chouser | yes |
| 10:32 | cemerick | Chouser: good lord, neither will I :-) |
| 10:33 | pilkarn | Does anyone know for sure, is it ok to release applications written in Clojure on the paid Android-market? Or is there a rule that it has to be written in Java and not only compiled to Dalvik bytecode? |
| 10:34 | Chouser | pilkarn: to work with android requires a patched clojure still, doesn't it? |
| 10:34 | rhickey | what's wrong with (seq x) ? |
| 10:35 | rhickey | the whole point of allowing an open set of values for truth is to allow for functions with a boolean nature to return something more useful than 'true' |
| 10:35 | rhickey | but they won't end in ? |
| 10:35 | rhickey | all the auto-seqing is lulling people into believing everything is a seq - it's not |
| 10:36 | Chouser | I like (if (seq coll)) |
| 10:36 | cemerick | Chouser: :-P |
| 10:36 | rhickey | if-let (s [(seq coll)] ...) is going to be an important idiom - seq is no longer free |
| 10:37 | Chouser | taking out auto-seq is a new desire, post lazy-seq? |
| 10:37 | cemerick | rhickey: nothing's wrong with (seq x), but if you're really checking for whether a collection is empty or not, then it's far more readable (IMO) to use empty?, as it's explicit in its purpose |
| 10:38 | rhickey | cemerick: empty? is there |
| 10:38 | rhickey | but loses information |
| 10:38 | rhickey | seq will pull the inner seq out of a lazy seq |
| 10:39 | cemerick | it's not like I'm doing stuff like (if (nil? (some-fn ..))) or somesuch. Returning useful values from fns which can also double as a boolean indication is obviously a Good Thing. |
| 10:39 | rhickey | cemerick: that's what seq does |
| 10:39 | cemerick | rhickey: FWIW, I'm not advocating for *anything* right now. Just blowing hot air. :-) |
| 10:40 | rhickey | Chouser: I'm not seriously proposes removing auto-seq from first/rest |
| 10:41 | Chouser | I'm not surprised. But you didn't even want to pre-lazy-seq, did you? |
| 10:42 | cemerick | I guess I don't have a coherent argument as to where and when I use empty? vs. (seq x). e.g. I know that I often use a bare (if some-seq ...) if I know that some-seq is a seq already |
| 10:43 | Chouser | I prefer (if (empty? coll)) over (if-not (seq coll)) |
| 10:44 | rhickey | Chouser: there's a lot of convenience to auto-seq, but I'm not confused about seqs, nor do I want to try to make them fit into some preconceived notion of collection APIs. I really like (seq x), it says and does a lot compactly, but yes, you have to learn what it means |
| 10:46 | rhickey | if you say (if (empty? coll) foo (do-something-with (first coll) ... (rest coll)) your code will be slow with lazy seqs |
| 10:46 | Chouser | hm, good point. That was a pattern I'd used when seq was cheap. |
| 10:47 | cemerick | rhickey: that's interesting. |
| 10:47 | cemerick | sure to be a tripwire |
| 10:47 | rhickey | better (if you want empty?): (let [s (seq coll)] (if (empty? s) foo (do-something-with (first s) ... (rest s))) |
| 10:47 | Chouser | I do believe I've not used it at all in my lazy-seq conversions. |
| 10:47 | rhickey | first and rest are a seq API after all |
| 10:48 | rhickey | core provides idiomatic examples, people just resist the idioms rather than try to understand what is being accomplished by unifying lazy/eager sequences |
| 10:49 | Chouser | shoover`: yes, so you can answer my questions tonight |
| 10:49 | rhickey | cemerick: the code will work, jut not as fast |
| 10:49 | shoover` | Chouser: about that... you're not allowed to ask questions |
| 10:50 | cemerick | rhickey: sure -- in a twisted sort of way, that's worse though. Nothing to be done about it, we'll just have to keep learning. |
| 10:50 | Chouser | (if-let [[f && r] coll] (do (something f) (recur r)) done) |
| 10:51 | rhickey | Chouser: most recurs are better with & and next I think |
| 10:51 | Chouser | that should be ok, right? an extra first/rest (and therefore extra seq) on the terminal case |
| 10:51 | Chouser | rhickey: hm. |
| 10:52 | pilkarn | Chouser: didn't someone get a hello world running on the simulator? |
| 10:52 | Chouser | pilkarn: yes, with a (slightly) patched Clojure. |
| 10:53 | Chouser | pilkarn: I mention that because i think (though IANAL) that any *changes* to clojure would have to be released open source. But you could then build that changed version and your own code into a binary-only android app and sell it. |
| 10:54 | cemerick | the "slight patch" is to remove the bytecode generating classloader, yes? |
| 10:54 | Chouser | cemerick: I thought it was just to remove the 'bean' fn |
| 10:54 | pilkarn | Chouser: ok but making the surce code available I don't think is a problem for Andrid apps, users probably wn't know or bother compiling their own apps. |
| 10:54 | Chouser | pilkarn: sure |
| 10:55 | cemerick | oh, is that all? I thought rhickey said that although AOT compiled clojure doesn't generate bytecode at runtime, it still somehow depends on that classloader, which causes issues (in osgi, for example)? |
| 10:55 | cemerick | ...and android, I assumed |
| 10:56 | Chouser | that classloader is instantiated on demand, so as long as none of your compiled code demands it you're ok at least for applets, and I think android as well. |
| 10:58 | cemerick | Chouser: OK, then I must be misreading this from last December (or maybe things have improved since then): http://groups.google.com/group/clojure/browse_frm/thread/d8a73d4c124bc8f6/935a9d0ab98e3541 |
| 11:01 | AWizzArd | anyone here who has used JSwat+Clojure with success? |
| 11:01 | Chouser | cemerick: yes, improved since then: http://code.google.com/p/clojure/source/detail?r=1201 |
| 11:02 | cemerick | I'll catch up one of these days. :-) |
| 11:03 | Chouser | that was one of those famous swank-breaking changes. |
| 11:07 | cemerick | that there is a public service |
| 11:09 | nroling | Anybody have any ideas on the best way to do the following? I'm using CouchDB to store documents as JSON, and Apache FOP to create PDFs from XML. |
| 11:09 | nroling | I need to translate the JSON to XML one way or another. Ideas? |
| 11:10 | Chouser | If only there were a more convenient API for creating PDFs... |
| 11:11 | nroling | Chouser: I'm all ears |
| 11:11 | nroling | Just don't say LaTeX :-) |
| 11:15 | shoover` | nroling: you could use clojure-json to parse the documents into clojure data structures and then some libraries from clojure.contrib to generate xml |
| 11:17 | pilkarn | actually, since Clojure generates Java-code, it couldn't be a problem right? How does Clojure-generated Java-code look? A cllass with a bunch of static methods? |
| 11:18 | Chouser | a class with a bunch of nested classes |
| 11:18 | cooldude127 | does clojure generate java code or java byte-code? |
| 11:19 | Chouser | byte code |
| 11:19 | cooldude127 | that's what i thought |
| 11:19 | cooldude127 | there's a difference |
| 11:19 | nroling | shoover`: Looks like lazy-xml might work, thanks. |
| 11:22 | rhickey | back to (not-)empty?, I think it would be best, if you want the terminal test first, to come up with a macro that: binds a local to (seq coll) and does the inverted if: (let-seq-and-test-empty [s coll] (empty-case) (something-case s)), name needs work obviously :) |
| 11:23 | gnuvince | Does Mark Engelberg hang in this channel? |
| 11:26 | nroling | If I include clojure.contrib.jar on my classpath, shouldn't (all-ns) include the contrib namespaces? |
| 11:26 | Chouser | no, you still have to 'require' the ones you want. |
| 11:27 | nroling | Chouser: Got it, thanks. |
| 11:46 | pilkarn | so can someone post an example of how to remove the classloader? |
| 11:47 | Chouser | pilkarn: I don't think it needs to be removed. If you search the google group I believe you can find a description of commenting out the bean defn to get android working. |
| 11:49 | gnuvince | Does test-is work with the new trunk? |
| 11:49 | gnuvince | (run-tests) seems to just be hung |
| 12:01 | danlarkin | gnuvince: problem with your tests? Mine passed okay |
| 12:04 | gnuvince | danlarkin: ah, I'd forgotten to recreate the clojure-contrib.jar |
| 12:06 | wabash | Im looking at Real World Haskell, and think it's a great book. Is there something similar for Clojure yet? |
| 12:07 | gnuvince | wabash: there's Programming Clojure (http://www.pragprog.com/titles/shcloj/programming-clojure) that's gonna be out soon |
| 12:07 | gnuvince | The beta PDF is already available |
| 12:07 | albino | has he updted it to match the latest language changes? |
| 12:09 | WizardofWestmarc | everything except lazy |
| 12:09 | WizardofWestmarc | but lazy is coming before the book goes paper supposedly |
| 12:09 | wabash | gnuvince: Awesome |
| 12:09 | wabash | thank you. |
| 12:12 | drewr | AWizzArd: "Success" is relative. |
| 12:12 | drewr | I got it to run and I poked around. |
| 12:13 | technomancy | cooldude127: I found a problem in clojure-test-mode that I'm not sure how to deal with. |
| 12:13 | jbondeson | finally found the form that swank-clojure is failing on. |
| 12:13 | technomancy | if you define a test and then remove it, clojure doesn't realize it's gone |
| 12:13 | jbondeson | course it happens to be swank/swank-require |
| 12:13 | technomancy | it will continue to highlight it |
| 12:14 | technomancy | jbondeson: did you see that jochu pushed something last night to swank-clojure? |
| 12:14 | jbondeson | yeah, he did the first part |
| 12:14 | jbondeson | i forked off of that, and changed rest to next |
| 12:15 | jbondeson | and am looking to fix this exception and the broken contrib packages |
| 12:15 | technomancy | great |
| 12:19 | jbondeson | it's looking for a swank.commands.contrib.swank-presentations which isn't in contrib, any ideas? |
| 12:20 | jbondeson | hmmm... |
| 12:20 | cooldude127 | technomancy: hmm that's strange |
| 12:21 | jbondeson | swank-presentations is in slime |
| 12:22 | technomancy | cooldude127: no, it makes total sense. |
| 12:23 | technomancy | when you remove a deftest from the file, it doesn't undefine it in clojure |
| 12:24 | technomancy | jbondeson: well not everything has been ported; that's always been the case. still strange why it wasn't complaining about missing that earlier |
| 12:25 | cooldude127 | technomancy: what do we do about that then? |
| 12:26 | technomancy | cooldude127: no idea. maybe undef everything in the namespace before we load the file |
| 12:26 | nroling | Does anyone know of a clojure lib with a more compact representation of xml? {:tag :attrs :content} gets ugly fast... |
| 12:27 | jbondeson | technomancy: may be a red herring, i basically put print messages down the call stack to see where errors were being generated. |
| 12:28 | cooldude127 | technomancy: that sounds like trouble tho |
| 12:29 | technomancy | cooldude127: better then: we alter the metadata for every var to remove the :test entry. then we reload the file. |
| 12:29 | technomancy | I don't know how to undef vars anyway. |
| 12:30 | technomancy | jbondeson: right; it's entirely possible that error wasn't affecting usage before. have you tried rolling back and comparing your results to pre-lazy results? |
| 12:30 | AWizzArd | drewr: yes, with JSwat you mean? Same here |
| 12:30 | jbondeson | technomancy: not yet. |
| 12:31 | technomancy | might be worth a shot |
| 12:31 | AWizzArd | I set some breakpoints in loaded code files after attaching a session, and sometimes they do work, sometimes not. The won't work for example when I put them on a defn or on the doc string. |
| 12:36 | technomancy | danlarkin: hey, are you still looking for a name? |
| 12:36 | danlarkin | technomancy: yes |
| 12:36 | technomancy | I came up with one yesterday that I don't think I'm going to use. |
| 12:36 | technomancy | how about "calamity"? |
| 12:36 | technomancy | it has the c and l sounds |
| 12:37 | technomancy | and it also sounds dangerous |
| 12:37 | silkarn | Chouser: where is the bean fn? |
| 12:37 | danlarkin | hahah |
| 12:37 | technomancy | but it does have negative connotations. |
| 12:37 | danlarkin | ~source bean |
| 12:37 | danlarkin | silkarn: ^ |
| 12:37 | danlarkin | technomancy: yeah I donno, is it too "bad news" sounding? |
| 12:37 | technomancy | danlarkin: you'd have to find a way to put some positive spin on it. |
| 12:38 | technomancy | I'm not sure how that would work. but the name has a ring to it. |
| 12:38 | technomancy | take it or leave it. =) |
| 12:38 | danlarkin | I appreciate you thinking of me :-o |
| 12:39 | technomancy | I think naming your project in a self-deprecating way subverts people making fun of it. For instance, with git, when people say "git is so stupid!" it's like, "well, yeah... that's what it's called." |
| 12:54 | cooldude127 | technomancy: any progress in the 20 minutes i've been gone? |
| 12:54 | technomancy | nope, haven't touched it |
| 12:54 | cooldude127 | boooo |
| 12:55 | technomancy | we've got some deadlines at work today; probably won't be able to hack on it much |
| 12:55 | technomancy | considering delegating it to you. =) |
| 12:55 | cooldude127 | honestly it's not that big a deal to me, since it's rare that i completely remove a function |
| 12:55 | cooldude127 | oh this is outside my knowledge |
| 12:55 | technomancy | what about renaming though? |
| 12:55 | technomancy | it's the same thing |
| 12:55 | cooldude127 | i'm so confused by all of this |
| 12:56 | cooldude127 | technomancy: hmm, true, but the thing is, the old tests will still work with the old renamed function |
| 12:56 | technomancy | cooldude127: yeah, but they'll have the line numbers of the old function |
| 12:56 | technomancy | so it will overlap with the new one |
| 12:56 | cooldude127 | well, my overlays still aren't showing up, so i forgot about that |
| 12:56 | technomancy | wait, they consistently don't show up? |
| 12:56 | technomancy | hmm... I guess that's more important to fix. =\ |
| 12:56 | cooldude127 | idk, haven't seen any today |
| 12:57 | technomancy | actually... I think I know the fix. just need to clear the test metadata in the same place as the status metadata |
| 12:57 | cooldude127 | oh |
| 12:57 | cooldude127 | but yeah, at the moment your package is doing nothing for me |
| 12:57 | technomancy | bleh |
| 12:58 | cooldude127 | all C-c C-, does that i can see is run the file |
| 13:00 | technomancy | well I guess that's more important |
| 13:00 | cooldude127 | technomancy: yeah i just have no idea why |
| 13:01 | technomancy | oh... I think I know part of the problem. |
| 13:01 | cooldude127 | do tell |
| 13:01 | technomancy | it's the async-ness |
| 13:01 | cooldude127 | why? |
| 13:01 | technomancy | in run-tests, it calls clear |
| 13:02 | technomancy | but it sends that off and doesn't wait for it to return before loading the file |
| 13:02 | technomancy | and running the tests |
| 13:02 | cooldude127 | are you saying it's a race condition? |
| 13:02 | technomancy | yeah |
| 13:02 | technomancy | we need to chain together callbacks, I guess |
| 13:02 | cooldude127 | that sounds right |
| 13:02 | technomancy | lemme check in what I've got, then I have to head into a meeting |
| 13:03 | technomancy | pushed |
| 13:04 | cooldude127 | lol i had literally just pulled when you updated it, so i had to do it again |
| 13:32 | gnuvince | What's the procedure to submit a patch to clojure-contrib? |
| 13:33 | technomancy | gnuvince: bring it up on the mailing list, then create a google code issue if it's deemed appropriate. |
| 13:33 | gnuvince | ok |
| 13:33 | technomancy | and make sure you've got a contribution agreement signed |
| 13:33 | gnuvince | I don't |
| 13:33 | gnuvince | Required for clojure-contrib? |
| 13:33 | technomancy | yeah, it is |
| 13:34 | gnuvince | ok |
| 13:38 | te | lol at the end of the SICP it says: "Start over again, this time with more information" |
| 13:38 | cooldude127 | they aren't kidding, you get more out of it the more you know :) |
| 13:38 | technomancy | it's recursion in action! |
| 13:39 | te | Yeah I'm actually taking the same tack with "Programming Clojure" |
| 13:39 | te | I am reading it front-to-back, then re-reading it |
| 13:41 | pilkarn | sicp is awesome i dont get how people cant like it if they are really interested in learning to program |
| 13:41 | pilkarn | then they must have bought with the wish to learn to code a bad webapp in 3days |
| 13:45 | pilkarn | are refs slower than accessing a def-ed variable that isn inside a ref? |
| 13:46 | technomancy | a little bit, since a call to deref is involved |
| 13:46 | te | how do i make sure clojure-contrib is loaded? |
| 13:46 | te | it's not showing up in autocomplete in emacs |
| 13:47 | technomancy | te: did you set swank-clojure-extra-classpaths? |
| 13:48 | te | yes |
| 13:48 | te | (setq swank-clojure-extra-classpaths '("~/src/clojure-contrib/clojure-contrib.jar")) |
| 13:48 | cooldude127 | te: try importing something :) |
| 13:48 | cooldude127 | er...using something |
| 13:48 | technomancy | yeah, could be an autocomplete problem |
| 13:51 | te | pardon my ignorance |
| 13:51 | te | but how do i do that |
| 13:52 | technomancy | (use 'clojure.contrib.duck-streams) |
| 13:52 | te | returns nil |
| 13:52 | te | which is good, right? |
| 13:53 | Chousuke | yes |
| 13:53 | te | god im such a noob |
| 14:13 | stuhood | is there a way to recursively compile .clj files AOT? |
| 14:14 | Chouser | compile should follow :require and :use clauses, building things recursively that way |
| 14:14 | stuhood | gotcha. |
| 14:15 | stuhood | but i have a compile ant task like the one defined in Clojure's build.xml |
| 14:15 | stuhood | do i need to define all of the top-level libraries manually? |
| 14:16 | kotarak | stuhood: If the .class is newer than the .clj, it is not recompiled. I would specify all namespaces in the compile task. More robust against changes.... |
| 14:16 | stuhood | so: clojure.lang.Compile com.example.util com.example.paths ... |
| 14:17 | stuhood | kotarak: alright, thanks... i guess i'm just used to giving javac a source directory, and having it build everything it contains |
| 14:38 | pilkarn | (File. "C:/Users/saftarn/Desktop/mp3s/Timbuktu-Oberoendeframkallande/01-pretjafs-cta.mp3") |
| 14:38 | pilkarn | "))\n(File. " |
| 14:38 | pilkarn | user=> java.lang.Exception: Invalid token: C:/Users/saftarn/Desktop/mp3s/Ti |
| 14:38 | pilkarn | mbuktu-Oberoendeframkallande/01-pretjafs-cta.mp3 |
| 14:38 | pilkarn | why? |
| 14:40 | kotarak | pilkarn: there is a spurious " somewhere in the repl input. |
| 14:40 | cooldude127 | is there a nice convenient way to call a function with a number of args, and let it just ignore any extra ones? |
| 14:41 | danlarkin | add & _ to the end of your parameter list :) |
| 14:41 | cooldude127 | danlarkin: is there a way that preserves the original function? |
| 14:42 | tashafa | dunno if this is the right way of doing it but... |
| 14:42 | danlarkin | I guess you could write a wrapper that checks the arglists of the function it's wrapping |
| 14:42 | Chouser | the arglists isn't guaranteed to be machine readable, I think. |
| 14:43 | tashafa | sorry just aswred my own question |
| 14:43 | cooldude127 | Chouser: looks like lisp structures |
| 14:43 | tashafa | by writing the question |
| 14:44 | Chouser | (,(:arglists ^#'defn) |
| 14:44 | Chouser | ,(:arglists ^#'defn) |
| 14:44 | clojurebot | ([name doc-string? attr-map? [params*] body] [name doc-string? attr-map? ([params*] body) + attr-map?]) |
| 14:44 | cooldude127 | Chouser: ok is it a bad sign when i have var that is a function that has no arglists key in its meta data |
| 14:45 | cooldude127 | oh wait i know why, it's def'd to the symbol? function |
| 14:45 | cooldude127 | this seems like a bad idea |
| 14:46 | danlarkin | yeahhh, it probably is |
| 14:47 | cooldude127 | well it looks disgusting to have all these function wrappers cuz some of them need the extra arg, but a lot of them don't and are used in other places |
| 14:47 | danlarkin | and you don't want to have them all take & _ ? |
| 14:47 | cooldude127 | i'd prefer not to do that |
| 14:48 | technomancy | yay, jochu is back in action |
| 14:48 | cooldude127 | sweet |
| 14:52 | cooldude127 | alright i just created a function that makes a new fn that ignores the arg |
| 14:52 | cooldude127 | got rid of the boilerplate |
| 14:54 | pilkarn | (throw java.lang.IllegalArgumentException) <- whats wrong with that syntax? |
| 14:54 | gnuvince | technomancy: I got an issue with clojure-mode: delete-trailing-whitespace kills the trailing commas too. |
| 14:54 | Chouser | pilkarn: you giving throw a class, and it wants an instance |
| 14:54 | gnuvince | pilkarn: (throw (IllegalArgumentException. "Hi")) |
| 14:56 | technomancy | gnuvince: well, it works as advertised. =) |
| 14:57 | gnuvince | technomancy: is there something that can be done? |
| 14:58 | gnuvince | Or is it too ingrained? |
| 15:26 | pilkarn | how do I create an event-function? Like I play an mp3 in a separate thread and when it finishes I want to do something. Right now I'm using polling which works fine but isn't very elegant. Can I use an event-based action somehow? |
| 15:32 | cooldude127 | pilkarn: where you play the mp3, pass a callback function, and after the mp3 finishes, call the function you passed |
| 15:32 | cooldude127 | assuming the playing of the mp3 blocks |
| 15:32 | technomancy | gnuvince: I'm not sure; I haven't looked into the details of the syntax table |
| 15:33 | technomancy | gnuvince: the problem is that whitespace is whitespace |
| 15:33 | technomancy | you don't want it treated as non-whitespace for other purposes, I think |
| 15:33 | gnuvince | technomancy: ok |
| 15:34 | gnuvince | I was editing a file, and I noticed it was changed in places I didn't touch |
| 15:36 | technomancy | that happens all the time with delete-trailing-whitespace |
| 15:37 | technomancy | it's generally a bad idea to use it at the same time as you're editing |
| 15:37 | technomancy | you want to separate out cleanup commits from functionality commits |
| 15:44 | Bracki | How do you debug your clojure code? |
| 15:44 | cooldude127 | Bracki: REPL |
| 15:45 | technomancy | Bracki: test-is |
| 15:45 | cooldude127 | Bracki: debuggers are fun, but i don't know to use one with clojure |
| 15:45 | cooldude127 | Bracki: oh yeah, test-is also |
| 15:45 | cooldude127 | very good stuff |
| 15:45 | Bracki | Well do you sprinkle echos everywhere? |
| 15:46 | technomancy | using a debugger is a good sign that you either 0) need a better test suite or 1) are doing rhickey's job |
| 15:46 | hiredman | technomancy: that depends on the kind of code you are writing |
| 15:47 | hiredman | the code may do what you want fine |
| 15:47 | hiredman | (i.e. pass the tests) |
| 15:47 | hiredman | but is just too slow, so you want to see why |
| 15:47 | hiredman | or uses to much heap, or whatever |
| 15:48 | technomancy | that's true; it can be helpful for optimization I guess. |
| 15:49 | durka42 | http://www.qtsoftware.com/about/news/preview-of-final-qt-jambi-release-available |
| 15:49 | cooldude127 | Bracki: usually you don't need a ton of echoes if you've broken your code down enough into smaller functions |
| 15:49 | hiredman | actually in that case you'd want a profiler |
| 15:49 | cooldude127 | Bracki: cuz then you can just test the results of each functions individually |
| 15:49 | hiredman | which, uh, apparently a lot of people are using YourKit for profiling |
| 15:50 | hiredman | durka42: brilliant |
| 15:50 | durka42 | ,(+ 2 (doto 3 prn)) |
| 15:50 | clojurebot | 5 |
| 15:50 | clojurebot | 3 |
| 15:51 | Chouser | durka42: that *is* brilliant |
| 15:51 | lisppaste8 | bracki pasted "find-graph" at http://paste.lisp.org/display/75813 |
| 15:51 | durka42 | i think i stole it from rhickey :p |
| 15:51 | durka42 | i had come up with (do (prn value) value) |
| 15:51 | hiredman | playing with zippers I use "->" so I always want to examine something from the middle of the pipe |
| 15:52 | durka42 | apparently qt-jambi is going the way of the dodo |
| 15:52 | Bracki | The find-graph function I pasted is obviousl broken. But no idea where. |
| 15:52 | Bracki | It looks good to me. |
| 15:52 | hiredman | ,(-> \a (doto prn) int) |
| 15:52 | clojurebot | 97 |
| 15:52 | clojurebot | \a |
| 15:53 | cooldude127 | Bracki: that first (conj path start) doesn't do anything |
| 15:53 | hiredman | datastructures in clojure are immutable |
| 15:54 | Chouser | durka42: what's that about jambi? |
| 15:54 | durka42 | see above link |
| 15:54 | hiredman | so conj does not change a ds, it produces a new ds |
| 15:54 | Chouser | oh |
| 15:54 | Bracki | So I need to let right. |
| 15:54 | cooldude127 | Bracki: you need to rethink how to do this immutably |
| 15:54 | Chouser | yikes |
| 15:55 | Chouser | I wonder if a community will pick it up, or if it's all done. |
| 15:55 | cooldude127 | for example, conj returns a new list instead of changing the old one |
| 15:55 | Bracki | I've tried that for the last two evenings and couldn't come up w/ anything usable. |
| 15:55 | cooldude127 | or a new set or whatever |
| 15:55 | Chouser | When they announced jambi, I thought it was a weird choice and didn't have any reason to like Java. Sounded dumb. |
| 15:55 | cooldude127 | Bracki: btw, why is your path a set? shouldn't the path be in order? i don't think sets preserve order |
| 15:55 | Chouser | Now I'm all about JVM and hate to see Qt walking away. |
| 15:56 | cooldude127 | Bracki: you probably want a vector |
| 15:56 | durka42 | well, they intend to release it... as you said remains to be seen if anyone will keep it alive |
| 15:57 | WizardofWestmarc | that's kinda sad, I'd been looking at using Jambi as my UI lib for clojure |
| 15:57 | Lau_of_DK | Good evening gents |
| 15:58 | technomancy | well when I first read about jQuery I ignored it because I thought it was for Java. |
| 15:58 | tashafa | technomancy: ha |
| 15:58 | cooldude127 | haha |
| 15:59 | WizardofWestmarc | technomancy: heh really? |
| 15:59 | technomancy | well I didn't exactly research the topic thoroughly |
| 15:59 | WizardofWestmarc | javascript is actually next on my list of stuff to learn right now, because of jQuery |
| 15:59 | technomancy | jQuery is awesome |
| 16:00 | WizardofWestmarc | technomancy: you listen to the interview with Resig on FLOSS weekly? |
| 16:00 | technomancy | javascript is really close to being awesome... just enough warts to drive you crazy |
| 16:00 | technomancy | WizardofWestmarc: no, link? |
| 16:00 | WizardofWestmarc | sec |
| 16:00 | durka42 | awesomeness seconded |
| 16:00 | WizardofWestmarc | http://twit.tv/floss55 |
| 16:01 | WizardofWestmarc | really good stuff |
| 16:01 | tashafa | one of the best documented libraries out there |
| 16:01 | WizardofWestmarc | also brings up processing.js |
| 16:01 | WizardofWestmarc | ~an hour but interesting stuff I thought |
| 16:01 | clojurebot | Gabh mo leithsc�al? |
| 16:01 | WizardofWestmarc | doh forget the 'bot reacts to ~ |
| 16:02 | tashafa | question... |
| 16:03 | durka42 | yes? |
| 16:03 | tashafa | im trying to write a macro that defines a set of functions using a seq as the macro's argument |
| 16:03 | tashafa | so if the argument of the macro contains 3 items it would defn 3 different functions |
| 16:03 | tashafa | is this possible? |
| 16:04 | cooldude127 | tashafa: sounds simgle enough |
| 16:04 | tashafa | im almost there |
| 16:04 | WizardofWestmarc | remember you can execute code in the macro |
| 16:04 | WizardofWestmarc | so you'd just loop through your seq generating all the def/defns/etc |
| 16:04 | tashafa | yup |
| 16:05 | cooldude127 | tashafa: macro writing tip: first write what the macro should look like when you call it (an example use), then write what code that should turn into |
| 16:05 | tashafa | im using a doseq but and it return nil |
| 16:05 | hiredman | erm |
| 16:05 | tashafa | it works when I pass in an item |
| 16:05 | tashafa | (i.e I remove the doseq) |
| 16:06 | cooldude127 | tashafa: if i were you i'd probably use something like map |
| 16:06 | tashafa | but when i add the doseq and pass a collection of items it return nil but the functions are not defined |
| 16:06 | hiredman | doseq always returns nil |
| 16:06 | durka42 | trying to map defn might not work so great |
| 16:06 | cooldude127 | `(do ~@(map (fn [x] `(defn ~x ...)))) |
| 16:06 | hiredman | and returning nil from a macro is almost never what you want |
| 16:07 | tashafa | yup i figured as much... |
| 16:08 | tashafa | it returns the defined function when i pass in an item from the seq (removing the doseq in the macro) |
| 16:08 | tashafa | but i need it to work on a collection of items |
| 16:08 | cooldude127 | tashafa: you see what i posted? |
| 16:08 | tashafa | yup trying that right now |
| 16:08 | cooldude127 | kk |
| 16:08 | tashafa | will get back to you |
| 16:08 | cooldude127 | idk exactly what you're so it might not work perfectly, but that's the idea |
| 16:10 | tashafa | need to go to a meeting right now |
| 16:10 | tashafa | but brb with the results |
| 16:10 | cooldude127 | kk |
| 16:21 | cemerick | wow, that was a quick flash in the pan for jambi |
| 16:21 | Bracki | Is there a way to find out more about raised exceptions? |
| 16:22 | durka42 | (use 'clojure.contrib.stacktrace) |
| 16:22 | durka42 | (print-cause-trace (e)) |
| 16:22 | Bracki | can I do that in the repl |
| 16:22 | hiredman | you can do everything in the repl |
| 16:22 | Bracki | How do I access the last thrown execption? |
| 16:23 | technomancy | *e |
| 16:24 | hiredman | ,(pl inc $ inc $ inc $ 0) |
| 16:24 | clojurebot | 3 |
| 16:25 | pilkarn | map+filter is lazy right? so it is 1*N not 2*N? |
| 16:27 | pilkarn | cooldude127: the problem is it seems from prior expreicences the callback will be called immediately and not after the song is finsihed. to find out when it is finsihed id still need a pollingthread then no? |
| 16:27 | pilkarn | , (do (:import (haskell [ghc :as g])) (g/foldr (+) 0 [1 2 3])) |
| 16:27 | clojurebot | java.lang.Exception: Unable to resolve symbol: haskell in this context |
| 16:27 | cooldude127 | pilkarn: if it's async and has no facility to pass a callback then yes |
| 16:28 | pilkarn | cooldude127: so can I force sync then? |
| 16:28 | cooldude127 | i don't think so |
| 16:28 | cooldude127 | if it doesn't block, i don't know how to make |
| 16:28 | cooldude127 | it |
| 16:29 | hiredman | if all the api you using provides is a poll, you are stuck polling |
| 16:33 | Bracki | java.lang.ClassCastException: clojure.lang.LazyCons cannot be cast to clojure.lang.IFn <- what does that tell me? |
| 16:34 | cooldude127 | Bracki: you're treating a list as a function |
| 16:34 | cooldude127 | or actually more like a seq as a function |
| 16:34 | cooldude127 | but still bad |
| 16:34 | cooldude127 | Bracki: care to share the code that causes it? |
| 16:35 | hiredman | clojurebot: latest? |
| 16:35 | clojurebot | latest is 1295 |
| 16:35 | lisppaste8 | bracki annotated #75813 "untitled" at http://paste.lisp.org/display/75813#1 |
| 16:35 | cooldude127 | extra paren around the (for) |
| 16:36 | clojurebot | svn rev 1296; added clojure.core/*source-path* |
| 16:36 | Bracki | cooldude127: More or less? |
| 16:36 | cooldude127 | Bracki: you have an extra |
| 16:36 | cooldude127 | Bracki: (for) creates a seq, that extra paren around it means you're trying to call that seq as a function |
| 16:37 | cooldude127 | Bracki: btw, you're still gonna run into trouble here. those ifs at the beginning are pointless |
| 16:37 | Bracki | Hm, no the code is back to just returning nil. I don't seem to understand the evaluation model. |
| 16:37 | cooldude127 | Bracki: you have nil at the end |
| 16:37 | cooldude127 | it returns the value of the last expression |
| 16:37 | cooldude127 | always |
| 16:38 | cooldude127 | you can't return early |
| 16:38 | Bracki | hm. |
| 16:38 | cooldude127 | give me a sec, let me try to sort of rewrite what you have in a more functional style |
| 16:39 | cooldude127 | just to give you an idea of the way it should be |
| 16:39 | Bracki | It's a port from here: http://www.python.org/doc/essays/graphs.html |
| 16:39 | pilkarn | is there a deep-flatten function in clojure already? |
| 16:54 | Lau_of_DK | Anybody here interested in the JMonkeyEngine? |
| 16:55 | pilkarn | is there a function for randin an int? |
| 16:57 | leadnose_ | Lau_of_DK, what about it? |
| 16:57 | leadnose_ | I've fiddled with it a bit |
| 16:57 | leadnose_ | in java though |
| 16:58 | Lau_of_DK | leadnose_: I made a Clojure port, just wondering if anybody was interested |
| 16:58 | leadnose_ | oh, cool, have a link for it? |
| 16:59 | Lau_of_DK | No, I didnt upload it yet, because I didnt know if it had any interest - Ive only recently been attracted to game development because my 2-year-old had a blast changing screensavers on my laptop, but I realize that its an unique experience :) |
| 17:00 | danlarkin | a port? or a wrapper |
| 17:00 | technomancy | at the risk of stating the obvious: games are fun |
| 17:00 | Lau_of_DK | danlarkin: Bindings would probably be the word |
| 17:02 | lisppaste8 | cooldude127 annotated #75813 "functional and working find-path" at http://paste.lisp.org/display/75813#2 |
| 17:02 | cooldude127 | Bracki: there is the first working version |
| 17:04 | cooldude127 | not ideal, but it works |
| 17:05 | tashafa | cooldude127: you are a the coolest! |
| 17:05 | cooldude127 | thank you |
| 17:05 | tashafa | worked on the first try |
| 17:05 | cooldude127 | Bracki: this actually should probably be split up into two separate functions |
| 17:06 | tashafa | cooldude127: no thank you |
| 17:06 | tashafa | time to drink |
| 17:06 | cooldude127 | lol |
| 17:06 | cooldude127 | tashafa: were you in need of this code or just applauding my work? |
| 17:06 | Bracki | cooldude127: thx nice one. |
| 17:07 | tashafa | both |
| 17:07 | Bracki | Would have never come up with this. |
| 17:07 | tashafa | cooldude127: both |
| 17:07 | cooldude127 | Bracki: let me give you a new version that does a better separation |
| 17:07 | cooldude127 | this function has gotten too big |
| 17:09 | Bracki | I previously had a look at the documentation for loop, but that left me completely clueless. |
| 17:09 | cooldude127 | Bracki: loop was important here because a for doesn't allow you to prematurely terminate |
| 17:10 | Bracki | and what's the [node & nodes] part? |
| 17:11 | cooldude127 | Bracki: destructuring. binds node to the first element and nodes to the rest |
| 17:13 | Bracki | Aight. |
| 17:13 | cooldude127 | Bracki: and you understand that everytime you call recur, it rebinds node and nodes based on what you pass it? |
| 17:14 | Bracki | Ok then nodes is restructed again etc. |
| 17:15 | cooldude127 | yeah |
| 17:15 | Bracki | The whole and not set part seems complicated. |
| 17:15 | cooldude127 | Bracki: yeah i'm trying to find a nicer way to write that |
| 17:16 | cooldude127 | Bracki: do you have clojure-contrib setup? |
| 17:16 | Bracki | Yes. |
| 17:17 | cooldude127 | Bracki: ok, then i will take advantage of something in there |
| 17:18 | cooldude127 | Bracki: i'm about to go eat, but i'll be back on later with something even better for you |
| 17:19 | Bracki | cooldude127: i'll be off to bet in an hour so. |
| 17:20 | Bracki | but i'll get your stuff somehow. |
| 17:20 | Bracki | bed |
| 17:20 | Bracki | i meant |
| 17:20 | cooldude127 | Bracki: save the link to the paste, i'll annotate it |
| 17:21 | Bracki | thx. |
| 17:36 | lisppaste8 | bracki annotated #75813 "Now using (includes?)" at http://paste.lisp.org/display/75813#3 |
| 17:37 | jwinter | Lau_of_DK: I'd be interested in the clojure bindings for JMonkeyEngine |
| 17:39 | Lau_of_DK | k, gimme 10 minz, I'll GitHub and clean it up...tomorrow :) |
| 17:39 | jwinter | cool, looking forward to it. |
| 17:39 | durka42 | ooh, that looks interesting |
| 17:39 | danlarkin | Lau_of_DK: tomorrow is a slippery slope :) |
| 17:40 | Lau_of_DK | danlarkin: I know - But at least Im uploading today |
| 17:40 | durka42 | at least Lau doesn't have to come up with a name ;) |
| 17:40 | Lau_of_DK | Exactly right |
| 17:40 | durka42 | cljME? |
| 17:41 | technomancy | hehe |
| 17:41 | Lau_of_DK | durka42: This is called Sofiaba :) |
| 17:41 | Lau_of_DK | Its just a raw engine which renders a 3d sphere, which you can toggle between shaded and wireframed |
| 17:41 | Lau_of_DK | But its enough to get someone going with JME in Clojure |
| 17:41 | durka42 | cool cool |
| 17:41 | durka42 | where did sofiaba come from? |
| 17:42 | pilkarn | you can catch runtimeexceptions right? |
| 17:43 | durka42 | sure |
| 17:43 | Lau_of_DK | durka durka: My 2-year-old is called Sofia, she's the one who got me interested in making a game for small kids, like 2 -3, 4-5, 6+. And one of here many nicknames is Sofiaba :) |
| 17:43 | pilkarn | Lau_of_DK: what si the JMonkeyEngine? I'm doing opengl in scheme right now and im generally interested in game dev |
| 17:43 | hiredman | catching exceptions is pretty much the whole point of exceptions |
| 17:43 | durka42 | ~google jmonkeyengine |
| 17:43 | clojurebot | First, out of 6910 results is: |
| 17:43 | clojurebot | jMonkeyEngine.com |
| 17:43 | clojurebot | http://www.jmonkeyengine.com/ |
| 17:44 | Lau_of_DK | pilkarn: http://www.jmonkeyengine.com/ , its a very serious Gaming engine, already used in several impressive productions - It has good performance and is well made, check out the demos/screenshots |
| 17:46 | technomancy | you can tell it's serious because they capitalize Gaming |
| 17:46 | technomancy | =) |
| 17:46 | technomancy | I like the logo. the monkey looks serious. |
| 17:47 | technomancy | wow, that looks like fun |
| 17:48 | Lau_of_DK | Yea |
| 17:48 | Lau_of_DK | Ok, the code is ready, making repo on Github, hang on |
| 17:50 | technomancy | grrr... /me hates zip files that don't create a new subdir |
| 17:51 | jwinter | yea, always unarchive in /tmp/ |
| 17:51 | technomancy | wow, jME totally just crashed X |
| 17:52 | technomancy | haven't seen that happen in a while |
| 17:52 | Lau_of_DK | http://github.com/Lau-of-DK/sofiaba/tree/master |
| 17:52 | technomancy | going to try it again without going fullscreen |
| 17:52 | Lau_of_DK | jwinter: There you go - Have fun, that basically extends BaseGame so that you can run Clojurecode the rest of the way |
| 17:53 | technomancy | huh; none of the demo stuff runs |
| 17:53 | Lau_of_DK | technomancy: Which demo stuff? |
| 17:53 | technomancy | Lau_of_DK: the jMonkeyEngine demos |
| 17:54 | jwinter | Lau_of_DK: thx, will take a look tonight |
| 17:54 | Lau_of_DK | technomancy: Have you got a renderer installed? |
| 17:54 | technomancy | Lau_of_DK: no idea |
| 17:55 | technomancy | just followed the README instructions |
| 17:55 | Lau_of_DK | Get LWJGL and put it in your Library path |
| 17:55 | technomancy | you mean the classpath? |
| 17:55 | Lau_of_DK | no |
| 17:55 | Lau_of_DK | Read my README :) |
| 17:56 | technomancy | oh, I haven't got your stuff yet; just trying the straight jme stuff |
| 17:57 | technomancy | I don't have LWJGL in my package manager, but JOGL is there and is a much less horrible acronym... |
| 17:57 | Lau_of_DK | Thats certainly true |
| 17:57 | Lau_of_DK | JOGL should work also though |
| 17:58 | technomancy | ok, this has bit me before though... apparently for Java just installing a library via apt-get is not enough, right? |
| 17:58 | technomancy | you need to add it to the classpath too? |
| 17:59 | technomancy | at which point you start to wonder why it's even in the package manager in the first place... ugh. |
| 18:01 | Lau_of_DK | You need to set up some things yes, like |
| 18:01 | Lau_of_DK | export LD_LIBRARY_PATH==/custom/path/to/dependencies |
| 18:01 | technomancy | even if you installed via apt-get? that's terrible |
| 18:02 | cooldude127 | Bracki: you still here? |
| 18:02 | Lau_of_DK | I need to hit the sack, input on Sofiaba is most welcome. I hope that over 1 - 2 months, it'll be a fantastically thrilling game for both 2 - 3 year olds, and technomancy :) |
| 18:02 | technomancy | heh |
| 18:02 | Lau_of_DK | technomancy: dunno - I didnt use apt-get for lwjgl |
| 18:02 | technomancy | have fun |
| 18:02 | technomancy | oh, ok |
| 18:02 | Lau_of_DK | u 2 |
| 18:06 | jwinter | technomancy: for jogl, I ended up doing -Djava.library.path=/path/to/jni-files in my clojure bash script |
| 18:07 | jwinter | probly not the cleanest way |
| 18:07 | jwinter | apt-get install on ubuntu didn't take care of that for me. |
| 18:10 | p_l | technomancy: Java spec guys missed the memo |
| 18:10 | hiredman | I think maybe that memo should go to package managers |
| 18:11 | p_l | hiredman: Is there a common way to specify classpath for Java that really works? |
| 18:11 | p_l | Except for modifying CLASSPATH ? |
| 18:11 | jwinter | at least for me, it wasn't the classpath, but whatever you'd call java.library.path |
| 18:12 | durka42 | OS X incantation: java -cp $CLASSPATH:build:/Users/alex/Downloads/lwjgl-2.0.1/jar/lwjgl.jar -Djava.library.path=/Users/alex/Downloads/lwjgl-2.0.1/native/macosx jmetest.TestChooser |
| 18:12 | durka42 | ...so i closed that window, and my screen went blank, flickered in and out a couple of times before coming back |
| 18:12 | durka42 | interesting |
| 18:12 | durka42 | SEVERE: Exception in game loop |
| 18:12 | mattrepl | technomancy: interest in helping to keep up with an issue tracker for swank-clojure? |
| 18:13 | technomancy | mattrepl: sure |
| 18:14 | Bracki | cooldude127: yes |
| 18:14 | technomancy | mattrepl: what are you thinking of? |
| 18:14 | Bracki | technomancy: mire doesn't work on windows. |
| 18:14 | Bracki | the add-classpath stuff in mire.clj does not work. |
| 18:14 | technomancy | Bracki: but... I was told I could write once and run anywhere! |
| 18:14 | technomancy | I've been LIED TO! |
| 18:15 | technomancy | Bracki: oh yeah, I meant to fix that. how are you launching it? |
| 18:15 | Bracki | Yeah the Java trap snapped shut. |
| 18:16 | technomancy | are you launching it via slime, the shell script, or what? |
| 18:16 | Bracki | java -cp ..\jars\clojure.jar;..\jars\clojure-contrib.jar clojure.main mire.clj |
| 18:16 | mattrepl | the simplest possible for letting anyone submit bugs/feature requests. lighthouse would be nice, but think we'd need a paid account if there are more than 2 people working on it. so google code it is unless you have any ideas |
| 18:16 | technomancy | Bracki: you need src/ on the classpath too |
| 18:16 | technomancy | Bracki: looks like I updated it on the branches but not on master yet |
| 18:17 | technomancy | java -cp jars/clojure.jar:jars/clojure-contrib.jar:src/ clojure.main src/mire.clj # from the project root |
| 18:17 | hiredman | well, setting $CLASSPATH works fine |
| 18:18 | technomancy | hiredman: does -cp on the command line add to that or replace it? |
| 18:19 | Bracki | Does not work on Windows because of the crappy backward slashes. |
| 18:19 | hiredman | replaces |
| 18:19 | technomancy | hiredman: well that's not a solution for a package manager then =\ |
| 18:20 | hiredman | the other solution is to wrap java |
| 18:20 | hiredman | (which freebsd already does) in a shell script |
| 18:20 | technomancy | yeah, I've been playing with hashdot, which seems to be a step in the right direction |
| 18:21 | technomancy | it gets rid of the ridiculous ps output too |
| 18:21 | hiredman | but the freebsd script is only setup for switching between multiple versions of java |
| 18:21 | hiredman | not managing the classpath |
| 18:22 | technomancy | it just pains me to see these things cause so many problems, because they have been solved well already. |
| 18:24 | Bracki | technomancy: you shouldnt hardcode the slashes into the mire.clj use File.separator instead. |
| 18:25 | technomancy | Bracki: that stuff doesn't get translated on the fly by the JVM? |
| 18:25 | Bracki | Apparently not. |
| 18:26 | technomancy | Bracki: ok, noted. |
| 18:26 | pilkarn | is there a way to flatten (1 2 3 4 5 6 (7 8 9) (10 11 12)) |
| 18:27 | pilkarn | how do you package for ubuntu? does it have to get approved? |
| 18:27 | pilkarn | is there a god mp3player coming with ubuntu? |
| 18:27 | technomancy | none of mp3 players on ubuntu are deities yet. |
| 18:27 | pilkarn | i have made a really good one in clojure, can I make it available o download a s a apt-get-package? |
| 18:28 | pilkarn | deities == very good? |
| 18:28 | technomancy | pilkarn: deities are gods or godlike beings |
| 18:28 | technomancy | pilkarn: you probably couldn't get it packaged unless clojure is also packaged |
| 18:28 | technomancy | which I suspect would need to wait for a 1.0 release, at least |
| 18:29 | hiredman | that doesn't stop you from making your own .deb |
| 18:29 | hiredman | and distributing that |
| 18:29 | technomancy | true, as long as you made it self-contained |
| 18:29 | hiredman | erm |
| 18:30 | pilkarn | well i did mine to learn clojure and a little java and it can do most what youw ant, save lplaylists, create random playlists, im currently adding trackening listening habits etc |
| 18:30 | pilkarn | what about videoplayers? |
| 18:30 | technomancy | but at that point you might as well put out a tarball I think |
| 18:30 | technomancy | the whole point of making a deb is to handle dependencies and be stored in a repository |
| 18:30 | hiredman | ~google banshee |
| 18:30 | clojurebot | First, out of 5010000 results is: |
| 18:31 | clojurebot | Banshee |
| 18:31 | clojurebot | http://banshee-project.org/ |
| 18:31 | zakwilson | pilkarn: I think getting something distributed with Ubuntu would be easier if it starts to get some popularity... so, convince some people to use it. |
| 18:31 | hiredman | I don't use ubuntu, but I would be surprised if it did not come with some kind of media player |
| 18:31 | zakwilson | I can think of no technical you couldn't bundle Clojure with it and get the whole thing packaged as a .deb with Ubuntu. |
| 18:32 | Bracki | How do I access static members of Java classes? |
| 18:32 | hiredman | I mean, it has gnome, and gnome comes with totem |
| 18:32 | cooldude127 | Bracki: System/out |
| 18:32 | hiredman | Class/member |
| 18:32 | zakwilson | Ubuntu does come with a media player or three, and many more available in the repositories. |
| 18:34 | technomancy | yeah, getting included in the base distribution is virtually out of the question, but you could get it included in the "universe" repository |
| 18:36 | danlarkin | technomancy: duck-streams has a file function that will convert unix or windows style paths into a java.io.File object correctly |
| 18:37 | technomancy | cool |
| 18:37 | Bracki | ,(.java.io.File separator) |
| 18:37 | clojurebot | java.lang.Exception: Unable to resolve symbol: separator in this context |
| 18:37 | Bracki | What's wrong there? |
| 18:37 | hiredman | ,java.io.File/separator |
| 18:37 | clojurebot | "/" |
| 18:37 | technomancy | ,java.io.File/separator |
| 18:37 | clojurebot | "/" |
| 18:37 | hiredman | many things |
| 18:37 | technomancy | oh snap |
| 18:38 | hiredman | ,(. java.io.File separator) |
| 18:38 | clojurebot | "/" |
| 18:38 | hiredman | symbols starting with a . are interpreted as method calls |
| 18:39 | hiredman | using . directly like (. java.io.File separator) is a very archaic style |
| 18:39 | Bracki | ok. |
| 18:40 | hiredman | there are different kinds of syntactic sugar for it |
| 18:40 | slashus2 | What do you all think about complex number support in a language? |
| 18:40 | Bracki | Well off to bed. good night |
| 18:41 | hiredman | slashus2: I don't use complex numbers... |
| 18:42 | slashus2 | I don't really either, but I am sure there are some mathematicians that use them quite often. |
| 18:43 | hiredman | let them who are concerned address those concerns |
| 18:43 | technomancy | rule 1 of programming: don't write code that you aren't going to use. |
| 18:43 | technomancy | ~yagni |
| 18:43 | clojurebot | Huh? |
| 18:44 | technomancy | clojurebot: yagni is You Aren't Going to Need It |
| 18:44 | clojurebot | Ok. |
| 18:50 | ataggart | ~~ |
| 18:50 | clojurebot | No entiendo |
| 18:59 | pilkarn | what kind of features do existing player's have? can they create playlists for you based on your listening habits? can they recommend music for you given what you listen to? |
| 19:04 | technomancy | the killer feature for the one I use is being able to be remotely controlled by external clients |
| 19:05 | technomancy | http://musicpd.org |
| 19:05 | technomancy | you need a huge external database to recommend new music based on listening habits |
| 19:06 | hiredman | technomancy: well, you connect to some kind of external service |
| 19:06 | hiredman | banshee has some kind of plugin for it |
| 19:06 | technomancy | right, yeah. it can be a 3rd-party service |
| 19:06 | technomancy | last.fm, ilike, and pandora come to mind |
| 19:11 | lisppaste8 | pilkarn pasted "playbacklistener, for acllbacks?" at http://paste.lisp.org/display/75827 |
| 19:11 | pilkarn | ^^ is that what I could use for the callback-function? |
| 19:32 | stuhood | if there an equivalent of import java.io.* for the :import directive? |
| 19:32 | danlarkin | heyyyy finally got this stupid project AOT compiling |
| 19:32 | cooldude127 | stuhood: pretty sure that's a no |
| 19:32 | danlarkin | stuhood: no |
| 19:33 | danlarkin | java packages aren't enumerable |
| 19:34 | stuhood | bummer. thanks gang |
| 19:36 | stuhood | actually, Scala does it... it's got to be possible |
| 19:44 | danlarkin | stuhood: please figure out how and post to the group :) |
| 19:49 | technomancy | if you were trying to get someone to try clojure, but they insisted on using an IDE, which would you suggest? |
| 19:49 | technomancy | which has the most mature clojure support? |
| 19:51 | Raynes | technomancy: Netbeans. |
| 19:51 | Raynes | I use it full time. |
| 19:51 | technomancy | enclojure certainly has a better web site than clojure-dev. =) |
| 19:51 | Raynes | It's fine for development right now. |
| 19:51 | technomancy | Raynes: have you tried the Eclipse one too? |
| 19:51 | hiredman | woa, that looks all zoomie and high tech |
| 19:51 | Raynes | Little rough around the edges but it has build and run support which is why I use it. |
| 19:51 | technomancy | ok, thanks |
| 19:51 | Raynes | technomancy: The Eclipse one, dare I say isn't all that great. |
| 19:52 | Raynes | I use Netbeans because of that pretty little "build" button. |
| 19:52 | Raynes | I hate trying to build executable .jars :| |
| 19:52 | technomancy | I haven't gotten that far yet. not looking forward to it. |
| 19:52 | Raynes | But enclojure isn't all that buggy, so it's not going to crash on him or anything. |
| 19:52 | technomancy | seems like a tarball with a shell script can get you a long way though. |
| 19:53 | technomancy | holy crap netbeans has a lot of dependencies |
| 19:54 | blbrown | is (let [] ...) equivalent call to the common lisp (progn ...) |
| 19:54 | technomancy | oh crap; the version with ubuntu looks like it's too old. =\ |
| 19:54 | technomancy | blbrown: CL's progn is clojure's do |
| 19:55 | technomancy | let is let |
| 19:55 | blbrown | crap |
| 19:55 | Raynes | technomancy: It's mostly the Java stuff. |
| 19:55 | hiredman | actually, I hear let is let* |
| 19:55 | technomancy | ah, right |
| 19:56 | blbrown | I guess let in common lisp is a little pointless |
| 19:56 | blbrown | as opposed to just let* |
| 19:57 | technomancy | wow. this is... not fast. |
| 19:57 | Raynes | technomancy: Netbeans is slow as /shit/ |
| 19:57 | Raynes | Always has been always will be. |
| 19:58 | Raynes | I just live with it. |
| 19:58 | Raynes | :| |
| 19:58 | danlarkin | poor java developers don't know what poor tools they're dealing with :-/ |
| 19:58 | Raynes | Eclipse is a bit faster, but not significantly unless you are on rather nice hardware. |
| 19:58 | Raynes | I find them both to be bearable. |
| 19:59 | technomancy | Raynes: there's like seven different versions. which is the smallest that will work for clojure? |
| 19:59 | Raynes | Any. |
| 19:59 | Raynes | Clojure will download it's own dependencys. |
| 19:59 | technomancy | cool |
| 19:59 | Raynes | I used the PHP version. |
| 19:59 | Raynes | Dependencies* |
| 19:59 | Raynes | Enclojure* |
| 20:00 | Raynes | Bah I need sleep. |
| 20:02 | Raynes | It's not going to be as "powerful" as emacs and all that noise but it works great and it's all I need. I just don't have the patience to use Emacs with a JVM language. |
| 20:02 | Raynes | Especially on windows with no other option. |
| 20:02 | pilkarn | is there some good program to draw how a program works, ie execution flow, dependencies etc? |
| 20:02 | technomancy | Raynes: because you're writing a significant amount of Java? |
| 20:02 | cooldude127 | Raynes: i don't have the patience to use Emacs with Java, but for clojure it's the bomb |
| 20:02 | Raynes | technomancy: Zero Java. |
| 20:03 | Raynes | cooldude127: It's my opinion, please people don't start this again. :| |
| 20:03 | pilkarn | god i cant stand eclipse and netbeans, how did they manage to make soemthing so bloated? oh yeah thats right...they used java |
| 20:03 | Raynes | I don't like to use Emacs for any JVM language period, Emacs is fine for those who do, and I use emacs for almost everything else including simple text editing. |
| 20:03 | technomancy | at least the splash screen is nice |
| 20:04 | gnuvince_ | What's the problem with Emacs and JVM languages? |
| 20:04 | Raynes | pilkarn: I agree for Emacs, but I have to say that Eclipse is pretty darn neat. |
| 20:04 | Raynes | I mean. |
| 20:04 | gnuvince_ | I quite like the Clojure integration. |
| 20:04 | Raynes | Netbeans. |
| 20:04 | Raynes | netbeans not emacs, damn I need sleep! |
| 20:04 | Raynes | gnuvince_: Stop it. |
| 20:04 | gnuvince_ | Raynes: I'm seriously asking, I don't want to dissuade you or anything, I'm geniuinely curious |
| 20:05 | technomancy | at least NB 6.5 is not as slow as 6.1 |
| 20:05 | Raynes | "I don't like to use Emacs for any JVM language period, Emacs is fine for those who do, and I use emacs for almost everything else including simple text editing." It's my opinion because I have very esoteric wants and needs. I just don't like using emacs for JVM languages. I like having an IDE so command-line use is kept at a minimum. |
| 20:06 | gnuvince_ | ah, so the integration with ant and stuff? |
| 20:06 | Raynes | And second of all, I'm on windows. That's just too much to bear. I think emacs is the greatest bit of software since Clojure was developed. |
| 20:06 | Raynes | Yes. |
| 20:06 | gnuvince_ | kk |
| 20:06 | gnuvince_ | Emacs on Windows wasn't too shabby last time I tried (EmacsW32 22.something) |
| 20:07 | Raynes | gnuvince_: Sorry for being so insulting, it's just I tend to be chased after with torches and pitchforks in here when I mention I don't like emacs for JVM languages. |
| 20:07 | Raynes | Emacs on windows is fine, it's the command line stuff I don't care for. |
| 20:07 | gnuvince_ | Raynes: I like to suggest it, but I frankly don't care what you use |
| 20:07 | gnuvince_ | (unless it's notepad) |
| 20:07 | gnuvince_ | I personally use both vim and Emacs for different tasks |
| 20:07 | technomancy | how do you open a project in netbeans? |
| 20:08 | Raynes | gnuvince_: Understood, Lau_Of_DK almost called me stupid when I first mentioned it. |
| 20:08 | gnuvince_ | Emacs for Clojure and Haskell, Vim for Django and small edits. |
| 20:08 | Raynes | I use Emacs for Haskell. |
| 20:08 | gnuvince_ | Raynes: Lau_of_DK seems pretty zealous about his tools |
| 20:08 | Raynes | gnuvince_: Top left corner, open project. |
| 20:08 | gnuvince_ | He's on rhickey's case all the time to switch to git |
| 20:08 | technomancy | Raynes: yeah, it just lets me browse through directories, but doesn't let me choose one |
| 20:08 | Raynes | Lau_Of_DK is an asshole quite frankly, I don't like his attitude too much. |
| 20:08 | gnuvince_ | Raynes: you probably meant technomancy |
| 20:08 | Raynes | Yeah, sorry. |
| 20:09 | gnuvince_ | (about the open project thing, not the asshole thing) |
| 20:09 | gnuvince_ | I love you technomancy |
| 20:09 | gnuvince_ | Please keep clojure-mode alive |
| 20:09 | gnuvince_ | kthxbye |
| 20:09 | gnuvince_ | :) |
| 20:09 | technomancy | hehe |
| 20:09 | Raynes | technomancy: File -> new project -> Clojure -> Clojure application. |
| 20:09 | technomancy | Raynes: I tried that too, but I'll try it again I guess. |
| 20:10 | technomancy | Raynes: is there a special trick to opening projects that aren't created in NB? |
| 20:10 | Raynes | technomancy: When you create a project, make the namespace as follows (anything.filename) |
| 20:10 | technomancy | ah, when I tried to pick my own project name and location it was a no-op. |
| 20:10 | technomancy | but using the defaults it worked |
| 20:11 | technomancy | and people complain that Emacs is hard. =) |
| 20:11 | Raynes | For some reason, if you don't make the namespace at least 2 directories it wont work because it takes a directory the last statement after the last . will be the file name. |
| 20:12 | Raynes | Wow. |
| 20:12 | Raynes | Why am I even talking. I'm so tired most of what I say seems like nonsense. |
| 20:12 | technomancy | heh |
| 20:12 | technomancy | yeah, I tried to enter a root namespace that didn't have a dot in it |
| 20:12 | technomancy | legal in clojure, but not in NB I guess |
| 20:13 | technomancy | whatever; I don't have to use it, I just have to try it out so I know what I'm suggesting to others. |
| 20:13 | Raynes | It isn't because the last part of the file name, weird. |
| 20:13 | Raynes | I'll have to talk with Eric about it. |
| 20:13 | Raynes | He can fix it. Yes he can! |
| 20:13 | Raynes | I'd use Eclipse if Laurent would put in somekind of build mech to build an executable .jar. |
| 20:14 | Raynes | It wouldn't be hard at all, but I guess he doesn't see it as important. |
| 20:14 | Raynes | Just a simple Ant script. |
| 20:14 | technomancy | well thanks for the tips |
| 20:14 | Raynes | No problem. |
| 20:14 | Raynes | <3 |
| 20:14 | technomancy | haven't used one since VC6 in university |
| 20:14 | technomancy | *visual studio |
| 20:14 | technomancy | whatever |
| 20:14 | technomancy | it was horrible |
| 20:15 | Raynes | Visual Studio is neat for C++ thanks to it's exceptional debugger. |
| 20:16 | Raynes | I despise C++ and everything it stands for, but still. |
| 20:16 | technomancy | yeah, hard to say how much of the pain was due to the language vs due to the UI |
| 20:17 | technomancy | if I had a time machine, slapping some sense into my freshman self would be on my list right after inflicting pain on the people who told brendan eich to make JS look like java |
| 20:17 | technomancy | later |
| 20:29 | pilkarn | isn't the browser hopelessly imperfect for making advanced stuff? look! its a gui in a gui |
| 20:54 | pilkarn | is there some good program to draw how a program works, ie execution flow, dependencies etc? |
| 20:54 | pilkarn | anyone use JLayer to play mp3s? a class called PlayBackListener is that for creating a callback function so I can use that to somethin when finished rather than do polling every 10K ms? |
| 20:54 | pilkarn | are Listener used for callbacks? |
| 20:56 | cooldude127 | pilkarn: looks like it |
| 20:56 | cooldude127 | it has a playbackFinished method |
| 21:01 | pilkarn | it justs seems circular, advancedplayer has PlayBackListener, PlaybAckLisetner has event, PlayBackEvent has AdvancedPlayer. has as in has a sa parameter to their constructor |
| 21:02 | cooldude127 | pilkarn: it's fine |
| 21:03 | cooldude127 | playback event wants to know what player it's associated with |
| 21:03 | cooldude127 | which player fired that even |
| 21:03 | cooldude127 | but the player also has listeners that get called with those events |
| 21:03 | cooldude127 | circular references only matter when you try to traverse the trail |
| 21:11 | pilkarn | but hmm |
| 21:13 | pilkarn | I dont' get the structure, the whole anthropomorphism of Java just bugs me. |
| 21:14 | pilkarn | its a thing that has a thing that does athing class here and there |
| 21:15 | danlarkin | Heyooo! executable jar |
| 21:15 | pilkarn | i dont get how to construct a on-event method |
| 21:15 | hiredman | ,(doc pl) |
| 21:15 | clojurebot | "([& forms]); replaces a $ b with (a b) walking right to left replaces a � b with (comp a b) left to right ?a with (uncurry a) left to right ?a with (flip a) left to right" |
| 21:15 | pilkarn | danlarkin: how? |
| 21:15 | danlarkin | pilkarn: a lot of trial and error, ha! |
| 21:16 | cooldude127 | pilkarn: in java or clojure? |
| 21:20 | pilkarn | cooldude127: to create an on-event in Clojure, but i wouldnt get it in java either, i dont get the principle |
| 21:20 | cooldude127 | pilkarn: you need a proxy i believe |
| 21:20 | cooldude127 | ,(doc proxy) |
| 21:20 | clojurebot | "([class-and-interfaces args & fs]); class-and-interfaces - a vector of class names args - a (possibly empty) vector of arguments to the superclass constructor. f => (name [params*] body) or (name ([params*] body) ([params+] body) ...) Expands to code which creates a instance of a proxy class that implements the named class/interface(s) by calling the supplied fns. A single class, if provided, must be first. If not provid |
| 21:21 | cooldude127 | but if you don't get the java principle, you might have trouble |
| 21:21 | pilkarn | its not really that(i think), i dont get hwta to pass to execute something when it finishes |
| 21:22 | pilkarn | do you know JLayer? |
| 21:22 | pilkarn | or have the docs? |
| 21:31 | danlarkin | https://twitter.com/gvanrossum/status/1228991275 |
| 21:34 | pilkarn | also a listner seems to be for when a user does something rather than when a task finsihes |
| 21:34 | hiredman | http://twitter.com/disturbyte/statuses/1228998632 |
| 21:34 | pilkarn | isnt twitter just the biggest timewaster ever? |
| 21:36 | cooldude127 | YES |
| 21:38 | matthew` | Hi everyone. I want to read in some data from a file that is comma separated. I was wondering what the "Clojure" way of doing this? Some pointers to the functions I might call would be handy. Thanks |
| 21:39 | hiredman | SuperCSV is a pretty nice java lib for csv files |
| 21:39 | hiredman | I have used it with clojure in the past |
| 21:40 | danlarkin | yeah, CSVs can be a total PITA, I would wrap a well-tested java lib if you can |
| 21:40 | hiredman | it doesn't take much wrapping |
| 21:41 | matthew` | Thanks |
| 21:42 | matthew` | I'll give it a look. Its just that when you start using Lisp you are encouraged to start thinking in Lisp. For me that usually entailed a completely different way of dealing with the problem. |
| 21:43 | matthew` | But if the library is already there it why re-invent the wheel. |
| 21:43 | hiredman | java interop is a win, never forget it |
| 21:43 | matthew` | Thanks again. |
| 21:43 | pilkarn | uh ok. somehow i got something tht seems to work by pure guessing lol. |
| 21:44 | pilkarn | matthew`: (defn split [string delim] (seq (.split string delim))) , (split (slurp filename) ",") |
| 21:46 | hiredman | pilkarn: that is a very naive way to do it |
| 21:47 | danlarkin | that'll never work for real data |
| 21:47 | hiredman | real data is really dirty |
| 21:47 | hiredman | and I hate it |
| 21:47 | matthew` | pilkarn: That is more of what I was expecting. Although it looks like it will pull in the entire file at once. |
| 21:47 | danlarkin | motion seconded |
| 21:54 | pilkarn | i was just showing a simple way of reading a file and splitting, didnt mean it would work perfectly for his example |
| 22:00 | matthew` | pilkarn: Thanks for the example. It helps to see examples so I can start to get the feel for how things are meant to be done in the language. Cheers. |
| 22:02 | danlarkin | so what's the clojure equivalent of argv[0]? |
| 22:03 | danlarkin | it's not *file* |
| 22:12 | pilkarn | (proxy [ActionListener] [] |
| 22:12 | pilkarn | (actionPerformed [ev |
| 22:12 | pilkarn | am i supposed t do soemthing like that for the PlaybackListener for example? |
| 22:19 | hiredman | yes |
| 22:19 | pilkarn | how would I improt this |
| 22:19 | pilkarn | javazoom.jl.player.advanced.jlap.InfoListener |
| 22:20 | pilkarn | Constructor Summary |
| 22:20 | pilkarn | jlap.InfoListener() |
| 22:22 | arohner | is anyone familiar with an embeddable wiki engine? I've looked at a few but they all suck. |
| 22:25 | cooldude127 | arohner: define embeddable |
| 22:26 | arohner | a wiki library that only deals with the back end objects |
| 22:27 | cooldude127 | not sure i understand |
| 22:27 | arohner | i.e. programatic access only |
| 22:27 | cooldude127 | oh |
| 22:27 | arohner | all of the wiki engines I've seen only deploy as WARs, and have their own servlets. They draw their own menus and controls, etc |
| 22:27 | arohner | I want to control all of the UI |
| 22:28 | arohner | and it seems like this is a problem that should already be solved. I can write my own but it seems like it should be out there already |
| 22:36 | blbrown | I have an gui app. I am basically saving a the state of a regex matcher (with 'ref') and to call m.find from anywhere in the app. But I can't tell with m.find the difference between 'has a match but at the end' or 'doesn't have any matchs found' |
| 22:40 | arohner | blbrown: if there weren't any matches found, wouldn't m.find return false? |
| 22:41 | blbrown | arohner, exactly, it will return false for when no matches are found and when match is at the end of scanning. I was trying to distinguish between the two. and I don't think m.hitEnd is helping either |
| 22:45 | arohner | why do you need to be able to tell the difference? |
| 22:45 | technomancy | so is it true that if you take a map and use a lazy function on it that you can no longer "call" it? |
| 22:45 | arohner | if it returns false, there are no more matches, right? |
| 22:47 | blbrown | arohner, well there is a difference. If you are at the end of the search, "Do you want to search again at the beginning" and the "There aren't any matches" I guess I could reset after a not found |
| 22:49 | arohner | blbrown: I assume you're saving the state because this is a time-intensive operation? |
| 22:50 | blbrown | arohner, I got it, I just reset the matcher after a a "Not Found". that seems to work |
| 22:51 | arohner | cool |
| 23:03 | technomancy | it seems like calling seq on a map causes it to lose its "mappiness", and I'm not sure how to get it back |
| 23:03 | cooldude127 | technomancy: what about (into {} (seq {blah})) |
| 23:04 | cooldude127 | technomancy: yeah i know that works |
| 23:04 | technomancy | cooldude127: aha! that's certainly better than (apply hash-map (flatten (seq {1 1 2 2}))) ... =) |
| 23:05 | cooldude127 | technomancy: yeah i was asking the same question the other day |
| 23:05 | technomancy | it's just a shame that laziness and associativity can't really co-exist. I understand why now that I think about it, but for some reason I thought it would Just Work. |
| 23:05 | blbrown | hmm, lazier version of clojure...is that good |
| 23:06 | technomancy | cooldude127: unfortunately this means rewriting a serious portion of my peepcode, because I was using map inappropriately =\ |
| 23:07 | cooldude127 | technomancy: how? |
| 23:08 | technomancy | http://github.com/technomancy/mire/blob/2c65943e7b158c50a42d9e31f3be525dec0c0683/src/mire/rooms.clj |
| 23:09 | technomancy | there are a number of things wrong with this. first is that I was putting a transaction inside a call to map, which meant it didn't happen unless it was realized, which it wasn't |
| 23:09 | cooldude127 | oh lol |
| 23:09 | technomancy | I switched it to use the return value of map instead of altering a ref, but then I lose the "mappiness" of the rooms var |
| 23:09 | cooldude127 | oh |
| 23:10 | technomancy | so I have to chose between laziness or associativity. the code base requires associativity in a number of places, but I really need an example of laziness. =\ |
| 23:10 | technomancy | rock and a hard place |
| 23:11 | cooldude127 | technomancy: yeah that's unfortunate |
| 23:11 | cooldude127 | this doesn't look like a great place for it |
| 23:13 | technomancy | I *already* have a great example for getting tripped up by laziness where you don't expect it. =) |
| 23:13 | technomancy | don't need another |
| 23:13 | cooldude127 | lol |
| 23:14 | technomancy | plus using into feels like introducing too much stuff at once. |
| 23:18 | technomancy | mapcat almost looks like it could do it |
| 23:18 | technomancy | maybe I'm just not fitting the pieces together |
| 23:19 | pilkarn | JLayer is pretty fucing bad, it is like they haven't thought at all when they made it, they have several different playes that dont share the same method even if they are basic |
| 23:19 | defn | 'lo all |
| 23:20 | danlarkin | technomancy: jochu merged your branch! hooray |
| 23:20 | technomancy | hmm... I may be able to pull something off with reduce and conj. let's see |
| 23:20 | technomancy | danlarkin: indeed; he has emerged from his silence! |
| 23:20 | defn | I'm trying to explain Clojure to a friend who doesn't have any experience with lisp, etc. |
| 23:21 | defn | I was trying to kind of give him lecture 1 of SICP, but he's not really getting what I'm saying |
| 23:21 | defn | Any analogies or ways you can think of putting it simply, or a way to illustrate it that would demonstrate the power? |
| 23:23 | pilkarn | defn: do you have a codeexample of a whatever language he uses and one of the ame program in a lisp? |
| 23:23 | defn | pilkarn: im pretty new to this whole boat myself, but ive had glimpses of the awesomeness of lisp, et al |
| 23:23 | hiredman | what exactly doesn't he get? |
| 23:24 | hiredman | you could have him watch the actual sicp video |
| 23:24 | defn | well i was trying to explain how there are forms, and you combine these forms in interesting ways to do just about anything you can imagine |
| 23:24 | hiredman | ~google sicp videos |
| 23:24 | clojurebot | First, out of 16200 results is: |
| 23:24 | clojurebot | Structure and Interpretation of Computer Programs, Video Lectures |
| 23:24 | clojurebot | http://groups.csail.mit.edu/mac/classes/6.001/abelson-sussman-lectures/ |
| 23:25 | defn | hiredman: yeah -- although i dont want to scare him away |
| 23:25 | hiredman | heh |
| 23:25 | defn | im trying to kind of give him the elevator pitch if only for my own understanding |
| 23:25 | jhawk28 | there is the beta Programming Clojure book |
| 23:26 | technomancy | cool; it works with reduce at the expense of laziness |
| 23:26 | defn | jhawk28: I have it and am reading it, although it is still a challenge to get one's mind around the ideas from Lisp |
| 23:26 | hiredman | I would start off just talking functions, and leave code as data stuff for later |
| 23:26 | defn | hiredman: like functions as types? |
| 23:26 | hiredman | now |
| 23:26 | hiredman | no |
| 23:27 | hiredman | functions as a means of abstraction |
| 23:29 | defn | so i should explain to him lambda calculus? |
| 23:29 | defn | im trying to not scare him away ;) |
| 23:29 | hiredman | you don't say "lambda calculus" |
| 23:30 | slashus2 | Is there a good reference to design patterns for programming in languages such as Clojure? I am use to modeling problems in an object oriented fashion. |
| 23:30 | hiredman | and I would go with combinatory logic :P |
| 23:31 | jhawk28 | anything with the word calculus is scary :) |
| 23:31 | hiredman | the sicp vidoes are great |
| 23:32 | defn | yeah anyone with even a vague interest in sicp should draw something from those i think |
| 23:33 | technomancy | slashus2: mostly just reading code. trying to apply design patterns from other languages to lisp is a recipe for overcomplicated code, especially with Clojure. |
| 23:34 | slashus2 | That is what I was afraid of. |
| 23:35 | technomancy | slashus2: on the bright side, there's a lot of code out there to learn from. |
| 23:35 | technomancy | well, a lot more than you could ever read all the way through, anyway. |
| 23:37 | hiredman | the problem is exstracting the algorithm from the mechanics of state manipulation |
| 23:39 | slashus2 | So the "try to make each function do one thing (doesn't include using other functions of course)" applies? |
| 23:40 | hiredman | that is what makes for good functions |
| 23:41 | hiredman | and good functions can be used in more then one place |
| 23:41 | hiredman | are easily composed |
| 23:43 | slashus2 | I don't know why it feels dirty, but when I was writing a genetic algorithm, it felt dirty making a bunch of utility functions in one file. I am still learning about the modularization aspect of it. |
| 23:44 | slashus2 | Used to classes helping to organize. |
| 23:45 | danlarkin | namespaces are the new classes |
| 23:46 | jhawk28 | is first and rest similar to the tail in ML? |
| 23:47 | hiredman | well, what is tail in ML? |
| 23:47 | cooldude127 | jhawk28: rest = tail |
| 23:47 | cooldude127 | first = head |
| 23:47 | jhawk28 | does it have similar performance? |
| 23:48 | cooldude127 | jhawk28: no idea |
| 23:49 | hiredman | uh |
| 23:57 | danlarkin | how would it not have O(1) complexity? |
| 23:58 | danlarkin | well, strike that question, I guess I can imagine situations where it wouldn't... I guess if you for some reason copied the list every time you did a call to tail... |
| 23:58 | danlarkin | but clojure doesn't do that |