#clojure logs

2009-01-26

00:07technomancyautomated tests for functional code are so easy; I love it
00:46ecretin eclipse I can add src subfolders with java. I need to do this for clojure, add java src paths, is this possible?
00:48hiredmanare you talking about classpaths?
00:48hiredmanwhat do you mean by source subfolderS?
00:53ecretjava source files. I am trying to load a project in clojure. To do it in java, I need to add source paths in eclipse so that it gets compiled as well. I suppose I should make jar files first?
00:53durka42the java files are going to have to compiled first
00:53ayrnieu'load a project in clojure' doesn't make sense. Do you mean enclojure?
00:54ecreti mean, can clojure build java files as well by using the jdk?
00:54hiredmanbuild java files?
00:54ecretno, not enclojure. I should of said build a project.
00:54ecretyes
00:54durka42i mean, i guess you could make a clojure ant task
00:55durka42that's sort of a tangential problem though
00:55hiredmanyou mean java source or jvm bytecode or...
00:55ecretsource
00:55hiredmanso you want to generate java source from clojure?
00:56ecretno
00:56hiredmanso what do you want?
00:57ecreti realize I should of just made jar files or use ant. I thought maybe clojure could handle java files in the background so long as you had the jdk installed.
00:57durka42i think you want to have java source files and clojure source files in the same project and have everything build when you click a button?
00:57durka42that would require ant
00:57ecretyes
00:58durka42clojure will look for class files, but it won't compile java source
00:58hiredmanand javac cannot handle clojure files
00:58arohnerstairstep: takes a seq of numbers, and adds each member to every value after it in the seq. (stairstep [1 1 1 1 1]) => (1 2 3 4 5). Does this function already exist? is there a better way to write it than using loop/recur?
00:59ecretthanks for the help
00:59hiredmanmaybe you could do it lazy like with seqs
01:02Chouserarohner: similar to reductions
01:02arohnerChouser: I've never quite understood how reductions works. Can you give me an example?
01:02Chouser,(use '[clojure.contrib.seq-utils :only (reductions)])
01:02clojurebotnil
01:02Cark(defn stair-step [seq] (reduce (fn [val item] (conj val (+ item (last val)))) [(first seq)] (rest seq) ))
01:02Chouser,(reductions + [1 1 1 1 1])
01:02clojurebot(1 2 3 4 5)
01:03Carkhoo =)
01:03Cark(doc reductions)
01:03clojurebotNo entiendo
01:03Chouser,(doc reductions)
01:03clojurebot"([f coll] [f init coll]); Returns a lazy seq of the intermediate values of the reduction (as per reduce) of coll by f, starting with init."
01:04Cark,(reductions + 4 [1 1 1 1 1])
01:04clojurebot(4 5 6 7 8 9)
01:05arohnerthanks
01:06ayrnieuwhere is this defined?
01:06hiredmanclojure.contrib.seq-utils
01:06Chouserwhere is 'this' defined?
01:07durka42,(this)
01:07clojurebotjava.lang.Exception: Unable to resolve symbol: this in this context
01:07Carkin proxy !
01:07ChouserCark: right!
01:07Carkyay =)
01:07ayrnieuah, I missed it.
01:08arohneris the last update to clojure contrib really 2008-12-27?
01:08Carki'd like to see more use cases for reductions
01:09Chouserarohner: no, it's moved to google code
01:09Carksomething less trivial maybe
01:09arohnerChouser: ah, that would explain it
01:09Chouserhttps://clojure-contrib.googlecode.com/svn/trunk
01:09arohnerthanks
01:09Chouseror maybe http instead of https
01:10Carkclojurebot: where is contrib ?
01:10clojurebotcontrib is http://code.google.com/p/clojure-contrib/
01:10durka42~contrib
01:10clojurebotcontrib is http://code.google.com/p/clojure-contrib/
01:13hiredman~ seen arohner
01:13clojurebotarohner was last seen joining #clojure, 0 minutes ago
01:13arohneryay, mixing emacs and mac shortcuts
01:21technomancynice; how long has clojurebot done seen?
01:21durka42yesterday or thereabouts
01:21hiredmanabout a day, day and a half
01:22hiredmanthe current instance doesn't recognize quits because I haven't restarted it
01:22durka42~ seen cadsmack
01:22clojurebotcadsmack was last seen joining #clojure, 102 minutes ago
01:23hiredmanyeah
01:32Carkhum there is something in don't understand
01:32Cark,(java.lang.Character/isWhitespace \a)
01:32clojurebotfalse
01:32Cark,(split-with java.lang.Character/isWhitespace (seq "qs fq df"))
01:32clojurebotjava.lang.Exception: No such namespace: java.lang.Character
01:32durka42java methods are finicky like that
01:32Chousersomebody's reading the book
01:32hiredmanjava.lang.Character/isWhitespace is not a clojure fn object
01:32durka42,(split-with #(java.lang.Character/isWhitespace %) (seq "qs fq df"))
01:32clojurebot[nil (\q \s \space \f \q \space \d \f)]
01:32durka42you have to wrap them
01:33Carkah thanks !
01:33Carkand no i'm not reading the book !
01:33durka42,(split-with (memfn java.lang.Character/isWhitespace) (seq "qs fq df"))
01:33clojurebotjava.lang.IllegalArgumentException: No matching method found: isWhitespace for class java.lang.Character
01:33hiredman,(macroexpand-1 '(java.lang.Character/isWhitespace \a))
01:33clojurebot(. java.lang.Character isWhitespace \a)
01:33Carkthank you all
01:33ChouserCark: oh!? I just finished that page.
01:33ayrnieuwhere's the book?
01:34Chouser~book
01:34clojurebotbook is http://www.pragprog.com/titles/shcloj/programming-clojure
01:34hiredmanclojurebot: know anything about the book?
01:34clojurebotbook is http://www.pragprog.com/titles/shcloj/programming-clojure
01:34hiredmanlove that fuzzy lookup
01:36Carkchouser : must be a good book anchored in practical problems =)
01:38Chouser:-)
01:50Cark~ regex
01:50clojurebotHuh?
01:52durka42clojurebot: regex is <reply>Sometimes people have a problem, and decide to solve it with regular expressions. Now they have two problems.
01:52clojurebot'Sea, mhuise.
01:52durka42~ regex
01:52clojurebotSometimes people have a problem, and decide to solve it with regular expressions. Now they have two problems.
01:53Carki have to ... http://java.sun.com/javase/6/docs/api/javax/swing/RowFilter.html
01:54ayrnieuwhat question do you have about them?
01:55Carkjust wanted to see if clojurebot knows where to find a reference on java's regex
01:55Carkfound it now, thanks
02:46ayrnieu,2 3 (+ *1 *2)
02:46ayrnieuclojurebot: hello?
02:46clojurebotBUENOS DING DONG DIDDLY DIOS, fRaUline ayrnieu
03:47jliuser> (+ 1,000,000 2,000,000)
03:47jli3
03:47jlidarn it. I was all excited that I'd finally be able to insert commas into my numbers
03:51ayrnieuyou could write nr such that (+ (nr 1,000,000) (nr 2,000,000)) = 3000000
03:52jlithat's true. maybe if we ever get to twiddle the reader macros...
04:10teIs everything in clojure a function?
04:12jli"everything"?
04:12ayrnieu,(class "not a function")
04:12clojurebotjava.lang.String
04:12jli,3
04:12jli:(
04:12ayrnieu,(do 3)
04:12clojurebot3
04:12jli,(prn 3)
04:12jli:(
04:12clojurebot3
04:13jli:)
04:13jliayrnieu, hey, you're here too.
04:23ayrnieuhttp://gnuvince.wordpress.com/2009/01/25/response-to-problems-with-lisp/
04:24jliI thought it was interesting that hash tables are functions in Ruby, as well. Any other languages have that, that I was unaware of?
04:25ayrnieuit's an Arc idea, but hash tables aren't function in Ruby.
04:26jlier, right, it was Arc.
04:31AWizzArdMoin
08:41stuarthalloway"Can't await in agent action" is giving me fits...
08:41stuarthallowayrhickey: would it be possible to relax the restriction on awaiting in agent actions when using the send-off pool?
08:44rhickeystuarthalloway: await is really a simplistic thing - real workflow is going to involve queues/latches. In any case, the prohibition is not to avoid thread starvation, but deadlock: A awaits B awaits A
08:45gnuvinceHi
08:46Lau_of_DKrhickey: Did you consider this http://mindtouchsoftware.com/random/git_two.jpg ?
08:46Chouseror if you feel like ignoring the queue/latch advice, you can do your send-offs and awaits in a regular thread
08:49stuarthallowayrhickey: got it. Not sure how I ever decided to use agents for runonce -- just went back through the email thread where you quite clearly said the agent approach wouldn't compose
08:54rhickeyChouser: maybe using pmap from a regular thread? although pmap does use send...
08:55jacky_Has anyone managed to add a new folder to the classpath of clojurebox?
08:56jacky_(add-classpath) does not seem to work
08:57rhickeymaybe this pvals stuff needs promotion: http://paste.lisp.org/display/73650
08:58shooverjacky_: from the REPL or during initialization?
08:59Lau_of_DKcall-par is cool, never saw that before
08:59stuarthallowayrhickey: if I use latches instead of await, I still have the potential for deadlock, right? It's just up to me to avoid circularity
09:02stuarthallowayI can't see a way to write runonce in a composable way while sticking to Clojure-level concurrency abstractions: agents won't compose, and transactions assume no side-effects...
09:03rhickeystuarthalloway: latches, and all j.u.concurrent blocking constructs, offer timeouts
09:04rhickeystuarthalloway: what does runonce do?
09:04stuarthallowayrhickey: takes a Clojure fn, and returns a fn that runs only a single time, caching the result
09:05rhickeywhy do you need threads then?
09:06stuarthallowayrhickey: maybe I don't. Other build tools are logically single threaded until you introduce an explicit parallel task
09:06rhickeysending-off one job and awaiting it is essentially single-threaded
09:07stuarthallowayrhickey: my intention is to create a build system that is parallel-ready
09:08stuarthallowayso that (at a later date) once can kick off multiple build targets that do *not* have a direct dependency, safe in the knowledge that if they share a subtask that it will run only once
09:09stuarthallowayrhickey: you have already answered my question on this in detail: http://groups.google.com/group/clojure/browse_thread/thread/12b48c9f7954901b/c4a8f351e9b17787?lnk=gst&amp;q=macro+specified#c4a8f351e9b17787
09:09stuarthallowayI just realized that I still haven't understood all the implications
09:10Lau_of_DK(let [gitdir (javax.swing.JOptionPane/showInputDialog "Git dir" "/home/lau/coding/gitrepo/")]
09:10Lau_of_DK (with-sh-dir gitdir
09:10Lau_of_DK (sh "git" "log --stat > mynewlog.txt")
09:10Lau_of_DK (slurp (str gitdir "mynewlog.txt"))))
09:11Lau_of_DKThis fires without errors, but produces no new file - Why?
09:12stuarthallowayLau_of_DK: I think you need to break the command args into separate strings
09:12Lau_of_DKsame
09:13Lau_of_DKAs in - No file produces, no errors returned
09:13rhickeyChouser: did you see the thread on sync watchers? That might apply to stuarthalloway's issue here too. Like your watcher problem, he is going to asynchronously generate an indefinite amount of work, then need to know when it's complete
09:14hiredman,(let [nr (comp #(Interger/parseInt %) str)] (nr 1,000,000))
09:14clojurebotjava.lang.Exception: No such namespace: Interger
09:14hiredman,(let [nr (comp #(Integer/parseInt %) str)] (nr 1,000,000))
09:14clojurebot100
09:14stuarthallowayLau_of_DK: If sh is failing with an error, you won't see it because the return value of with-sh-dir is the return value of slurp. Try println-ing the call to sh
09:15Lau_of_DKoh yes, youre right
09:15Lau_of_DKfatal: ambiguous argument '>': unknown revision or path not in the working tree.
09:15Lau_of_DKUse '--' to separate paths from revisions
09:15Lau_of_DKThat gives me a better clue
09:15Lau_of_DKChouser: As I recall you wrote sh - Can I used > < | operators in my calls ?
09:19ChouserLau_of_DK: no. If you're sure you want that, you'll have to use sh to launch an actual shell process, like /bin/bash or something, to interpret those chars
09:19ChouserLau_of_DK: but be aware that there are security issues with that -- you have to be extra careful about the context in which you're running them
09:20Chouserrhickey: haven't read that thread yet, thanks.
09:20Lau_of_DKOh ok - Man you run a tight shift :)
09:24Chouser"ship" I think. :-)
09:24Lau_of_DKhehe
09:24Lau_of_DKborn danish -> learn english -> fail
09:24Lau_of_DK:)
09:27Lau_of_DKChouser, I get another type of error now which is pretty confusing, from CL "sh git log" works of course, but when I do it with your sh script I get "/bin/sh: Can't open git, or "/bin/bash/git: cannot execute binary file
09:29StartsWithKLau_of_DK: http://paste.pocoo.org/show/101445/ you don't need temp file to capture programms output
09:31Chouserright, and 'sh' returns stdout and stderr contents by default
09:33Kerris7Chouser: how's the ultra-alpha Clojure editor-repl coming along? :)
09:34Chouserkarmazilla's fixing it right up.
09:34Chouserhe's added several features to his own fork of it.
09:35Kerris7that's nice, thanks for the update =)
09:38Lau_of_DKStartsWithK: Doh! Youre right ofc :)
09:46Chouseryou might need to take the inverse of a "Erlang for Java Programmers" and compose with "Clojure for Java Programmers"
10:13ChouserI suppose it's intentional that there's no way to create a local Var with a given root binding?
10:14Chousershort of using the Java methods directly, I suppose.
10:26LordOfTheNoobs,(doc gensym)
10:26clojurebot"([] [prefix-string]); Returns a new symbol with a unique name. If a prefix string is supplied, the name is prefix# where # is some unique number. If prefix is not supplied, the prefix is 'G__'."
10:26rhickeyChouser: yes, it's intentional - do you have a use case for a root binding?
10:33Chouserrhickey: nothing very compelling, but I've noticed it before. Most recently was the 'my-defmethod' brought up last night.
10:37Chouserhttp://paste.lisp.org/display/74247
10:37Chouserthe purpose being to provide a place to hang some metadata, so a bit of an abuse of a Var
10:38Chouserconversation starts here: http://clojure-log.n01se.net/date/2009-01-25.html#19:43
10:39rhickeyprobably just need a non-macro (add-method multi dispatch-val fn)
10:39rhickeythen fn could be regular defn'ed var
10:39rhickeyyou'd get name and metadata
10:41gnuvinceHow do I get args into main?
10:42gnuvince(defn main [args] ...)?
10:50ayrnieu,(do *command-line-arguments*)
10:50clojurebotjava.lang.Exception: Unable to resolve symbol: *command-line-arguments* in this context
10:50ayrnieu,(do *command-line-args*)
10:50clojurebotnil
10:51Chousergnuvince: how is your 'main' getting called?
10:51gnuvinceChouser: it's not.
10:52gnuvinceChouser: I wonder how i'm supposed to get the command line args
10:52Chouserah. just as ayrnieu demonstrated.
11:00stuarthallowayrhickey; is it possible to add my own latch to an agent-based implementation, accepting the possibility of deadlock? My simple test fails: http://paste.lisp.org/display/74268
11:12rhickeystuarthalloway: you need to 1) release pending sends, 2) return the same thing from your send-off as send-off (the agent), 3) deref the agent before using it in + : http://paste.lisp.org/display/74268#1
11:13stuarthallowayrhickey: thanks! is this so gross that I shouldn't be using agents at all, or can you imagine scenarios where agent + deadlockable send-off is the most clojurish way?
11:15rhickeyI still think send one job and wait for it is not multithreaded, so why bother?
11:18rhickeyyou can't parallelize in the small like this. in the large, you'd have sets of things that could run in parallel, which when done constitute a single unit of work that might need to precede another (i.e. serially), and a way to express those parallel/serial dependencies
11:22stuarthallowayI think build tasks are large enough to merit parallelization
11:23stuarthallowayand I was hoping to use runonce semantics as a way to implicitly specify serial dependencies
11:23stuarthallowaywhile the top level caller can kick off multiple tasks in parallel
11:23rhickeystuarthalloway: so only do the parallel part with agents
11:24hiredmanstuarthalloway: each task or target should get it's own agent, so building a target is firing a "build" to that target's agent, with some sort of "return to this task" when you are done
11:24rhickeydoing the serial part with agents just makes it hard, since you have to keep waiting
11:24stuarthallowayhiredman: that's pretty much what Rich is talking me out of :-)
11:25hiredmanreally?
11:25stuarthallowayhiredman: yes. read back through the irc log. agents and awaits are not composable, nor necessary
11:26stuarthallowayso I end up using agents only at the top level, and letting individual tasks run on the agent that hits them first
11:26hiredmanok
11:27rhickeystuarthalloway: the problem seems more of a fork/join one, which Chouser has also encountered recently
11:28stuarthallowayrhickey: will take a look at the fork/join stuff. Had planned to leave it out of the book for space reasons, but this is making me reconsider
11:28rhickeystuarthalloway: I sketched something here: http://paste.lisp.org/display/73650
11:28rhickeystuarthalloway: I don't mean official Fork/Join
11:29stuarthallowayrhickey: gotcha, thanks!
11:30rhickeyyou don't really want agent identity, just thread launching and results gathering
11:34rhickeyit's the identity aspect of agents that require guarding against deadlock, without it, you can't wait on the thing waiting for you since you can't get a handle on it
11:34rhickeyI should make this pval stuff official, since it is so easy to use
11:34stuarthallowayrhickey: that would be very cool
11:35rhickeycgrand argued for a macro in-between pval and pargs, that just took exprs and returned vector of values
11:36rhickeyi.e. getting rid of the f of pargs
11:36stuarthallowayrhickey: makes sense
11:37stuarthallowaypvals is a little weird: you can't get completed results in the order they become complete
11:38stuarthallowayI would want some way to carry around which calculation went with a result, so they could be pulled off as they complete, instead of in the order they kicked off
11:39rhickeystuarthalloway: I disagree
11:39stuarthallowayrhickey: then I am probably wrong :-)
11:39rhickeyit would be a substantially weaker promise, would require job identity etc
11:40stuarthallowayrhickey: then don't make it lazy. The laziness is misleading, isn't it?
11:40stuarthallowaythe laziness is useful if the tasks added first finish first
11:41stuarthallowaybut not otherwise
11:41lisppaste8rhickey annotated #73650 with "pexprs" at http://paste.lisp.org/display/73650#2
11:42stuarthallowayrhickey: I would use pexprs immediately if it were in core, and include it in the book
11:43rhickeyname ok with everyone?
11:44danlarkin+0
11:45LordOfTheNoobspdo, pardo?
11:45rhickeyI'm not sure anyone would use pvals directly, and is the better name
11:45rhickeyLordOfTheNoobs: do implies side effects, and this is useful w/o side effects
11:46stuarthallowaypapply?
11:46cgrandrhickey: plist?
11:46rhickeyapply implies a collection last arg
11:46hiredmanpexprs is good for me
11:46rhickeycgrand: it's kind of like list, but lazy
11:46stuarthallowaybrown-noser :-)
11:47hiredmanstuarthalloway: I have another nameing issue, so I will let this one pass
11:47LordOfTheNoobspcollect
11:47hiredman:P
11:47hiredmanLordOfTheNoobs: implies reduce
11:47stuarthallowaythese names are all too long, how about "p"?
11:48hiredmanparallel expressions is exactly what they are
11:48LordOfTheNoobsparallel-map-apply
11:49hiredmanexpressions-evaluated-in-parallel-and-returned-as-a-lazy-seq
11:49AWizzArdtoo long
11:49hiredmaneeiparaals
11:49rhickeyanother difference from list is that it is not a function, not that that matters much
11:51rhickeymaybe the p part implies the lazy difference between plist and list
11:51cgrandpvals is a good name, let rename pvals pcalls and pexprs pvals!
11:51hiredmanrhickey: (scope ...) should be (horizon ...) and calling (when-hrz ...) outside of a horizon should throw a naked singularity exception
11:51rhickeycgrand: I agree, it's between pvals and plist
11:51hiredmanplist is nice
11:51danlarkinI dislike pvals, sounds too much like vals, which is totally unrelated
11:52MarkVolkmannWhy does (ns-map 'clojure.contrib.math) return include all the mappings from core?
11:52Chouserdanlarkin: nice point.
11:52rhickeydanlarkin: true, pcals and vals are unrelated
11:52rhickeypvals
11:53stuarthallowayMarkVolkmann: use ns-interns instead
11:53AWizzArdor why not embed pvals into the macro, then there is only one thing that needs a name (the macro)
11:53rhickeyAWizzArd: that's not important, only the resulting macro name
11:54rhickeypseq?
11:54danlarkinpexprs is kinda neat, since it's a play on sexprs, Parallel versus Serial?
11:55hiredmanhah, cute
11:56AWizzArddanlarkin: ah that's what the s stands for... ;)
11:57AWizzArdI think plist sounds nice. It is close to list.
11:58cgrandpvalues? there are more differences between pseq and seq than between plist and list
11:59rhickeycgrand: I like pvalues
11:59AWizzArdWe could ask Kent Pitman
12:00AWizzArdif it is between pvals and pvalues I like pvals better, as this is shorter
12:01rhickeyOk, vote, pvals or pvalues?
12:01AWizzArdvals
12:01stuarthallowaypvals
12:02arbschtpvals, in keeping with 'vars' and 'keyvals'
12:04cgrandpvalues because of vals
12:04Chouserpvalues because cgrand said so
12:04rhickeyChouser: cop out :)
12:04danlarkinsame as Christophe
12:05Chouserer, um, I mean -- for the reasons cgrand gave.
12:05danlarkinthat is, pvalues
12:05rhickeywait for clojurebot...
12:06rhickeythanks all for the feedback!
12:07LordOfTheNoobs, (if (> 0.5 (rand)) "pvalues" "plist")
12:07LordOfTheNoobs,(if (> 0.5 (rand)) "pvalues" "plist")
12:07clojurebot"pvalues"
12:10clojurebotsvn rev 1235; added pcalls, pvalues
12:12rhickeyhave at it
12:15lisppaste8danlarkin annotated #74247 with "using defn" at http://paste.lisp.org/display/74247#1
12:16danlarkinrhickey: is that paste like what you were suggesting regarding multimethods saving vars instead of function objects?
12:17rhickeydanlarkin: not quite - add-method should be a function
12:18rhickey(add-method manager-dispatch :default #'manager-dispatch-default)
12:19danlarkinrhickey: why should it be a function instead of a macro?
12:20rhickeydanlarkin: because that would have general utility for dynamic use, and could be used for your purpose as well
12:20rhickey(map add-method ...)
12:21danlarkinMmmmhm, that makes sense
12:23danlarkinthanks for the help
12:24rhickey(+ 1 ##2 3)
12:24rhickey-> 4
12:25rhickeythoughts?
12:25danlarkinI kinda like #- but what do I know
12:26jbondesonI'm with the #- crowd
12:26jbondeson## looks odd to me
12:28Chouserthey're all strike me as ugly
12:28jbondesonheh
12:28Chouserbut my problem may be with the concept as much as the syntax
12:28jbondesonlesser of the evils Chouser, it's like voting for anything else
12:28ayrnieupvalues says "sequence of the values of the exprs", list says "list containing the items". Is there any difference in how they treat the exprs given to them?
12:29jkantzwell, coming from common lisp I find #+:foo useful
12:29jkantzwith a corresponding *features* variable
12:29jkantzand often write #+nil
12:29Chousercan't we group it... (+ 1 (read-if 2 3))
12:29rhickeyjkantz: right, that's the only problem with using #- here, no test, no use of *features*
12:30jbondesonChouser: that require much more work for quickly getting rid of forms.
12:30technomancyso the server-socket library has some example code in the form of a socket-repl, but the example does silly things with java.io.OUtputStreamWriter and LineNumberingPushbackReader that strike me as unnecessary detail. what if we made it use duck-streams instead?
12:30jbondesonrhickey: but if you use #- you could always add it later, correct?
12:30jbondesonrather than add a second reader-macro for features you could expand.
12:31rhickeyjbondeson: no, because the immediately following form would not be interpreted as a test
12:31jkantzyeah existing code would get confused once it's added
12:31jbondesonhmmm, i guess it would be breaking.
12:31rhickeyif #-foo eats foo it would be a breakling change to later say #-test foo
12:31rhickeybreaking
12:31ayrnieu(if this is just to have a (comment) that doesn't return anything, why not make (comment) not return anything?)
12:32technomancywhat's this for?
12:33jbondesonreader macro for commenting out a form
12:33Chouseroh! see, I already misunderstood the example. I thought ##2 was using the trueness of 2 to include 3
12:34rhickey## (or whatever) would just eat the next form
12:34technomancyjbondeson: huh; handy
12:34jbondesoni guess with that argument i'm swayed toward ## or something else so #-/+ can be reserved for features
12:35jbondeson#~ or something would also work, but is harder to type.
12:35jkantzwow that's eery, a random person just walked into my office asking me what #+bugxyz meant in some lisp code
12:36jbondesonbut that would get confused with ~
12:36jbondesonhmmm
12:36jbondesonnaming is the hardest part of apis
12:36ayrnieuNobody'll ask what (comment ) means. And if they think to notice that it doesn't return anything because it's a magical read-time form, they'll just say "oh, that makes sense."
12:37jbondesonbut a form is harder to add/remove than a reader macro
12:37jbondesonthe most common use is quickly adding/removing a form
12:37rhickeyayrnieu: it really doesn't work to have to add structure
12:46duck1123couldn't we have both, (comment) doesn't return anything and ## is a reader macro for (comment)?
12:47duck1123I've been bitten by the (comment) => nil when trying to remove a section of code in a fn for testing
12:48gnuvinceI have a doseq that iterates over a list of files given at the command line. What would be the best way to accumulate the total number of lines? I was thinking of using reduce, but I feel uncomfortable sticking side effects in there.
12:48rhickey(comment ...) isn't on the table right now, just need to pick a dispatch character for ##/#- reader discarder
12:49LordOfTheNoobs#comment:
12:50WizardofWestmarcthat seems far too verbose.
12:51WizardofWestmarcand depending on font, #- might not be as readable, so I'd say go w/##
12:51duck1123are letters out of the question? #d (for delete)
12:51kotarak#; would be nice. Editors can be fixed.
12:52rhickeyleaning towards #-, as when using to remove an existing #{} or #(), ##() and ##{} will work, but when uncommenting easy to make a mistake
12:52rhickeykotarak: eventually, but a real short-term problem
12:53rhickeyduck1123: letters are out for now
12:54kotarak#% #$ #? #* ...
12:54kotarak% is comment in TeX. So maybe #%?
12:54duck1123then I like #- I would vote for #; but the editor breakage would be too much. (especially on the simple editors)
12:54LordOfTheNoobsif you could either #; or #\; , emacs, at least, syntactically seems to support the latter.
12:55mmcgranaIs there any reason that (name k) would ever return nil for a keyword k?
12:55ayrnieugnuvince, you can write a doseq that also carries the number for you (binding an additional parameter to an initial value, then updating it based on the value of the last form in the body) or you can update a Ref
12:55LordOfTheNoobsOf course then noone would update the editors from only supporting the #\; option, so nevermind.
12:57ayrnieuI like ## , # has the same comment value of these suggestions, it's easy to type, it doesn't suggest or stomp over CL ideas.
12:57gnuvinceayrnieu: I'd rather stay away from refs if I can avoid it without too much of a readability penalty
12:58ayrnieugnuvince - (doseqlet [n 0] [f files] ... (+ n read-lines)) => total-lines
12:58gnuvincedoseqlet?
12:58gnuvinceIs that in contrib?
12:58ayrnieuas a proposed name.
12:58rhickeymmcgrana: shouldn't
12:59gnuvinceI might also use loop instead of doseq
13:05gnuvinceThat's a whole lot less readable though :-/
13:06Chousergnuvince: what side effects? opening and closing files?
13:06rhickey#_ ?
13:06lisppaste8gnuvince pasted "loop vs doseq" at http://paste.lisp.org/display/74271
13:07kotarak#_ is also nice. Following the _ "don't care" convention for locals and function params.
13:08jbondeson#_( ... ) might not look too bad
13:08hiredmangnuvince: you can make a lazy seq of thunks calling readline and take-while not nil
13:08jacky_I am a bit confused about namespaces -- I have my c:\user directory where I have a file called json/json.clj json.clj contains (ns json). I have another file json_tests.clj which contains (use 'json) . I added c:\user to classpath using (add-classpath "file://c:/user/"). When I run json_tests.clj, I get an error java.io.FileNotFoundException: Could not locate json__init.class or json.clj on
13:08jacky_classpath: (json_tests.clj:0)
13:08hiredmanand call count on it
13:08ayrnieugnuvince - that isn't a whole lot less readable, it's just longer.
13:08lisppaste8Chouser annotated #74271 with "less ceremony" at http://paste.lisp.org/display/74271#1
13:09hiredmanoh
13:09hiredmanyeah
13:10hiredman*that*
13:10Chouseroh, but you're asking about the other loop?
13:10kotarakjacky_: the namespace must be named json.json or the json.clj must be moved up one level in the directory hierarchy.
13:10gnuvinceChouser: yes
13:10gnuvinceI commented what I had before
13:10gnuvinceI wanted to include the total number of lines
13:10gnuvince(somewhat like wc -l)
13:10kotarakjacky_: I vaguely remember, that there should at least be one . in the namespace. So I would suggest to try json.json.
13:11gnuvinceAnd short of using an atom, I don't see how I can keep the code short
13:11hiredmanwiat
13:11hiredmanwoa
13:11hiredmanfold2
13:12hiredmanhmmm
13:12ayrnieumakes sense.
13:12hiredmanthe only thing is with fold2 you would end up counting the lines twice
13:12ayrnieucan you append a lazy finite seq onto the end of another one?
13:12hiredmanayrnieu: concat
13:13ayrnieuthen string all the files together, with a separator, and then count lines once :_)
13:13mmcgranao boy, i had a parameter named "name" that had a keyword value, got nil because (:foo :bar) => nil, sorry to bother...
13:14hiredman,(name nil)
13:14clojurebotjava.lang.NullPointerException
13:14mmcgrana,(:foo :bar)
13:14clojurebotnil
13:14hiredmanyeah
13:15mmcgrana,(let [name :foo] (name :bar))
13:15clojurebotnil
13:15hiredman,(:foo :bar :baz)
13:15clojurebot:baz
13:15hiredmanmmcgrana: oh, nice
13:15Chouseryeah, local names that are tempting but dangerous: name vector vec list map set ref agent count
13:15kotarakfn
13:15Chouserindeed
13:16kotarakLittle sins are punished immediately, bigger sins some time later on...
13:19Lau_of_DKGooood evening gents =)
13:19kotarakHi Lau
13:21shooverjacky_: you need file:///c:/... on Windows (3 slashes)
13:23lisppaste8Chouser annotated #74271 with "spit up side-effects and functional code?" at http://paste.lisp.org/display/74271#2
13:23stuhoodi just got bitten by the fact that (printf) doesn't flush, and my app finished without outputting something i wanted
13:24stuhoodit seems like the clojure runtime ought to flush streams it controls before it closes down
13:24Chouser(doc *flush-on-newline*)
13:24clojurebotWhen set to true, output will be flushed whenever a newline is printed. Defaults to true.; arglists
13:24Lau_of_DKShouldnt someone consider closing the sourceforge repo, or is it still kept current ?
13:25stuhoodChouser: yes, but this particular app doesn't print any newlines
13:25LordOfTheNoobsWould it have been bad form for gnuvince to use `for' instead of `doseq' passing out a seq of lengths and then sum them in a surrounding let?
13:26stuhoodshouldn't clojure flush out/err before dying?
13:26hiredmanyou could return a data structure of filenames/line counts, pass it to reduce, reduce prints out filenames/line counts while accumulating the line count and then print the output of reduce
13:27ayrnieu,(let [old printf] (defn printf [& args] (apply old args) (flush)))
13:27clojurebotDENIED
13:27Chouserhiredman: similar to what I pasted.
13:28gnuvinceLordOfTheNoobs: for is used for list comprehensions, and I don't believe it's good style to stick side effects in there.
13:28stuhoodayrnieu: i can understand why the buffering is nice, so i wouldn't want to eliminate it completely
13:28gnuvinceLike it isn't good style to use println in a map call
13:29stuhoodi'm just suggesting that the default behaviour to be to 'just work'
13:30Chouserstuhood: you were using clojure.lang.Script, or clojure.main?
13:30stuhoodChouser: the -main method of a gen'd class
13:38technomancys/you/we/
13:39WizardofWestmarcpity jquery already uses the "write less, do more" slogan
13:39technomancyclojurebot: clojure?
13:39clojurebotclojure > scheme
13:40technomancyclojurebot: slogan?
13:40clojurebotExcuse me?
13:40rhickeytechnomancy: ouch
13:40technomancyclojurebot: slogan is "Mutability we can believe in."
13:40clojurebot'Sea, mhuise.
13:40frodwithClojure: There are lambdas in my coffee!
13:40technomancyheh
13:40technomancy(since there's nothing there already)
13:42WizardofWestmarchaha ok that one's pretty good
13:42technomancyooh; that's good too
13:42kotarakidea by AWizzArd
13:42technomancykotarak: 301 Moved Permanently
13:44lisppaste8gnuvince annotated #74271 with "using atoms" at http://paste.lisp.org/display/74271#3
13:45Chousergnuvince: out of curiosity, what didn't you like about #2?
13:45hiredmanugh
13:45hiredmanI am disgusted with you
13:46gnuvinceChouser: I just saw that there was a second annotation.
13:46gnuvinceI was away from my computer for a while
13:47gnuvinceChouser: pretty good
13:48ChouserI forgot to include the "no such file" output.
13:48hiredman~horizon
13:48clojurebothorizons is http://gist.github.com/51721
13:48gnuvinceChouser: I can figure how to do that
13:49hiredmanyou should totally be using Readers that get closed when you leave their horizon
13:50Chouser:-( yeah, I always forget that.
13:51rhickeyChouser: so how would you feel if line-seq balked if called not in a scope?
13:51Chouserrhickey: I think I'd like that.
13:52rhickeyI was just about to move that into core when I started thinking about named scopes, rather than just nested
13:53rhickeythings like line-seq could take an optional scope
13:53Chousernamed would allow non-nested structures?
13:53hiredmanis the plan for binding create a scope?
13:53Chousernon-nested usage, I guess.
13:53rhickeyif not supplied would use nearest enclosing
13:54hiredmanor would you need (binding [a bindings] (scope ...))
13:54lisppaste8gnuvince annotated #74271 with "Chouser rocks" at http://paste.lisp.org/display/74271#4
13:54Chouseryou'd create and "finish" named scopes imperatively?
13:54rhickeyChouser: scopes would be nested, but you could be bound to one other than the nearest enclosing
13:54hiredmanand binding has a scope, so why call scope scope?
13:55hiredmanseems like asking for confusion
13:55Chouserrhickey: ah, ok. That makes sense. Sounds useful, but not a breaking change.
13:55hiredmanI am in scope but not in a scope
13:56Chouserhiredman: you have a better name for an macro that creates a scope to restrict side-effects?
13:56hiredmanChouser: horizon
13:56hiredmanas in event horizon
13:56jbondeson(dont-do-stupid-stuff-here) ?
13:57hiredmanas in cosmic censorship which hides singularities
13:57jbondesonhorizon is a little of a stretch
13:58jbondesonsounds like some kind of contract macro
13:58rhickeyChouser: it might impact argument ordering, implicit blocks etc, e.g. (when-scope fred-scope :exits ...)
14:00rhickeyscope names would alleviate the (common) need to also do a binding, when scope is to be used in nested context with no scopes in parameter lists of intervening call chain
14:00jbondesoni just re-read that and realized i took Chouser's "side effect" too literally, sorry
14:10ChouserI don't think using the word "scope" would be any more confusing than the word "binding".
14:10Chouser'binding' creates a dynamically scoped binding, but there are other kinds of scopes (lexical and soon IO or whatever) and other kinds of bindings (let, args, etc.)
14:11hiredmanclojurebot: bucket is http://wiki.xkcd.com/irc/Bucket#Docs
14:11clojurebotOk.
14:11hiredmanOk.
14:12lisppaste8danlarkin annotated #74247 with "wrapper on add-method" at http://paste.lisp.org/display/74247#2
14:13danlarkinrhickey: there's a python decorator-esque wrapper for add-method
14:16sethtrainquick question, i am using clojure.main in my java call to run the Repl do I still use clojure.lang.Script to run a script?
14:18danlarkinsethtrain: no, you can use clojure.main for running a script too
14:18sethtrainok, thanks.
14:23kotarakCan I specify the source information when (read)ing and (eval)ing? Something like (binding [*file* "foo.clj" *line* 5] (read stuff))?
14:25hiredmanclojurebot: say hello to someone
14:25clojurebotHello, Winterstream
14:26hiredmanclojurebot: say hello to someone else
14:26clojurebotHello, lisppaste8
14:26hiredmanHah
14:27danlarkinclojurebot: say hello to hiredman
14:27clojurebotBUENOS DING DONG DIDDLY DIOS, fRaUline danlarkin
14:27danlarkin...whoah
14:28hiredmanhidden depths
14:36Chouserkotarak: I think there's no way to set the *line*, and the reader doesn't know or care about the file name.
14:48noidiis there a clojure syntax file for vim that handles indentation?
14:49rhickeydanlarkin: I don't understand the need for def-method as you could just replace it with add-method
14:50gnuvincenoidi: I just used (past tense, switched to Emacs ;) :set lisp and added a few lispwords
14:50noidiah, stupid me, should've googled first :P
14:50ozy`noidi: yes but you have to have the vimclojure plug installed
14:50noidihttp://kotka.de/projects/clojure/vimclojure.html
14:50gnuvince(def, defn, loop, etc.)
14:50noidithanks, and sorry :)
14:50ozy`(if you don't, it barfs errors all over your screen and won't indent anything)
14:51noidignuvince, how's it working out for you?
14:51danlarkinrhickey: just sugar I guess, don't have to have a call to add-method after you define a function since the macro does it for you
14:52rhickeydanlarkin: no, literally, just replace def-method with add-method and it works
14:53noidii tried emacs for a few weeks last summer (been a vim user for 8 years) but i just couldn't live without modal editing :)
14:53gnuvincenoidi: like I said, I switched to Emacs and Slime
14:53noidignuvince, the switch, I mean :)
14:53danlarkinrhickey: oh.. d'oh you're right, silly me :-o
14:53gnuvincenoidi: I already had experience. My editor journey has been vim (5 yrs) -> Emacs (2 yrs) -> Vim (2 yrs) -> Both (now)
14:54noidinow that I bought Programming Clojure, I might have an incentive to switch editors if the difference is big enough
14:54gnuvincenoidi: the only advice I can give you is, try to power your way through and try to view the advantages that Emacs brings and learn to cope with the shortcomings.
14:54WizardofWestmarcI'm working my way to both land, but they're so different it bends the brain sometimes.
14:54WizardofWestmarcof course I'm not a vim master.
14:54gnuvinceEditing text in Emacs is 10x worse than in Vim, but working with an interactive environment is 10x better
14:55WizardofWestmarcagreed on that front
14:55gnuvinceSo things sort of even themselves out.
14:55jbondesonthe day you rebind your control key is the day you give yourself over to emacs...
14:55WizardofWestmarcwhich is why I use vim for everything except lisps
14:55noidisorry about bringing up vim and emacs! :D
14:55Chousergnuvince: does slime provide a significant (for you) advantage over inferior-lisp-mode or whatever it's called?
14:55WizardofWestmarcmeh, no one's being zealous.
14:55gnuvincenoidi: no problem; no reason cannot be civil about it.
14:56noidi:)
14:56gnuvinceChouser: auto-completion is nice, seeing the arguments accepted by a syntax is another one
14:56gnuvinceThere are also keyboard shortcuts like C-c C-d d to view the documentation of the symbol under the cursor
14:57Chouserok, thanks.
14:57rhickeylisp
14:58gnuvinceSomebody (billc maybe?) ought to put together a 5 minute screencast of Slime and Clojure
14:58Chouserrhickey: it seems like you'd have to be, or otherwise also maintain slime/swank code along with the language.
14:58WizardofWestmarcshould get the stumpvm guy to voiceover for it
14:58gnuvinceWizardofWestmarc: who?
14:58WizardofWestmarclemme find the video
14:59WizardofWestmarche's got this crazy voice
14:59jbondesoni actually leave completion off in the non-repl windows. years of visual studio have made me realize how much of a crutch it can create.
14:59WizardofWestmarcand if you don't know it stumpvm is a window manager for x that lets you modify it on the fly with lisp
14:59WizardofWestmarcerr wm
14:59WizardofWestmarcnot vm *dur*
14:59gnuvinceOh wait, he has like this super barytone voice?
14:59WizardofWestmarcyeah
14:59kotarakChouser: the source information is handled in the compiler, I guess. Is there maybe an interface?
14:59gnuvinceYeah, I recall the voice, not so much the screencast itself.
15:00WizardofWestmarchttp://www.youtube.com/watch?v=tKt_rVO960Q&amp;eurl=http://functionalrants.wordpress.com/2008/09/23/stumpwm/
15:00Chouserkotarak: line numbers appear to be handled at the reader level, but I don't see any way to start it off at an arbitrary number.
15:01kotarakChouser: -.- Ok. Thanks for the info.
15:01Chouserkotarak: file names are handled at the compiler level, i think, but if you're just calling "read" that level's not involved.
15:01Chouserhm.
15:02kotarakChouser: I'm currently rewriting the gorilla repl. I'd like to set the source file & line info when sending an expression.
15:03Chouseryeah, that'd be nice. I don't think it'd be too hard to open up the API a little to allow for that, but I don't see a way to do it currently.
15:03Chouserof course I could just be missing something.
15:05kotarakChouser: Stephen's repl_ln pushed thread-local bindings for Compiler/SOURCE and Compiler/LINE. Is this voodoo or allowed?
15:07hiredmanclojurebot: whose job is<reply>that is #someones job
15:07clojurebotOk.
15:07hiredmanclojurebot: whose job is that?
15:07clojurebotNo entiendo
15:07hiredmandamn you sure
15:07hiredmanclojurebot: whose job is <reply>that is #someones job
15:07clojurebotYou don't have to tell me twice.
15:07hiredmanclojurebot: whose job is that?
15:07clojurebotthat is Zzompps job
15:08hiredmanclojurebot: whose job is <reply>that is #someone's job
15:08clojurebotIk begrijp
15:13hiredmanclojurebot: whose job is it to keep the riff-raff out?
15:13clojurebotthat is te's job
15:13Lau_of_DKhiredman: Sometimes I worry about you
15:14hiredmanclojurebot: whose job is it to worry about hiredman?
15:14clojurebotthat is hiredman's job
15:14hiredman:P
15:15hiredmanthat is pretty amazing
15:15hiredmanit randomly picked my nick out of the list of people in the channel and plugged it into that factoid
15:17Lau_of_DKclojurebot: whose taught you to pick random names?
15:17clojurebotPardon?
15:17Lau_of_DKnoob
15:18hiredmanclojurebot: whose job is it to make excuses for your bad behaviour?
15:18clojurebotthat is l_a_m's job
15:20danlarkinchances were 1/130
15:20danlarkinassuming it can pick itself
15:20hiredmanuh, it cannot
15:21hiredmaninfact it picks from the list of everyone in all the channels it is in, so it was like 2/130
15:21hiredmanwait, not
15:22hiredman2/131
15:39knaprwhat is the easiest way to play a .mp3 file in java?
15:46gnuvinceIt's funny that this guy is using Haskell-like type signatures: http://npcontemplation.blogspot.com/2009/01/clojure-genetic-mona-lisa-problem-in.html
15:51hiredmangnuvince: ugh
15:52hiredmanyeah, last week there was a bit of an ado on the group about type tags
15:52gnuvincehiredman: ?
15:52gnuvinceyeah?
15:52gnuvinceI must've missed that
15:52gnuvinceWhat thread was that?
15:52hiredmanhey, here is a dynamic language, LETS ADD TYPES!
15:53hiredmanI don't recall, exactly, I read a bit, was just sort of weirded out that people would be trying to go oop all up on clojure
15:55gnuvincehmmm, can't seem to find it.
15:56danlarkinwhoah, I'm loving the type sig comments
15:56hiredmandanlarkin: eh?
15:57gnuvincedanlarkin: it's not the first time I've seen them; I'm pretty sure I recall somebody writing Python code with this notation
15:57danlarkinin this guy's code
15:57ozy`those are valid haskell type signatures
15:58hiredmanoh
15:58ozy`I wouldn't be surprised if someone translated the whole thing into haskell starting with those comments...
15:58hiredmanmaybe he started with haskell?
15:59gnuvincehiredman: his profile suggests a Common Lisp background.
15:59gnuvinceMy guess is he liked the notation and adopted it to comment his functions.
15:59ozy`hiredman: or maybe he learned haskell at some point, and ever since then he's liked the "start with the type signature" mindset
16:00knaprgnuvince: ive written python code ith that notatioon :) haskell is cool
16:00gnuvinceYes it is
16:00ChouserMy eyes glaze over when I try to read: Integer -> Integer -> Integer -> Integer -> Color
16:00knapri do miss typesdeclarations in dynamic languages, the documentational features are good
16:01knaprdoes the monalisa example run for you?
16:01Chouserperhaps I just need to get used to it. I suppose my eyes glazed over trying to read lisp paren-code at one point too.
16:01knaprjava.lang.Exception: EOF while reading (monalisagp.clj:238)
16:01knapruser=>
16:01knaprwhat does that point to really?
16:01gnuvinceknapr: unclosed paren
16:01hiredmanmissing paren
16:01gnuvincedid you copy the code from the site or did you clone his git repo?
16:01ozy`there's a single close paren on the last line
16:02ozy`don't miss it when you copy it
16:02hiredmanhmmm
16:03hiredmanI guess he uses :type as the dispatch for mutate
16:04hiredmanclojurebot: whose job is it to keep knapr's internet connection working?
16:04clojurebotthat is arbscht's job
16:04ozy`clojurebot: dude like whoa
16:04clojurebotHuh?
16:08knaprim switching in 3months(!) had a long resign-time
16:08knaprim writing a simple mp3player for myself, what is the best way to play mp3s in java? i already have the gui working
16:08BigTomhi - any eulers here?
16:10knapryes im his great great great grandson, wassup?
16:10Lau_of_DKBigTom: All Eulers listed on clojure-euler.wikispaces.com :)
16:12BigTomah, thanks
16:12BigTomwhat is a good time for euler-7?
16:14Lau_of_DK0.5 secs
16:14BigTomah, cool :-)
16:15BigTomI started at 18s which was a bit depressing
16:15Lau_of_DKHow low can you go ?
16:16BigTombut I am down to 513ms now
16:16hiredman"Elapsed time: 0.385 msecs"
16:16hiredmanhmmm
16:16hiredmanoh
16:16hiredman<-- cheating
16:17ChouserI've got a version that runs in 0.07 seconds, but you have to give it the size of the seive up front, so that's rather a cheat as well.
16:17BigTomI could go multithreaded I guess
16:17Lau_of_DKBigTom: I've found the best way to protect your selfesteem in these discussions is simply to run this command from irc /ignore Chouser
16:17BigTom:-)
16:18BigTomI think I'll stick with 0.5s until I am a bit better at this
16:18Chouserheh
16:18BigTomAlso...
16:18BigTomIs anyone actually using StringTemplate for web pages?
16:19Lau_of_DK0.5 is very good BigTom, unless youre running your code on a Blade server :)
16:22BigTomWell that's nice to know
16:23BigTomonto 8! :-)
16:24shooverBigTom: no web pages yet, but I have experimented with StringTemplate in the REPL
16:26BigTomok, I was planning to investigate it over the next few days. Maybe we can compare notes.
16:27BigTomChouser: I saw a reference to an algorithm for estimating the sieve size, I'm not a mathematician so I don't know if its valid
16:28Chouserhm! that's interesting.
16:29Chouserit could be a pretty expensive calculation as long as it consistently overestimates by only 100 or 200% and still be a win.
16:30cooldude127technomancy: you in here?
16:31LordOfTheNoobsclojurebot: whose job is it to keep track of technomancy?
16:31clojurebotthat is mrsolo__'s job
16:32BigTomhttp://mathworld.wolfram.com/PrimeNumberTheorem.html
16:32cooldude127lol
16:33hiredmanclojurebot: seen technomancy?
16:33clojurebottechnomancy was last seen in #clojure, 171 minutes ago saying: kotarak: 301 Moved Permanently
16:34hiredmanit is clojurebot's job actually
16:34cooldude127oh i found him in #emacs
16:34ChouserBigTom: thanks
16:35BigTomChouser: Enjoy! :-)
16:38knaprgod isnt there a simple mp3lib where you cna just load a friggin file and play it?
16:40Chouserknapr: the easiest API I know of is stuck inside the Applet class.
16:40technomancyknapr: nothing is simple in Java. I predict at least three factories will be involved.
16:40technomancyalso: the mp3 format is patented.
16:41hiredmanknapr: google around
16:41hiredmanthe first hit on google for "java mp3 player" looks very promising
16:50LordOfTheNoobsclojurebot: seen LordOfTheNoobs?
16:50clojurebotLordOfTheNoobs was last seen in #clojure, 0 minutes ago saying: clojurebot: seen LordOfTheNoobs?
16:50LordOfTheNoobslol
16:50technomancycareful there; you don't want to cause a feedback loop.
16:51hiredmanthe deal there that keeps track of the last thing someone said sits at the top of the priority queue
16:52Lau_of_DKIs there a simple way for my program to determine if its running on Windows, Mac or Linux? And I dont mean to check if bootlog for 20 secs or 5 minz
16:53LordOfTheNoobsclojurebot: test?
16:53clojurebotlatest contrib is 334
16:53LordOfTheNoobsclojurebot: abc?
16:53clojurebotNo entiendo
16:53hiredmanLau_of_DK: os.name system property
16:53LordOfTheNoobsclojurebot: abc is clojurebot: seen clojurebot
16:53clojurebotno, I have not seen abc
16:54LordOfTheNoobsclojurebot: abc?
16:54clojurebotPardon?
16:54LordOfTheNoobsclojurebot: abc is <reply>clojurebot: seen clojurebot
16:54clojurebotno, I have not seen abc
16:55hiredmanLordOfTheNoobs: I recommend #clojurebot for mucking around with clojurebot
16:55Lau_of_DKhiredman: Thanks
16:55LordOfTheNoobsAh, thank you.
17:02hiredman~ exceptions
17:02clojurebotexceptions is http://wuhrr.wordpress.com/2007/11/22/java-exceptions-list/
17:02Lau_of_DKFor some reason Im having trouble importing QString from qt.core - anyone else run into this?
17:02durka42hmm, if one can remember enough of the exception to generate a regular expression that will match it, my "smuggler" library can help
17:04durka42Gorilla=> (count (flatten (lookup-re db #"Exception$")))
17:04durka42835
17:06walters_"really it helps lot for me. Is any other exception other than in ur list. if so please update."
17:06Lau_of_DKnvm regarding QString
17:06walters_awesome.
17:09knaprhmm im slowly migrating towards clojure from python for a lot of things
17:10knaprif i need to use java-threads how should i do? use them directly or use aganets or refs?
17:10hiredmanclojure functions are Runnable
17:11hiredmanso you can (.start (Thread. (fn [] (println "foo"))))
17:11durka42lisppaste8: are you alive?
17:11hiredmanlisppaste8: url?
17:11lisppaste8To use the lisppaste bot, visit http://paste.lisp.org/new/clojure and enter your paste.
17:12knapralso when i started to play an mp3 it freezed my player, i wasnt using a thread, so that si normal then?
17:12knaprdoe spython thread for you automaticlly or something?
17:13lisppaste8durka pasted "exceptions" at http://paste.lisp.org/display/74305
17:13hiredmanknapr: it depends
17:13durka42warning: very large paste
17:13hiredmanthe library may or may not thread stuff
17:13hiredmanthe java ui stuff can be very particular about threading
17:13durka42anyway, to answer that commenter's question: yes, there a few more and here they are
17:14hiredmane.g. there is a particular input thread, and god help your soul if you do work in the input thread
17:14durka42hmm, should i comment on hai's post
17:15hiredmanclojurebot: exceptions is <reply>http://paste.lisp.org/display/74305
17:15clojurebotAlles klar
17:16hiredmanorg.jibble.pircbot.IrcException <-- ha ha
17:16durka42i suppose pircbot isn't on the typical classpath
17:16durka42so perhaps there are few less than 835
17:17durka42(this searches classpath, ext dirs and endorsed dirs)
17:17knaprany good link to java threads?
17:21durka42Gorilla=> (count (lookup-re db #"Factory"))
17:21durka42696
17:21durka42sigh
17:21mrsolo__"..Lambdas are not garbage collected..." is this still true?
17:22hiredmanin what context?
17:22durka42apparently not, see cgrand's comment beow
17:22durka42below
17:22durka42there are 5 FactoryFactory's and they are all in CORBA
17:22mrsolo__http://npcontemplation.blogspot.com/2009/01/clojure-genetic-mona-lisa-problem-in.html
17:22hiredmanah
17:22hiredmanyes, PermGen
17:22mrsolo__"...each lambda in Clojure is an anonymous class in Java. The problem is that classes are never garbage collected. They reside in a special place called the PermGen.
17:22mrsolo__"
17:23durka42cgrand says that's no longer true, although he didn't give details
17:23hiredmansvn rev 1232
17:23clojurebotsvn rev 1232; made eval use ephemeral classloader in all cases
17:23hiredman^-
17:25walters_that guy's program is special in that he's creating function definitions at runtime
17:25walters_using eval
17:30mrsolo__walters: i just start learning clojure but that sounds like a pretty common programming technique?
17:30hiredmanmrsolo__: no
17:31hiredmaneval'ing is general seen as unhygenic
17:32Chouserthe common exceptions are REPLs and the kind of AI programming in the article. Both cases should be solved by rev 1232, I would think.
17:32hiredmanclojurebot: whose job is to keep Chouser informed of everything so he can correct me all the time?
17:32clojurebotthat is noidi's job
17:32hiredman:P
17:33Chouserhiredman: No, you were absolutely.
17:33Chouserright.
17:35knapranyone have a good codesnippet using threds they could show?
17:36knaprwhat is the idiomatic thin to do in clojure when usign threads? use agents?
17:36durka42agents are cool
17:36durka42they do use thread pools internally
17:36Chouserthere are cases where you need threads that agents are a poor fit.
17:36hiredmanChouser: I just enjoy playing with clojurebot
17:37Chouserknapr: I wrote a little thing about adding agents to a project euler solution, if that's of any interest: http://blog.n01se.net/?p=34
17:46knaprty
18:47knapris there a clojure function to list all files ina dir?
18:48duck1123knapr: I think you can do that with one of the apache commons libs
18:48durka42do you need to recurse?
18:48durka42if you don't just use java.io.File
18:49durka42if you do i have a function built on tree-seq that you might be interested in...
19:05knaprhow do i make a regex from a string?
19:05knaprlike users passes ganja and i want to find ganja-smuggling by eek a mouse
19:05knapr(make-regex #str)
19:08gnuvince_knapr: (re-pattern str)
19:09wwmorganis there a way to set java annotations in .class files?
19:09gnuvince_,(re-seq (re-pattern "(.)(\d)") "hello3")
19:09clojurebotEval-in-box threw an exception:Unsupported escape character: \d
19:09gnuvince_,(re-seq (re-pattern "(.)(\\d)") "hello3")
19:09clojurebot(["o3" "o" "3"])
19:11Carkhum : http://npcontemplation.blogspot.com/2009/01/clojure-genetic-mona-lisa-problem-in.html
19:11Carki think using eval isn't the right thing to do
19:11Carkbesides it's a big misleading saying "Lambdas are not garbage collected"
19:11Carka bit*
19:13Carkpeople will think that calling (defn bleh [] (fn [] dosomething)) will go to permgen
19:13Carkwhich is not true
19:16knaprhow would you do without eval?
19:16Carkmake your own interpreter... there's a tradition of doing such things in lisp
19:17Carkthat's pretty easy too
19:17Carki bet you could get better performances in the end
19:18gnuvince_Do it :)
19:18hiredmanCark: and that issue is fixed, apparently
19:18gnuvince_Yes, cgrand pointed it out in the comments.
19:18hiredmansvn rev 1232
19:18clojurebotsvn rev 1232; made eval use ephemeral classloader in all cases
19:19gnuvince_I like that he used Haskell-like notation for type declarations
19:30knaprCark: but what is the advantage of making your own interpreter?
19:30knaprexcept for potential speed-up?
19:30Carki thought about it, and actually would only mutate data structures really
19:30knapri did my own genetic programming with eval
19:30Cark(for the problem at hand)
19:31knaprbut you need to evaluate them somehow...
19:31Carkright, data is code
19:31Carkyou only need a bunch of lists of triangles with color there
19:32Carkmutate that, that's your program
19:32knapryes but how do you eval which ons is better fitted?
19:32Carkthen interpret it ....draw the triangles
19:32knapryes and then how do you decide...
19:32Carkjuste the same as he does
19:33knaprso then you use eval...
19:33knapror your own
19:33Carkyou don't need an eval at all
19:33Carknot even an interpreter
19:33Carkjuste draw your triangles on a canvas, and check fitness
19:33knaprhow?
19:34knaprfor pixel in pixles?
19:34knaprpixels
19:34knaprif pixel == pixel
19:34Carki didn't quite look at how he does it, but i guess that's the way, compare pixels, find pixel fitness, sum them all
19:37Carkhte individual in your population would be a list of maps with fields point1 to point3 and a color
19:37Carkor an array, which would make the crossover easier i guess
19:42hiredmanknapr: what do you mean by "eval"
19:42hiredmanthe way you are using it makes be think you mean something else
19:45knaprwell i ws doing function finding, dont know which kind of genetic stuff it would be categorized as
19:46hiredmaneval is a function in most lisps
19:46Carkdepending on the runtime duration of your functions, it might be better to use eval or do a "fast-eval" yourself
19:46knaprgave ti soem data like (2 4 6) that it shoul fit and then i would start with soem parameters and the closest fit wins. so that would regress toward (* :x 2)
19:46hiredmanthat does, well, evaling
19:46hiredmanyou are talking about something that determines the "fitness" in GP?
19:47hiredman,(doc eval)
19:47clojurebot"([form]); Evaluates the form data structure (not text!) and returns the result."
19:47knapryes
19:48hiredmanthe function "eval" that is in clojure.core is something totally different
19:49hiredmangenerally, in #clojure, when some says "eval" they mean the specific clojure.core/eval
19:49knapri eman that
19:51knaprhow are java constans accessed?
19:51knaprThread.NORM_PRIORITY
19:51Chouser,(prn Thread/NORM_PRIORITY)
19:51clojurebot5
20:29cooldude127woohoo, wrote an avl tree in clojure with total lack of mutability. which was totally weird being taught in java where we user setters out the ass
20:35jbondesonany reason you used an avl instead of an rb tree?
20:35jbondeson(out of curiosity)
20:35cooldude127jbondeson: it's for college. avl was the assignment
20:35jbondesonah\
20:36jbondesonnext up a fibonacci heap? =P
20:37cooldude127jbondeson: what are the advantages to red-black? we haven't been taught them yet (prolly tomorrow), but avl trees are far easier to understand for me at least
20:38jbondesonavl and rb are very similar, the rb i believe is simply slightly easier in a functional environment
20:39cooldude127jbondeson: not gonna lie, this avl tree was pretty straightforward in clojure, i can past the code if you're curious
20:40jbondesoni would be interested.
20:40jbondesonthe ml implementation of rb-trees is really compact ~30loc
20:42cooldude127http://paste.lisp.org/display/74323
20:42cooldude127i forgot to put the stupid channel lol
20:43sohailwriting an immutable tree is not very hard
20:43sohailis it efficient?
20:43cooldude127sohail: no idea, probably not
20:43cooldude127but i'm just learning data structures
20:43sohailok
20:43sohailbbl
20:43cooldude127k
20:49knaprwhen i need a global should i use agents then or can i use def?
20:49cooldude127knapr: do you need to change it?
20:49knapryes
20:49gnuvince_How do you design a macro? Write code as you'd want to write it and then write the macro that will perform the task?
20:49cooldude127knapr: probably a ref is what you want
20:50cooldude127gnuvince_: i write a macro by first typing out how the code should look when using the macro, then the code that should turn into when macroexpanded, then use both of those to write the macro
20:50knaprmeh i cant figure out how now to steal the main even dispatch thread in swing
20:50knapri set the started thread to low prioirty
20:51gnuvince_cooldude127: OK, I'll try
20:51gnuvince_I'm pretty sure my situation warrants a nice macro
20:51gnuvince_But it's the first time I've had to use them.
20:51cooldude127gnuvince_: they are awesome, and my technique works pretty well in my experience, i can't remember where i picked that up
20:51cooldude127i want to say it was on lisp
20:52gnuvince_I got the PDF on my computer
20:52gnuvince_I really, *really* ought to make time to read it quickly eventually
20:53cooldude127gnuvince_: it is GREAT
20:53gnuvince_Stupid maths
20:53gnuvince_Sponging a lot of my free time
20:56cooldude127lol
20:58keithbHow do I use the function shorthand to write a fn that returns a constant value. Ex: (def pi (fn [] 3.14)) works, but (def pi #(3.14)) does not. Why?
20:58cooldude127keithb: that's equivalent to (fn [] (3.14))
20:58cooldude127keithb: no way to do that with the shorthand
20:58cooldude127keithb: well, except for #(identity 3.14)
20:59cooldude127which isn't really worth it
20:59lisppaste8gnuvince pasted "replay macro" at http://paste.lisp.org/display/74324
20:59gnuvince_cooldude127: can you check that?
20:59gnuvince_Does that look like a "good" macro usage?
20:59keithbThis also works: (def pi #(* 1 3.14)) -- but it seems strange that the simplest case wouldn't.
21:00cooldude127keithb: it's not the most common
21:00cooldude127functions returning constants aren't used as often
21:00cooldude127gnuvince_: is defsection the macro?
21:01keithbcooldude127: Thanks.
21:01cooldude127keithb: no problem. it's a common question tho, people not realizing that they are already in a list with #()
21:01gnuvince_cooldude127: it would be yes; I have a binary file from which I want to extract data, and I don't want to manually do all the (.getInt) calls from ByteBuffer
21:02keithbcooldude: I don't understand; already in a list?
21:02hiredman,(doc constantly)
21:02clojurebot"([x]); Returns a function that takes any number of arguments and returns x."
21:02cooldude127gnuvince_: it looks like a good use of macro, but the name is questionable. usually a def... macro would be a toplevel form
21:03gnuvince_cooldude127: I'm open to suggestions
21:03hiredman,((constantly 3.14) 1)
21:03clojurebot3.14
21:03gnuvince_parse-something?
21:03hiredman,((constantly 3.14) :foo :bar :baz)
21:03clojurebot3.14
21:03cooldude127gnuvince_: i want to say with-something, but i'm not sure what
21:04gnuvince_with-buffer?
21:04gnuvince_Also, is it "good form" to make a macro that will return a value?
21:04cooldude127keithb: s-expressions are lists, and you are already wrapped in a list when you use #(). those parentheses are a list
21:04gnuvince_I had intended this macro to be (let [...] ...)
21:04knaprmeh i cant figure out how now to steal the main even dispatch thread in swing. i set the thread to low priority still it consumes the whole application
21:04cooldude127gnuvince_: yes that is good form, and i actually think parse-buffer makes more sense
21:05gnuvince_all right
21:05gnuvince_here comes the hard part then :)
21:05keithbknapr: I've done a lot of Swing work; what are you trying to do with the Swing thread?
21:06cooldude127gnuvince_: it's not really all that hard
21:07gnuvince_cooldude127: still wet behind the ears about this stuff
21:07cooldude127lol it'll come to you
21:07cooldude127you're just writing a translator
21:07gnuvince_hopefully
21:08keithbknapr: If you want to cripple the Swing thread, you could sneak sleep() calls into the Swing (AWT) thread.
21:08gnuvince_Basically, I'm just writing a page in PHP or something right?
21:08keithbknapr: Very bad for UI responsiveness, though.
21:08cooldude127gnuvince_: ?
21:08gnuvince_cooldude127: I'm defining a "page" by plugging in some values
21:09cooldude127yeah basically
21:09mrsolo__http://paste.lisp.org/display/74325
21:09cooldude127gnuvince_: obviously more structured, but yeah same idea. at least for your first few. some macros can get pretty crazy if you're doing a radical transformation
21:09mrsolo__so i did a little benchmark... is performance penality pretty big for partial compares to normal defn?
21:09gnuvince_almost like <?php foreach ($products as $product => $price) echo "<th>$product</th><td>$price</td>" ?>
21:09cooldude127gnuvince_: yeah kinda like that
21:10cooldude127ew get that php out of here tho
21:10gnuvince_Right
21:10gnuvince_:)
21:10gnuvince_Fortunately, I do Django at work :)
21:10cooldude127i wish i did anything "at work", i need money
21:10danlarkingnuvince_: oh word? help me name my django clone then!
21:12gnuvince_danlarkin: I'm unsure my using Django gives me much credit for picking a fine name ;)
21:12gnuvince_how about "jimi"? ;)
21:14cooldude127this line makes me cry
21:14cooldude127public interface AVLNode<K extends Comparable<K>> extends BinaryNode<K> {
21:14cooldude127SO VERBOSE
21:15hiredmanclojurebot: google clojure
21:15clojurebotFirst, out of 131000 results is:
21:15clojurebotClojure » home
21:15clojurebothttp://clojure.org/
21:15hiredman*tada*
21:16danlarkinneat feature!
21:16danlarkinalthough maybe reduce it from 3 lines to 1
21:16hiredmanalways a critic
21:16hiredmanhow about two?
21:17danlarkinwhy not 1
21:17hiredmanI mean, it's not like it would get used all the time
21:17hiredmanit feels neater to have the url and the title of the page on seperate lines
21:18hiredmanclojurebot: google Good Earth
21:18clojurebotFirst, out of 69500000 results is:
21:18clojurebotThe Good Earth - Wikipedia, the free encyclopedia
21:18clojurebothttp://en.wikipedia.org/wiki/The_Good_Earth
21:18hiredmanit would be one long line
21:18danlarkin4 lines in the channel just for 1 google search :(
21:19knaprhmm is there a way to enforce try catching exceptions in clojure?
21:19ayrnieuenforce in what sense?
21:20knaprit is good not having to when i play with the interface but once i have decided on the design i want to make the code as safe as possible
21:21Chouseryou mean checked exceptions?
21:21knapryes
21:22Chousernope
21:27knaprhow do i compile clojure into a an executable?
21:28knapri want to share my mp3player with non-programmers so i want it to be dobleclick->run
21:28Chouseryou don't actually need to compile it for that.
21:30Chouserknapr: this is a bit old, so there may be a better way now
21:30Chouserhttp://groups.google.com/group/clojure/browse_thread/thread/3c2010cde7d87a6d/1078e6e75018deb1
21:33knaprand does Java ever compile to binary or users need java installed?
21:33knapris it possible to compile to binaries
21:33ayrnieuusers need Java installed.
21:38Chouserhttp://chouser.n01se.net/misc/bug.svg
21:38Chouserany opinions? is something like that worth having around, or is it just scary?
21:39danlarkinChouser: lol
21:40Carkwhat was again the function that does this : (take n (repeat fn)) ?
21:41Chouserreplicate
21:41rhickey_Chouser: make sure you include all the "Rich fixes it" short paths
21:41Chouserrhickey_: heh.
21:41Carkahh thank you _again_ chouser
21:42ChouserCark: you're quite welcome.
21:43danlarkinChouser: although I think you are making an assumption here that "Are you satisfied with the response" goes right into "post issues to appropriate issues page"
21:44hiredmanI like it
21:45Chouserdanlarkin: hm, you're right.
21:45hiredman"Rich fixes it" will be a bunch of lines coming out to the left
21:45Chouser"Did you get a request to post the issue?"?
21:46Chouserhiredman: ah, perfect.
22:02danlarkinwhat's the best way to convert either a String or nil into an int/Integer or nil
22:05hiredman,(#(and % (Integer/parseInt %)) "1")
22:05clojurebot1
22:05hiredman,(#(and % (Integer/parseInt %)) nil)
22:05clojurebotnil
22:06hiredman*tada*
22:06danlarkinnicer than my:
22:06danlarkin,(try (Integer/valueOf "10") (catch java.lang.NumberFormatException e))
22:06clojurebotGabh mo leithsc�al?
22:07danlarkinclojurebot doesn't do exceptions?
22:07hiredmannope
22:10ozy`,(:pizza)
22:10clojurebotjava.lang.IllegalArgumentException: Wrong number of args passed to keyword: :pizza
22:10ozy`:(
22:11hiredman,(:pizza nil :pizza)
22:11clojurebot:pizza
22:11danlarkin,:pizza
22:11hiredmanneeds parens
22:12ozy`,(const :pizza)
22:12clojurebotjava.lang.Exception: Unable to resolve symbol: const in this context
22:13hiredman,(identy :pizza)
22:13clojurebotjava.lang.Exception: Unable to resolve symbol: identy in this context
22:13hiredman,(identity :pizza)
22:13clojurebot:pizza
22:13ozy`,(#(%) :pizza)
22:13clojurebotjava.lang.IllegalArgumentException: Wrong number of args passed to keyword: :pizza
22:13ozy`pah
22:19durka42,(#(do %) :pizza)
22:19clojurebot:pizza
22:19hiredman,(#(do %) "nothing")
22:19clojurebot"nothing"
22:22durka42(do 'nothing)
22:22durka42,(do 'nothing)
22:22clojurebotnothing
22:22durka42it didn't follow instructions
22:25ozy`ooooohh
22:28durka42clojurebot: paste is <reply>lisppaste8: url?
22:28clojurebotpaste is http://paste.lisp.org/new/clojure if it's working
22:28durka42clojurebot: paste is <reply>lisppaste8: url
22:30durka42lisppaste8, url
22:30lisppaste8To use the lisppaste bot, visit http://paste.lisp.org/new/clojure and enter your paste.
22:30durka42clojurebot: paste is <reply>lisppaste8, url
22:30durka42doesn't want to overwrite?
22:31hiredmanoh
22:31hiredmanhmm
22:32durka42i was thinking we could cut out the middleman if clojurebot can talk to lisppaste8
22:35hiredmanclojurebot: paste?
22:35clojurebotlisppaste8, url
22:35lisppaste8To use the lisppaste bot, visit http://paste.lisp.org/new/clojure and enter your paste.
22:35hiredmancute
22:35gnuvince_How good of a practice is it to return different data types (besides nil) from a function?
22:36durka42what do you mean?
22:36durka42don't most functions have values to return
22:36hiredmanI do it all the time
22:36hiredmanyou mean a {} or a [] or a #{}?
22:37hiredmanconj returns different data types
22:43gnuvince_hiredman: I mean, like a scalar or a collection
22:43gnuvince_Fictitious example:
22:43gnuvince_(take 3 (range 10)) => (0 1 2)
22:43gnuvince_(take 1 (range 10)) => 0
22:44hiredmandunno
22:44durka42i think take has a contract to always return a list
22:44Chouserthat particular example would be a pain to work with.
22:44ozy`gnuvince_: makes it a bit harder to reason about the function....
22:44durka42otherwise map/filter/reduce would break on edge cases
22:44hiredmanseems dodgy
22:45hiredman 19:44 gnuvince_ : Fictitious example:
22:45durka42oh, i see what the question meant
22:45hiredmanFictitious
22:45hiredman^-
22:45durka42whether the return type of the function should depend on its arguments
22:46Chouser'first' returns different object types
22:46Chouser(first [1]) vs. (first [[2]])
22:48gnuvince_Actually, it doesn't; in Haskell terms, that would be first :: [a] -> a
22:49hiredman...
22:49Chouserbut *actually* it does.
22:49hiredmanno wonder no one wnats to write haskell
22:49Chouser,(class (first [1]))
22:49clojurebotjava.lang.Integer
22:49Chouser,(class (first [[1]]))
22:49clojurebotclojure.lang.LazilyPersistentVector
22:50ozy`Chouser: the return type of "first" is a function of the argument type, rather than the argument value
22:50Chouserozy`: only if you expand what you mean by "type" to be a whole lot more than a Java class.
22:51gnuvince_Anyway, I decided against it
22:51Chouserheh
22:52ozy`Chouser: can't possibly think of a reason why I would mean "Java class" when I say "type"
22:52ozy`you guys must get a lot of people who think that way O_o
22:53ozy`"first :: [a] -> a" is haskell-ese for "given a list containing type X, 'first' returns a single value of type X"
22:53ozy`just for what that's worth
22:54hiredman,(first [[:a] :b :c :d 1 2 3 4 "a"])
22:54clojurebot[:a]
22:54durka42i mean, it could be LazilyPersistentVector<T>
22:54hiredmanwhere is your type system now?
22:54Chouserhiredman: there you go.
22:55ozy`hiredman: ah... well. it's stitched up inside half a lemon and half a lime :(
22:55Chouser,(map #(nth [[:a] :b] %) (range 2))
22:55clojurebot([:a] :b)
22:55durka42my type system is forced to its knees and relegated to calling everything an Object
22:55Chouserheh. well, that one seemed more impressive in my head
22:56hiredmanozy`: like 7-up?
22:56hiredmanclojurebot: make 7- is <reply>UP YOURS, #who
22:56clojurebotAlles klar
22:57durka42clojurebot: 7-down
22:57clojurebotHuh?
22:57hiredmanclojurebot: make 7-
22:57clojurebotUP YOURS, hiredman
22:58durka42clojurebot: the fairest of them all is certainly not #who
22:58clojurebotAck. Ack.
22:58durka42clojurebot: who is the fairest of them all?
22:58clojurebotthe fairest of them all is certainly not durka42
22:58durka42clojurebot: the fairest of them all is <reply>certainly not #who
22:58clojurebotRoger.
22:58durka42clojurebot: who is the fairest of them all?
22:58clojurebotcertainly not durka42
22:58durka42:(
22:59hiredmanclojurebot: the fairest of them all is also <reply>certainly #someone
22:59clojurebotYou don't have to tell me twice.
22:59durka42you've left open the 1/130^2 possibility of hypocrisy
23:00cooldude127clojurebot: who is the fairest of them all?
23:00clojurebotcertainly rhickey
23:00cooldude127lol
23:00durka42impresive
23:00durka42s/s/ss/