#clojure logs

2009-03-05

00:07zakwilson~translate to it: I don't speak Italian.
00:07clojurebotNon parlo italiano.
00:22cooldude127clojurebot is a liar
00:22cooldude127it obviously speaks italian
00:28durka42clojurebot: do you speak italian?
00:28clojurebotHuh?
01:23djkthxany idea why im getting this error from sql in clojure-contrib?
01:23djkthxuser=> (use '[clojure.contrib.sql :as sql])
01:23djkthxjava.lang.Exception: No such var: clojure.contrib.def/alter-meta! (sql.clj:22)
01:26durka42djkthx: i don't get that. are your builds out of sync?
01:26djkthxi dont think so
01:26djkthxeverything is the latest
01:27durka42alter-meta! is in core
01:27durka42~latest
01:27clojurebotlatest is 1323
01:27durka42~latest contrib
01:27clojurebotlatest contrib is 334
01:27durka42whoa that's incorrect
01:27durka42latest contrib is 565
01:28djkthxhmm
01:28djkthxim using the git repo for clojure-contrib
01:28djkthxi wonder if thats the problem...
01:28durka42kevinoneill's?
01:28djkthxyeah
01:29durka42i thought that was supposed to mirror googlecode
01:29durka42so it shouldn't be a problem
01:29durka42but i don't know
01:29djkthxhmm
01:29djkthxweird
01:29durka42the last commit was today
01:29durka42er, yesterday
01:29durka42in error-kit
01:30djkthxhmmm
01:33djkthxalter-meta doesn't show up anywhere in clojure's src/ for me...
01:34durka42~source alter-meta!
01:34djkthxhmm
01:34djkthxguess my source is messed up
01:34hiredmandjkthx: what svn rev are you at?
01:35durka42hiredman: how can one check, without svn up'ing?
01:35hiredmansvn info
01:35durka42hiredman: i think he is using the git mirror
01:35djkthxim using svn for clojure
01:35djkthxdidnt switch to the git mirror
01:36djkthxwhoa
01:36djkthxr1162
01:36djkthxthats quite old
01:36durka42hiredman: this is incorrect:
01:36durka42~latest contrib
01:36clojurebotlatest contrib is 334
01:36hiredmanthat may be pre-google code
01:36hiredmandurka42: then fix it
01:36durka42that is pre-google code
01:36djkthxi believe it is
01:36djkthxyeah
01:36durka42does clojurebot not watch contrib as it does core?
01:36hiredmansomeone set that, clojurebot doesn't track contrib svn
01:36durka42it may have been me
01:36djkthxim assuming kevin oneill's follows google-code?
01:36hiredmanat least note yet
01:37hiredmanI really need to make svn.clj better
01:38djkthxcool
01:38djkthxworks now
01:38djkthxthanks guys
02:20Lau_of_DKHey guys
02:23hiredmanyo
02:30brennanc_I'm trying to understand the difference between alter and commute. Can someone explain?
02:33hiredmanclojurebot: alter?
02:33clojurebotalter is always correct
02:34brennanc_if thread A starts a transaction that modifies a ref and the B comes along after and completes the entire transaction before A is done, does that mean that A overwrites B? or does A start over when it sees there has been another commit
02:37cgrandbrennanc_: A starts over
02:37brennanc_thanks
02:37cgrandunless you used commute
02:37hiredman...
02:37brennanc_that's what I was referring to
02:37brennanc_so what happens in the case of commute?
02:39cgrandat the end of the transaction A, the commute is recomputed with the latest value of the ref (since B modified it)
02:40brennanc_isn't that the same as what alter does?
02:43cgrandif in thread A you use alter the whole transaction restarts, with commute the transaction would never restart.
02:44cgrandthe return value of alter is guaranteed to be the value to which the ref will be set, there's no such guarantee with commute
02:45brennanc_is there a better example/scenario? I'm not getting it.
02:46brennanc_can you go throw 2 different examples, one with alter and one with commit?
02:46hiredman,(doc io!)
02:46clojurebot"([& body]); If an io! block occurs in a transaction, throws an IllegalStateException, else runs body in an implicit do. If the first expression in body is a literal string, will use that as the exception message."
02:47hiredman~def io!
02:50cgrandbrennanc_: 2 min
03:00lisppaste8cgrand pasted "alter vs commute" at http://paste.lisp.org/display/76500
03:11brennanc_cgrand: so it's set to 4 either way?
03:13cgrandyup
03:13brennanc_I think I'm kind of getting it. What about the classic cash register example? Let's say 1) get balance, 2) add to balance, 3) set balance ...
03:14brennanc_with commute, if B comes along after A does step 1, will A base it's result off of what it read, or will it know what it read is now invalid?
03:15cgrandif you use commute steps 1 2 and 3 are blended together
03:15cgrand(commute balance add some-cash)
03:17brennanc_blended?
03:17brennanc_I see there's a concurrency video, I'm going to look through that. Hopefully it explains it in there.
03:19cgrandcommute gets the actual value, adds to it and sets it in one atomic step, B can't come along after setp 1 and before step 2
03:20cgrandalter is the safe choice
03:20brennanc_it sounds like B is safe as well from what you just said
03:20brennanc_I'm confused :(
03:22cgrand"alter is the safe choice" is a general rule of thumb, in your last example I think commute would do fine
03:24hiredmanclojurebot: alter?
03:24clojurebotalter is always correct
03:26cgrandif, in your transaction, you rely on the new value of the ref you need to use alter, else you can use commute.
03:26brennanc_you're referring to the return value of the function vs the value of the ref?
03:27brennanc_in alter they are the same, in commute they can be different?
03:29cgrandyes (the return value vs the value of the ref after the txn succeeded)
03:29brennanc_ok, starting to get it
03:30brennanc_:)
03:31cgrand(I hope I'm not going to confuse you further: but the return value is always consistent with the in-txn value)
03:33brennanc_I'm going to finish watching the video, go to sleep, and then come back to it tomorrow. Hopefully it will make a lot more sense then.
05:31eevar2,(use 'clojure.contrib.lazy-seqs)
05:31clojurebotjava.io.FileNotFoundException: Could not locate clojure/contrib/lazy_seqs__init.class or clojure/contrib/lazy_seqs.clj on classpath:
05:33eevar2,(use 'clojure.contrib.seq-utils)
05:33clojurebotjava.io.FileNotFoundException: Could not locate clojure/contrib/seq_utils__init.class or clojure/contrib/seq_utils.clj on classpath:
05:35eevar2,(doc use)
05:35clojurebot"([& args]); Like 'require, but also refers to each lib's namespace using clojure.core/refer. Use :use in the ns macro in preference to calling this directly. 'use accepts additional options in libspecs: :exclude, :only, :rename. The arguments and semantics for :exclude, :only, and :rename are the same as those documented for clojure.core/refer."
05:35kotarakeevar2: do you have a problem with use?
05:39eevar2not any more, thanks .)
06:50timothypratley1user=> (import '(javax.sound.sampled AudioSystem))
06:50timothypratley1nil
06:50timothypratley1user=> (import '(javax.sound.sampled DataLine.Info))
06:50timothypratley1java.lang.ClassNotFoundException: javax.sound.sampled.DataLine.Info
06:51timothypratley1DataLine.Info <- was this invented to annoy Clojure users?
06:52rhickey,javax.sound.sampled.DataLine$Info
06:52clojurebotjavax.sound.sampled.DataLine$Info
06:52timothypratley1:) thanks!
09:48AWizzArdBTW, yesterday was the birthday of AIM-8, Lisp: http://www.informatimago.com/develop/lisp/small-cl-pgms/aim-8/
09:55alinp1,(doc take)
09:55clojurebot"([n coll]); Returns a lazy sequence of the first n items in coll, or all items if there are fewer than n."
09:55alinp1,(doc from)
09:56clojurebotjava.lang.Exception: Unable to resolve var: from in this context
09:56alinp1is possible in clojure to generate an infinite list ?
09:56alinp1like in haskell
09:56alinp1haskell equivalent: [1..]
09:57alinp1in fact, will be nice to be a lazy infinite list
09:57Chouser,(take 10 (iterate inc 5))
09:57clojurebot(5 6 7 8 9 10 11 12 13 14)
09:57alinp1,(doc iterate)
09:57clojurebot"([f x]); Returns a lazy sequence of x, (f x), (f (f x)) etc. f must be free of side-effects"
09:57alinp1oh, thanks
09:58Chousernp
10:48tashafaChouser: should duck-streams include a case for gzip compressed streams or our apps should handle those?
11:04clojurebotsvn rev 1324; sped up for
11:09Chousertashafa: that's a nice thought. would it need a parameter, or would it examine the stream itself in order to do the right thing?
11:11Chouserrhickey_: so much re-indenting recently. Is there a particular reason you're choosing to do that now?
11:13leafwChouser: the new doc for doseq has a dangling parenthesis, very weird.
11:13leafw,(doc doseq)
11:13clojurebot"([seq-exprs & body]); Repeatedly executes body (presumably for side-effects) with bindings and filtering as provided by \"for\". Does not retain the head of the sequence. Returns nil."
11:13leafwnot here on clojure bot, bot yes on latest revision.
11:14rhickey_Chouser: looking at the :use proposal, I'd been thinking about namespaces declaring a preferred alias, to avoid having to :as when :require, now if :use does what :require did, but only when :as is supplied, that's thwarted
11:14cemericksome of the new indenting is irregular, too (like condp in r1324)
11:14Chouserrhickey_: I like the idea of a preferred alias.
11:15rhickey_Chouser: aargh, I hadn't noticed that - there's a reformat code checkbox on IntelliJ I don't remember it ever having been set, but it must have been. I double-check the diff before checkins, but this happens on upload - yikes
11:16Chouser:-(
11:16cemerickrhickey_: are you using the intellij clojure plugin, then?
11:17Chousercgrand: I found the def, still trying to find the actual changes...
11:17Carkhello
11:17Chousercemerick: I don't know -- the clojure code appears to be indented unlike clojure code.
11:18ChouserCark: hi
11:18Carkit has been a while (damn delphi project) glad to be back !
11:18cgrandChouser: line 2756 when-let -> when-first
11:19cemerickChouser: I was thinking that perhaps the newness of the plugin might be falling down. I presume IntelliJ doesn't try to apply code reformatting to clojure files in any default config.
11:19ChouserCark: I really liked Delphi, last time I used it.
11:20Chouserprobably just over a decade ago now. :-)
11:20Carkchouser : the lack of closures is pretty hard to live with
11:21Chouseryes, my tastes have changed in the meantime, I'm sure.
11:22Carkbut it's not too bad, for an imperative language, no need to be smart at all =P just let the fingers do the coding
11:22rhickey_cemerick: I'm not editing with the plugin yet, but I use IntelliJ for svn and have plugin installed - the reformat checkbox must have been set in my upgrade to IntelliJ V8
11:22Chouserleafw: I'm not seeing the paren mismatch on doseq.
11:23Chouserrhickey_: first noticed it in svn 1318
11:23rhickey_Chouser: aargh
11:24cemerickenclojure's formatting is almost perfect, IMO. It falls down a little with parens found in strings, tho.
11:24leafwChouser: never mind. Appeared only once -- my interpreter may have screwed up.
11:24rhickey_tools modifying after you say commit is a truly bad idea
11:24clojurebotsvn rev 1325; sped up for, w/fixed formatting
11:25Chouserrhickey_: I wholeheartedly agree. Sounds destined for pain.
11:25rhickey_1325 better?
11:27cemerickyeah, I think so
11:28rhickey_Chouser: so how does preferred alias jive with new :use?
11:29cemerickrhickey_: it looks like line number information for else forms isn't being reported properly -- the compile error reports the line number where the if-let form starts, rather than the line number of the else form (where a recent error of mine was)
11:30cemerickdon't know if that's easily fixable, but...
11:30cemerickactually, the same thing happens with plain if forms as well
11:31tashafaChouser: Regarding duck-streams: preferably it would examine the stream, so duck streams stay true to the "just-give-me-a-stream" mantra
11:34rhickey_cemerick: got a test case?
11:39cemerickah, the behaviour is different for fn invocations vs. symbols, and it has nothing to do with if at all -- same behaviour with do...
11:39lisppaste8cemerick pasted "rhickey_: loss of line-number info" at http://paste.lisp.org/display/76525
11:41rhickey_cemerick: there's no line number info kept on plain symbols during compilation, only on lists
11:42cemerickOK, good to know. A good reason to keep the shorter form first. ;-)
11:43rhickey_cemerick: aren't those errors always going to be a variant of 'I don't understand foo, or foo unbound' etc? pretty easy to find foo
11:49cemerickrhickey_: probably true, but I had an if-let that set a bunch of bindings from destructuring a map and had a long body; the else form was just returning a value that is available in the if-let body via the map destructuring. A casual look at the entirety of the if-let had a bunch of valid usages of foo, so finding the solitary foo reference in the else form required a careful reading.
11:53rhickey_cemerick: ok. I'm still on the fence on adorning read symbols with line metadata
11:54cemerickis it just a question of space or compile time, or?
11:54rhickey_yes
11:57cemerickI imagine that eventually there should be different compilation "profiles" -- I could care less about space or compile time, but I'll bet the mobile folks care very deeply.
11:58rhickey_cemerick: yeah, there are a bunch of interesting pulls on Clojure right now - mobile, OSGi and other module-based platforms, TerraCotta, potability to CLR/JavaScript, high-perf people ...
11:59rhickey_portability
12:00cemerickactually, we have multiple use-cases ourselves -- space is a real concern once we start looking at distributing software that includes clojure, rather than running stuff in-house (just to contradict myself within 60 seconds)
12:00Chouserspin-offs. did you guys see L# ?
12:01rhickey_heh - this: http://www.lsharp.org/ ? is actually a derivative of my original DotLisp
12:02Chouseryeah, I think that's the one I was reading about, implemented using LINQ
12:02Chouserhttp://groups.google.com/group/LSharp/browse_frm/thread/f966f9a809cc702b
12:03rhickey_That's why I like the supported Clojure/CLR effort
12:04rhickey_rather than see clones, maybe all interested parties can pool their effort
12:08Chouseras for :use/:require, I'd very much like to see them consolidated. I don't think what they do is sufficiently different to warrant them being separate.
12:10Chouserwith that as a goal, perhaps (uses 'foo.bar.baz) could default to using the preferred alias
12:10Chouserthen (uses 'foo.bar.baz :exclude ()) could act like 'use' does now, refer'ing in all the symbols
12:11Chouser(uses 'foo.bar.baz :as qux) would ignore the perferred alias and use qux instead.
12:12Chouser'uses' could support all the other flags that 'use' and 'require' currently do, so they could be deprecated to allow everyone to transition to 'uses'
12:15shooverclojurebot: thirsty is yes, until Clojure is potable
12:15clojurebotYou don't have to tell me twice.
12:26kotarakHmmm... AOT compilation looses metadata on namespaces.
12:28kotarakHaving a (ns foo.bar "docstring") in a corresponding file and loading the file via require shows the docstring in the (doc foo.bar) output. AOT compiling the file and loading from the class file only shows nil in the (doc foo.bar) output.
12:32Carki'm having a bit of trouble making a jar execuable
12:33Carkif i do this : java -cp app.jar application
12:33Carkit works
12:33leafwjars cannot be executable
12:33Carkbut it won't work by just java -jar app.jar
12:33leafwoh that. Just declare the manifest file.
12:34Carkright i made a manifest file
12:34danlarkinleafw: hm? jars can be executable
12:34leafwant should do it for you if you set up its XML sourcery properly.
12:34Carki'm doing it manually, i want to understand it all
12:34Carkmy manifest file has this : ClassPath: .
12:34Carkand : Maiin-Class: application
12:34Carkwith only one i =P
12:35Carkthe application.class file is at the root of the jar file
12:35hiredmanmanifests aren't xml
12:35hiredmanoh
12:35hiredmanant
12:36Carkso when trying to run the jar file i get "Exception in thread "main" java.lang.NoClassDefFoundError: application"
12:36hiredmanCark: there should be a directory structure inside the jar that mirrors the namespace declartion of your application
12:36Carkright
12:36Carki tried all combinations
12:37Carkeventually i went for no directory structure at all as a simple case
12:37hiredman~namespace
12:37clojurebotnamespaces are (more or less, Chouser) java packages. they look like foo.bar; and corresponde to a directory foo/ containg a file bar.clj in your classpath. the namespace declaration in bar.clj would like like (ns foo.bar). Do not try to use single segment namespaces. a single segment namespace is a namespace without a period in it
12:37Carkbut i tried test/application.class with a namespace of test.application aswell
12:38Carkright now it's application.clj direct in root of jar, with clojure namespace of 'application' all alone
12:38hiredmanso a single segment namespace?
12:38Carkright
12:38hiredman"Do not try to use single segment namespaces."
12:39Carkah ok... i'll revert to directory and let you know !
12:41Carkstill no good : Exception in thread "main" java.lang.NoClassDefFoundError: test/application
12:41Carkbut it is really there in the jar file ... i don't get it
12:41keithbHi, all. I'm trying to subclass a Java file for the first time. What am I doing wrong here?: http://gist.github.com/74451 . Line 71 is the 'def clear-action...' line.
12:41hiredmanlisppaste8: url?
12:41lisppaste8To use the lisppaste bot, visit http://paste.lisp.org/new/clojure and enter your paste.
12:42hiredmancat you pastebin your manifest?
12:42hiredmankeithb: you are missing a few parens
12:42lisppaste8cark pasted "a manifest file" at http://paste.lisp.org/display/76529
12:43robnikHi. Is there a way to use `for' to process 2+ sequences in parallel, like you can with `map'? So that you can do something like (for [a (range 2) b (range 2)] (list a b)) --> ((0 0) (1 1)) ?
12:43keithbhiredman: really? Even with the 2 parens at the bottom (where they probably shouldn't be)?
12:44hiredmankeithb: really
12:46keithbhiredman: I appreciate your help. I count 4 open and 4 close parentheses. Do you see differently?
12:46hiredmankeithb: I did not say your parens are unbalanced
12:46keithbhiredman: Oh, I see...
12:47hiredmanCark: how are you making your jar?
12:47Carkjar cmf mf-app.txt app.jar -C classes .
12:47kotarakCark: did you actually compile the source file?
12:48hiredmankotarak: apperently java -cp foo.jar test.application works
12:48Carkyes it is in the jar
12:48Carkyes it does
12:48kotarakah. Sorry. Didn't see this.
12:49Carkwell i can use it this way, that's not such a big deal, still i hate it when i don't understand the problem =P
12:49hiredmantry something like jar cevf test.application app.jar -C classes .
12:50kotarakCark: did you include also the Clojure .class files in the jar?
12:50hiredman(get jar to auto-generate a manifest for you)
12:50Carkkotarak : they are there, in the right place
12:50keithbhiredman: Got it. Doh! Of course I needed to put parens around the overridden function. Thanks for your help.
12:50Carkhiredman : will try that now
12:54Carkhiredman : now it's working ... the only difference is the Class-Path declaration isn't there anymore
12:54Carkthanks !
12:55hiredmanare you sure that is the only difference? is there an extra line at the end?
12:55Carki checked that
12:55hiredmanhuh
12:56hiredmananyway
12:56hiredmanIt Works!
12:56Carknow i tried doing it manually, and no good ...
12:56Carkthat's soem crazy sh*t
12:56gnuvinceHello everyone
12:56Carkhello gnuvince
12:57gnuvinceHas anyone read "Calculus Made Easy" by Silvio Thompson and re-worked by Something Gardner?
12:58hiredmanthe only books I read are ones with spaceships on the cover
12:58gnuvincehiredman: you read that Forth book, eh?
12:58hiredmangnuvince: FICTIONAL spaceships
13:00Carkfor the record ... i had a space character after test.application in the manual case ....
13:00Carkthat's nuts
13:01hiredman*shrug*
13:02Carksome guy at sun must have thought : "you never know there might be a class file with a space at the end"
13:02Carkanyways thanks again hiredman
13:26AWizzArdHas there been some success to let Clojure apps run on mobile phones?
13:31scottjThe feature in slime that highlights in the echo area parameter list what parameter you're currently editing doesn't work with clojure right? I just want to make sure I'm not missing out on this awesome feature because I have something misconfigured.
14:11Lau_of_DKHello everybody
14:11kotarakHi Lau
14:11cgrandHi!
14:12danlarkinHeya!
14:15sverrejIs it possible to create java classes at runtime in Clojure, or do they have to be compiled first?
14:16sverrejI tried to proxy Object, but it seems as with proxy one can only create methods that are defined in an interface.
14:16leafwsverrej: see doc gen-class
14:17sverrejleafw: Yes, I did, and there it seemed as if I have to do it compile time, with the extra hassle of setting the classpath.
14:17leafwIIRC, you can do it on the fly
14:18kotarakgen-class must be compiled
14:19Chouserleafw: that used to be the case, but gen-class does nothing now except when compiled.
14:19ChouserAOT
14:19sverrejok, and gen-class is the only way of making classes?
14:19kotaraksverrej: classes with new methods, yes.
14:20sverrejexactly
14:20sverrejok
14:20Chouserno, proxy makes classes, but there are constraints as you noted.
14:20leafwok thanks Chouser
14:20Lau_of_DKsverrej: for adding methods and accessing protected fields, you need gen-class
14:20Lau_of_DKIf none of those apply, you SHOULD be fine with proxy
14:20Lau_of_DKclojurebot: proxy?
14:20clojurebotproxy is <Chouser> proxy teases with its ease of use, then suddenly betrays.
14:20Chouseryou can use gen-interface, AOT compile that, and then try out various implementations using proxy.
14:21sverrejChouser: Yes, I will probably do something like that.
14:21Lau_of_DKChouser: Example?
14:21ChouserLau_of_DK: sverrej will cook one up for you. ;-)
14:21sverrejIs this because of limitations in the JVM, or is this a Clojure design choice?
14:21Chousersverrej: a bit of both.
14:23Lau_of_DKChouser: You've got a definate meanstreak
14:23ChouserMy understanding is that the JVM puts various restrictions here and there about classloaders, classes can't be changed once their loaded, etc. that together made dealing with dynamically-defined classes error-prone.
14:23Lau_of_DKBut I understand, if I was as cocky as you, I'd have the same :)
14:23ChouserSo Clojure attempted to support that for a while, but no longer does.
14:24mtzChouser: http://www.zeroturnaround.com/javarebel/
14:24ChouserI think the reason proxy is still allowed at runtime is that it takes so few parameters that actually effect how it bahaves -- essentially just the superclass and list of interfaces. This allows a single unique name for the class to be created, and there's no question of trying to change it later.
14:25Chousermtz: interesting. have you tried it with Clojure?
14:26mtzno. i just wanted to show that they somehow solved the class reloading problem.
14:28pjstadigok so another terracotta issue
14:28pjstadigi got two repls connected to terracotta last night at 10:40pm
14:29pjstadigbut it's really flakey and for some reason it was printing my repl prompt in one of the repls readably ("user=>" with the quotes)
14:29pjstadignow i can't get two connected again
14:30pjstadigi'm getting an NPE in PersistentHashMap
14:30durka42,(binding [*print-dup* true] (println "user=>"))
14:30clojurebot"user=>"
14:30durka42,(println "user=>")
14:30clojurebotuser=>
14:30pjstadigi think it has to do with the fact that Classes are used occasionally as keys into PersistentHashMap
14:30pjstadigand Classes don't seem to have the same hashCode across VMs
14:31pjstadigat least while debugging i'm seeing clojure.lang.Var being compared to an existing node with the same key
14:32pjstadigand the hashes are different, so it attempts to split the leafnode and it dies with an NPE when trying to create a new node
14:32Chouserclasses are used as hash keys for the print-method multimethod table
14:32ChouserI had to work through some issues with that for ClojureScript.
14:32pjstadigyeah that's exactly where the problem is
14:33pjstadigit's trying to print the REPL prompt
14:33pjstadigit is trying to cache a value in the multimethod table
14:34pjstadigChouser: any words of wisdom?
14:38Chouserhm... I had to write a JS version of clojure.lang.Util.hash() anyway, so I handled classes directly there.
14:38pjstadigok
14:39pjstadigso i could rewrite clojure.lang.Util.hash()
14:39Chouserright. it was a natural solution for me. not sure if it makes sense in your scenario.
14:39pjstadigactually i think it makes sense
14:39pjstadigi'm gonna give it a whirl
14:40pjstadigi've already had to make some changes to Util.equals and introduce a Util.equiv because of the "object identity crisis" for java.lang.Boolean with TC
14:41Chouserah, ok.
14:42pjstadigsorry
14:42pjstadigi meant introduce Util.same
14:42pjstadigi'm going to have a PhD in the innerworkings of Clojure after this :0
14:45pjstadigcool
14:45pjstadigi have REPLs
14:46pjstadigin one VM:
14:46pjstadiguser=> (defn foo [] 42)
14:46pjstadig#'user/foo
14:46pjstadiguser=>
14:46pjstadigIn another:
14:46pjstadig"user=> "(foo)
14:46pjstadig42
14:46pjstadig"user=> "
14:47Chouserwhoa.
14:47pjstadigit's weird that the one is printing the REPL prompt with quotes
14:47pjstadigbecause
14:47pjstadig"user=> "*print-dup*
14:47pjstadigfalse
14:47pjstadig"user=> "
14:47pjstadigthere is obviously still a lot to do :)
14:48pjstadigi'm gonna try disconnecting/reconnecting and look for foo
14:49pjstadigcool
14:49pjstadigreconnected and foo still exists
14:50kotarakpjstadig: \o/ grats
14:50pjstadigthx
14:51pjstadigstill very raw, but i should package this up and push it to github
14:54jwinterpjstadig: wow, that sounds v. cool.
15:34Lau_of_DKCompojure crew (Madison Square Clabango, chime in if relevant) - Is there anyway to persist an object in memory, which all clients to the website can access?
15:35danlarkinatom or a ref
15:35Lau_of_DKref
15:35Lau_of_DKits a massive struct, that I dont want to go to I/O for every time
15:42rhickey_pjstadig: congrats on TC progress!
15:44danlarkinLau_of_DK: so what's the question, just have a ref like any other program
15:45pjstadigrhickey_: thx
15:45Lau_of_DKYea - What Im thinking is, I can make a little Clojure app on the server, which acts as a local server, where you feed it your data and it returns the result of a look up it does on a hash-map it has in memory - But I'd be very happy to avoid this, if I could persist this structure in my webapp directly
15:46pjstadigonce i sort out what can be part of the integration module and what probably needs to be patched in clojure
15:46pjstadigshould i just open tickets?
15:47rhickey_pjstadig: no, you should post on the group what your issues are/were and let me think about how best to accommodate TC, or start a Google Doc or something
15:47danlarkinLau_of_DK: so why not just define a ref in some namespace and access it directly from your compojure functions
15:48Lau_of_DKThat might be a way - Im just not sure what happends to compojure/jetty between clients
15:49Lau_of_DKdanlarkin: Have you tested this in Madison Square Clabango ?
15:50pjstadigk
15:50danlarkinLau_of_DK: haven't tested it, but my intuition says it will work just fine
15:50pjstadigyeah i wasn't even thinking about code, but just tickets to explain the issues, but a google doc will work too
15:51danlarkinLau_of_DK: as long as you use defonce, since the builtin runserver does code reloading
15:52Lau_of_DKoh, defonce... that might do the trick
16:01Lau_of_DKdanlarkin: Works well I think - Thanks for the tip
16:05jwinterLau_of_DK: so defining a ref from one servlet makes it available to others?
16:06Lau_of_DK(defonce *data-set* (import-huge-data-set source))
16:06Lau_of_DKIts read-only
16:06Lau_of_DKBut yes, this is available to all clients, like a ref would be I imagine
16:06jwintercool, that's handy
16:07Lau_of_DKVery
16:07Lau_of_DKCutting out SQL and Disk I/O gains alot of speed
16:07Lau_of_DKIm doing lookups on 1M lines in 200 msecs
16:08danlarkinLau_of_DK: cool, glad it worked out
16:24redalastorWhat's the idiom already to simulate default values to functions?
16:25Chouseryou can use either destructuring or multi-arity functions
16:25Chouser(fn [a & [b c d]] ...) ; b c and d are optional, default to nil
16:26Chouser(fn foo ([a] (foo a 2 3)) ([a b] (foo a b 3)) ([a b c] ...)) ; b and c are optional, default to 2 and 3 respectively
16:26redalastorThat wouldn't do, I can either pass a, b, both or neither. I need a default value for both of them.
16:26redalastorThat would :)
16:27Chouserthe second way is probably faster at runtime too
16:27hiredman,((fn [{:keys a b :or {a 1 b 2}}] [a b]) {})
16:27clojurebotjava.lang.ArrayIndexOutOfBoundsException: 5
16:27kotarakredalastor: you can use :keyword arguments and turn the arglist into a hash-map.
16:28kotarakredalastor: see hiredman :)
16:28hiredman,((fn [{:keys a b :or {a 1 b 2}}] [a b]) {:a 1})
16:28clojurebotjava.lang.ArrayIndexOutOfBoundsException: 5
16:28hiredmanbah
16:28hiredmanhttp://clojure.org/special_forms#let <-- estructuring
16:29hiredmandestructuring
16:29hiredman,((fn [{:keys [a b] :or {a 1 b 2}}] [a b]) {})
16:29clojurebot[1 2]
16:29hiredman,((fn [{:keys [a b] :or {a 1 b 2}}] [a b]) {:a 3 :b 4})
16:29clojurebot[3 4]
16:29kotarak,((fn [& args] (let [{:keys [a b] :or {a 1 b 2}} (apply hash-map args)] [a b]) :a 5)
16:29clojurebotEOF while reading
16:29kotarak,((fn [& args] (let [{:keys [a b] :or {a 1 b 2}} (apply hash-map args)] [a b])) :a 5)
16:29clojurebot[5 2]
16:30hiredmanugh
16:53AWizzArdDoes the JVM currently have a concurrent GC?
16:53AWizzArdIt seems Java 6 Update 14, which should appear in a few months, will have one, the G1: http://research.sun.com/jtech/pubs/04-g1-paper-ismm.pdf
17:01Lau_of_DKWhen Im JavaC compiling isnt there a simple way to add all jars in a directory to classpath ? like javac -classpath ${/path/to/jars}/*.jar ?
17:02AWizzArdLau_of_DK: I think most people wrote a script which will call javac with the right parameters
17:02Lau_of_DKcan most people paste their scripts here? :)
17:02StartsWithKjavac -classpath "basepath/*.jar" dosn't work?
17:03Lau_of_DKno
17:03AWizzArdLau_of_DK: write a small Clojure program that runs in the shell
17:03cp2iirc you can specify a directory for it to search in
17:03AWizzArdOr alternatively you could use Enclojure. There you just need to press a green Play button.
17:04Lau_of_DK javac -classpath /home/lau/coding/lisp/clojure/libs/*.jar -d classes/ com/jme/bounding/*.java
17:04Lau_of_DKjavac: invalid flag: /home/lau/coding/lisp/clojure/libs/commons-io-1.4.jar
17:04Lau_of_DKUsage: javac <options> <source files>
17:04Lau_of_DK
17:04cp2-sourcepath sourcepath Specify the source code path to search for class or interface definitions. As with the user class path, source path entries are separated by semicolons (;) and can be directories, JAR archives, or ZIP archives.
17:04cp2well
17:04cp2hm
17:04cp2i dont know if that will included already compiled stuffs
17:05cp2worth a try
17:05Lau_of_DKman I hate java compilation
17:05Lau_of_DKI think I'll surrender and just use netbeans
17:05cp2yeah
17:05cp2javac is kinda lacking
17:05cp2on some useful features
17:06cp2you could write a short (dare i say) perl (or maybe bash) script to concat all jar files in whatever dir with :
17:06StartsWithKLau_of_DK: javac -cp "lib/*" Test.java
17:06cp2so then you can java -cp `getstuff lib/` blah
17:06StartsWithKworks for me
17:06Lau_of_DKI'd rather format my harddrive that you perl
17:06cp2lool
17:06Lau_of_DKs/you/use
17:07Lau_of_DKStartsWithK: Windows?
17:07StartsWithKLau_of_DK: linux
17:08Lau_of_DKk
17:08Lau_of_DKdoesnt work here
17:09Lau_of_DKhttp://www.jmonkeyengine.com/wiki/doku.php?id=downloading_and_installing_jme_2
17:09Lau_of_DK*sigh*
17:10cp2[will@microwave ~]$ javac -cp ".clojure/*" test.java
17:10cp2worked for me too
17:10AWizzArdwith NetBeans it is really very easy.
17:10cp2Lau_of_DK: java -version
17:10Lau_of_DKcp2 its always these addons to jmonkey I cant get to compile
17:11Lau_of_DKTheres something fundamental Im missing, and its not JMonkey
17:11cp2heh
17:11Lau_of_DKAH
17:11cp2what message(s) are you getting
17:11cp2class not found etc
17:11Lau_of_DKIt might be the library path
17:11StartsWithKLau_of_DK: Just tried it again and i'm sure it works http://pastebin.com/d2ab2b791
17:11AWizzArdIn NetBeans you have a window in which you select all the .jar files which you want to use. When you press a button it will generate your own double clickable .jar file with everything you need.
17:11cp2library path is used for shared libraries, it will compile without it
17:11cp2infact im not sure if javac even has a -D flag
17:11Lau_of_DKNot according to the wiki
17:12StartsWithKyou don't need library path for javac
17:12StartsWithKits a runtime thing
17:12cp2yeah
17:13StartsWithKi just downloaded jme from zip on there google code site
17:13StartsWithKand included jogl libs in my lib/ dir
17:14StartsWithKit was easyest way to go
17:14kefkaI've noticed a performance "bug" (perhaps not really) in clojure.set/intersection.
17:15kefka(clojure.set/intersection #{5} +large-set+) takes a long time, when it needn't,
17:15kefkabut (filter +large-set+ #{5}) is essentially instantaneous (as it should be)
17:15Lau_of_DKI gotta get to bed - Thanks for looking into this with me guys
17:16cp2np
17:18kefkaOk: the obvious work-around is to use clojure.set/select.
17:19kefka,(let +s+ (range 1000000) (time (clojure.set/intersection #{5} *s*)))
17:19clojurebotjava.lang.IllegalArgumentException: let requires a vector for its binding
17:19kefka,(let [+s+ (range 1000000)] (time (clojure.set/intersection #{5} *s*)))
17:19clojurebotjava.lang.Exception: Unable to resolve symbol: *s* in this context
17:19kefka,(let [+s+ (range 1000000)] (time (clojure.set/intersection #{5} +s+)))
17:19clojurebot#{}
17:19clojurebot"Elapsed time: 1.069 msecs"
17:20kefka,(let [+s+ (set (range 1000000))] (time (clojure.set/intersection #{5} +s+)))
17:20clojurebotExecution Timed Out
17:20kefka,(let [+s+ (set (range 1000000))] (time (clojure.set/select +s+ #{5})))
17:20clojurebotExecution Timed Out
17:20kefka,(let [+s+ (set (range 100000))] (time (clojure.set/select +s+ #{5})))
17:20clojurebot#{5}
17:20clojurebot"Elapsed time: 0.759 msecs"
17:21kefka,(let [+s+ (set (range 100000))] (time (clojure.set/intersection +s+ #{5})))
17:21clojurebot#{5}
17:21clojurebot"Elapsed time: 0.17 msecs"
17:21kefka,(let [+s+ (set (range 100000))] (time (clojure.set/intersection #{5} +s+)))
17:21clojurebot#{5}
17:21clojurebot"Elapsed time: 0.161 msecs"
17:21kefkaOdd. Select gets killed there. Has clojure.set/intersection recently been improved? I guess I need to update my checkout.
17:22Chouserkefka: http://groups.google.com/group/clojure/browse_thread/thread/29609929e94f279c
17:23Chouserhttp://code.google.com/p/clojure/issues/detail?id=52 fixed Feb 22
17:26kefkaChouser: Cool. Thanks.
17:29keithbAll: I've got a question. In the code at http://gist.github.com/74602, shouldn't I be able to define a fn in a let clause, and then use it subsequently? What am I doing wrong?
17:31Chouserdo you say (label-panel) later?
17:32Chouseranyway, nothing is jumping out at me there. perhaps pasting a small runnable example would help.
17:32keithbChouser: Yes, sorry, here's the whole function: http://gist.github.com/74604
17:34ChouserI was hoping for the package name of GridLayout so I didn't have to go look it up. :-)
17:34Chouserjava.awt.GridLayout
17:34keithbChouser: Sorry, it's java.awt, and JPanel is javax.swing. Forgot to include them...
17:36keithbChouser: Ok, what the heck, I'm not going to win the Nobel Prize for it, so here's the whole file posted: http://gist.github.com/74606
17:36Chouserand it's still not runnable, because call functions not shown there.
17:36Chouser:-) ok
17:36Chouserother than pasting the whole thing, you could trim it down to the few lines actually causing the error.
17:37Chouseryou might find you can spot it on your own then as well.
17:37keithbChouser: I've been doing that for quite a while now ... ;)
17:37Chouserok
17:38keithbFirst I used #( notation, and thought that was the problem, so changed to fn.
17:38Chouserkeithb: you know how to examine the stack trace?
17:39hiredmanare you sure it is that function that is cause the exception
17:39keithbChouser: Yes, I've worked with Java for many years, but this one goes into the Clojure compiler code, and not my code, so I don't understand it very well.
17:39keithbwait...
17:40hiredmanare you working at the repl with this? my guess is you def'ed that function without the . after JPanel
17:40Chouserstray paren
17:40Chouserline 134
17:41hiredmanoh
17:41javehello
17:41keithbChouser: hiredman Holy #@$#$! Thank you, and sorry to waste your time...
17:41javewhy doesnt the following snippet work? (.getPackages (proxy [ClassLoader] [] (getPackages [] (.. this getParent getPackages ))))
17:42Chouserkeithb: also worth noting that the real error wasn't in any of the earlier pastes. :-)
17:42hiredmanjave: that crashed my jvm
17:42javeoh :|
17:43hiredman~jdoc ClassLoader
17:43Chouserjave: you can't add methods using proxy
17:43Chouserhm.
17:43javeive read that, but dont quite understand
17:43keithbChouser: Sorry about that. it turns out that I wasn't aware that it was a nested exception and the real cause was further down the stack trace. Now I understand why you asked about the stack trace. So I was indeed looking in the wrong place. Lesson learned. Hopefully will remember next time. ;)
17:43ChouserI though you could override protected methods, though.
17:44Chouserkeithb: not a problem. happy to help.
17:44javeChouser: yes the docs do say you can overide protected methods
17:45Chouseroh, it wants a string arg
17:46Chousernope, sorry, misread.
17:46Chouseroh, but you can't call the protected method of the Parent classloader.
17:46javeah hmm
17:47javethat kind of killed my plan then :)
17:48Chouserhm, yes, I see you plan. a pity.
17:49jave(my plan involves making a backend for Emacs/CEDET using Clojure)
17:50Chouseroh
17:50javea java backend, that is
17:54scottjThe feature in slime with common lisp that highlights in the echo area parameter list what parameter you're currently editing doesn't work with clojure right? I just want to make sure I'm not missing out on this awesome feature because I have something misconfigured.
17:57ayrnieuscottj - if you see the echo'd parameters but don't see one highlighted, then the feature isn't supported.
18:23keithbAll, is there a way to have a function's documentation string extend to more than 1 line?
18:24ayrnieujust extend it to more than one line.
18:24Chouserliteral newlines are allowed in strings
18:25keithbThanks.
18:29keithbAm I correct in understanding that use of proxy creates a new (sub)class? Is a new class added to the system each time it's called?
18:39hiredmankeithb: nope
18:39keithbhiredman: No to both?
18:39hiredman~jdoc java.lang.reflect.Proxy
18:42keithbthanks.
18:43keithbwhere can i find documentation for the clojurebot commands? They're really cool...
18:43hiredmanuh, well, you see, they are not really documented
18:43hiredmanclojurebot: where are you?
18:43clojurebothttp://github.com/hiredman/clojurebot/tree/master
18:44hiredmanI sort of started down that direction in the README
18:44hiredmanbut have not made it very far
18:45ChouserClojure's proxy does not create a java.lang.reflect.Proxy
18:45hiredmanoh
18:45hiredmanmy mistake
18:45hiredman~def proxy
18:45Chousereasy one to make. :-/
18:45hiredmanso it does do teh subclass thing?
18:46hiredmanhow embarressing
18:46Chouserkeithb: the first time a set of superclasses is given the proxy macro, it creates a new class at macro-expand time.
18:47Chouserthen at runtime, every time proxy is called a new instance of that class is created.
18:47Cark.
18:47Carkhum that was my cat speaking
18:47keithbChouser: Very cool. I imagine then that performance for that "real" class is faster than it would be for a Java proxy class?
18:48Carkso why the limitations about protected members ?
18:48ChouserCark: I don't know.
18:49Carki'll have a look tomorrow
18:49Chouserhm, perhaps because the body of the given methods aren't really inside the class at all
18:50rhickey_Cark: the methods defined in proxy classes are stubs that call out to real fns, which have no relationship to the superclass and thus no protected access
18:50Chouserthe methods in the class generated by 'proxy' all simply look up the approriate clojure fn in a map.
18:50Carkthat makes sense
18:50Chousersuch a pity
18:51Chouserperhaps proxy could generate stubs for all the protected members
18:53Chouserthat'd be another set of use cases that could be handled by proxy that currently require gen-class
18:53Carkah that might be usefull
18:54Carkthough i didn't have such a need yet
18:55keithb~def gen-class
19:11ChouserIn Java, if you have class B that extends class A, can an instance of class B use a protected member of class A?
19:12RaynesI want to say yes.
19:13Chouseryeah, that's what I thought. I should experiment, but if so then simply creating a proxy subclass of B that exposes B's protected members will only solve part of the problem.
19:14rhickey_what's wrong with proxy-super?
19:15Chousernothing at all
19:15Chouserother than that it probably should be mentioned in the proxy docstring near "they have no other access...to super"
19:16RaynesPeople seem to not be able to prevent themselves from writing text editors in Clojure.
19:18lisppaste8rhickey pasted "new streams" at http://paste.lisp.org/display/76549
19:20keithbChouser: Here's a table of Java access levels: http://is.gd/eJYt
19:22rhickey_streamlined streams ^^, much happier with client code, still safe
19:23rhickey_still on the fence as far as unification, but will probably add as standalone, good interop with seqs. Just need a naming convention for the 'stream' version of a function
19:24rhickey_input welcome
19:26gnuvince_map~, filter~, reduce~: the ~ looks like a little ripple in the water of a stream
19:26gnuvince_;)
19:28hiredman,(let [a~ 1] a~)
19:28clojurebotUnmatched delimiter: )
19:28hiredmannot so much
19:29gnuvince_oh yeah
19:29gnuvince_Anyway, it wasn't a very serious suggestion.
19:46Chouserrhickey_: that's a lot prettier.
19:47rhickey_Chouser: yeah, I moved all the boilerplate into Stream itself, also simpler model
19:48lisppaste8rhickey annotated #76549 "new streams, some stateful ones" at http://paste.lisp.org/display/76549#1
19:48rhickey_model is now just supply fn of item, can process, skip or eos, also considering expand
19:49rhickey_same single pipeline model, got rid of detach
19:53Chouserok. I can't say I understand the use cases sufficiently to know when it would have been useful.
19:53Chouserby standalone you mean in a non-core namespace, or something else?
19:58rhickey_Chouser: I mean separately-named functions vs. changing map et al to streams
19:59clojurebotsvn rev 1326; interim checkin, incorporating new stream model
20:00rhickey_1326 doesn't have any clj code yet, but the examples in the paste work for those that want to experiment
20:10redalastorIs there a better way to remove a value from a vector than using two subvec?
20:18cmvkk_hmm, is there a document somewhere about what these streams do and what sort of functionality they provide?
20:19Chouserwould you then pour those two subvecs into a another vector?
20:24ayrnieu,([:a :b :c] 1)
20:24clojurebot:b
20:25ayrnieuoh, you mean the other 'remove'.
20:29redalastorYeah as Python would do if I pop()ed an item out of a list.
20:30ayrnieu(let [v [:a :b :c]] (vec (map v (filter #(not (= % 1)) (range (count v)))))) ;; best possible solution.
20:30redalastorIs there a reason why dissoc doesn't work on vectors since assoc does?
20:32rhickeyredalastor: what would it do?
20:34redalastorrhickey: (dissoc [:a :b :c] 1) would yield [:a :c]
20:34rhickeyredalastor: changing the indexes of all the following items?
20:34redalastorYes
20:35rhickeyI don't think so
20:35rhickeydissoc removes a key, not possible with vectors
20:36redalastorI see, makes sense.
20:36rhickeye.g. removing an item still leaves its index, re-indexes the following, that's not diccoc
20:36rhickeydisspc
20:36rhickeydissoc
20:36rhickey:)
20:37redalastorI guess there's no "insert" function that pushes the indexes to the right either?
20:38rhickeyredalastor: nope, can't be done efficiently, maybe with a data structure like finger trees
20:40jhawk28_are vectors array based?
20:42ayrnieuhttp://blog.higher-order.net/2009/02/01/understanding-clojures-persistentvector-implementation/
21:20rhickeycmvkk_: these docs reflect some of the new logic, note not everything is up in svn yet: http://clojure.org/streams
21:21cmvkk_aha, thanks, that's exactly what i was looking for.
21:24cmvkk_i'm working on a framework right now that generates PCM data by chaining closures together; i think this sort of thing might really be useful for that.
21:34jhawk28_does anyone know what an arity is?
21:34cmvkk_the number of arguments a function takes.
21:58keithbQ: I have a vector of Java objects, and want to call instance methods on them that have side effects. What is the simplest way for me to do this? I know I can use map, but it's lazy and I'd have to force it.
21:58cmvkk_doseq?
21:59keithbcmvkk_: Ah, thanks.
21:59Chousercmvkk_: try again, with more confidence this time.
21:59hiredman~def doseq
22:00keithbChouser: He probably couldn't believe I didn't know that. ;)
22:00cmvkk_i hate to sound like an authority on what the simplest way to do something is.
22:01keithbcmvkk_: On the contrary, that's the best kind of authority there is. :)
22:18keithb~def in-ns
23:28blbrown,(+ 1 1)
23:28clojurebot2
23:28Chousersurprised?
23:29RaynesSurprised?
23:29Raynes(- 1 2)
23:29clojurebot-1
23:29RaynesThat surprised me when I first started in Clojure.
23:29RaynesFunky LISP syntax.
23:29Raynes<3
23:30Chouser(infix 2 - 1)
23:30blbrownChouser, hehe, just checking if the bot is alive
23:30blbrown-clojurebot/#clojure actually I was trying to see what this meant
23:30Chouserhttp://paste.lisp.org/display/75230 -- infix
23:30Raynes,(infix 2 - 1)
23:30clojurebotjava.lang.Exception: Unable to resolve symbol: infix in this context
23:30RaynesThat would have felt dirty anyways.
23:32blbrownI guess I should add save to the text editor. hmm
23:33dcnstrctdo clojure maps impliment java.util.Map ? anyone know ?
23:33Chouserdcnstrct: they do
23:33ayrnieu,(ancestors (class {}))
23:33clojurebot#{java.io.Serializable java.lang.Iterable clojure.lang.IObj clojure.lang.Obj clojure.lang.IPersistentCollection clojure.lang.Counted clojure.lang.Seqable java.util.Map clojure.lang.IMeta clojure.lang.AFn java.lang.Runnable clojure.lang.Associative java.util.concurrent.Callable clojure.lang.IPersistentMap clojure.lang.IFn java.lang.Object clojure.lang.APersistentMap}
23:34dcnstrctawesome, thnx
23:34Chouser,(instance? java.util.Map {})
23:34clojurebottrue
23:35Chouserfor almost 5 months now
23:36hiredman,(pl (partial map inc) $ range $ 3)
23:36clojurebotjava.lang.Exception: Remove at top
23:36hiredmandamn
23:37hiredmanblbrown: that is a NOTICE
23:38blbrownhiredman, did you just implement that
23:38blbrownI guess it is for the svn updtaes
23:38hiredmannope
23:38cmvkkit does it for ~doc responses too. why?
23:38hiredmansvn stuff it uses a normal message
23:38blbrownhiredman, I have a plan to out do your bot with my own clojure bot. Just wait till this weekend and we will have bot wars
23:38RaynesHow do you pronounce Fibonacci?
23:39hiredman"Fib"
23:39RaynesSmartass. ._.
23:39blbrownFIBBBB--- O - NACHI ?
23:40cmvkkwow, i always thought it had an R in it, like fibronacci. why did I think that?
23:40RaynesI was pronouncing it Fib o' nawssy.
23:41hiredmanchee
23:42cmvkki still want to know why you use notices for ~doc
23:42Chouserthe lie of the third reich. fib o' nazi
23:42cmvkkohhh
23:44hiredmancmvkk: I am willing to entertain arguments that it should be otherwaise
23:45cmvkkunavailable, since i don't really understand the difference between a notice and a message anyway.
23:45cmvkkoh well!
23:45hiredman~google IRC NOTICE
23:45clojurebotFirst, out of 256000 results is:
23:45blbrown~doc
23:45clojurebotA Short IRC Primer
23:45clojurebothttp://www.irchelp.org/irchelp/ircprimer.html
23:45clojurebotgitdoc is http://github.com/Lau-of-DK/gitdoc/tree/master
23:52sverrej~def gen-and-load-class
23:52sverrejgen-and-load-class is removed, or?
23:53hiredmanyes
23:53sverrejExpected that, ok. Thanks.
23:54sverrejStill haven't managed to swallow the fact that it's not possible to create new classes dynamically. Like proxy without an interface.