#clojure logs

2009-02-16

01:07technomancycooldude127: ping
01:17technomancycooldude127: more ideas on date handling: http://gist.github.com/65034
01:17technomancyplease comment (and anyone else who's interested); will try to get feedback on the mailing list tomorrow.
01:19Chouserkeyword arg to later and earlier accept both singular and plural?
01:22Chouserbut the api looks nice. I'd use it.
03:19BrackiCan smaddy point me to a place where all the special character expresiions like #,@,` etc are explained?
03:21Bracki,#
03:21clojurebotEval-in-box threw an exception:EOF while reading character
03:21Bracki,(doc #)
03:21clojurebotEval-in-box threw an exception:No dispatch macro for: )
03:24xitamBracki: http://clojure.org/reader
03:27BrackiAight, thx.
03:29alinpopahey
03:29alinpopa'morning
03:29alinpopais there a way to display current clojure's version ?
03:29alinpopajava -cp $CLOJURE_JAR:$CLOJURE_CONTRIB_JAR clojure.main
03:29alinpopathis is how I'm using it ...
04:21alinp,(+ 1 2)
04:21clojurebot3
04:23eevar2(+ 1 2)
04:23clojurebot3
04:35alinp,(doc recur)
04:35clojurebotjava.lang.Exception: Unable to resolve var: recur in this context
04:35alinp,(+ 1 2)
04:35clojurebot3
09:22cooldude127damnit technomancy, why aren't you on here when i am?
09:24Chouserwouldn't it be great if there were some electronic communications mechanism that would hold your messages until the other person was available to read them?
09:24cooldude127Chouser: he emailed me already, i just desire a more active discussion
09:27Chouserheh, ok.
09:29cooldude127i'm curious about what other sort of representation he has in mind for dates internally
09:29cooldude127cuz the way i understand it, if you want to stick with pure clojure, you're using either lists, vectors, or maps (or struct-maps) to represent all your data
09:30cooldude127you can use objects if you dip into java
09:30cooldude127like do a gen-class
09:30rsynnottwell, clojure has structs
09:30rsynnottwhich are effectively objects
09:30Chouserhe could just use a Date object
09:31cooldude127Chouser: well, i wanted something more clojure-like. date objects are gross
09:32cooldude127i'm using maps at the moment, which allows keyword access to year, month, hour, etc.
09:32cooldude127(:year (today)) => 2009
09:32Chouseryep
09:32ChouserI wasn't recommending anything, just speculating wildly.
09:33cooldude127yeah
09:33cooldude127but he seems to have ideas beyond maps, so i'm kinda wondering what he has in mind
09:34cooldude127i don't see any reason why maps should not be sufficient, aside from the fact that we can't customize how they print, which i'm hoping will be fixed at some point soon thanks to you, Chouser
09:34Chouserwell, I'm not sure how likely that is to make it in
09:35Chouserusing a custom print method to make something that used to print as code to instead print as something that's not ... may not be a popular feature.
09:35cooldude127Chouser: why not? i'm just curious cuz that seems like a really useful patch. not all data looks like vectors and maps
09:37cooldude127Chouser: most object-oriented languages have a way to make objects print different ways, haskell has the Show type class, we need something :)
09:37rsynnottcooldude127: date objects handle a lot of nasty stuff for you
09:37rsynnottthey're horrible because working with dates is horrible
09:37ChouserI'm still speculating here, but it seems to me to be sorta central to lisp that the things you print can be read again.
09:38rsynnottChouser: well, depends
09:38cooldude127rsynnott: yes they do, i haven't been writing this totally from scratch, i
09:38rsynnottmost things in common lisp aren't, for instance
09:38cooldude127've been using the java Calendar api
09:38Chousermaybe if they print like #=(make-date 2009 02 16) or something. hm...
09:38gnuvinceMorning guys
09:38rsynnott(arrays, symbols and lists are printed as readable, but pretty much nothing else)
09:39Chouserrsynnott: oh, really? well, then, maybe that patch has a decent chance after all.
09:40cooldude127Chouser: that would be rather acceptable actually. anything that's less verbose than a damn hash which happens to have a timezone object attached to it
09:40cooldude127s/hash/map/
09:40cooldude127i come from ruby world
09:40rsynnottactually, what cooldude127 is talking about looks very much like what the popular CL local-time library produces
09:41rsynnott(local-time:now) -> "@2009-02-16T11:52:16.692307-05:00"
09:41rsynnottbut given that most things in Clojure ARE readable, it might not be appropriate
09:41cooldude127but is stuff like #=(date 2009 1 1) readable?
09:42cooldude127will that get read in as calling that function?
09:42Chouseryes
09:42cooldude127well there we go!
09:42durka42that sounds dangerous
09:42Chouser,#=(sorted-map :a 1, :b 2)
09:43clojurebot{:a 1, :b 2}
09:43durka42from a user-editable data file standpoint
09:43Chouserdurka42: it's a strange mode -- the function is called, but the args are not evaluated, just read.
09:43gnuvinceWhat does #= do?
09:43durka42so those aren't really numbers?
09:43durka42,#=(class 1)
09:43clojurebotjava.lang.Integer
09:44Chouserno, they're really numbers, but...
09:44Chouser,#=(sorted-map :a (+ 1 4), :b 2)
09:44durka42,#=(class (System/getProperty "java.class.path"))
09:44clojurebotclojure.lang.PersistentList
09:44clojurebot{:a 5, :b 2}
09:44Chouserhm.
09:44durka42,#=(prn (System/getProperty "java.class.path"))
09:44clojurebotDENIED
09:44cooldude127Chouser: you liee
09:45Chousercooldude127: aparently I do. I clearly have a weak grasp on it. The thing's not documented -- it's used internally by print-dup
09:45durka42,#=(str (System/getProperty "java.class.path"))
09:45clojurebot"(System/getProperty \"java.class.path\")"
09:45durka42but it didn't do that one
09:45durka42although, it did when i tried to prn it
09:45cooldude127maybe it evaluates safe stuff
09:45cooldude127like math
09:45cooldude127idk
09:46Chouseror maybe my math was eval'ed in a later stage.
09:46cooldude127actually #=(sorted-map :a a) doesn't work either
09:46cooldude127a gets evaled
09:46durka42,#=(list :a a)
09:46clojurebotjava.lang.Exception: Unable to resolve symbol: a in this context
09:46cooldude127but #=(class a) gives symbol
09:46durka42,#=(System/getProperty "java.class.path")
09:46clojurebotEval-in-box threw an exception:System
09:47Chouser,#=(str :a b)
09:47clojurebot":ab"
09:47durka42only in the current namespace?
09:47cooldude127durka42: don't worry, that soooo doesn't work
09:47Chouseras I said, strange mode.
09:47cooldude127i tried #=(System/exit 1) and it threw an exception
09:47ChouserI wasn't lying about that part.
09:47Chousercooldude127: but only because of clojurebot's sandbox
09:48Chousercooldude127: it works in a regular repl
09:48cooldude127Chouser: no it doesn't
09:48cooldude127not on mine
09:48Chouser,#=(java.lang.System/exit 1)
09:48cooldude127class not found System
09:48cooldude127oh
09:48Chouserah!
09:48Chousersorry!
09:48cooldude127LOL
09:49durka42whoops
09:49Chousershoot, I was sure it would catch that. :-(
09:49durka42hiredman: bat signal!
09:49Chouserwell, nobody really promised that 'read' was completely safe.
09:50cooldude127lol
09:50durka42perhaps that is a bug
09:51jbondesonChouser: didn't we have a similar conversion about reading having side effects last week?
09:51cooldude127Chouser: this is why i want this patch: this is not an acceptable printed date representation: {:type :clojure.contrib.chrono/Date, :year 2009, :month 1, :day 1, :zone "America/New_York"}
09:51cooldude127but this is acceptable: #=(date 2009 1 1)
09:52Chouserdurka42: I don't know if it's a bug or not. I think this sort of thing is meant to work: #=(java.util.HashMap. {:a 1})
09:52durka42does clojurebot read things outside the sandbox?
09:52durka42i'm thinking it has to, if System/exit worked
09:52Chouseroh, I see -- a bug in clojurebot. could be.
09:52ChouserI've never looked at his code.
09:53durka42his dispatch architecture is pretty nifty
09:53cooldude127yeah agreed
09:54Chouserjbondeson: i guess reading well-behaved text doesn't have side effects. :-)
09:54jbondesonhahaha
09:54durka42well, i'm thinking from an application standpoint it's nice to initialize settings by just (read-string (slurp "data-file"))
09:54durka42but that isn't safe
09:55durka42maybe this strange mode could incorporate a "safe list" of functions that are OK to call?
09:55jbondesonyeah... that's just not pretty
09:55durka42or namespaces
09:56Chouserthis is odd, though, because I used to have a clojurescript repl that sent strings to my server to be read and compiled to JS
09:57Chouserbefore I turned it on, I tried several such dangerous-looking #=() forms, and concluded it was safe enough.
09:57durka42hmm
09:57ChouserI wonder if I just completely failed to test it right.
09:57durka42or things could have changed
09:57Chouseranyway, at the moment I'm pleased to have turned that off. :-)
09:58Chouserhttp://clojurescript.n01se.net/repl/ now uses an applet. You can do whatever you'd like to your own machine.
09:58durka42i wonder if this also punches a hole right through clojurebot's blacklist
09:58durka42#=(defn works in the repl
09:59Chouseri was wondering that too
09:59durka42however, i need to go now
09:59Chouserbut #=(def x 1) doesn't. how odd.
10:00durka42well, def is a special form
10:00durka42defn is a macro
10:00Chouserright
10:01durka42i shall return
10:01djpowellRe dates, Joda Time, is a Java Date API that makes heavy use of immutable objects and is proposed for incorporation in Java 7. Probably worth a look.
10:01hiredmansmooth guys
10:02Chouserhiredman: so sorry. :-(
10:02ChouserI like clojurebot and i mean him no harm.
10:03hiredman:P
10:05hiredman~def defn
10:06jbondeson,(assoc {} :bot-hater "Chouser")
10:06clojurebot{:bot-hater "Chouser"}
10:13cooldude127let's talk programming fonts! consolas vs. inconsolata
10:13jbondesonconsolas
10:16cooldude127i used to use it, i've forgotten how they compare
10:16jbondesonvery similar
10:16cooldude127and now i'm killing myself trying to find a download for consolas for mac
10:18cooldude127i may need to just install cabextract
10:19jbondesonthe only real differences i can see is that inconsolata is a little more rounded..
10:19cooldude127idk i'm never satisfied
10:19jbondesonthings like 'C' and '{'
10:24cooldude127and found it
10:43cooldude127man this room is dull
10:45danlarkinyou're dull!
10:45cooldude127lol
10:46pilkarnto make an mp3player you just use a decoder, doe sthe OS has automatic "streamer" for video too, you just need the right decoder?
10:48rsynnottyou killed the poor little bot?!
10:48cooldude127apparently i was not aware of the change that allowed defmulti to have a docstring without ugly metadata map
10:48cooldude127nice
10:48Chousercooldude127: ah, I missed that too. thanks.
10:49Chousermust have come along with per-defmulti hierarchies
10:49cooldude127Chouser: it was funny how i found it. i was writing a new multimethod, and i saw in the minibuffer that slime was showing doc-string? as one of the args
10:49ayrnieuno, it's older than that.
10:49cooldude127Chouser: what are these per-defmulti hierarchies you speak of?
10:49Chousercooldude127: hm, nice. i don't have that.
10:50cooldude127Chouser: what are you using?
10:50Chousernothing
10:50cooldude127Chouser: WHAT?
10:50Chouser(doc defmulti)
10:50clojurebotCreates a new multimethod with the associated dispatch function. The docstring and attribute-map are optional. Options are key-value pairs and may be one of: :default the default dispatch value, defaults to :default :hierarchy the isa? hierarchy to use for dispatching defaults to the global hierarchy; arglists ([name docstring? attr-map? dispatch-fn & options])
10:51cooldude127Chouser: is the clojure.org page for hierarchies updated with information about this?
10:51cooldude127i'm so lazy i could just check myself
10:51Chouserthe web pages in general are meant to reflect the latest release, not svn HEAD (experimental branch docs notwithstanding). So my guess is no.
10:52cooldude127we have releases?
10:53cooldude127and it does cover make-hierarchy and such
10:53Chouseryeah, that's older.
10:53cooldude127oh ok. well that's enough
10:53Chouserlatest release: http://code.google.com/p/clojure/downloads/list
11:07hiredman,#=(java.lang.System/exit 1)
11:07clojurebotaccess denied (java.lang.RuntimePermission exitVM.1)
11:07cooldude127woo hoo
11:07hiredmanExcelard
11:07dreish,#=(num 1)
11:07clojurebot1
11:07dreishInteresting.
11:08hiredmanyeah
11:08hiredmanI just moved the (read ...) into the sandbox
11:08dreishMakes sense.
11:08hiredmanwhere it should have been from the begining
11:10cooldude127well good then :)
11:11ChouserYou're welcome for the test case.
11:11cooldude127lol
11:11hiredman:)
11:12dreishAnyone happen to know whether arg destructuring in the lazier branch uses the new rest, or next a.k.a. old rest?
11:13dreishOr better yet, a link where I can browse the branch's source online?
11:13danlarkindreish: at google code
11:14danlarkin~source
11:14clojurebotsource is http://github.com/hiredman/clojurebot/tree/master
11:14danlarkinerf,
11:14danlarkin~source rest
11:14dreishAh, thanks.
11:14danlarkinthat's trunk though
11:14Chouserdreish: next -- as in, nil punning is allowed
11:14danlarkinso change the branch in the browser
11:14dreishOh yeah, it's pretty easy to find.
11:15Chouser,(let [[a & b] [1]] (class b))
11:15clojurebotnil
11:15dreishChouser: That's too bad. One of the things I was hoping for from this was easier porting of Haskell code.
11:15Chousertry that in a lazy branch repl to see it yourself.
11:16Chouseryou really need the extra laziness there?
11:16dreishUsually.
11:17dreishIt's not that hard to rewrite things to be lazier, but I just think it would be nice if it could be almost a transliteration from Haskell.
11:17cooldude127dreish: that's what i was hoping the lazy branch would be
11:17cooldude127EVERYTHING LAZY
11:17dreishI'm not sure it would be nice enough to justify the cost of rewriting everything that uses destructuring, though, since that's harder than just s/rest/next/g.
11:18cemerickis there a canonical post in the group (or some other resource somewhere) that discusses the various printing mechanisms? (print-method, print-dup, etc) My grasp of the interactions in that area isn't up to snuff.
11:28Chousercemerick: not that I know of. print-dup has hardly been discussed at all.
11:29Chouseryou can poke around in core_print.clj to get a sense of how the print-method works.
11:29cooldude127wait what's print-dup
11:29cooldude127(doc print-dup)
11:30cooldude127~(doc print-dup)
11:30clojurebotNo entiendo
11:30cooldude127,(doc print-dup)
11:30clojurebot"; "
11:30rhickeydreish: yeah, maybe a destructuring variant [[a &rest b]] ?
11:30cooldude127well then
11:30Chouser(doc *print-dup*)
11:30cemerickChouser: yeah, that's what I'm doing. I think I basically have it, but I'm guessing I'm not going to do something the "right way"
11:30clojurebotWhen set to logical true, objects will be printed in a way that preserves their type when read in later. Defaults to false.
11:30cooldude127ohhh
11:31cooldude127oh so like hashmaps will be hashmaps ands sorted-maps will be sorted?
11:31Chousercooldude127: exactly
11:31cooldude127got it
11:31Chousercooldude127: and java.util.HashMaps will be java.util.HashMaps
11:31cooldude127ok
11:32Chousercooldude127: and System/exit will kill your bot
11:32cooldude127lol
11:32Chouser,(binding [*print-dup* true] (prn (new java.util.HashMap. {:a 1, :b 2})))
11:32clojurebotjava.lang.ClassNotFoundException: java.util.HashMap.
11:33Chouserhuh
11:33cooldude127,(binding [*print-dup* true] (prn (new
11:33cooldude127 java.util.HashMap {:a 1, :b 2})))
11:33clojurebotEOF while reading
11:33Chouser,(binding [*print-dup* true] (prn (sorted-map :a 1, :b 2)))
11:33clojurebot#=(clojure.lang.PersistentTreeMap/create {:a 1, :b 2})
11:33cooldude127Chouser: you messed up by using new AND having a . after hashmap
11:33Chouseroh. indeed.
11:33cooldude127,(binding [*print-dup* true] (prn (new java.util.HashMap {:a 1, :b 2})))
11:33clojurebot#=(java.util.HashMap. {:b 2, :a 1})
11:34cooldude127nice
11:34cooldude127the only way to change *print-dup* is to surround in binding, right?
11:35Chousercooldude127: afaik, yes
11:36cooldude127yeah nothing else seems to work
11:36cemerickhah! Since my genbean impl inherits from PersistentStructMaps, I get a perfect serialized form for free when I print with *print-dup* bound to true -- now I just need to write a single 'create' fn. :-D
11:38cooldude127anybody know a way for a computer to determine eigenvalues/vectors without symbolic math?
11:50dreishrhickey: (re &rest) I was wondering about that, but looking at the destructure fn, I couldn't tell whether that would make it infeasibly complex.
11:50dreishIt's already very big.
11:51Chouserdreish: that's a fun function, eh? :-)
11:51dreishYes.
11:52dreishI'm just glad it happens at compile time.
11:52Chouser& is also supported by pre-destructuring fn (and loop?) forms, but I guess that wouldn't necessarily have to change.
11:54dreishJust when I thought I understood something ...
11:57stuartsierraHi, all. In the lazy branch, I can't write (doall (map f c)), right?
11:57stuartsierraIt has to be (doall (seq (map f c)))?
11:57silkarnayrnieu: you never answered yesterday, what is so bad about Haskell? it inspired Clojure a lot, I find Haskell to be very elegant in so many ways(althouhg the Io Monad is not my dearest friend always)
11:58Chouserstuartsierra: no, I think your first example is fine
11:59Chouserstuartsierra: in what way do you think it might fail?
11:59stuartsierraChouser: clojure.contrib.walk didn't work right in the lazy branch; that seemed to fix it.
12:00stuartsierraBut the problem only shows up when trying to use "are" in clojure.contrib.test-is.
12:01Chouserdoall appears to return a LazySeq in the lazy branch
12:01ayrnieusilkarn, #haskell is a more suitable channel for a defense of haskell.
12:01Chouser...although it still is fully realized first
12:02Chouserstuartsierra: you must be fixing up test-is a bit as well?
12:02stuartsierraChouser: Not changing anything, just trying to make it work in the lazy branch.
12:03stuartsierraChouser: just had to replace "rest" and "rrest" with next/nthnext.
12:03Chouserok
12:05Chouserstuartsierra: you have the assert-if-lazy-seq flag on?
12:05stuartsierrayes
12:07stuartsierraThe form with a problem is this: (are (= _1 _2) :a :a :b :c)
12:08ChouserI'm getting Unable to resolve symbol: _1
12:08stuartsierraThat's what I get.
12:09stuartsierraUntil I change this one line in clojure.contrib.walk:
12:10stuartsierraFrom (seq? form) (outer (doall (map inner form)))
12:10stuartsierraTo (seq? form) (outer (doall (seq (map inner form))))
12:12Chousersomeone should branch contrib, even without any changes, so we have a place to put fixes as we find them.
12:12Chouser:-D
12:13stuartsierraJust trying to stay anonymous. :)
12:17ChouserI've not used 'walk' before, but calling postwalk-replace directly appears to do the right thing
12:17cemerickIs it the case that print-dup is meant to be a superset of the level of "readability" provided by "regular" print-method impls? I'm not clear on when I *wouldn't* just bind *print-dup* all the time, I suppose.
12:17cemericksorry, still trying to get some clarity, and the content I've found on the group so far isn't specific enough for me :-)
12:17Chousercemerick: the output of *print-dup* is a bit ugly for, say, a repl.
12:18ChouserI think that's the main difference.
12:18Chouseror rather, the main reason for there being a difference.
12:18cemerickChouser: ah, OK -- so print-method impls should be human-readable, and nominally clojure-readable, whereas print-dup impls should provide the highest-fidelity serialization possible?
12:18Chouserthat's my understanding, yes.
12:18rhickeycemerick: right
12:19stuartsierraChouser: yes. There's something very subtle going on in the interaction of walk, template, and test-is.
12:19cemerickOK, got that.
12:19Chouserand right there is the difference between the BDFL and a lowly hanger-on. :-)
12:19Chouserstuartsierra: yes
12:20cemerickrhickey: what's the etymology of print-dup, BTW?
12:21Chousercemerick: ah, I've got a link for that one if you give me a sec...
12:21stuartsierraFYI: I created /branches/lazy in contrib, in SVN rev. 472.
12:21Chouserstuartsierra: thanks!!
12:22stuartsierraWelcome. I'm not a big SVN user, but I think it's right.
12:23Chousercemerick: http://clojure-log.n01se.net/date/2008-11-06.html#19:57
12:25stuartsierrarhickey: what does that imply?
12:25cemerickChouser: ah-ha. Hey, if I had been following the channel then, we could have lengthened that conversation by at least another 20 minutes! :-P
12:26rhickeystuartsierra: things will be much simpler without 2 seq[uence] types, but the first/rest/next thing stays the same
12:27rhickeybbl - will push code and modified docs - this looks like a winner
12:27dreishTo trunk?
12:28stuartsierraOk, I'll take a look after lunch. :)
12:28Chouserdreish: I would doubt it.
12:29dreishOh, I see. Got rid of the Sequence class, pushing that to the branch.
12:29dreishI just don't want to miss the big exciting merge.
12:29dreishEspecially since merges are such a clusterf*** in SVN.
12:31pilkarncan a tuple not be of length 3?
12:31pilkarnwrong channel
12:32cooldude127pilkarn: what language was that for? haskell? scala?
12:32Chouserpython?
12:33Chouserpython as tuples, but getting one of length 3 would be trivial, so probably not.
12:33cooldude127Chouser: any language i know with tuples has no problem with any length
12:33Chouserhaskell might require the number of args in the constructor function name, right?
12:33cooldude127Chouser: tuples in haskell are just like (1,2,3)
12:33Chouserhm.
12:34dreishWhat a riddle you have given us, pilkarn.
12:34ayrnieu,(defn tuple [a b] [:tuple a b]) ;; no, they can only have two arguments.
12:34clojurebotDENIED
12:34cooldude127lol he may never come back
12:34cooldude127then we'll never know
12:35Chouser~google can a tuple not be of length 3?
12:35clojurebotFirst, out of 289000 results is:
12:35clojurebotTuples
12:35clojurebothttp://greenteapress.com/thinkpython/html/book013.html
12:35dreishPython it is, then.
12:35cooldude127lol
12:37hiredmanhttp://en.wikipedia.org/wiki/Tuple
12:38cooldude127tuples should always be able to be whatever length
12:38albinoIn python a tuple of length 3 is as easy as (1, 2, 3)
12:38WizardofWestmarcyeah
12:38WizardofWestmarcjust can't modify it after, have to make a new one :P
12:38albinohe must have been doing something much more interesting
12:39dreishOh? So you think you know better than Google's supercomputers, with their silicon chips and such?
12:40albinooh, if that was directed at me, then the answer is yes
12:42gnuvinceayrnieu: have you caught the blog post I promised?
12:42ayrnieuI did! Thanks.
12:42cooldude127richard cobbe's thesis about null in java looks like something i've been wondering about lately
12:43gnuvinceayrnieu: cool :)
12:47Chousercooldude127: link?
12:47cooldude127http://www.ccs.neu.edu/scheme/pubs/dissertation-cobbe.pdf
12:48Chouserthanks
12:49cooldude127basically boils down to: why is java's type system so sucky?
12:49cooldude127at least as far as i have read
12:50gnuvinceCouldn't they just copy C#'s nullable types?
12:50gnuvinceint x; // Non-nullable type
12:50gnuvinceint? x; // Nullable type
12:50cooldude127cuz at the moment, existing java code would EXPLODE
12:50hiredmanDoctor of Philosphy in the field of Computer Science
12:50hiredmancute
12:50cooldude127lol
12:52gnuvinceSee, that's why Rich should not feel bad about breaking Clojure *now* with rest/next and do the right thing *before* there's too much code out there that just cannot afford breaking changes
12:52albinohow is a Nullable type different from using NPEs? In the Nullable type case you end up using an if instead of a try/catch, right?
12:53cooldude127albino: nullable types encode the information that this variable can or can't be null in the type system
12:53gnuvincealbino: as I understand it (I don't really have any experience with C#), you cannot pass a nullable type to a function that expects a non-nullable type.
12:53WizardofWestmarcyeah I prefer Rich to feel like it's ready for prime time before 1.0 and it takes off to another level or two
12:53albinocooldude127: I figured that, still doesn't answer my question
12:53gnuvinceThe compiler will scream at you
12:53WizardofWestmarcalthough following the twitter traffic on clojure is interesting
12:53WizardofWestmarcit's escalating
12:53cooldude127albino: the compiler can now check that stuff
12:54cooldude127albino: NPEs are at runtime, but with nullable types the compiler can check if you're doing something wrong
12:54gnuvinceWizardofWestmarc: link?
12:54WizardofWestmarchttp://search.twitter.com/search?q=clojure
12:54WizardofWestmarcyou can see all references to clojure with that
12:55WizardofWestmarcand it updates pretty fast based on tests where I've mentioned clojure and then waited for it to give the refresh message
12:59tei just found a cool clojure-related domain name
12:59tetrying to dfecide on the .org or the .com
12:59temaybe .org just for street cred
12:59Chouserinjure.com is already taken
12:59telol
12:59ayrnieuclojurebot: jure words
12:59clojurebothttp://gist.github.com/54847
13:00cooldude127lol foreclojure
13:00WizardofWestmarcget both
13:00WizardofWestmarcdomains are cheap
13:01hiredmanbut they pile up
13:01WizardofWestmarcI still regret not taking the .net and the .org for my domain because someone else grabbed the .net while I've barely used my .com and now wants the .com, which is just annoying :P
13:01hiredmanlike buying songs from itunes
13:01temine isnt on there
13:01teWizardofWestmarc: domains are cheap UNTIL you have to renew 30 of them the same week
13:02cooldude127haha
13:02hiredmanyeah
13:02tewow, 7$ for a .net
13:03WizardofWestmarcheh
13:03WizardofWestmarcthey still cost $30+ if you buy through network solutions :P
13:03WizardofWestmarcand I think Yahoo! as well
13:03cooldude127whyyyy
13:04tebecause people dont know any better
13:04WizardofWestmarcbecause NS are *insert lots of swearwords here*? <_<
13:04cooldude127lol
13:04WizardofWestmarcactually what was ugly, last i heard yahoo charged something like $10 for the first year
13:04WizardofWestmarcbut the auto renewals were something like $30
13:05cooldude127stupidddd
13:05WizardofWestmarcthere's a reason I stick to GD
13:05WizardofWestmarcthough right now I have the extra ~$10 for private entry
13:07hiredmanI did not do the private thing, and got a few calls from people who wanted to make a website for me
13:09WizardofWestmarcheh really? bleh
13:10WizardofWestmarcI'll probably unprivate it once I launch what I'm going to put on the site
13:10WizardofWestmarcbut not before
13:10tehehe I registered getclojure.com/.org
13:10te"I--I just need to get clojure *sob*"
13:11WizardofWestmarcyou know, findclojure.com would be an amusing domain name as well, what with the many meanings ;-)
13:11WizardofWestmarcsee how many typoing people looking for counciling you can sucker in >_>
13:11telol id give them code
13:12te(defn your-mood [scale])
13:13te(Or maybe I'd proceed to tell them how their life is probably great compared to me-- I spent hours of my life learning something most people will never care about."
13:21cooldude127if i'm saying that a function in clojure returns a sequence, does that mean it returns a vector, list, etc. that can be used with the seq functions, or that it returns one of those that has had seq called on it already
13:24WizardofWestmarcI'd expect it to be the actual seq object, with who knows what underlying it
13:24WizardofWestmarcthough technically I think that's same difference
13:25cooldude127WizardofWestmarc: ok, just wondering what the right way to document stuff is
13:25WizardofWestmarcactually I'm going to test something, one sec
13:26WizardofWestmarchm
13:27WizardofWestmarcmay be off, conjing a seq of a vect works like a list/seq, not a vector
13:27hiredmancooldude127: (class ...)
13:27hiredman,(class (map identity [:a :b :c]))
13:27clojurebotclojure.lang.LazyCons
13:28WizardofWestmarcalthough if you class a seq of a vect it returns persistantvector
13:28hiredman,(class (reduce conj '() [:a :b :c]))
13:28clojurebotclojure.lang.PersistentList
13:28WizardofWestmarcwell
13:28WizardofWestmarcAPersistantVector$Seq
13:28cooldude127it's not as important anymore cuz i'm using map, so it's definitely a seq
13:28hiredman~def seq
13:35cooldude127how big is the cutoff between array maps and hash maps?
13:35Chouser32
13:36cooldude127oh
13:36cooldude127makes sense
13:38Chouserthat's wrong,
13:38cooldude127Chouser: close enough, 33 is a hashmap
13:38cooldude127but so is 31
13:39Chouser9?
13:39cooldude127idk this is fine, it was more a curiousity
13:39Chouser9 is an array-map, 10 is a hash-map.
13:40cooldude127ok good to know
13:40Lau_of_DKGood evening gents
13:40danlarkinHi Lau!
13:41danlarkingot a name for me?
13:41Lau_of_DKc l a b a n g o !
13:41danlarkinno way man
13:42danlarkinthat's worse than copter
13:42Lau_of_DK:(
13:55rhickeySequence-free lazy is up, new doc at: http://clojure.org/lazy
13:56Lau_of_DKcool
13:59clojurebotsvn rev 1283; [lazy] got rid of Sequence, (seq iseq) no longer an identity, ISeqs can be empty, PersistentList.EMPTY and LazySeq.EMPTY are ISeqs, rest returns ISeq
13:59rhickeyNo changes to code already ported other than to switch back to seq? since sequence? is gone
14:00WizardofWestmarcrhickey: so nil punning is still out in lazy?
14:00rhickeyWizardofWestmarc: there is still next and seq
14:01WizardofWestmarc*nods*
14:01Chouserwhy is (seq iseq) not being identity important?
14:02rhickeyChouser: it's just a change
14:02rhickeyhopefully it's not important
14:02rhickeyIt was an important optimization inside Clojure itself, but I figured out another way
14:03Chouserok
14:03hiredmanthe "Don't hang (onto) your head" fills me with non-specific dread
14:03rhickeybut the change just covers (seq ()) -> nil, since () is a seq now
14:04Chouser"Sequence fns (map, filter etc) don't (necessarily) return seqs, but Sequences"
14:04rhickeyhiredman: there's nothing new about that, just that it's less likely
14:04cooldude127sometimes i just love loop/recur, it's just so elegant sometimes
14:04ayrnieucooldude - read The Little Schemer for a deeper appreciation :-)
14:04WizardofWestmarcI like it because it helps me catch when I don't have my TC in the tail position
14:05WizardofWestmarcsince I'm so bad at doing that wrong :P
14:05rhickeyChouser: fixed - thanks
14:05cooldude127i like it because i can be doing a simple tail recursion where it calls to the function it's in, but if i need to have something done before that, i just wrap it in a loop and i don't need an auxillary function
14:10stuartsierraPorted clojure.contrib.duck-streams to lazy branch, SVN rev. 473.
14:10rhickeystuartsierra: lazy 1283?
14:11Chouserrhickey: why the use of the Cons constructor rather than just the cons fn, in the final example at http://clojure.org/lazy
14:11stuartsierrarhickey: yes
14:11rhickeystuartsierra: awesome!
14:12stuartsierrarhickey: That was the easy one. :)
14:12rhickeystuartsierra: good
14:12Chousertemplate/test-is/walk still misbehaving?
14:13stuartsierraChouser: working on that next.
14:13Chouserok
14:15ChouserI think rhickey fixed it.
14:15rhickeyChouser: remnant, fixed in 1284 and doc - thanks
14:16Chouserrhickey: np!
14:16rhickeyso, is this (1283+) simpler?
14:17stuartsierraCommitted test_is.clj using next/nthnext (rev. 474). Still need to test 'are' & templates.
14:17ChouserBased on just reading the docs, I think nicely simpler, yes.
14:17Chouserstuartsierra: it's fixed already.
14:18Chouserstuartsierra: your "are" example now works fine as of 1283
14:19stuartsierraChouser: so it does. Thanks, Rich!
14:19clojurebotsvn rev 1284; [lazy] straight cons call in filter
14:20gnuvincerhickey: when do you plan to merge lazy into trunk?
14:21Lau_of_DKHas anyone here had some experience with the JMonkey Engine?
14:21rhickeygnuvince: RSN
14:21gnuvincerhickey: cool
14:22gnuvinceI'm going to check my lib, but there are no calls to rest and only one to lazy-cons.
14:22gnuvinceI think the conversion is gonna be real easy :)
14:27stuartsierraCommitted lazy/.../json/write.clj (rev. 475); only renamed rest to next, all tests pass
14:29hiredmanclojurebot: svn?
14:29clojurebotsvn is http://clojure.googlecode.com/svn/trunk/
14:34stuartsierraFixed re-partition in clojure.contrib.str-utils for lazy; SVN rev. 476
14:35stuartsierradanlarkin: oh I wish
14:35stuartsierradanlarkin: Really, though, these are trivial changes.
14:35jbondesononly a bot would say that!
14:35Chouserclojurebot could announce contrib commits too, couldn't he?
14:36stuartsierraChouser: yes, that would be nice.
14:41Lau_of_DKJava question, when I want my Clojure proggy to have a structure like this class calc extends GCalc { public static void myadd(int x, int y) { ... } }, How do I mimic that in Clojure?
14:42Chouserstatic -- does that mean GCalc does not have a myadd method?
14:42hiredmandepends, are you adding a new method or changing the behaviour of an existing method?
14:43Lau_of_DKChouser: Yea
14:43Lau_of_DKhiredman: Adding
14:43hiredmangen-class
14:44Chouser~gen-class
14:44clojurebotNo, Chouser, you want gen-interface + proxy
14:45Lau_of_DKCome now boys, gen-class was sent into retirement by AOT right?
14:45hiredmannope
14:45hiredmanjust changed
14:45cooldude127Lau_of_DK: it lives in (ns)
14:45Lau_of_DKhiredman: Can you give me an example?
14:46hiredmanuh
14:46jbondesonyou cannot extend objects with proxy, correct?
14:46hiredmanthe only place I used, I used it very badly
14:46hiredmanjbondeson: correct
14:46jbondesontime for SUPERPROXY
14:47hiredmanhttp://gist.github.com/34229
14:47hiredmanmacro generates standalone (gen-class ...) forms
14:47Lau_of_DKthanks
14:47hiredman(not in a ns form)
14:48thearthurdoes clojure contrib have something to write a bunch of ints or sequences of ints to an open file?
14:48Chouserthearthur: as ascii text?
14:48Lau_of_DK(spit ...)
14:48Lau_of_DKor is it spew ?
14:48Lau_of_DK(doc spit)
14:49Chouser,(println [1 2 3 4])
14:49hiredman(binding [*out* (FileWriter. "somefile")] (println (range 100)))
14:49clojurebot[1 2 3 4]
14:49thearthurLau_of_DK, tak!
14:49Lau_of_DKSelv tak min ven :)
14:50thearthurChouser, as 64 bit ints
14:50Chouserah. I don't know of any such thing
14:53stuartsierraCommitted seq_utils.clj in lazy branch; changed lazy-cons to lazy-seq, but haven't tested everything.
14:54gnuvincerhickey: if one wants to avoid unnecessary eagerness, should we stay clear of destructuring?
14:58technomancyheh; spew/slurp would be almost as awesome as spit/slurp
14:59cooldude127technomancy: woah you're here
15:00gnuvincetechnomancy: do you have an idea why slime-interrupt doesn't work in swank-clojure?
15:02technomancygnuvince: I've not touched the internals of swank-clojure at all, just the setup stuff.
15:03technomancycooldude127: hey. did you take a look at that date stuff I sent you?
15:03cooldude127technomancy: yeah, in fact i was wondering what you had in mind for other internal representations
15:03gnuvincetechnomancy: ok
15:04gnuvincetechnomancy: does it work for you?
15:04technomancygnuvince: I haven't tried it at all. I often just end up killing my inf-lisp buffer and restarting; I'm sure there's a better way though
15:05technomancyneed to spend some Quality Time with the slime manual
15:05BrackiWhat ecavtly does lazy-cat do?
15:06technomancycooldude127: I think I need to learn how gen-interface works. I'm not so sure I like using just a map, but I'm not sure how one constructs a new data type.
15:06cooldude127Bracki: eventually concatenates two things
15:06cooldude127technomancy: idk, it feels anti-clojure to me to use anything else
15:06gnuvincetechnomancy: ok; I find it annoying to do all the (use) and (import) that I had
15:08technomancycooldude127: well the problem I see is that if you're going to implement stuff like (later-than christmas 1 :month) and keep the internal representation as a map, you're going to need to do tons of useless translation back and forth between the two formats.
15:08cooldude127:( dates suck
15:09BrackiI'm trying to understand the fibonacci code using lazy-cat but I just don't get it.
15:10cooldude127Bracki: trust me, it's confusing
15:10technomancycooldude127: well I really don't know if that's the right way, but I think it at least merits some more investigation
15:10cooldude127yeah you're right
15:10cooldude127i'm really not sure
15:10technomancycooldude127: what do you think of the other functions I specced?
15:10cooldude127everything looked good to me
15:11technomancycooldude127: mostly I tried to think of what I like best about date libs from Ruby
15:11hiredmanBracki: are sure it is lazy-cat? not lazy-cons?
15:11Brackiyes
15:11technomancyand translate that into non-OO-speak
15:12hiredman,(lazy-cat '(1) '(2))
15:12clojurebot(1 2)
15:12hiredman^- that is what lazy-cat does
15:12cooldude127technomancy: the one thing that i wonder about is having parse guess the format. i have no idea how to make that happen, java doesn't support it i don't think
15:12lisppaste8Bracki pasted "fibs with lazy-cat" at http://paste.lisp.org/display/75585
15:13hiredmanah
15:13hiredmanso lazy-cat is lazy
15:13hiredmanso is map
15:13hiredmanso that turns into a lazy seq of (0 1 ..promise to compute the rest..)
15:13BrackiSo every element is evaluated when it is taken right?
15:14hiredmanyes
15:14cooldude127Bracki: yes, otherwise if they were all evaluated now, that would go infinitely
15:14hiredmanso it sort of rolls over on itsself
15:14technomancycooldude127: well I was thinking of trying each of the known formats in order of likelihood until a sane result was reached
15:14cooldude127yes
15:14technomancybut I don't know if that would work
15:14technomancya smarter approach may be necessary
15:14BrackiAlright lets say I do (take 4 fibs). What happens for 3 and then 4?
15:14cooldude127technomancy: yeah i'm not really sure how to do that. tho ruby is open source, maybe see how it does it
15:15hiredmanwell, the map happens
15:15technomancycooldude127: yeah, but that part's in C... ugh! =)
15:15cooldude127Bracki: your head explodes trying to understand it
15:15cooldude127technomancy: what about rubinius?
15:15cooldude127technomancy: do they have that working? wouldn't it be in ruby?
15:15technomancycooldude127: worth a shot. that's lower-priority than most of the other functions though
15:15cooldude127yeah
15:15hiredmanthe map is on fibs which is (0 1 ..promise to compute the rest..) and (rest fibs) which is (1 ..promise to compute the rest..)
15:16hiredmanand map is mapping +
15:16cooldude127Bracki: so you end up with (0 1 (+ 0 1) (+ 1 1) ...)
15:16cooldude127it's scary how it works
15:17hiredmanuse the substitution model
15:20cooldude127i'm doin it! i'm writing a damn symbolic math system in clojure
15:20cooldude127i've made the namespace
15:20cooldude127there's no going back
15:20jbondesoncooldude127: DOOOON'T DOOOO ITTT
15:20cooldude127jbondeson: I MUST
15:20jbondesonthere's no going back after this
15:20cooldude127lol
15:21cooldude127i have to, it will make everything easier
15:21jbondesonit's like killing a man, once you write a symbolic math library you're never the same
15:21cooldude127lol
15:21cooldude127jbondeson: have you done it?
15:21jbondesonno, but i've... seen things... things no man should have to
15:21cooldude127haha
15:22cooldude127well in the name of all that is holy, i'm telling infix to go jump off a bridge
15:22cooldude127so that should eliminate at least a few problems
15:22technomancy"I knew the risks!"
15:22technomancy(http://qwantz.com/archive/001406.html)
15:23cooldude127lol
15:24jbondesoncooldude127: it's not sybolic math if you throw out the most common notation!
15:24cooldude127jbondeson: fuck infix! i don't love it. all i want is to have variables in my stuff
15:25cooldude127i'll do what i want
15:25jbondeson"Reality is what *I* define it to be!"
15:25cooldude127EXACTLY
15:26cooldude127if i want to use prefix notation, damnit i will!
15:26jbondesonRPN is for calculators and COMMIES
15:26cooldude127haha
15:26WizardofWestmarcwho says the calculators aren't commies?
15:27jbondesontheir both after our precious fluids
15:27jbondesonthey're even
15:32pilkarnhow do I do if I want to call a Clojure-function from Java? I do compile with gen-class to generate class-files and then I import what? the namespace and refer to it like namespace.function(params); ?
15:37BrackiDoes anybody have some pointers to an easy parser written in Clojure? I'm about to write a Markdown parser.
15:38BrackiOr rather as far as I get tonite.
15:38danlarkinBracki: http://github.com/joshua-choi/fnparse/tree/master
15:38pilkarnhow do I make (System/exit 0) not kill the repl?
15:39danlarkinpilkarn: why do you want to do that?
15:39gnuvincepilkarn: don't call it?
15:39Brackidanlarkin: I meant *easy* ;)
15:39technomancyquote it. =)
15:40gnuvincepilkarn: http://java.sun.com/javase/6/docs/api/java/lang/System.html#exit(int)
15:40danlarkinBracki: it's a steep, but short, learning curve
15:40gnuvinceIt terminates the JVM
15:41danlarkinBracki: much more fun than reading a string char-by-char, believe me
15:42gnuvinceOr having a regex mess
15:42briancarperBracki: I was actually starting to write a Markdown parser too. I was going to use ANTLR. Didn't get very far though.
15:42BrackiI prefer the regex mess then.
15:43briancarperThe original Markdown.pl was a regex mess, and if you make a proper parser with a proper grammar, it will probably break compatibility. So I've read.
15:44technomancyheh
15:47BrackiWell who needs a Markdown parser anyways...
15:52gnuvinceif you go with the regex mess, you can probably just copy markdown.pl and be done with it in less than 4 hours
15:54BrackiThat's even harder to read...
15:55gnuvincefnparse then :)
15:55BrackiNo way, cause my Clojure is less than basic and I don't understand anything thats happening there...
15:56danlarkinBracki: it's not too difficult :)
15:56BrackiConsidering that the lazy-cat fibs stuff makes my head explode it is.
15:56danlarkindo you know much about formal grammar or automata?
15:57BrackiI did.
15:58danlarkinthen it's a breeze, you build rules from the bottom up to match bigger and bigger parts of the markdown spec
15:58danlarkinlike you'd start with a whitespace rule
15:58BrackiBut I wouldnt know how to handle multiple lines.
15:59danlarkinwell if you want to match a newline then use a rule to match \newline
15:59danlarkinif you don't, then just... don't match them
15:59danlarkinsee? easy :)
16:00jbondesonheh
16:00jbondesonthere's a reason people use parser-generators
16:00briancarperParsing Markdown requires at least two passes, I think. One to extract the links first.
16:00danlarkinbecause they're small minded!
16:01jbondesondanlarkin: either that or efficiency minded
16:01danlarkinjbondeson: parser combinators can run in polynomial time
16:02danlarkinif they use memoization correctly
16:02danlarkinfnparse doesn't, but it could
16:06BrackiHm, so how do I replace stuff in a string?
16:08technomancy(doc re-sub)
16:08technomancyclojurebot: hey!
16:08clojurebotexcusez-moi
16:08technomancyclojurebot: (doc re-sub)
16:08clojurebotNo entiendo
16:08danlarkinit's in str-utils I believe
16:08technomancyclojurebot: (use 'clojure.contrib.re-sub)
16:08clojurebotclojure is a very attractive hammer with a nice heft to it
16:08technomancyclojurebot: (doc clojure.contrib.re-sub)
16:08clojurebotclojure is cheating
16:08hiredman,(use 'clojure.contrib.re-sub)
16:08clojurebotjava.io.FileNotFoundException: Could not locate clojure/contrib/re_sub__init.class or clojure/contrib/re_sub.clj on classpath:
16:08technomancybah
16:09technomancy,(doc clojure.contrib.str-utils)
16:09clojurebotjava.lang.Exception: Unable to resolve var: clojure.contrib.str-utils in this context
16:09hiredman,(use 'clojure.contrib.str-utils)
16:09clojurebotjava.io.FileNotFoundException: Could not locate clojure/contrib/str_utils__init.class or clojure/contrib/str_utils.clj on classpath:
16:09technomancy,(doc clojure.contrib.str-utils/re-sub)
16:09clojurebotjava.lang.Exception: Unable to resolve var: clojure.contrib.str-utils/re-sub in this context
16:09hiredman*shrug*
16:09jbondesonclojurebot is anti-contrib
16:09technomancyjbondeson: yeah, when was the last time he contributed a patch anyway? slacker.
16:10jbondesonclojurebot: sharing is caring
16:10clojurebot'Sea, mhuise.
16:11cooldude127clojurebot: sharing?
16:11clojurebotsharing is caring
16:11cooldude127lol
16:12jbondesonhe'll be ditching us and teaching preschoolers in no time
16:12technomancyis this an appropriate use of cons? (str-join "\n " (cons "You are carrying:" @*inventory*))
16:13Brackire-gsub is it.
16:24pilkarn(fn [[x y] z](y (* x x))) isnt that allowed?
16:24pilkarn, ((fn [[x y] z] (* x y)) [10 20])
16:24clojurebotjava.lang.IllegalArgumentException: Wrong number of args passed to: sandbox$eval--933$fn
16:25pilkarnhow do I destructure there
16:25pilkarn, ((fn [[x y]] (* x y)) [10 20])
16:25clojurebot200
16:25pilkarnah
16:26Brackizomg the markdown.pl code is really awful.
16:27ayrnieuwhere is it?
16:27hiredman~google markdown.pl
16:27clojurebotFirst, out of 59600 results is:
16:27clojurebotDaring Fireball: Markdown
16:27clojurebothttp://daringfireball.net/projects/markdown/
16:27ayrnieuOK. Is that what you're looking at, Bracki?
16:29gnuvincefnparse isn't looking so bad now, is it?
16:30BrackiYeah but the whole detabbing unspacing stuff is even worse in a grmammar for my taste
16:30Brackiayrnieu: yes
16:30Brackitrying to translate the _detab subrotuine
16:30Brackihttp://code.google.com/p/python-markdown2/source/browse/trunk/lib/markdown2.py#386 This one is easiert to understand.
16:31stuartsierraOr just use http://sourceforge.net/projects/markdownj/
16:32ayrnieuoh, I was expecting something written in perl4. This this OK.
16:32Brackistuartsierra: Yeah, but the point is to learn clojure.
16:32ayrnieuBut why are you reading the code anyway? Implement the documentation.
16:33stuartsierraBracki: ok, go for it!
16:33Brackiayrnieu: true
16:33technomancyBracki: I hate to discourage you, but I'm not sure that's a great first project for clojure.
16:34skogsthere is also a haskell parsec like library in google groups files
16:34technomancyit doesn't seem to address any of the language's strengths
16:34skogsits based on clojure.contrib.monads code
16:34Brackitechnomancy: probably not, but project euler is boring.
16:35technomancyBracki: I had a lot of fun implementing a game.
16:35BrackiWhat kinda game? a MUD thingy?
16:36technomancy~mire
16:36clojurebotHuh?
16:36technomancyBracki: yeah, exactly: http://github.com/technomancy/mire/tree/master
16:36pilkarnhow do you do extends or implments from Clojure?
16:36hiredman~mire is http://github.com/technomancy/mire/tree/master
16:36clojurebotAlles klar
16:36pilkarnhow do I make (System/exit 0) not kill the repl?
16:37pilkarnhow do I do if I want to call a Clojure-function from Java? I do compile with gen-class to generate class-files and then I import what? the namespace and refer to it like namespace.function(params); ?
16:37Brackitechnomancy: Ah, saw that yesterday while browsing a friends following list on github.
16:39stuartsierrapilkarn: if you declare your method as static in gen-class.
16:40BrackiThe thing is, functional programming isn't made for me. I like filter,map and list comprehensions but I have those in Python as well ;(
16:40pilkarnBracki: it takes time
16:40WizardofWestmarcyou don't have the same guarantees of data safety though
16:41pilkarnayrnieu: can you explain to me why you think all Haskell code is useless?
16:41hiredmanBracki: what about it turns you away?
16:41BrackiThe special characters and the lack of coherent docs.
16:42hiredmaneh? that doesn't seem to be a functional programming issue
16:42BrackiNo, but I makes code even less readable for my taste.
16:43hiredman*shrug*
16:43technomancyBracki: you get used the special characters pretty quickly
16:44technomancygive it a week or so
16:44BrackiOr rather what turns me away is, I don't have any problems to solve that require functional programming.
16:44technomancythe docs will take longer than a week, of course
16:44technomancyah! that is a little harder to address. =)
16:45BrackiIt has either been solved or turns out to be too hard.
16:45WizardofWestmarcthe thing is, learning the functional style can arguably make even your non-functional programming better
16:45stuartsierraNothing *requires* functional programming, but it can be very concise and elegant.
16:45hiredmanI see you have been misinformed, all problems require functional programing
16:45WizardofWestmarcbecause of the new way it teaches you to think
16:45stuartsierraYes. :)
16:46technomancybut coming up with a learning project can be tricky; no doubt about that.
16:46BrackiThat's alright. I did a fair bit of scheme/guile but it's not how I tick.
16:46hiredman(ha ha guile)
16:47cooldude127anything involving math is more fun in a functional language
16:47cooldude127:)
16:52pilkarndoes java have an import as statement? it is either import java.io.*; then File or java.io.File ?
16:52pilkarnimport java.io.* as I; I.File would be better, as in Python
16:54stuartsierrapilkarn: No, Java doesn't have package aliases.
16:55Lau_of_DKWhats the syntax for gen-class' :expose ?
16:55Lau_of_DKI need to expose com.jme.app.SimpleGame's protected method getRootNode
16:55Lau_of_DKHow do I do ?
16:55Lau_of_DKThe things that you do ?
16:56hiredmanwhy functional programming matters is <reply>http://www.math.chalmers.se/~rjmh/Papers/whyfp.pdf
16:56hiredmaner
16:56hiredman~why functional programming matters is <reply>http://www.math.chalmers.se/~rjmh/Papers/whyfp.pdf
16:56clojurebotYou don't have to tell me twice.
16:57jbondesoni tell yeah, clojurebot just gets more uppity by the day...
16:57hiredmanLau_of_DK: http://clojure.org/api#gen-class has a bit about :expose
16:57stuartsierraLau_of_DK: I think you want :exposes-methods
16:57BrackiWell, more Euler than. What's sqrt in clojure?
16:57hiredman,(Math/sqrt 25)
16:57clojurebot5.0
16:58Lau_of_DKtypical rich, fancy documentation, no examples for dumb folk
16:58hiredmanbut, uh, Math/sqrt is a normal java static method, so you cannot just pass it a BigDecimal or what not
17:00stuartsierraLau_of_DK: protected methods are automatically exposed by gen-class.
17:00pilkarnstuartsierra: how? (declaring gen-class method static)
17:00hiredmanah
17:00hiredman:exposes is for fields
17:01stuartsierrayes
17:01pilkarnLau_of_DK: whatis SimpleGame?
17:01BrackiWhen should I use a Macro?
17:01hiredmanfor manipulating code
17:02hiredman(as data)
17:02Lau_of_DKpilkarn: google JMonkeyEngine
17:02stuartsierrapilkarn: (gen-class ..... :methods [#^{:static true} [methodName [param types] return-type]]
17:02stuartsierraI think
17:03jbondesonis clojure.contrib.math borked for anyone else?
17:03hiredmanBracki: for example, to talk about pointless symbols, I have a macro that transforms (a � b) to (comp a b)
17:04clojurebotsvn rev 1285; [lazy] updated docs
17:04hiredmannormally (a � b) would try and apply the function 'a' to '�' and 'b'
17:05hiredmanbut the macro gets access to (a � b) as a list of symbols, and deletes the � symbol and cons the comp partial onto the front of the list
17:05hiredman(actually it uses a zipper, so it doesn't really cons onto the front)
17:09hiredmaner
17:09hiredman"comp partial"
17:09hiredmanhah
17:13BrackiWhat is between (a and b). Unicode/putty issues.
17:13Chouserapparently an empty rectangle.
17:13cooldude127a dot
17:15hiredmannah
17:15hiredmanit is a interpunct
17:15technomancyit's a middle-dot rather than a period
17:15hiredmanhttp://en.wikipedia.org/wiki/Interpunct
17:19ChouserI once saw an guy get interpunked
17:19hiredmanashton sent him an email?
17:19jbondesondid he get composed?
17:19Chouserhiredman: exactly
17:22durka42was clojurebot's read-time vulnerability already discussed?
17:22Chouserand solved
17:22Chouserthough not the underlying question of whether read should allow such things
17:22rhickeyeveryone good with lazy branch?
17:23jbondesonbwahaha
17:24rhickeyChouser: I feel good about it, have no idea how best to get it in trunk without major breakage
17:24jbondesonembrace the chaos ;)
17:24ChouserI was planning another blog post -- I have what I think is a nice setup here for running any of the different branches on a whim
17:25ChouserIt doesn't currently handle the contrib branch, but I was thinking that could be worked in too.
17:26lisppaste8Bracki pasted "What's wrong with this primality test?" at http://paste.lisp.org/display/75598
17:27Chouserbut I'm not sure there's any value in that once the future is no longer uncertain. People can choose to upgrade now or later, but the end result is the same. *shrug*
17:27WizardofWestmarcthere could be major change branches in the future as well
17:27WizardofWestmarcso the info is still useful even if the current branches get merged into trunk
17:28Chouseroh, I see. sure
17:28hiredmanBracki: I think you need sqrt+1
17:28durka42,(empty? nil)
17:28clojurebottrue
17:28durka42^ that is Bracki's problem
17:28Chouserbut I guess I was thinking the benefit of keeping trunk un-broken (unbreaking?) for now is hardly anything once we know lazy branch is the future.
17:28durka42,(empty? (seq nil))
17:28clojurebottrue
17:29durka42wait, nevermind
17:31lisppaste8Bracki annotated #75598 with "untitled" at http://paste.lisp.org/display/75598#1
17:31hiredmanyeah
17:31hiredmanchange the "int" to an inc
17:32durka42nice one-char fix
17:33BrackiCool.
17:34jbondesonstill technically not correct because (is-prime? 2) => false
17:35BrackiNitpicker ;)
17:36rhickeySVN wizards - how do I (best) merge this lazy stuff back into trunk?
17:36jbondesonnumber theory is serious business
17:38jbondesonrhickey: unfortunately i've always done big merges in svn by letting svn have a go and using a really good diff tool to resolve the conflicts.
17:42danlarkinmake sure you're using svn 1.5! It has merge tracking built-in
17:42BrackiHm it's getting late, how do I break or return?
17:42hiredmanuh
17:43hiredmanyou don't
17:43jbondesondanlarkin: that would not be helpful only if he had it before he branched lazy off ;)
17:43hiredmanhow are you "looping"
17:43hiredman?
17:43BrackiWell take the prime code and add the explicit check for 2.
17:43hiredmanah
17:43hiredmanjust wrap it in an if
17:44hiredman(if (= x 2) true (filter ...))
17:44BrackiArgh, I closed the bracket to early...
17:44durka42what if x is 1?
17:45BrackiAfter the true.
17:45danlarkinjbondeson: :-o
17:46Brackidurka42: Since I do an empty? on an empty list then its true.
17:47durka42but is 1 prime? ;)
17:47jbondesondurka42: no.
17:47jbondesoniirc
17:48hiredmanprime is not evenly divisble by any number other then 1 and itsself
17:48hiredmanhmm
17:49hiredmanI am pretty sure 1 is not prime, but that def sounds different
17:49ayrnieuyou could also state it computationally: a number is prime if it is not divisible by any of the primes you've come across.
17:50durka42that's a seive, isn't it
17:50jbondesonhiredman: it excluded because it screws up factoring
17:50hiredmanhttp://en.wikipedia.org/wiki/Prime_number#Primality_of_one
17:51hiredmanYeah.
17:51ayrnieuyes, you can also ask what it means to factor a number. Reducing a factor from a non-prime gives you a new number -- that is, you're actually reducing the non-prime with the act.
17:51rhickeycat out of bag - Clojure on CLR: http://groups.google.com/group/clojure/browse_frm/thread/54571c9b8f625dba
17:51jbondeson"We don't like it cause it screws up our other pretty theories"
17:54jbondesonit was bound to happen. countdown until the next round of "you need a language spec"
17:54clojurebotsvn rev 1286; [lazy] smarter ASeq and LazySeq isEmpty()
17:54ayrnieujbondeson - glass is technically a liquid. But you can't drink it, you can't pour it into a container, it doesn't take the shape of its container to any extent; you can also do things to it that would make no sense given any other 'liquid'.
17:54rhickeySubversion command-line client, version 1.4.4.
17:55jbondesonrhickey: yeah, you're going to have a bit more manual merging.
17:56BrackiI give up on prime factorization for tonite.
17:59BrackiDon't know how to create ISeq from: BigInteger
18:02zargon_ad full lazy seqs: I'm a bit worried about the proposed "next" semantics. For Java programmers this would definitely mean "next element" as with Java iterators
18:02blbrown,paste
18:02zargon_I would even prefer typing "next-seq" ...
18:02clojurebotjava.lang.Exception: Unable to resolve symbol: paste in this context
18:02blbrown~paste
18:02clojurebotlisppaste8, url
18:02lisppaste8To use the lisppaste bot, visit http://paste.lisp.org/new/clojure and enter your paste.
18:03ayrnieuzargon, do you want to forever type 'next-seq' so that people who've spent all of a day with the language will wonder WTH 'next-seq' means instead of wondering, with all the other unfamiliar parts in context, what 'next' means?
18:03rhickeyzargon_: iterator next both gets next element and moves iterator, Clojure gives you next iterator
18:04lisppaste8blbrown pasted "Clojure...Im doing it wrong" at http://paste.lisp.org/display/75603
18:05blbrownanybody have any code improvements for that. I basically just want to have a count of number times a token occurs
18:05hiredmanhmm
18:05hiredmanI would use a line-seq
18:05hiredman(doc line-seq)
18:06clojurebotReturns the lines of text from rdr as a lazy sequence of strings. rdr must implement java.io.BufferedReader.; arglists ([rdr])
18:06hiredmanand just reduce over the line-seq
18:06blbrownhiredman, what about the 'map' part of it, that is the most important code
18:08zargon_rhickey: I really really appreciate your opinion, I just read the 63 posts on the mailing and thought "damn" rich is right on the "tail" proposal (not corresponding with first, "head" would be the right peer). But it would convey the right semantics I think ...
18:10hiredmanblbrown: nested lets are kind of nasty and often unnesassary
18:10rhickeyzargon_: I guess my feeling is a functional iterator like seq is so different from a stateful one like Iterator, there are bigger problems than the meaning of next - it could never be the same as Java's
18:10blbrownsigh
18:11zargon_rhickey: don't you think "next" is also tainted in colloquial sense?
18:11hiredman(doc zipmap)
18:11clojurebotReturns a map with the keys mapped to the corresponding vals.; arglists ([keys vals])
18:11WizardofWestmarcwhat about just using... frequencies I think it is? and then looking for the occurancies of your tokens within the map?
18:11BrackiWhat yields the last element of a list?
18:11zargon_"give me the next ONE"
18:12blbrownWizardofWestmarc, is that for me, that is what I need, where is frequencies
18:12WizardofWestmarcin clojure contrib, forget which lib
18:12technomancysome projects still using centralized version control perform merges in an external DVCS and then import them back into SVN... that's always an option if the merging gets hairy
18:12hiredman(map #(.group m %) (range 6))
18:12technomancyEmacs did this with Arch and CVS before git was around.
18:12WizardofWestmarcsomeone mentioned it recently but haven't had a chance to dig through the code for it
18:13hiredman(map #(keyword (.group m %)) (range 6))
18:13WizardofWestmarcand Bracki: only thing I can think of is (nth coll (- (count coll) 1))
18:13BrackiOr the largest?
18:14WizardofWestmarclargest in a list?
18:14Brackiyes
18:14WizardofWestmarc(reduce max coll)
18:14technomancyanyway, I'm in favour of merging the lazy branch as soon as possible
18:14hiredmanWizardofWestmarc: apply
18:14hiredman,(apply max [ 34 2 291 0 53])
18:14clojurebot291
18:15WizardofWestmarcah ha
18:15WizardofWestmarcfair enough!
18:15rhickeyso I just ran svn merge trunk lazy and got only Us and As, no diff popped up, and it builds!
18:15rhickeyI wonder if it did anything?
18:15hiredmanhmmmm
18:15WizardofWestmarclook at a file that you know what it should look like
18:16WizardofWestmarchiredman: btw, at least on that small a list reduce is faster then apply
18:16hiredmaninteresting
18:17WizardofWestmarcnot sure if that holds up across larger collections
18:17hiredman,(import 'java.util.Collections
18:17clojurebotEOF while reading
18:17hiredman,(import 'java.util.Collections)
18:17clojurebotnil
18:17hiredman,(import 'java.util.LinkedList)
18:17clojurebotnil
18:18hiredman,(let [x (LinkedList. (range 10000)) _ (Collections/shuffle x)] (time apply max x))
18:18clojurebotjava.lang.RuntimeException: java.lang.IllegalArgumentException: Wrong number of args passed to: core$time
18:18WizardofWestmarcalso blbrown: lemme find the old post in the google group with a short/fast frequencies function
18:18hiredman,(let [x (LinkedList. (range 10000)) _ (Collections/shuffle x)] (time (apply max x)))
18:18clojurebot9999
18:18clojurebot"Elapsed time: 42.059 msecs"
18:19hiredman,(let [x (LinkedList. (range 10000)) _ (Collections/shuffle x)] (time (reduce max x)))
18:19clojurebot9999
18:19clojurebot"Elapsed time: 7.435 msecs"
18:19hiredmanouch
18:19hiredman~def max
18:19hiredmanheh
18:20hiredmanmax uses reduce interally anyway
18:21WizardofWestmarcblbrown: http://bit.ly/kJxFl
18:22WizardofWestmarchiredman: true but that only matters if you feed it individual elements ;-)
18:24hiredmanI do find the disparity odd because apply max and reduce max both use reduce
18:24blbrownWizardofWestmarc, gracias
18:25WizardofWestmarcblbrown: np, I needed that function a while back for stuff I'm currently working on so I happened to have it bookmarked in delicious ;-)
18:25hiredmanI guess because it is (reduce max (max x y) more)
18:26WizardofWestmarchiredman: hm, certainly possible. Either way it's a useful bit of info
18:26hiredmanYes.
18:27hiredmanif you supply the reduce you leave out the extra calls to max
18:27rpgback
18:30blbrownWizardofWestmarc, what datastructure is returned from that frequency call.
18:31hiredmana map
18:31rhickeyhmmm.. that seemed to be backwards (i.e. lazy branch dominated), but when I switch to svn merge lazy trunk, I get only a few added files, no updates
18:32WizardofWestmarcbtw best thing I learned from that frequencies function is the merge-with function
18:32WizardofWestmarcrhickey: hm, trying to think what could be wrong, but I almost exclusively use tortoise svn so I don't know the syntax for the command line version.
18:34WizardofWestmarcthat and I'm anything but an svn wizard, I just spend a lot of time cleaning up other peoples' mistakes at work >_>
18:35danlarkinthis is the cost of using svn
18:36rhickeyI wish someone would just feed me the correct command line to try...
18:37hiredmanhttp://www.sepcot.com/blog/2007/04/SVN-Merge-Branch-Trunk
18:38hiredmanthat might help, step by step instructions
18:39WizardofWestmarcthe worst part about pre-1.5, the fact you have to supply the revision # of the break
18:40burkelibbeySo at the end of his latest blog post, chouser mentioned his system to easily switch between branches of clojure. I figured I'd share the piece of junk I hacked together to do the same thing: http://gist.github.com/65457
18:41WizardofWestmarcHeading out, take care all and good luck on the merge rhickey
19:10mrSpecHi
19:12cooldude127mrSpec: hey
19:12ayrnieuburkel, I have a clojure.jar symlink in my CLASSPATH , and I have a makefile. 'make lazy'. 'make trunk'.
20:08pilkarnis binary search the fastest way to locate a number in an array?
20:10hiredmanpilkarn: http://en.wikipedia.org/wiki/Sorting_algorithm#List_of_sorting_algorithms
20:18cooldude127pilkarn: is your data already sorted?
20:31cooldude127ok looks like symbolic math is gonna be way easier with some good pattern matching
20:34blbrown_how can I set the return value with 'loop' Can I put anything after 'recur'?
20:34hiredmanuh
20:34Chouserno, you need an alternate branch.
20:34hiredmanno
20:34blbrown_nevermind
20:34blbrown_Chouser, yea
20:35Chouserand then you have to merge them. Ask Rich how. ;-)
20:35hiredmanrecur is (a loop) not a loop
21:11matthew` Does anyone have any thoughts on delivering Clojure applications to the desktop?
21:11albinobuild jar+bundle with jre == delivered java app?
21:19matthew`I'm really coming to Java through Clojure and don't have much of a feel for how widely used it is out there.
21:20matthew`Are there many Java Swing apps running out there in the business world?
21:20hiredmanbecause the jvm startup time, java is not used a lot in desktop apps
21:20matthew`Ok.
21:21matthew`So it isn't a quality issue with the GUI then.
21:21hiredmanmostly for long running tasks
21:21cooldude127matthew`: well, the gui isn't the greatest, but it works
21:21matthew`Thanks.
21:21hiredmanand there are bindings for other gui frameworks
21:22matthew`I've heard of the QT4 bindings.
21:22burkelibbey...pretty much every other GUI framework, really.
21:22blbrownmatthew`, I like SWT
21:22hiredmanQT :(
21:22cooldude127swt isn't too bad
21:23burkelibbeyQT would be perfect if it weren't for the sketchy license :(
21:23matthew`ok.
21:24blbrownQT jvm bindings, do they exist? I am going with swt/eclipse ...millions of installs and great widgets.
21:24hiredmanperfect is a strong word
21:24burkelibbeyYes, I heard of someone developing QT in Clojure a few months back. I'll try to dig up the link
21:24cooldude127blbrown: they're called QT jambi i think
21:24burkelibbeyhttp://briancarper.net/2008/10/31/qt4-in-lisp/
21:25hiredmanLua_of_DK is pretty unrelenting about pushing a) emacs and b) Qt Jambi
21:25matthew`Thanks guys, sorry to start something and then leave. My swimming partners are hassling me. Thanks for the help and the links.
21:25blbrownI guess we have options. SWT, Swing, QT4
21:26hiredmanand "anyone who picks something else is doing so for religious reasons"
21:26Chousergtk/gnome
21:26hiredmanChouser: have you looked at gnome's java bindings?
21:26Chouserno, just saw they exist
21:26hiredmanthey, uh, :(
21:27hiredmanat least on freebsd
21:29hiredmanthe documentation doesn't match the current class hierarchy
21:29Chouserfor gtk??
21:29hiredmanthe documentation on the java gnome website
21:30Chouserah.
21:30hiredmandoesn't match what is actually in the java gnome source tree
21:30hiredmanclasses have been moved around, etc
21:30hiredmanpackages renamed
22:10shooverrhickey: still looking for that svn command?
22:26shooverif you're going to merge the lazy branch and be done with it, go to a clean up to date trunk working copy and run svn merge -r 1236:1286 http://clojure.googlecode.com/svn/branches/lazy. That takes all the changes to the lazy branch and applies them to the trunk working copy. There will be some minor conflicts to resolve.
22:29shooverIf you want to bring trunk changes into lazy and play with lazy some more, go to a clean, up to date lazy working copy and run svn merge -r 1236:1286 http://clojure.googlecode.com/svn/trunk.
22:30eyerisIf I instantiate a HashMap in Java, I have to specify the key and value types and .get() and .put() enforce those types. That doesn't seem to be the case in Clojure. Could someone point me to documentation of the implications of this?
22:30hiredmaneyeris: Generics are implemented as type erasure in java
22:31ChouserBefore generics, the types of things put in Java collections was not enforced.
22:31hiredmanhttp://java.sun.com/docs/books/tutorial/java/generics/erasure.html
22:32hiredmanso as I understand it, generics are just a compiletime check
22:32Chouserand allow you to avoid casting things as you take them out of the collection
22:33hiredman"there is no way to tell at runtime which type parameter is used on an object. For example, when you examine an ArrayList at runtime, there is no general way to tell whether it was an ArrayList<Integer> or an ArrayList<Float>."
22:34eyerisRight, so how does Clojure know what methods are available?
22:34eyerisOr is that a JVM operation, resulting in a runtime error?
22:35hiredmanclojure uses reflection, unless you type hint
22:35ChouserClojure does some type inference at compile time, which you can help along with type hints.
22:35eyerisOkay
22:36Chouserright, if that's not sufficient it will issue an optional warning and do the lookup at runtime.
22:36eyerisLast question: When dealing with generics in Clojure, this means that I can just completely ignore the type parameters and use the generic class as a raw type?
22:40Chouseryes
22:40eyerisGreat. Thanks.
22:40cooldude127eyeris: although it so doesn't matter
22:40cooldude127eyeris: java has generics mostly to avoid a bunch of casting. clojure doesn't bother with that, so it doesn't really matter
22:41cooldude127for the record, you can use a generic type in java as a raw type, it behaves as if you just has Object as the generic parameter
22:41cooldude127that was crappy english on my part
22:41eyerisI see that now.
22:42ozy`generics are necessary for typesafe polymorphic collections
22:42ozy`typesafe polymorphic other stuff as well, but mainly collections
22:42cooldude127ozy`: in clojure, we could give a damn about type-safety
22:42ozy`cooldude127: exactly
22:42cooldude127:)
22:49cooldude127it's sometimes fun to translate CL code to clojure, you really see how certain features clean things up
22:49cooldude127for example: maps being functions of their keys
22:49cooldude127AWESOME
22:49gnuvince_Hell yeah
22:49gnuvince_and having literal syntax for maps
22:49cooldude127yes also awesome
22:50gnuvince_I use them as much as I use them in Python or JavaScript
22:50cooldude127i forget that's not how CL works
23:12cooldude127what's the closest thing we have in clojure to this CL function: http://www.lispworks.com/documentation/HyperSpec/Body/f_sublis.htm#sublis
23:13cooldude127which btw, i had no idea existed until now
23:15pilkarncooldude127: yes i find clojure to be sooo much cleaner than common lisp.
23:16hiredmancooldude127: I think you'll have to roll your own
23:16cooldude127BOOO
23:16cooldude127:(
23:17hiredman,clojure.zip/seq-zip
23:17clojurebot#<zip$seq_zip__5928 clojure.zip$seq_zip__5928@171120a>
23:17hiredmanI think it would be fairly easy with a zippero n a seq
23:17durka42(let [tree ["one" "two" ["three" "four"]] reps {"one" 1 "three" 3} doit (fn doit [x] (if (coll? x) (map doit x) (get reps x x)))] (map doit tree))
23:17durka42,(let [tree ["one" "two" ["three" "four"]] reps {"one" 1 "three" 3} doit (fn doit [x] (if (coll? x) (map doit x) (get reps x x)))] (map doit tree))
23:17clojurebot(1 "two" (3 "four"))
23:19durka42~zippers
23:19clojurebotexcusez-moi
23:19durka42wasn't there a good link on the haskell behind them?
23:19hiredman~google haskell functional zippers
23:19clojurebotFirst, out of 1950 results is:
23:19clojurebotHaskell/Zippers - Wikibooks, collection of open-content textbooks
23:19clojurebothttp://en.wikibooks.org/wiki/Haskell/Zippers
23:19hiredmanthe zip.clj code is pretty clear
23:19durka42oh man the theseus example
23:20durka42i remember reading this when i was attempting to learn haskell
23:25hiredmanhttp://paste.lisp.org/display/74521 <-- could be useful
23:33hiredmanlisppaste8: url?
23:33lisppaste8To use the lisppaste bot, visit http://paste.lisp.org/new/clojure and enter your paste.
23:35lisppaste8hiredman pasted "sublis sort of, using transform" at http://paste.lisp.org/display/75625
23:43blbrownhmm, thinking about buying those clojure t-shirts
23:44durka42clojure t-shirts?
23:44blbrownhttp://www.zazzle.com/clojure+tshirts
23:44durka42heh
23:48Chouserblbrown: you should. I've currently got the keys to that account, but since the ideas are mostly not my own I've already said I'll give the proceeds (if any) over to Rich.
23:49blbrownwonder why the black one is so expensive. I wanted to get two
23:49Chouseryou can customize them, pick the shirt that you want.
23:50Chouserdoesn't mean there's a cheaper one, through. :-/
23:50blbrownooo, nice website
23:51ChouserSo far we've sold 7, so Zazzle owes Rich almost $20.
23:51ChouserPretty soon he could by that new Clojure book.
23:51Chouserbuy
23:55blbrownChouser, I just bought 2
23:55Chouserblbrown: great, thanks!
23:55Chouserwhich did you get?
23:56blbrownI got the one with 'state you are doing it wrong'
23:56Chouserooh, I should get one before the lisp conference in Boston.
23:56Chousersomething provocative for all the CLers.
23:56blbrownhehe
23:56Chouserlisp is not dead...
23:57hiredmanheh
23:58durka42might be preaching the choir with that one
23:58danlarkinhaha oh boy, I watch catching up on the conversation and I thought you said "So far we've sold 7200..." and my jaw dropped
23:58Chouserman, how embarrassing would it be to get beat up at a LISP conference.
23:58Chouserheh
23:58hiredmanimagine getting a fat lip
23:58hiredmanlipth
23:58hiredmanlithp
23:58blbrownthis is the only other programming shirt I have: http://www.flickr.com/photos/berlinbrown/21302219/
23:59Chouseroh, that's orders not shirts. up to 8 now.
23:59blbrownhehe
23:59Chousernice