#clojure logs

2010-11-17

00:00taliosoh man this maven release is still running - must remove all those javadoc generations from running.
00:02livingstonhey talios - thanks again for that patch
00:03taliosoh hai ;-)
00:03livingstontalios: hi
00:06talioshow goes?
00:07livingstonalright - kinda - I refactored my project into a half dozen smaller maven modules (and I'm realize my api needs a bit of help too) so I'm just going a little crazy trying to humpty dumpty back together again
00:08taliosfun :) build refactoring :)
00:09livingstonyeah it's telling me I'm bringing in one of my symbols from two different places but I'm sure I'm not
00:10livingstonit's right of course, but i wish it was more helpful ;)
00:11sandGorgonhas anyone run a clojure webapp (or anything non trivial) on an EC2 Micro instance ? I'm asking for rough opinions .. for example I know that a Rails app just croaks on it
00:12livingstonsandGorgon: is that the level that they are giving away free right now?
00:12sandGorgonlivingston, caught me ;)
00:13rata_slyrus: yeah, parsers written in fnparse look as simple as EBNF... it's amazing =)
00:14livingstontalios: I was bringing in the symbol too much, in my cutting I ended up with two filed that were using the same stuff and one using the other... etc.
00:14livingstonsandGorgon: hey whatever man, if they're giving something away, take it
00:14rata_slyrus: any other parser I've written looks horrible in comparison
00:15slyrusagreed
00:15slyrusI know there are other nice approaches to the problem, but I'm a fan of fnparse
00:15sandGorgonlivingston, ack that
00:15rata_yeah, me too
00:18talioslivingston: doh :)
00:18rata_also it was a good idea to wait until the profiling phase to move into fnparse3, because I figured out how to recicle some data that the parser had available to avoid calling a fn to recompute it afterwards (calling that fn took much more time I'd have expected)
00:18talioslivingston: seems every day I see a reason why a compilation step is still really handy, even in dynamic languages
00:19livingstontalios: it was the compiler doing the complaining - or is that what you mean?j
00:20taliosthats what I mean. it revealed something wrong.
00:20taliosbetter a build die than a production server at midnight
00:22DeranderI do wish there was some way to do static checking in ruby
00:24livingston(offtopic: anyone now how to make emacs stop associating buffers with windows and let me move any buffer to any window - everything i want to look at is associated with the same window)
00:26taliosRight - time to leave work, find some dinner, watch some tv, hack!
00:26taliosback in an hour or so :)
00:27livingstonhave fun, i need diner too but once I'm out I'm out for the night
01:41Derander(into) is an amazing funciton. Why didn't I know about it before?
02:14LauJensenGood morning all
02:26sthuebnergood morning, LauJensen
02:26taliosEvening
02:28sthuebnerIt's a cold and rainy autumn day here in Berlin
02:29LauJensenSame in the DK
02:32sthuebnerLauJensen: how's Conj Labs London coming along?
02:32LauJensensthuebner: Postponed until 2011
02:33sthuebnerLack of interest?
02:34LauJensenAmong other things. I think Christophe and I were being a little too ambitious with our schedules, so we would come under big pressure and we didnt have time to market it properly. Add the pieces together and I'd rather wait until february and put on a great Labs event at that time
02:36sthuebnersounds good.
04:24bartjis there a date library in Clojure ?
04:25bartjclj-time ?
08:13tape_dispencerIn the documentation, I haven't been able to find any reference on how to declare a static field with def-class. Is there something I missed?
08:14neotykIs there simpler version of this?
08:14neotyk,(let [a '([:a 1] [:b 2])] (zipmap (map first a) (map second a)))
08:14clojurebot{:b 2, :a 1}
08:15neotyktape_dispencer: I've seen some docs on it
08:15tape_dispencerDo you remember where? I have seen references to accessing a field, but I want to declare one.
08:16hiredman,(into {} '([:a 1] [:b 2]))
08:16clojurebot{:a 1, :b 2}
08:17neotykthis is great, thank you hiredman!
08:17hiredmanneotyk: will only work with two element vectors
08:18hiredmantape_dispencer: never heard of "def-class"
08:18tape_dispencerI'm sorry. I miss typed. I mean gen-class. Sorry for the confusion.
08:18neotyktape_dispencer: http://clojure.github.com/clojure/clojure.core-api.html#clojure.core/gen-class
08:19neotykcheck :methods
08:19neotykand once you figure out how to make method static do share, I
08:19neotykdidn't manage to do so
08:19tape_dispencerI saw that. But it only refers to declaring a static method
08:20tape_dispencerI want to declare a static field. In java it would be public static String KEY = "keyValue";
08:20neotykok, miss read your question
08:21neotykand if you do (def -field-name ...)
08:21tape_dispencerhmm... I never thought to try that.
08:22neotykhth
08:33tape_dispencerAfter some trial and error, (def -field-name ...) doesn't seem to work either. It compiles fine, but I don't see any reference to the static field in the generated bytecode.
08:42tape_dispencerHas anyone been able to declare a static field when gen-class?
08:45fogus_tape-dispenser: on the gen-class declaration do you have ^{:static true} ?
08:45fogus_tape_dispencer: ^^^
08:45tape_dispencerWhere would I add that?
08:46tape_dispencerIn the documentation, I only see where that is applicable with static methods.
08:46tape_dispencerI want to declare a static field, ie public static final String KEY = "keyValue";
08:51stuartsierragen-class doesn't create fields
08:52stuartsierraor, it doesn't create more than one field, which is a public final instance field
08:53tape_dispencerbut no way of declaring a static field?
08:53stuartsierrano
08:54tape_dispencerThank you
08:54tape_dispencerIs there a way to declare a java enum in clojure?
08:55AWizzArdtape_dispencer: last time I asked about this there wasn't.
08:55AWizzArdThis is +/- 3 months ago.
08:55tape_dispencerThank you
08:58fogus_tape_dispenser: Sorry, I didn't read far enough in the thread to gather your precise question. My bad
08:59Raynesfogus_: You should be ashamed of yourself.
09:01fogus_I am
09:03unwissenderhello all, I have a question concerning clojure.contrib.mock: it seems not to be possible to build a mock within an expect statement for a method of a deftype
09:03unwissendercan I get that to work somehow?
10:02AWizzArdI have a sequence [:a :b :c 5000 'hi] and want ==> {:a 0, :b 1, :c 2, 5000 3, 'hi 4} - that is: I understand the seq as a map and want to reverse keys/vals and store that result in a HM. Any clever tricks for that?
10:03AWizzArdSeq: a map where the index represents the keys.
10:04AWizzArdOne can do it with indexed, with dotimes, etc. But maybe there is a neat way to do it.
10:05joegallo(zipmap (vals orig) (keys orig)) Might do it.
10:05joegalloOr something along those lines.
10:05joegallo,(let [foo {:a :b, :c :d}] (zipmap (vals foo) (keys foo)))
10:05clojurebot{:d :c, :b :a}
10:05LicenserWe have to reach cost reliability to improve end to end reliability!
10:06Licenserthank you clojure :D
10:06joegalloThat'll get you the reversing, I suppose.
10:07studybot_>>AWizzArd: (reduce #(assoc %1 %2 (inc (%1 %2 0))) {} coll)
10:07AWizzArdjoegallo: zipmap would work nice if my input already were a map. But it can be a list, or array or vector.
10:07joegallo,(let [foo [:a :b :c]] (zipmap foo (iterate inc 0)))
10:07clojurebot{:c 2, :b 1, :a 0}
10:08joegalloIs that what you wanted?
10:08AWizzArdYes, that is a good idea.
10:08AWizzArd,(doc range)
10:08clojurebot"([] [end] [start end] [start end step]); Returns a lazy seq of nums from start (inclusive) to end (exclusive), by step, where start defaults to 0, step to 1, and end to infinity."
10:08AWizzArd,(zipmap [:a :b :c 5000 'hi] (range))
10:08clojurebot{hi 4, 5000 3, :c 2, :b 1, :a 0}
10:08AWizzArdgreat, nice trcik
10:09AWizzArdthx
10:09joegalloGood call with range.
10:45Licenserhttp://manager.licenser.net/ - nonsense powered by clojure!
10:47cemerickLicenser: auto-generated managerial aphorisms?
10:47Licensercemerick: yap
10:47cemericknice :-)
10:47Licenserduring my last tele meeting I realized how simple it is to be a manager
10:48cemerickheh
10:48cemerickwell, it's simple to be a *bad* manager, of course ;-)
10:48Licenserheh
10:48Licensertrue
10:49stuartsierraLicenser: mind if I tweet that?
10:49LicenserSad thing is, I was done with the code faster then the telco was over
10:49Licenserstuartsierra please be my guest
10:50RaynesLicenser: It lives!
10:51LicenserRaynes: jup
10:51fogus_"We have to enhance synergy reliability."
10:51AWizzArdWhat about: "You need to make a bold move"?
10:51Raynes"End to end drive is the ultimate pattern."
10:52AWizzArdReminds me of the generator for scientific papers: http://pdos.csail.mit.edu/scigen/
10:54LicenserAWizzArd: yup a friend showed me that when I told him about the program
10:56AWizzArdAn all-time classic (:
11:06iveyhave any of you done the chef/opscode CLA?
11:06iveyit's all online with Echosign. took me 2 minutes. so cool.
12:02dnolenLauJensen: pong
12:33mattmitchell_what's the most clojure-like way to create a hash-map from another, but only by a limited set of keys?
12:34stuartsierra(doc select-keys)
12:34clojurebot"([map keyseq]); Returns a map containing only those entries in map whose key is in keys"
12:44_fogus_,(let [m {:a 1 :b 2 :c 3} k [:a :b]] (select-keys m k))
12:44clojurebot{:b 2, :a 1}
12:57jsandawhat's the best/preferred way to something to the classpath to an already running app?
12:58stuartsierrajsanda: restart the app
12:58RaynesNot doing so.
12:58stuartsierraor use a Java IDE that manages classloaders for you
12:59jsandai want to consume clj scripts but the location may not be known statically
12:59stuartsierraoh, then you can just load the file
12:59jsandathe path is determined at runtime
12:59Raynes&(doc load-file)
12:59sexpbot⟹ "([name]); Sequentially read and evaluate the set of forms contained in the file."
13:00jsandai'm running into - java.lang.IllegalAccessError: Context classloader is not a DynamicClassLoader
13:00RaynesAlso: http://github.com/ninjudd/classlojure
13:00RaynesFor doing multiple classloader stuff.
13:01jsandai'm running inside a plugin container system that manipulates classloaders already
13:01jsandai've tried setting *use-context-classloader* to false and it didn't help
13:01imadeHello, I am trying to connect to H2 database, but I get an error "Could not load properties /home/imade/clojure-dev/hours/jdbc:h2:tcp:/localhost/~/test.lock.db", it seems to point to wierd place
13:02stuartsierrajsanda: you'll probably need to use the classloader system of your container
13:03imadeanyone ever tried clojure with h2?
13:04jsandaok. i was starting to think that i'll have to add the paths to the parent class loader from the container. i will pursue that avenue. thx
13:05mattmitchell_stuartsierra: thanks!
13:17kotarakimade: haven't tested it extensively, but seems to tork quite well
13:18imadeI don't doubt that it doesn't work, it's me who's silly :)
13:19imade(def db {:classname "org.h2.Driver"
13:19imade :subprotocol "h2"
13:19imade :subname "jdbc:h2:tcp://localhost/~/test"
13:19imade :user "tester"
13:19imade :password "tester"})
13:19imade(defn test-db []
13:19imade (with-connection db
13:19imade (with-query-results rs ["select * from TEST"]
13:20imade (dorun (map #(println (:name %)) rs)))))
13:20imadethat's my connection properties and test method
13:21imadeI'm thinking my subname is wrong, I have tried the one written in http://en.wikibooks.org/wiki/Clojure_Programming/Examples/JDBC_Examples#H2Database, but also no luck
13:25kumarshantanuimade: you can try clj-dbcp if you want -- it's tested and works (shameless plug though)
13:27imadekumarshantanu, thanks, I am investigating it now
13:29kumarshantanuimade: okay, do ping me if there's something unclear about it
13:43mrSpecHello, I have very lame question. How can I write in clojure something like: gm.setMode(ModalGraphMouse.Mode.TRANSFORMING); ? I'm trying: (.setMode gm 'ModalGraphMouse.Mode.TRANSFORMING) but it's wrong :/
13:43chousertry (.setMode gm ModalGraphMouse$Mode/TRANSFORMING)
13:43amalloytry ModalGraphMouse$Mode$TRANSFORMING (no ')
13:43amalloyoh, that's probably more right
13:44chouserI'm not sure
13:44amalloyno, i think you're right
13:44mrSpecchouser: unfortunately: No such namespace: ModalGraphMouse$Mode
13:45amalloymrSpec: have you imported ModalGraphMouse from whatever package it lives in?
13:46Raynes$google ModalGraphMouse
13:46sexpbotFirst out of 32 results is: ModalGraphMouse (jung2 2.0 API)
13:46sexpbothttp://jung.sourceforge.net/doc/api/edu/uci/ics/jung/visualization/control/ModalGraphMouse.html
13:46mrSpechm, I'll check this :)
13:46RaynesIt lives there.
13:46Raynesedu.uci.ics.jung.visualization.control.ModalGraphMouse
13:46RaynesSeriously?
13:47chouser(import 'edu.uci.ics.jung.visualization.control.ModalGraphMouse$Mode)
13:47chouserthen try mine again :-)
13:47RaynesThose people should be executed by firing squad. :\
13:47mrSpecchouser: Thx
13:47mrSpecI didnt have $Mode
13:47amalloyRaynes: sigh, i'm writing similar package names at work
13:49Raynesamalloy: For a while, it looked like the group of clojurians supporting really long convoluted namespaces was going to win, but then Leiningen's default made the papers and took over the world.
13:49RaynesI don't think I could have tolerated it, even if it is 'better' for some reason. If this is wrong, I don't want to be right.
13:49amalloyRaynes: i think i would have supported them if i'd been around
13:50amalloyglobal uniqueness is a nice property
13:50RaynesI disagree when it's at the expense of three word wraps per namespace.
13:51LOPPwhat's the problem, you can alias that
13:51RaynesYou still have to type it.
13:51amalloyand someone would have added a way to create abbreviations within your own project. eg, define mr.* as an alias to com.hubpages.cassandra.mapreduce.* throughout the project
13:51LOPPonce per file
13:51RaynesAnd remember it.
13:51amalloyso that you only type it once per project, not file
13:52amalloyeg, put that in project.clj. not that hard
13:52amalloyi'm happy with the short namespaces, but if clojure takes off there will be conflicts and we'll have to switch back to java style
13:53RaynesOr more unique project names.
13:54LOPPnot to mention when you have a generic class name
13:54LOPPyou usually get 5 same ones when you try autocomplete in eclipse
13:54KirinDaveYou know...
13:54RaynesIf so, I promise to be the last person to bite the bullet and start using the nonsensical domain.project.file style.
13:54LOPPit's nice to have company name in namespace
13:55KirinDaveObjective-C has this problem 1000x worse and they really, really rarely have a collision problem.
13:55KirinDaveI think this collision/package problem is one of those things where people are *convinced* it's a nightmare but in practice, humans just Deal With It™.
13:56RaynesI'm of the opinion that if you create a project of the same name as another person's popular project, you have more collision problems than just namespace ones.
13:57KirinDaveAgreed.
13:58RaynesBut I digress.
14:12bobo_whats the simplest way to have one method that handles different types? ie converting Date to long before continuing.
14:13amalloybobo_: multimethod is one way
14:14kumarshantanubobo_: duck typing (as-date xxx) is another option
14:14kumarshantanuin fact that is coercion
14:15bobo_yes, but what way should one use when its only one tiny method and most likely just two types
14:16tonyl make a multimethod or just a fn that hangles both types to the resulting type
14:17kumarshantanuI prefer coercing personally (because it stays within the function)
14:17amalloyand i prefer a multimethod. i don't think it much matters
14:18tonyldoes arity works with type? like (defn myfn ([^Date d] ... ) ([^Long n] ...))
14:18tonyl*work
14:18tonylwell i guess there is multimethods for that
14:18bobo_hm ok, doesnt realy mather i guess
14:18amalloytonyl: no
14:18kumarshantanutonyl: doesn't -- the number of args matters
14:19amalloyclojure functions dispatch strictly on arity: no type overloading
14:19tonylyeah figured kinda late
14:30lazy1How do I write the char literal for space?
14:30chouser\space
14:30lazy1Thanks
14:33lazy1One sign that Clojure is well designed is that whenever someone answers me, there's a loud "doh" inside my head
14:35chouserheh. well, that may be, but I don't personally think its consistency around char and string prepresentation is particularly strong.
14:35chouserbut at least you can ask it questions like that.
14:35chouser& (first " ")
14:36sexpbot⟹ \space
14:45lazy1I come from Python where they did away with chars, there are only strings
14:45chouseryeah. That would be clumsy to try to do on top of JVM
14:46lazy1As abstractions goes, there is some different between a char and a string. But not that much
14:46lazy1difference that is
14:47klang.. must make something cool, to be able to use dk.lang.clojure.cool-stuff as the package name ..
15:02dprohi
15:03dproI was just checking out incanter, but when I run a simple example - from (doc view) - for example, I only get a blank window and no plots or graphics show up ... any ideas why that happens ? (I use a tiling WM if that matters)
15:04chouserthat might matter
15:04dprooh, and there are no errors of course
15:04chouseryeah
15:04chouserjust a sec, finding a link
15:05chouserdpro: http://www.haskell.org/haskellwiki/Xmonad/Frequently_asked_questions#Problems_with_Java_applications.2C_Applet_java_console
15:05chouseryou might try one of those
15:06chouseractually, this page may be easier to follow: http://awesome.naquadah.org/wiki/Problems_with_Java
15:13dprochouser: cheers now it works ... aargh
15:44dnolenhmm does anyone know how to get Enlive to not emit the surrounding <html> <body> when rendering snippets and/or templates ?
15:48defnRaynes: how's the rewrite of sandbox going?
15:55amalloydefn: sexpbot has been using the rewrite for a while now. if you haven't seen him broken or hacked, it's going well
16:06Raynesdefn: It wasn't really a rewrite as much as a total rethinking. I have to give clj-sandbox credit because I absolutely did not start totally from scratch, but I can't call it a 'rewrite'.
16:06RaynesBut yeah, what amalloy said.
16:06Raynes:)
16:39mattmitchell_i have a hash map, and would like to change all keys to have new keys (name becomes name_ss and name_text) -- is there a sweet clojure way to do this?
16:41tonyljust change the keywords by appending that?
16:42mattmitchell_tonyl: the only thing is that i have a bunch of keys per/hash i need to change to that same format
16:42tonyl&(into {} (map (fn [[k v]] [(keyword k "_ss") v]) {:a 1, :b 2}))
16:42sexpbotjava.lang.ClassCastException: clojure.lang.Keyword cannot be cast to java.lang.String
16:43tonyl&(into {} (map (fn [[k v]] [(keyword (str k) "_ss") v]) {:a 1, :b 2}))
16:43sexpbot⟹ {::a/_ss 1, ::b/_ss 2}
16:43rata_hi all
16:43neotyk,(let [m {:a 1 :b 2}] (zipmap (map #(str % "_text") (keys m)) (vals m)))
16:43clojurebot{":b_text" 2, ":a_text" 1}
16:43mattmitchell_interesting thanks
16:49amalloymattmitchell_: i think tony's is the clearest, once you adjust it to make it work: ##&(into {} (map (fn [[k v]] [(keyword (str k "_ss")) v]) {:a 1, :b 2}))
16:49sexpbotjava.lang.Exception: Unable to resolve symbol: & in this context
16:49mister_robotoIs it normal to get errors on the tests while building clojure-contrib 1.2?
16:49amalloy##(into {} (map (fn [[k v]] [(keyword (str k "_ss")) v]) {:a 1, :b 2}))
16:49sexpbot⟹ {::a_ss 1, ::b_ss 2}
16:49freakazoidhmm, double colon
16:50mattmitchell_freakazoid: yeah i was just going to ask about that :)
16:50amalloyoh, sure
16:50amalloy##(into {} (map (fn [[k v]] [(keyword (str (name k) "_ss")) v]) {:a 1, :b 2}))
16:50sexpbot⟹ {:a_ss 1, :b_ss 2}
16:50freakazoidit could make extra long poo with that double colon.
16:50joegallo,(name :foo)
16:50clojurebot"foo"
16:50joegalloOh, you beat me to it.
16:50mattmitchell_awesome :) thanks
16:50Raynes&(into {} (for [[k v] {:a 1, :b 2}] [(keyword (str (name k) "_ss")) v]))
16:50sexpbot⟹ {:a_ss 1, :b_ss 2}
16:50tonylname eluded me
16:51amalloyRaynes: dude, i just did that
16:51Raynesamalloy: Don't tell me I'm going to have to start tidying up YOUR code, now. ;)
16:51RaynesDid not.
16:51tonylRaynes did it with the for macro
16:51amalloyoh. you and your for nonsense
16:51tonyllol
16:52tonyli love map, what can i say
16:52amalloyi don't mind for, i guess, but i almost always use map when i'm writing my own stuff. why use a macro when a function will do, etc etc
16:52RaynesI don't always destructure, but when I do, I prefer for. Stay concise my friends.
16:52amalloyhe is...the most nitpicky man in the world
16:53RaynesComing from the guy who brought in a deprecated contrib lib just so he wouldn't have to not use ->
16:53Raynes;p
16:53defnRaynes: what's the name of your "rethinking"?
16:54Raynesdefn: clojail
16:54amalloy$google clojail
16:54sexpbotFirst out of 14 results is: Planet Clojure
16:54sexpbothttp://planet.clojure.in/
16:54RaynesMan, how does my stuff still end up on planet clojure. :o
16:54amalloysexpbot: srsly? you can't give us github?
16:54Rayness/./?/
16:54sexpbot<Raynes> ?????????????????????????????????????????????????????????
16:54amalloylol
16:55amalloygood try man
16:55RaynesOh, intertweets.
16:55RaynesI forgot that it was in the intertweets.
16:55Rayneshttp://github.com/Raynes/clojail
16:56mister_robotos/\./?/
16:56sexpbot<mister_roboto> Is it normal to get errors on the tests while building clojure-contrib 1?2?
16:56RaynesMan, that makes it an entirely different question.
16:58amalloy$sed -Raynes s/.*/whine whine whine
16:58sexpbot<Raynes> whine whine whinewhine whine whine
16:59amalloyhm, that's weird. i wonder why it matched twice
16:59RaynesBecause it's regex.
16:59amalloys/.+/1
16:59sexpbot<amalloy> 1
16:59RaynesI need to learn elisp.
16:59amalloys/.*/1
16:59sexpbot<amalloy> 11
16:59RaynesI desire an Emacs mode for atomo.
16:59amalloyhuh
17:04Raynesdefn: Have any uses for a sandbox these days?
17:05Thornit looks like it can actually be easier to deal with parentheses in lisp than in javascript
17:06ThornI've got something like )])])]}])])]} in my javascript code
17:06RaynesMy eyes!
17:06dnolenThorn: not unusual. Especially in Node.js programs.
17:06hiredmanparedit actually sort of works for javascript in emacs
17:06ThornI'm an ext js user
17:07dnolenThorn: never messed w/ that - a MooTools, jQuery+Underscore.js person myself.
17:08hiredmanin clojure you can write macros to turn normal looking code in to a series of callbacks
17:09Thornalso, neither netbeans nor eclipse actually help you if you get those unbalanced
17:09Thornhaven't tries emacs, though
17:10dnolenThorn: hmm, I thought Counter Clockwise had paredit support now
17:10hiredmanhttps://github.com/hiredman/die-geister/blob/master/test/die_geister/test/core.clj#L13 the async macro form is rewritten as a series of callbacks that depend on the result of the previous callback
17:12dnolenhiredman: hey, that looks pretty cool. Will need to digest that.
17:16Thornext js has these config objects which specify UI layout, see e.g. http://www.java2s.com/Code/JavaScript/Ext-JS/MulticolumnsNotitlesdoublestack.htm
17:16ThornI wonder if this could be made more elegant if we could use lisp
17:16hiredmandnolen: inspired by http://player.microsoftpdc.com/Session/1b127a7d-300e-4385-af8e-ac747fee677a
17:17hiredmannew composable async tasks for c# an vb.net
17:21mister_robotoIs it normal to get errors on the tests while building clojure-contrib 1.2?
17:29mister_robotoNo? Yes?
17:29technomancymister_roboto: well... it's not normal to build contrib in the first place.
17:29technomancyunless your name is Hudson
17:29mister_robotoIt is, actually!
17:29RaynesIt is if you intend to contribute to it.
17:30dnolenhiredman: not gonna install Silverlight, but that the Rx stuff right?
17:30mister_robotoIf u get the zip from github, that's what u get, a maven project
17:30mister_robotoSo the test failures are normal then?
17:30tonylit didn't happen to me
17:31amalloymister_roboto: there's no reason to get the zip from github though
17:31tonylI only followed the directions from the README file
17:31amalloyjust put dependency on contrib into your lein/cake project.clj, and they go get the jar for you
17:32mister_robotoDude, I am not using lein/cake. Why not just answer the question? I don't get the reluctance.
17:32amalloybecause i haven't built it
17:32RaynesBecause everybody uses lein and cake, and nobody builds contrib or clojure unless they plan to contribute to it.
17:33mister_robotoNo, everyone doesn't. :)
17:33RaynesIf you aren't building it to test your own changes, use lein, cake, or cljr to get a REPL and start using lein or cake for dependency management in projects. That's the best way to go about this. There is no point in building contrib unless you have a reason for doing so other than "I want to."
17:33RaynesLein, cake, or maven.
17:33mister_robotoI'm just using ccw in eclipse. Not worried about distribution yet of a jar war or whatever
17:34tonylI don't use lein or cake or any other tool like that
17:34tonylI just built it from the zip
17:34tonylbut there was no error output
17:35mister_robotothanks tony for your direct answer :) this was on the 1.2 release zip on the download page, btw
17:36tonylthat is the one I used, but if by 'download page' you mean the one in github
17:37mister_robotoRaynes, I would just use a prebuilt jar if there was one to directly d/l
17:37mister_robotoYes tony, the github page for clojure
17:37tonyli can send you mine
17:37mister_robotoThere is no prebuilt contrib jar there
17:38tonylnope
17:38tonylyou have to build it
17:39mister_robotoThanks tony but that's ok. I'm on my phone now anyway.
17:39tonylok
17:39raekmister_roboto: http://build.clojure.org/releases/org/clojure/
17:39raekthese are the jars that the clojure build tools would download
17:40tonylthat is a good link raek, never found it before
17:40raekcontrib is there too
17:40RaynesNo, you don't have to build it. You can get it from the maven repository. And no, you don't even have to use a build tool to do so, though that's the general work flow. If you just want a REPL, you can use the build tools for that, and to manage that REPL's classpath. I can't think of a really good reason to not do so if you aren't contributing to Clojure or contrib. I'm not trying to be an asshole, but merely trying to put you on the right track rath
17:40Rayneser than just answer your questions when you're inherently doing something that might be bad for you in the long run.
17:40mister_robotoThanks! Never saw that before raek
17:40RaynesRest assured, I only wish to help.
17:41mister_robotoI understand all of that. Been developing java with maven for like 6 years, use hudson etc etc. I only wanted to know about the errors
17:42mister_robotoActually, I checked out the src from git a while ago and compiled that with no prob at all, pulling from master
17:42mister_robotoI was just curious. I know the "dangers" :)
17:44RaynesNot necessarily dangerous as much as not using build tooling can quickly end up being painful and disastrous in the long run. Too many people go that route and end up turning away from Clojure because of it. However, you're familiar with the Java ecosystem (apparently), so I'm sure you understand. :>
17:44mister_robotoI actually love clojure.
17:50raeksorry for bombaring you with all this "use the build tools" propaganda, but beginners tend to complicate things. compared with other languages, it's not very obvious how to get started with other libs that clojure and contrib...
17:51Raynesraek: I'm writing up a blog post about all of this because of what just transpired.
17:51RaynesTo try to make sense of things for new people. I'll let you read it before I publish it, if you'd like.
17:52raeksure
17:53mister_robotoI understand, raek. but the 4 test failures are there in test_io.clj and test_profile.clj on win 7, maven 2.2.1 and jdk 1.6
17:53mister_robotoI appreciate that you're trying to be helpful. I do have a perfectly fine working env using ccw in eclipse
18:07mister_robotoraek I know I want something like lein for packaging if I ever get around to distributing something. Something to uberjar all my deps or build me a war or whatever. I'm too busy learning basic clojure to care at this point :)
18:08raekif what you have work, then great :)
18:10raekI find lein useful, because it downloads not only the jars of the deps, but the jars of the deps of the deps, etc...
18:10raekalso it makes managing the classpath a bit simpler (neat if you have more than one projec)
18:11raekthis is why *I* use it...
18:11mister_robotoThe ccw plugin works very well except that once in a great while the repl will hang on something related to laziness that always runs fine from the commandline (like clojure file.clj, or from a standalone repl)
18:11raekstrange
18:12mister_robotoRaek, u can do that easily in eclipse too (managing classpath)
18:13raekyes, but not in emacs... :)
18:13raekin emacs, you usually let lein or cake take care of that...
18:14raekI guess there is less need for leiningen in eclipse...
18:15mister_robotoRaek, oh for the transitive deps... yes, I usually rely on maven or grape in groovy for that. I haven't had that problem yet in my simple clojure experiments. I can add jars easily but not the nice transitive dep mgmt of maven or lein
18:16mister_robotoThat's a good point for using lein
18:16raekbtw, can one send a single defn for evaluation in CCW (without restarting the clojure instance), like one can with C-M-x in slime? (open question to everyone in #clojure)
18:16mister_robotoEasier than a clojure plugin and just maven
18:17Deranderraek: yes
18:17Deranderwait
18:17Deranderccw?
18:17clojurebotccw is http://github.com/laurentpetit/ccw
18:17Derander.. thanks clojurebot
18:17mister_robotoRaek yes u can. Highlight, right click and select run selected in repl
18:17mister_robotoWill use the running repl
18:18raekok. neat
18:18raekI have a friend who used to restart the clojure instance each time he changed something
18:18mister_robotoI didn't know that for a long time :O
18:18mister_robotoThat's what I was doing initially
18:18raekmy reaction was that "sure there must be a way to do interactive developmen?"
18:19raekmister_roboto: thanks for the hint
18:19mister_robotoThen I started copy pasting into the repl, which was still a pita
18:19mister_robotoFinally I read the contxt menu :)
18:21raekinteractive development in clojure rocks.
18:22mister_robotoRaek I agree... it's so quick to experiment. That's why I like the groovy console too, even to think through a java thing
18:22mister_robotoBut that console is not as nice due to the crappy editor
18:32alexykhow do you merge two sets?
18:33technomancyinto?
18:33tonylunion
18:38amalloy&(clojure.set/union #{:a :b} #{:b :c})
18:38sexpbot⟹ #{:a :c :b}
18:38amalloyalexyk: ^
18:38alexykthx
18:45Raynestechnomancy: ping
18:46Raynestechnomancy: You know how 'cake repl' runs in cake's global project, so that all dependencies of the global project are on the classpath of that REPL, providing functionality similar to that offered by cljr? I'm writing a blog post about some things and some other things, and before I'm totally wrong, I'd like to confirm whether or not Leiningen has anything similar.
18:47Deranderwtf do I do if contrib.profile has an integer overflow when it profiles my code?
18:47Derandergarrgh.
18:47raek1.3?
18:47Deranderchecking
18:48Derander1.2
18:48raekhrm strange.
18:48raek,(clojure-version)
18:48clojurebot"1.2.0"
18:49Deranderit works usually
18:49raek,(reduce + (rest (range 100)))
18:49clojurebot4950
18:49raek,(reduce * (rest (range 100)))
18:49Deranderbut I try it on a really big number
18:49clojurebot933262154439441526816992388562667004907159682643816214685929638952175999932299156089414639761565182862536979208272237582511852109168640000000000000000000000
18:49Deranderlong code* and it implodes
18:49DeranderI'm going to do it again, gimme a little bit.
18:49raekintegers shouldn't overflow in Clojure 1.2 :/
18:49technomancyRaynes: david has talked about adding that cljr-ish functionality to lein, but nothing's come of it so far. I guess people who want that just use cljr
18:50Raynestechnomancy: Cool. I'll add a note that it's being considered.
18:55Derandercan't reproduce it anymore
18:55Deranderweird.
18:57Deranderoh there is goes again
18:57DeranderValue out of range for int: 55560780000" in clojure.lang.RT.intCast after clojure.contrib.profile
18:58Derander(that's the number of nanoseconds it takes to execute this slow piece of shit)
18:59tonylwhat is the code?
19:01tonylor a simpler version if it is too big
19:40Derandertonyl: sorry, had to drive home.
19:45Derandertonyl: runs sub-1 second (usually around 800ms) for most web pages that I slam through this; I found one website with 1700 divs on it that eats this code alive. runtime is ~25 seconds.
19:45Derandertonyl: https://gist.github.com/704448
19:45Derander1) I'm not very good at clojure
19:46Derander2) it doesn't have a problem profiling things until I put a prof in (find-content)
19:46Deranderafter that I get that number out of range error
19:46Deranderthis code is inspired by webmine, but I started before that was publicized so it has some differences
19:46DeranderI couldn't get webmine running to check its performance on the same webpage, some weird dependency issue.
19:46Deranderhttp://www.core77.com/blog/columns/design_without_designers_17587.asp <-- this is the sample website
19:47DeranderI was starting to try to type hint it, but I don't understand fully how to do that. I'll figure it out though.
19:54hiredmandnolen: I am not sure if it is part of Rx, but async tasks certainly play well with the observable collections from Rx
20:06bhenryis there something that will always round division up if it's not evenly divisible?
20:06bhenryor do i have to write my own?
20:10hiredmanhttp://download.oracle.com/javase/1.4.2/docs/api/java/lang/Math.html#ceil(double)
20:12bhenrynice! thanks
20:15Deranderoh interesting
20:15Deranderprofiling hsows that it's spending 99% of the time in one spot
20:19rata_hi
20:24amalloybhenry: clojure.contrib.math/ceil also
20:28rata_which is the function that returns [(filter f coll) (remove f coll)] ?
20:38amalloy((juxt filter remove) f coll) :P
20:38amalloyor c.c.seq-utils/separate
20:39bhenryrata_ clojure.contrib.seq-utils/separate
20:39rata_oh thanks
20:41gertalothey all, I'm trying to sum a large number of vectors, but this gives me a stack overflow:
20:41gertalot(reduce (fn [a b] (map + a b)) (repeat 10000 [1 1]))
20:41gertalot(in reality the vectors aren't simply [1 1] btw)
20:41gertalothow should I be doing this instead?
20:44Derandergertalot: (reduce + (flatten [[1 2] [3 4]])) seems to work
20:45Deranderthat assumes that the vectors are in list-ish thing
20:45gertalotthat's not what I'm after though
20:45Deranderdinner time
20:45Deranderwhat are you trying to do?
20:45gertalotI have a large list of vectors, the results of calculations using a random normal distribution
20:45Deranderoh
20:46gertalotand I'm trying to average them
20:46Deranderare you trying to get a collection of sums of bectors?
20:46gertalotI'
20:46Derandervectors*
20:46gertalotI'm expecting (10000 10000) to be the result of my example above
20:46Deranderoh, I see
20:46Deranderso all of the first elements + all of the second
20:46gertalotyes!
20:47Deranderinteresting
20:47gertalotso [1 2 3] + [4 5 6] == [5 7 9]
20:47gertalotthat sort of thing
20:47Deranderdefinitely reduce
20:47Derandertrying to think of a way to structure it
20:47Derander(reduce (magic) (coll of vectors))
20:48gertalotwhy would it overflow the stack though?
20:48DeranderI don't know
20:49Derander(reduce (fn [[a b] [c d]] (identity [(+ a c) (+ b d)])) (repeat 10 [1 2])) returns [10 20]
20:49bhenrygertalot does every vector contain two items?
20:49tomojhuh?
20:49Derander(reduce (fn [[a b] [c d]] [(+ a c) (+ b d)]) (repeat 10 [1 2])) <-- so does this
20:49Deranderand doesn't overflow the stack after 10,000 iterations
20:50Deranderrepeats
20:50Deranderwhatever
20:50gertalotnot all vectors contain 2 elements though
20:50Deranderoh, darn.
20:50gertalot:)
20:50Deranderis it regular?
20:50tomojthen how can you add them?
20:50bhenryhow would you add?
20:50Deranderyou don't have [1 2] + [ 1 2 3] ever?
20:51gertalotall vectors contain the same number of items, but not necessarily 2
20:51gertalotthis should also work: (reduce (fn [a b] (map + a b)) (repeat 10000 [1 1 1]))
20:51tomojit blows the stack because you end up with (map + (map + (map + (map + ...))))
20:51gertalothm.
20:52tomojsomething like that
20:52tomoj( ... (map + (map + (map + [1 1 1]) [1 1 1]) [1 1 1]) ...)
20:52tomojdammit
20:52tomojyou get the idea
20:52gertalotyeah :)
20:52bhenry(apply map + (repeat 1000 [1 1 1]))
20:52bhenry&(apply map + (repeat 1000 [1 1 1]))
20:52sexpbot⟹ (1000 1000 1000)
20:53bhenry&(apply map + (repeat 10000 [1 1 1]))
20:53sexpbot⟹ (10000 10000 10000)
20:53gertalothey!
20:53gertalotawesome
20:53bhenry&(apply map + (repeat 100000 [1 1 1]))
20:53sexpbot⟹ (100000 100000 100000)
20:53bhenryboo ya
20:53gertalotthat makes me happy
20:53Deranderlol
20:54bhenrygertalot, watch your heap space though
20:55gertalotI'm alright with heap space - we need a lot, but we have quite a lot :)
20:55gertalotstack consumption I'm worried about
20:55bhenrycool.
20:56gertalotI wouldn't have thought that reduce should eat the stack though, but I'm sure there's a good reason for it? :)
20:57garytr25function call stack?
20:57tomojit's not reduce eating the stack
20:58tomojreduce builds up a lazy seq which has an unrealized chain of maps
20:58tomojas soon as you try to consume an element, it blows the stack by realizing all those maps
20:58tomojtry (def foo <version that blew the stack>)
20:58gertalotahh I see
20:58tomojmaybe something causes it to try to realize anyway
20:58tomojbut I"m betting that won't blow the stack
20:58tomojuntil you get an element out of foo
20:59gertalotyou're right
20:59gertalotinteresting. I learn something new every day! :)
21:26jarpiain,(reduce (fn [a b] (doall (map + a b))) (repeat 10000 [1 1]))
21:26clojurebot(10000 10000)
21:26jarpiaingertalot: that works also
21:30DeranderI have a list of things that I want to count in a string. Right now I'm doing (count (re-seq #"[!\"#$%&\'()*+,-./:;<=>?@\[\][\\]^_`{|}~]" string)) to count punctuation. This is pretty slow in large strings though. Is there a better way?
21:31gertalotthanks jarpiain
21:31gertalotthat forces evaluation so the lazy seq doesn't build up, right?
21:32tonylDerander: why not just look for not alpha-nums #"[^A-Za-z0-9]"
21:33Derandertonyl: I'll try, will that make a difference in exectution speed though?
21:34jk_there has to be an easier way to reverse a string as a string, right? (apply str (reverse "1234"))
21:34tonylmm probably, but low one
21:34Derandertonyl: the problem (I think) is more to do with the number of items in the seq
21:34Deranderbecause it occurs to some extent when I'm just counting commas
21:35tonyljk_: maybe clojure.string.reverse ?
21:36tonylDerander: so it has to be able to handle big strings
21:36Deranderyeah
21:36Deranderthe problem is that I am trying to parse article content
21:36DeranderI suppose it's not that valuable
21:37DeranderI could just axe these areas altogether and probably see no difference
21:37Deranderbut they're still decent indicators of where the article is
21:37Derander(in a website)
21:37tomojthe regex is just a character class?
21:37Deranderno, no. I'm doing it similar to how webmine does it
21:37Derandersec
21:38tonylhave you try seeing webmine, to see how it does it?
21:38tomojjust counting occurrences of particular characters?
21:38Deranderhttps://github.com/clj-sys/webmine/blob/master/src/webmine/readability.clj#L45
21:38Derandertonyl: it doesn't
21:38Deranderhm
21:38tonylor maybe partition-all the string seq and deal with each partition
21:38Deranderwell, they have a different way of checking for commas
21:39Deranderhm
21:39Deranderyeah
21:39Deranderlooks like they tried to implement the punctuation counter and killed it
21:39Deranderperhaps for the same reason
21:39Deranderlooking for info in commit lgo
21:39Deranderlog
21:39tomojI don't understand
21:40DeranderI'm sorry. I'm not being very clear
21:40tomoj(count (filter #{\, \. ...} coll)) ?
21:40tomojer, s/coll/s/
21:40tomojyou're not just counting character occurrences like that?
21:41Deranderno, I have a character class regex that I'm using re-seq w/
21:41DeranderI will try filter
21:41tomojI mean, is your regex equivalent to that
21:41Deranderyes
21:41tomojdunno if hash set will be faster
21:41DeranderI think it's just going to be slow
21:47Deranderoh. looks like the problem isn't in clojure, but lies more with the java library I'm relying on
21:48tonylthe regex class in java?
21:48Derandernah, w3c's document
21:48Deranderthe whole dom thing
21:49Derander.getTextContent
21:49Derandersorry, I'm not really sure which class I'm operating on
21:49Deranderit's an element. not sure if it's xerxes or w3c's, but it's a Node
21:52tonylok
21:53Deranderhead imploding
21:54tonylgot something
21:54tonyl(let [ls (partition-all 32 longstr)] (apply sorted-set (reduce #(re-seq #"[^a-zA-Z0-9]" (str %1 %2)) ["hello, world!", "wej,wep! oijer?"])))
21:54Derandertonyl: I will be back in ~5 minutes to try that out
21:54tonylnot that
21:54tonyl(let [ls (partition-all 32 longstr)] (apply sorted-set (reduce #(re-seq #"[^a-zA-Z0-9]" (str %1 %2)) ls))) this
21:54tonylok
21:55amalloy&(count (filter #{\,} (repeatedly 1e6 (comp char #(rand-int 255)))))
21:55sexpbot⟹ 3881
21:55tonylscratch that, not good performance
21:56amalloy&(time (count (filter #{\,} (repeatedly 1e7 (comp char #(rand-int 255))))))
21:56sexpbot⟹ "Elapsed time: 6982.28 msecs" 38920
21:56tonylamalloy: sorry meant to my code
21:56amalloysure i know
21:57amalloyi was just demonstrating that this one is probably fast enough, right?
21:57Deranderamalloy: not sure. I don't have a feel for how fast java/clojure is yet
21:57Deranderin ruby I'd be fine with that
21:57DeranderI don't think I could go that fast in ruby
21:57tonylprobably
21:57DeranderI don't know if it's fast or slow for java though
21:57Deranderit's a background threaded process though so it's not a huge deal if it's slow
21:57DeranderI just don't want to have shitty performance because of shitty code
21:58amalloyDerander: well, it took 7 seconds to create ten million random numbers and count up the commas
21:58Deranderyeah
21:58DeranderI know
21:58Derandergood enough
21:58amalloythat shouldn't be hard to write in java, right? to compare?
21:58Deranderwell, I didn't mean java vs clojure, I meant clojure vs ruby really
21:58DeranderI know that it'll be ridiculously slow in ruby
21:59amalloy*chuckle*
21:59DeranderI just don't know what slow looks like in clojure
21:59jk_(:slow)
21:59Deranderjk_: har :-)
21:59amalloyDerander: i'll hack it up in java for you and compare
21:59Deranderamalloy: only if you want to. not worrying about it
22:00Deranderokay, now the slow parts of the code are where I expected -- checking children nodes for various things
22:00Deranderthat's reasonablyt
22:00Deranderthere are 1700 nested divs
22:03gstampQuick macro question if anyone can help: https://gist.github.com/704567
22:04amalloygstamp: i'll look in a sec, but before that, let me suggest fewer macros. it's usually the right answer :)
22:05amalloyah, okay, not this time
22:05amalloyp# is a symbol that only exists within the quoted context. you can't refer at compile-time to a thing that doesn't exist until runtime
22:06Deranderamalloy: not sure why, but (p/prof :commas (count (filter #{\,} text-content))) takes 53 seconds
22:06Derandercompared to around 6 with re-seq
22:07tomojgetTextContent returns a String?
22:07amalloywhat you really want is (println "hi" ~@(list 1 2) p#). of course using ~@ for just some constants is silly here, but i assume you know that and are using it to demonstrate some other problem you're having
22:07Derandertomoj: yes
22:07tomojthen I guess regex is faster
22:07tomojnot very surprising I guess
22:07amalloyDerander: fwiw on my machine clojure takes 26 seconds and java takes 1.2s
22:07tomojseq of characters is slow
22:08Deranderamalloy: interesting
22:08Deranderamalloy: think there is any way to improve that performance?
22:08Deranderwould dropping to java classes help?
22:08amalloy*shrug* i don't do a lot of performance tuning in either language
22:09Deranderokay
22:09tonylwhat do you have now Derander
22:09Derander(p/prof :commas (count (filter #{\,} text-content))) where text-content is a string
22:09Deranderjava string
22:09dnolenDerander: do you have a gist of yr code?
22:10Deranderhttps://gist.github.com/704571
22:10Deranderthere is all of it
22:10Deranderof interest are weight-div
22:10Deranderand find-content-div
22:10Derander(this is my first clojure project, I'm sure there is lots wrong.)
22:11dnolenthat's quite a bit of code have you identified the slow spots?
22:12Deranderif you refresh the gist it has profiling
22:12Deranderit's all in weight-div
22:12Deranderwell
22:12Deranderthose prof markers are mostly all in weight-div
22:12dnolenDerander: so commas is slow?
22:12Deranderyes
22:12Derander(that was from before when :commas was commented out in weight-div)
22:13Licenserfor you night people: http://manager.licenser.net/ - an application for high level management featured by clojure
22:14dnolenDerander: one problem is that count is linear to size of the result of filter
22:14Deranderyeah
22:14dnolenfilter doesn't return some you can get the count of quickly, it must be traversed
22:15amalloydnolen: well, of course counting the number of commas in N characters will be O(N). the same is true of java
22:15dnolenamallaoy: yeah sorry I wasn't look at it closely enough,
22:17Deranderat this point I think the issue is if it's a clojure vs java issue, or just fundemental slowness that can't be avoided
22:17DeranderI don't know how much better the algorithm can get
22:17dnolenDerander: there are some tricks, gotta go tho.
22:17Deranderokay
22:18Deranderthere is a countMatches method in StringUtils
22:18Derandergoing to try that
22:18amalloyDerander: it can't possibly be better than O(n), but there are probably plenty of ways to reduce the constant factor
22:18Deranderamalloy: right, that's what i'm going for.
22:18amalloyeg, partition the input into four equally-sized chunks and count them each in parallel
22:18gstampamalloy: Thanks very much. That all makes sense. You're right about the example just being for demonstration purposes. I didn't want to confuse anyone with the real version.
22:19amalloybut the regex engine is probably pretty well tuned for literal-character matches, so that's likely to be the best you can do for a given chunk
22:20Deranderamalloy: that's an interesting idea
22:20DeranderI hadn't even though of multithreading
22:21Deranderhonestly this entire operation could be heavily parallelized if need be.
22:23Deranderokay, StringUtils/countMatches does it in 1.5 seconds vs. around 7 seconds for the best implementation I've done in clojure so far
22:26amalloyoh, in apache commons?
22:26Deranderyeah
22:26Derandergrabbing dinner now. contemplating parallization.
23:27joshua__Hi, I'm using emacs, swank and slime and had a question. I want to send code from a window to my slime buffer, how can I do that?
23:29joshua__Probably a pretty noobie question, but I've been struggling with it. I've found ways like C-cC-x which will eval a command, but it doesn't eval it in the slime window as far as I can tell, since if I do something like (ns some-ns) it doesn't actually change the ns from user> to some-ns>.
23:31bhenryis that all you're looking to do or do you have another purpose to send it to slime?
23:31bhenrythe slime buffer *
23:32amalloyjoshua__: C-c C-c evaluates the current top-level form
23:32amalloyif you want specifically namespace changes, C-c M-p changes the repl to the ns of the current buffer
23:33joshua__It pops up saying compilation finished when I do that amalloy (C-cC-c)
23:34amalloyjoshua__: clojure, unlike CL, doesn't have a concept of eval vs compile
23:34amalloyif it's been compiled, it's been evaled in the repl
23:34joshua__Okay.
23:34amalloyit doesn't paste the results, but if you eval eg a defn, that function will have changed
23:35joshua__Oh, I thought it wasn't doing anything this whole time.
23:35joshua__I was going to check for .jars and stuff haha
23:35amalloyC-c C-k evals the whole file
23:39amalloyjoshua__: problem solved?
23:39joshua__No actually.
23:39joshua__It still doesn't seem to be evaluating it. Just in case it matters I'm trying to do this with something I went to using slime-connect, and I'm in clojure-mode.
23:41amalloyso just to isolate the interesting part, try making a new file with (ns foo) (def bar 1)
23:41amalloyC-c C-k that, then switch to the repl; (ns foo) <RET> bar should eval to 1
23:42joshua__Oh, your right it works.
23:42joshua__=)
23:43amalloyhurrah!
23:43joshua__For some reason I was thinking I could access the equivalent of bar from the user namespace.
23:43joshua__=)
23:43joshua__Thanks amalloy!
23:46joshua__I'm like dancing irl at my chair because of how much fun being able to send code between a buffer and swank is.
23:46joshua__So awesome.
23:48jk_raek: ?
23:48amalloyhaha, that's great joshua__
23:51amalloyjk_: fyi, if you instead say "raek: ping", sexpbot will /msg you when raek gets back
23:52jk_amalloy: ahh, thanks. i'm getting ready to leave very soon. but i'll make a note of that
23:52jk_raek: ping