#clojure logs

2011-01-13

00:00amalloycemerick: i'm actually using an atom, which i think is substantially different in context
00:00cemerickThis topic came up on stackoverflow recently: http://stackoverflow.com/questions/4562122/use-clojureql-or-stm-asynchronous-writes
00:00clojurebot#<RuntimeException java.lang.RuntimeException: java.lang.Exception: 503>
00:00Enclojedcemerick: sure, that's how it's done in Red Dwarf, more or less. I still don't see how to do it safely here
00:00Enclojedcemerick: gonna look at SO now
00:01cemerickamalloy: yeah, I wasn't sure what that atom was there for
00:01amalloycemerick: heh. yes, i may have written the example wrong
00:01cemerickEnclojed: what do you mean, "safely"? Agent sends and watcher notifications aren't performed until the transaction closes.
00:01amalloyi mean more like (send-message (determine-message-from (swap! data do-transaction)))
00:02Enclojedamalloy: Oh, heh, that looks like the obvious way to do it, duh. Alright I'll try that.
00:03Enclojedcemerick: What I mean specifically is avoiding doing anything that fouls up the STM guarantees, that's all. I didn't realize there was an easy way to pass information back out of a transaction that way, but of course it makes sense.
00:04amalloyEnclojed: right, all(?) the stm constructs return the value they assigned to their atom/ref
00:04Enclojedamalloy: Yeah I'm just now seeing that... it seems consistent with a lot of other things in clojure.
00:04amalloythe synchronous ones, anyway. obviously that doesn't make sense for agents
00:05cemerickamalloy: atoms don't participate in transactions at all
00:05Enclojedamalloy: do agents give you something ilke a futuer?
00:05amalloyEnclojed: yeah, but futures give you something even more like a future
00:05amalloycemerick: no, but they do retries
00:05amalloywhich is the relevant part for Enclojed's concerns
00:06cemericksure; my eyes just crossed a bit when I saw STM mentioned in conjunction with atoms
00:07Enclojedcemerick: are you going to be at the meetup in Cambridge tomorrow?
00:07amalloycemerick: really? i mean, maybe technically atoms don't participate in the stm, but they're extremely close cousins
00:07amalloyand you have to consider all the same things when using them
00:08Enclojedcemerick, amalloy: at my old job we used atomic data types and STM together, as long as you weren't an idiot about it, it worked just fine :)
00:08Enclojedespecially if the number didn't have to be accurate :D
00:08cemerickEnclojed: Nope, won't make it. Not sure I'd want to bother with the drive anyway, given the snowpocalypse.
00:09cemerickamalloy: Atoms offer an uncoordinated CAS. IO isn't safe within a fn passed to swap!, but that's about where the similarities end.
00:09Enclojedcemerick: sorry to hear that... I wouldn't normally drive in this for that, but I'll be in the area beforehand anyways.
00:10amalloyCAS?
00:10clojurebotparedit screencast is http://p.hagelb.org/paredit-screencast.html
00:10cemerickEnclojed: where are you usually?
00:10cemerickcompare and swap
00:10Enclojedcemerick: I live ~40 minutes west of Boston.
00:10EnclojedAtoms and Transactions are both atomic right?
00:11EnclojedAnd they are composable
00:11cemerickamalloy: atoms wrap a http://download.oracle.com/javase/6/docs/api/java/util/concurrent/atomic/AtomicReference.html which is what defines the semantics
00:12amalloycemerick: yeah, i know
00:12cemerickEnclojed: yes, and yes, but atoms do not participate in transactions.
00:13Enclojedyeah, if they did it'd kind defeat the point of them, right?
00:13cemerickThat is, swap! and reset! are side-effecting w.r.t. a running transaction that may retry.
00:13cemerickYeah, I'm just nitpicking the proximity of the words "STM" and "atom". :-|
00:13cemerickEnclojed: no kidding -- I'm in Holyoke
00:13EnclojedWell it's important for people to not get the wrong idea I'm sure :)
00:13clojurebotmax people is 317
00:14amalloyclojurebot: keep it down, will you?
00:14clojurebotPardon?
00:14Enclojedcemerick: Yup, not far from here at all.
00:14EnclojedSo you two seem like you'd totally know
00:15cemerickEnclojed: You're in the Worcester area then?
00:15cemerickknow what?
00:15EnclojedI'm trying to figure out how to write programs in Clojure very quickly, and would like to find a good starting point in terms of how people structure them.
00:15EnclojedI have a lot of experience with functional programming, but mostly in ML dialects and scala
00:15Enclojedonly just the tiniest bit of lisp
00:16Enclojedcemerick: Acton actually, which is a little farther away
00:16EnclojedWhat I really need is some kind of "Clojure for scala weirdos" or whatever
00:17EnclojedThe language documentation does an excellent job of describing the language, however I'm more concerned with best practices and general structures at the moment. I can always look up how functions work etc as I need them.
00:18amalloyEnclojed: "lazy sequences" are the two most important words i can think of for writing clojure code
00:18Enclojedamalloy: Yeah, used those in scala pretty often
00:20amalloycode structure...i dunno, write some functions describing what you want to do to your data :)
00:20Enclojedamalloy: that's the part I already know how to do, more or less :(
00:20Enclojedamalloy: I'm more concerned about using things like multimethods w/ records and how to do that in the STM construct easily
00:21amalloyEnclojed: i rarely use any of those three things. they're nice to have, but not the core features
00:22Enclojedamalloy: I need the STM because I'm writing a server and concurrency is a huge part of the design
00:22Enclojedamalloy: records seem to be the cleanest way to keep my data
00:22cemerickEnclojed: amalloy's comment is on point more than he probably realizes. Clojure disposes of so much of the ceremony that exists in most programming languages, and is so "data-oriented" that the structure of Clojure applications seems to represent the contours of the domain far more than any other language I've encountered.
00:22amalloyEnclojed: meh. records are just optimized hashmaps
00:22Enclojedamalloy: multimethods I can probably do without, but I would really like to have some way to do inheritence and all that
00:23amalloyEnclojed: no, you really don't want inheritance, most of the time :)
00:23cemerickThat is to say, outside of some probably very broad idioms, there's probably no such thing as "typical structure" of Clojure programs.
00:24Enclojedamalloy: oh, I think inheritence is generally evil, however my problem domain more or less requires it
00:24amalloyEnclojed: i dare you
00:25Enclojedamalloy: I generally avoid inheritance but, for instance, in game programming it's generally part of the data model, and dispensing with it will lead to a lot of code duplication
00:27Enclojedamalloy: I'm not using it out of some idea that OOP is how programs should be written or anything like that. It's just the fact that the behavior that certain aspects of the simulation needs to follow are so concisely represented using a hierarchy of overriding implementations that it's kinda silly not to use that facility when it's provided.
00:27amalloyEnclojed: that's fair
00:28Enclojedamalloy: but yes, I definitely believe you that one shouldn't overdo it, especially in a functional language
00:28amalloyi'm not sure whether you want protocols or multimethods, then; probably some mix thereof
00:29Enclojedamalloy: yeah I was looking at both... I really like what protocols are, but the lack of implementation bit there means it's only useful for situations where I don't expect to be mixing implementations
00:30cemerickEnclojed: that doesn't seem clear to me at all -- you can absolutely define default implementations.
00:30amalloyEnclojed: no, not at all. the idea is that you use a protocol to define some bare-minimum set of functionality that an object has to have
00:31amalloythen write libraries to provide a richer set of features for all Foo-like objects
00:31EnclojedRight, which is not really what I need here
00:31EnclojedWhat I *really* need here is to be able to make something that's a "Foo" but with this one behavior tweaked slightly.
00:32Enclojedand then be able to make noe of those, but with smoething else tweaked
00:32tomojtoo bad
00:32tomoj:P
00:32Enclojedinheritance is outstanding for this, though I could be able to use composition to achieve it as well
00:32tomojimplementation inheritance is evil, supposedly
00:33cemerickEnclojed: in Java terms, are you looking to completely override implementation, or optionally call superclass' implementation(s)?
00:33EnclojedEither, depending on the situation
00:33tomojoh, didn't read backscroll
00:34EnclojedYeah I agree that inheritence often sucks all that etc etc, but for some things, like in this case game programming, it's something that maps so *very* well to the problem domain
00:34amalloytomoj: you're going to make it onto the Most Judgmental of 2011 list if you keep this up :)
00:34EnclojedI think there's a rule that any real programmer has to have at least a hundred strong opinions, often exactly the opposite of whoever they are currently working with :)
00:35cemerickEnclojed: protocols definitely allow you to selectively "override" baseline implementations.
00:35tomojamalloy: I don't even know why implementation inheritance is supposed to be evil
00:35Enclojedcemerick: sure, but can I do that multiple levels deep?
00:35cemerickdefinitely
00:35tomojI just know that you won't find it in clojure because rich said so
00:35amalloytomoj: i don't either, but it must be true
00:36cemerickEnclojed: extend takes a map of protocol impls; you can construct that map to mirror whatever implementation overriding strategy you want.
00:37Enclojedcemerick: alright, that means if I want to "inherit" from a record I start with that record's implementation map and then do whatever I want to it?
00:37cemerickright
00:37cemerickgoing down that route, the implementations really just don't belong to the records
00:37Enclojedcemerick: alright. I will see if I can do without multimethods then, although I know that they are very useful for specifying certain kinds of "special case" behavior
00:39EnclojedThe only reason that I would want to tie implementations to records is that the logic will need to persist some logic-specific state data, and so that already has to be in the record somewhere.
00:39cemerickYeah, the data definitely belongs in records. But, that doesn't mean the implementation does.
00:40cemerickmultimethods provide for arbitrary dispatch characteristics and an ad-hoc hierarchy. If you don't need the latter, and the type-based dispatch is appropriate, then protocols are uniformly superior.
00:40Enclojedcemerick: Hmm I might be using a different definition of "in" than you. I don't intend on putting the functions into each instance of a record.
00:41cemerickEnclojed: I'm just talking about whether the implementation is inlined in particular defrecord-generated classes, or exists separately (and therefore is available to be "overridden" for other types).
00:42Enclojedcemerick: Oh, that's not what I meant really. I guess it's hard to describe what i meant, but what I really want is whatever dispatch mechanism I use to automatically know which implementation to use, I don't want to have to manually keep that data somewhere and then dispatch on my own.
00:42Enclojedcemerick: looks like I can get a lot more flexibility from multi-methods but I don't think I need that very often, I will try just using protocols for now and see if that's good enough. is there something like isa? for protocols?
00:42amalloysatisfies
00:43cemerickProtocols dispatch on types, period. Thus, each record type will dispatch "on its own"
00:43amalloy&(doc satisfies?)
00:43sexpbot⟹ "([protocol x]); Returns true if x satisfies the protocol"
00:43Enclojedk... i'm gonna go play with those then
00:51amalloycemerick: i like the characterization as "following the contours of the problem domain"
00:51cemerickamalloy: yeah, so did I :-) Going to blog it in a bit.
00:52amalloymaybe i should start a blog, in case i say something catchy and nobody will do me the favor of plagiarizing to their own blog
00:54amalloy(PS this will never happen)
01:02seancorfield_amalloy: you don't already have a blog? shame...
01:09amalloyseancorfield_: well, i've never felt i had anything interesting to say. having someone proclaim it a shame that i don't have a blog might get me to change my mind
01:09amalloyand my day job is with a content company who'd like it if i did some writing as well as coding...
01:10talios<delurk> it's a shame you don't have a blog. </delurk>
01:11TobiasRaedermorning
01:19seancorfield_amalloy: a blog is a great place to write yourself reminders - which other people may find useful
01:19amalloyseancorfield_: hah, that's a very compelling description
01:20seancorfield_i often search for stuff and my own blog comes up - and i've heard other bloggers say the same :)
01:21tomojthink of any prettier ways to write (fn [x] ((#'foo (:bar x)) x)) ?
01:21tomojeh, can't be that terse anyway
01:24amalloy(-> x :bar #'foo (.invoke x))?
01:24amalloynot terribly pretty either, but interesting anyway
01:25tomojneeded (when-let [baz (#'foo (:bar x))] (baz x)) anyway
01:26amalloyah, true
01:26cemerick-> doesn't work like you'd think with #'
01:27amalloycemerick: yikes, good point
01:27amalloyneeds (#'foo) i guess
01:27seancorfield_tomoj: can you explain what that function actually does??
01:28tomojgiven an x, look up (:bar x) in a map foo to get a function, then call that function with x
01:29tomojthe #' is just so that it picks up changes when I redefine foo
01:29seancorfield_(var foo) right?
01:29tomojyeah
01:31tomoj(the when-let is to keep it from calling nil)
01:32amalloytomoj: you could use c.c.core/-?>
01:32amalloybut i guess you can't get a self-call in that way
01:33amalloyspeaking of which, do we have a "clojure-like" version of (.invoke f args)? ie, apply but without list expansion
01:35sexpbot⟹ 1
01:37tomojif you're calling invoke that way you know the arity, so #(%1 %2 %3 ..) ?
01:38tomoj:/
01:40tomojgot my hopes up stupidly when #(~@%&) eval'd without error
01:40amalloytomoj: it must exist already, somewhere - it's just CL's funcall
01:40tomojtoo bad, so beautifully ugly
01:41amalloyhaha
01:41qbgYou shouldn't need funcall
01:41qbgWhat are you trying to do?
01:41amalloyqbg: why not? (-> x :bar (.invoke y)) should be one way to rewrite ((:bar x) y)
01:42amalloyin this example it's less legible with funcall of course
01:43qbg,(-> {:bar inc} :bar (apply 5 []))
01:43clojurebot6
01:44amalloyqbg: yeah, i guess. i don't like the [] there
01:45tomojnil works too but I bet you don't like it any better
01:45qbgMethinks you want too much out of ->
01:45tomojI don't understand
01:46tomojoh, nevermind, I misread as "too much of ->" and was confused :P
01:47tomojhuh
01:48qbgI just use let for complex threadings; I suspect that a specific macro for such usage would not be much better.
01:48tomojwhy did it take me this long to realize that ##(-> 10 (range) (->> (map -))) works (admittedly a silly example)
01:48sexpbot⟹ (0 -1 -2 -3 -4 -5 -6 -7 -8 -9)
01:49amalloytomoj: yeah, and you can do similar things with doto
01:50amalloy(doto (Foo.) (.setBlah Baz) (-> set! x 10))
01:51amalloyer, ...(-> (set! x 10))
01:52amalloyi really like the freedom that ->, ->>, and doto give you to write your operations in whatever order makes sense rather than forcing inside-out or left-to-right or whatever
01:55zvrbaamalloy: hmm, quick explanation of -> and ->> ? documentation is a bit opaque
01:55amalloy&(macroexpand '(->> (range) (filter even?) (take 10) (reduce +)))
01:55sexpbot⟹ (reduce + (take 10 (filter even? (range))))
01:56zvrbaah, akin to a pipe?
01:56amalloyuhhmmm, sorta
01:56qbgIs macroexpand aliased to macroexpand-all in sexpbot?
01:56zvrba&(macroexpand '(-> (range) (filter even?) (take 10) (reduce +)))
01:56sexpbot⟹ (reduce (take (filter (range) even?) 10) +)
01:56amalloyqbg: it might be. i didn't think it was, but now that you mention it it must be...
01:57amalloyzvrba: really it blindly rewrites your forms, but it's most often used as a conceptual pipe
01:57zvrba-> is a bit harder to wrap head around :S
01:57qbg&(macroexpand-1 '(->> (range) (filter even?) (take 10) (reduce +)))
01:57sexpbot⟹ (reduce + (take 10 (filter even? (range))))
01:57zvrbaamalloy: but what is -> then?
01:57amalloyoh, qbg, i know
01:57qbg???!
01:57zvrbaamalloy: if ->> is pipe, what is -> ?
01:58qbgThey are both pipes in a sense
01:58qbg-> makes the previous form the first argument
01:58amalloysexpbot macroexpands all your code before evaluating any of it, so it can scan for not-allowed functions forms and members
01:58qbg->> makes it the last
01:58qbgamalloy: Seems like a bug
01:59amalloyqbg: as it happens, i'm currently working on a macroexpand plugin
01:59zvrbaqbg: aha! it suddenly makes sense :-)
01:59tomojhuh.. ##(first '(for [x 1] x))
01:59sexpbot⟹ let*
01:59qbgOh boy
01:59qbgThat is terrible
01:59tomoj&(first '(1 2 3))
01:59sexpbot⟹ 1
01:59tomojwell, that's good at least
02:00amalloyqbg: yeah, the '(for) thing is definitely a bug i didn't know about
02:00amalloythat one i'll fix
02:00tomojsame bug as the macroexpand[-1] examples above, isn't it?
02:00amalloyautomatically macroexpanding all the way, i won't fix but might hide
02:01amalloytomoj: i guess it is, isn't it
02:01tomojexcept it kind of looks like a feature if you squint
02:01amalloytomoj: usually it is in fact desirable
02:01qbg'(eval 5)
02:01qbg&'(eval 5)
02:01sexpbotjava.lang.SecurityException: You tripped the alarm! eval is bad!
02:02qbgYeah...
02:02amalloybut i'm reorganizing things so it only macroexpands-all on actual macroexpand forms
02:02zvrba&(5)
02:02sexpbotjava.lang.ClassCastException: java.lang.Integer cannot be cast to clojure.lang.IFn
02:02qbg&'[eval 5]
02:02sexpbotjava.lang.SecurityException: You tripped the alarm! eval is bad!
02:02amalloyqbg: understanding &'(eval 5) is extremely difficult. i'd do it if i could
02:02amalloyclojurebot doesn't do it right either
02:03amalloy,'(eval 5)
02:03clojurebotDENIED
02:03qbgIt also denies it when it is in a vector
02:04amalloy,[eval]
02:04clojurebotDENIED
02:04amalloythey all do
02:04zvrbaamalloy: how about using security policy to 1) disallow access to external resources [files,sockets,etc] 2) put a time limit on evaluation of each request
02:04amalloyzvrba: that's all already done
02:04zvrbaamalloy: wouldn't that also solve the eval problem? ie. allow you to support eval w/o having to analyze it?
02:04zvrbaamalloy: so what's the problem with eval?
02:05zvrbaamalloy: oh yeah, also disallow loading of other classes.
02:05qbgDo you want people defining stuff all over the place
02:05amalloyzvrba: you also can't (def)
02:05zvrbaaha
02:05zvrbaqbg: put every statement into a new namespace.
02:05zvrbaqbg: statement = every &.. request from irc
02:05amalloyzvrba: so? you're still leaking memory everywhere
02:05zvrbaamalloy: can't you programmatically erase a namespace?
02:06zvrbahmm
02:06amalloyzvrba: yes. but this is a much more complicated problem than you'd think at first glance
02:06zvrbawhat you're saying is that clojure doesn't have first-class environments?
02:06amalloyif you want to contribute to the effort, check out https://github.com/Raynes/clojail
02:06zvrbalike (eval [something] [variable-bindings-environment])
02:06qbgNope
02:06zvrbaIIRC, CL does have environment parameter to eval, but it is nowhere specified how to define an environment
02:07qbgCL doesn't either
02:07zvrbathat's the bit I like about Lua: easy to manipulate envs
02:07qbgYou have &environment lambda keywords for macros in a few spots
02:07qbgClojure 1.2+ has an implicit &env argument to macros though
02:08qbgBasically only useful for getting the names of variables in the lexical scope though...
02:08zvrbai hate github's webpages
02:08zvrbathey don't wrap properly in narrow windows
02:08zvrbaand using "fit to width" in opera makes a column 5-10 characters wide of it
02:09amalloyzvrba: have you tried githun filefinder?
02:09zvrbahmm?
02:09amalloygithub rather
02:09zvrbaobviously, not :)
02:09zvrbawhat is that?
02:09amalloyhttp://sr3d.github.com/GithubFinder
02:10zvrbano
02:11amalloycuts down substantially on the pain involved in browsing repos, and might fix your width issues
02:12amalloythere's some javascript you can add as a bookmark to open the repo you're browsing normally with ghfinder
02:12qbgBrute force way to solve the bot issues: Have a queue of JVM instances ready to evaluate a single expression, then kill them once done ;)
02:12zvrbauh, it's been a long time I did some programming in my free time :/
02:13zvrbaare there any plans for Clojure to support first-class environments?
02:13zvrbalike, what is the problem with doing eval in a specified namespace?
02:13qbgYou could create a new namespace, or switch to a different one and do stuff there
02:13tomoja new jail, huh
02:14tomojthat means new jailbreaks :)
02:14tomojclj-sandbox had me beat
02:15amalloyqbg: if you allow eval, the user can get around any clojure-based restrictions you care to place
02:15qbgamalloy: My last reply was w.r.t. why creating a new namespace doesn't work
02:15amalloyoh i see
02:16amalloyyou meant the client could, not the sandbox could
02:16qbgYes
02:16qbgThe JVM instances idea might be fun
02:16qbgIn a cruel, sick way at least
02:17amalloyqbg: as of this very second i'm accepting donations for a bigger vps
02:18amalloyi'll name one of the jvms after you
02:20tomoj&(tomoj)
02:20sexpbot⟹ hello! nil
02:20qbgI remember seeing some classloader hack that let you evaluate expressions in a different clojure version; I wonder if any of that could be used to spawn light clojure instances...
02:20amalloytomoj: wut
02:20amalloytomoj: do something clever and hacky via /msg or something?
02:21tomojdunno if I'd say clever
02:21tomojmaybe it was clever when I did it to clj-sandbox, same trick :(
02:22amalloyhah. well, please let us know in #sexpbot about any exploits you discover
02:22amalloywe work pretty hard to make them not exist
02:34tomoj&(doc +)
02:34sexpbot⟹ "([] [x] [x y] [x y & more]); Returns the sum of nums. (+) returns 0. FNORD"
02:54tomojthat I just wrote (sdrawkcab ("!dlrow ,olleh" nltnirp)) probably means it's time to go to bed
02:55amalloytomoj: pure genius
02:56tomojit would be genius if the definition of sdrawkcab was also backwards
02:56tomojunfortunately I guess that's impossible without cheating
02:58amalloytomoj: implement it as a palindrome
02:58tomoj:D
02:58amalloy(defn ... nfed)
02:59amalloythe ... is left as an exercise for the reader
02:59tomojhmm
02:59tomojwon't it always macroexpand to orcamfed ?
03:00amalloytomoj: (defmacro ... (let [orcamfed ...] orcamfed))
03:01amalloyyou can't do it as a palindrome *and* with balanced parens, probably, but that seems like asking a lot
03:04tomojoh well
03:04LauJensenMorning all
03:05amalloymorning LauJensen
03:05amalloyearlier we were discussing how i should start a blog to be more like you
03:05arbschtthis could be a start (defn _# [] #_ nfed)
03:06LauJensenamalloy: That would be great
03:06LauJensenarbscht: When is the next WR due?
03:06arbschtLauJensen: this weekend
03:07LauJensenarbscht: Alright - Its great that you're putting in the work - and I can tell its a lot of work!
03:07arbschtanother fortnightly review
03:08arbschtthe news part isn't much work tbh -- I should have released that without the special feature, but I mistakenly thought I could squeeze it together within a weekend
03:11LauJensenok. I was impressed that you collected news from so many different communities
03:11arbschtyou should see my rss reader and mailing list subscriptions...
03:12LauJensenI tried subscribing to the Clojure ML which killed my productivity in a week :(
03:12arbschttbatchelli_'s daily intertweets roundup is a really good source
03:16LauJensenYea I check them out daily as well
03:36TobiasRaederMorning, again :)
03:36clojurebotPardon?
05:27ejacksonHello all
05:30LauJensenmjello
05:30kryft'allo
05:33ejacksonFinally got my DIY standing desk worked out this morning. Previous versions have ben rather unstable.
05:34ejacksonand flying laptops are a poor idea
05:55LauJensenDIY ejackson ? pics :)
05:55ejacksonhahahah
05:55ejacksonalrightyyy.....
06:00LauJensenYou are indeed a creative man
06:00LauJensen!
06:01LauJensenIs that an 'authorized' stand you're using the for the laptop?
06:01ejacksonyeah, it folds up nicely fro when I have to travel
06:01LauJensennice, got a link/name for it?
06:01ejacksonand that is a wine case that's bringing the keyboard up to the proper height ;)
06:02LauJensenYea it wouldn't work without the wine case and the floor board :)
06:02ejacksonits ergonomically correct, and gets me off my fat ass, which is critical.
06:03LauJensenejackson: You know they actually sell tables which allows you to both sit and stand right?
06:03ejacksonoh yeah, they also sell software.
06:03ejacksonso i'm told.
06:03LauJensenOh you're trying to be clever... now I get it...
06:04ejackson:D
06:05ejacksoni figure you'd approve, it is very much in line with your ideas on doing everything the best way possible.
06:05ejacksonthe idea of a standing desk, at any rate.
06:06ejacksonthe macguyver construction, maybe less so :)
06:07LauJensenHmm. I dont know how I feel about you using a storage cabinet, a wine box, a floor board to mimic a box product and say its in line with my ideas ... :)
06:08ejackson:)
06:59opqdonuthow long do your projects tests take?
07:00opqdonutwere trying to optimize ours, were at 50secs at the moment
07:00fliebeltests? (yea, I'm evil)
07:00opqdonutthe tests involve jni libs doing some quite heavy processing
07:00opqdonutbut they still seem rather slow for some reason
07:01opqdonutmaybe memory churn
07:02fliebelopqdonut: Is all the heavy processing needed, or could you test on a subset of the data, or whatever?
07:02opqdonutwell it seems that it is needed. we have separate large tests which are run on "more real" data
07:02opqdonutthey're run periodically on a test server and take tens of minutes
07:03fliebelouch...
07:03opqdonuti'm just curious as to how low people have gotten their turnaround times
07:04fliebelBut if you want to find out the answer to your question, check out some github projects and run their tests :)
07:04opqdonutmm, yes, good idea
07:05midsopqdonut: I was thinking about adding some of the JunitMax features to a clojure test runner
07:06mids(JUnit Max keeps statistics of past run length and failure rate and sorts them to give you the quickest feedback)
07:06fliebel*puzzled look* Does anyone know why Clojure might insert whitespace in front of my printed data?
07:07midsfliebel: calling println with multiple arguments?
07:07fliebelmids: Yea...
07:07midsI believe that injects spaces, try str on it first
07:08opqdonutmids: we've been considering something like that
07:08opqdonutmids: were printint the top 10 time consuming tests at the moment
07:09fliebelopqdonut: Random idea: Distributes tests over a small cluster :)
07:09midsopqdonut: yeah, after adding some timing stats I got mine back to 14 seconds including jvm startup
07:09midsalso there are some testrunners out there that do parallel execution
07:10opqdonutdistributing will probably only help down to 10secs or so
07:10opqdonutsub-second unittests would be cool
07:10opqdonutmids: what sort of project is this by the way?
07:10midssome tiny web application :)
07:11opqdonutok
07:11midshow do you run your testsuite? as part of the CI? manually executed?
07:15opqdonutmids: developers run the tests manually, and the mergemaster runs tests as a prerequisite for merging
07:16opqdonuthmm, I grabbed clojure-contrib from git and am trying "mvn test"
07:16opqdonut[INFO] Unable to find resource 'org.clojure:clojure:pom:1.2.0-master-SNAPSHOT' in repository clojure-snapshots (http://build.clojure.org/snapshots)
07:16opqdonutthat sounds kinda stupid
07:17midsopqdonut: I got an autotest runner setup, which starts as soon as a .clj file is written to disk
07:17midstogether with a nice red/green bar this is very effective
07:17opqdonutah sounds neat
07:18midshttps://gist.github.com/771550
07:19midsmaybe it could be used to only run specific test cases based on which file / subdirectory is written to
07:19Raynes_na_ka_na_: ping
07:20_na_ka_na_Raynes, I present myself before you, bow
07:20zoldarhello, I'm trying to define a macro for handling conditions (clojure.contrib.condition) inside (try ...): http://paste.lisp.org/display/118588 . When compiling, I'm getting information about 'catch' symbol being unresolvable in current context . What am I doing wrong?
07:20Raynes_na_ka_na_: http://dev.clojure.org/jira/browse/CONTRIB-99
07:21RaynesThat bug appears to have been magically fixed in 1.3
07:21RaynesI was going to fix it, but found that somebody had beat me to the chase.
07:22_na_ka_na_sweet
07:22RaynesJust wanted to point it out. :>
07:22_na_ka_na_thanks for that :)
07:23opqdonuthmm, I must be doing something wrong. the 1.2.x tag of clojure-contrib fails with a "java.lang.NoSuchMethodError: clojure.lang.RestFn.<init>(I)V"
07:23opqdonut(when building clojure.contrib.repl-ln)
07:23raeksounds like you're mixing jars from different clojure versions
07:23RaynesAre you building it with the corresponding Clojure? That error is almost always a sign of mismatched versions of AOT compiled Clojure code.
07:24opqdonutI'm letting mvn grab the needed clojure jar
07:24opqdonutok, "maven clean" fixed it.
07:24opqdonutmy bad probably
07:50Raynes$seen kzar
07:50sexpbotkzar was last seen quitting 4 weeks and 1 day ago.
08:10Dranikhow to debug a clojure program without an ide?
08:11LauJensenDranik: You'll have to ask the vim users. I think kotarak and chouser are the last two left
08:11fliebelLauJensen: Why Vim users?
08:11DranikLauJensen, isn't there a comand-line way?
08:11LauJensenfliebel: Everybody else has an IDE
08:11LauJensenDranik: yea, open a cake repl in your project
08:11DranikLauJensen, me also but I'm not satisfied with them
08:12DranikI'm much happier with gvim than with netbeans/enclojure
08:13LauJensenDranik: Great, however most people are happy with Emacs
08:14Dranikyep, I was trying to get used to it for two months until I almost have broken my fingers playing the emacs chords
08:14Dranikso how to use cake to debug clojure code?
08:14LauJensenDranik: Oh - You didn't mention up front that you were a woman... :)
08:15Dranik???
08:15LauJensenDranik: cake repl just gives you a project repl, in which you can use whatever tools you normally would to debug. Im actually not sure how you attach a debugger
08:15Dranikok
08:16LauJensencheck in #cake.clj
08:20RaynesLauJensen: That was mean. People who whine about Emacs's chords aren't women! They're armless pirates!
08:21LauJensenRaynes: Oh Im sorry - I wasn't trying to be mean, I was just surprised thats all :)
08:21Raynes;)
08:22RaynesI don't know, it seems it always comes down to "it's huge" or "the keybindings suck", in which case I merely give up and presume that they're happy enough with Vim to just plain not care.
08:22RaynesI use Emacs because I can use it for *everything*. Any language. I mean, seriously, I'm writing my book in it.
08:23Dranikchouser, thanks :-)
08:23chouserwell, part of a book. Fogus wrote the rest in emacs.
08:24Dranikchouser, do you debug clojure code somehow?
08:24LauJensenDranik: chouser doesnt make mistakes, so he doesnt need debugging :(
08:24RaynesI wasn't implying that it couldn't be done in Vim. I was just stating why I use Emacs. If you asked me why I use Emacs over Vim, I'd answer with "tetris and M-x eshell"
08:24LauJensenRaynes: I use Emacs for the same reasons. And the keybindings that suck, get changed
08:25RaynesLauJensen: My hyper key is my hero.
08:25DranikRaynes, the keyword here: "if you ask". I don't ask about your emacs. I ask about debugging clojure
08:25LauJensenIs that bound to M-x zone-mode ?
08:25chouserI rarely step through clojure code examining locals and the like. I've never done that much in any language.
08:26RaynesDranik: Just making conversation. Certainly not trying to steal your question's spotlight! :)
08:26chousercareful examination of stack traces and liberal logging generally work well enough for me.
08:27fliebelchouser: You mean just inserting println statements?
08:27RaynesLauJensen: I have stuff like H-c for slime-connect and H-s for magit's status buffer.
08:27Dranikyeah, what the logging tool do you use?
08:27chouserfliebel: When I'm watching stdout, yes.
08:28Raynesprintln is my go-to debugging source. I've encountered few problems I couldn't solve with 5 or so strategically placed printlns.
08:28chouserthough on some projects I end up writing a 5-line function to allow turning on or off logging in certain sections of code
08:28fliebelThe only time I used a debugger was with Python, because it was included *shrug*
08:28Dranikyeah, python debug is great!
08:28Dranikthe same as in RoR
08:29Dranikso I was waiting something alike in clojure
08:29chouserthe clojure debugging framework is out there. I really should invest the time to figure out how to use it.
08:30fliebelchouser: You don't. There is one that can insert a repl at some point, and one that gets you a call stack… on pre 1.2
08:30Dranikfliebel, cdt?
08:31fliebelI don't recall anything about it, just that I couldn't get anything like pdb in Clojure.
08:33LauJensenchouser: Did you ever educate yourself on Maven like you wanted to ?
08:35clgvCan I use components that are licensed under LGPL in my project which shall be licensed with EPL (since this is the license of clojure)?
08:35LauJensenYes, but you might get sued :)
08:36raekI would think so. last time I investigated it, I came to that conclusion.
08:36clgvthan you shouldnt say yes! :P
08:36LauJensenclgv: All of these licenses basically require a lawyer to fill you in, but in my oppinion you're free to do so
08:36raekLauJensen: why?
08:36clgvok :)
08:36raekthe cause of the GPL-EPL incompability is not in the LGPL, at least
08:36LauJensenraek: Because as best as a layman can understand these complicated documents, only experienced lawyers really know what they're about. A danish lawyer told me, that nobody understands the GPL3, and if anybody did they were lying.
08:37LauJensen+said
08:38clgvI find that license stuff very tricky, too.
08:38LauJensenclgv: If you dont find it tricky, its probably because you dont understand it at all
08:38Licenserstop highlighting me :(
08:38LauJensenLicenser: Stop selling licenses
08:38chouserLauJensen: yeah, pretty well. I'm using maven on a half-dozen projects now, I understand it well enough to make use of it at least.
08:38LauJensenchouser: Are you glad you took that route?
08:39LicenserÍ don't but once upon a time I found it a smart idea to put 'lice' in my highlighing list
08:42chouserLauJensen: yep
08:43LauJensenhmm. so cemerick's gotten to chouser as well...
08:43cemerickwhat did I do now?
08:44LauJensencemerick: You seem to have pulled chouser to the dark side as well
08:44cemerickoh, the usual, I guess :-P
08:44LauJensen:)
08:45cemerickIndeed. I have great power.
08:45cemerickchouser being super-persuadable and entirely unopinionated himself.
08:45cemerick:-D
08:45LauJensen"Chas Emerick - Great in Power and XML"
08:47LicenserI don't know if Great in XML is a compliment
08:48cemerickLicenser: I'm certain that it's not, coming from Lau.
08:48Licenserheh
08:48cemerickI'll be Master of IDEs soon.
08:48Licenserthat sounds nice, which do you master?
08:48Licenseror do you just plan to run slave processes on all of them?
08:49cemerickI think only vim users make slaves of other IDEs.
08:50fliebelcemerick: So you mean vim users bend their IDE to their will, and other users are slave of their IDE?
08:50chouserright, because usually when a user and an IDE enter a relationship, the IDE becomes the master
08:50cemerickfliebel: heh, no, I was referring to e.g. http://eclim.org/
08:51cemerickchouser: Dude, you're going to be using Eclipse by the end of the year.
08:51chouserwait, this year? cool!
08:52chouseryou know, it's possible. I recently gave up my tabbing/tiling window manager.
08:52cemerickchouser: Yeah. I'd say you'll be in serious fiddling stage before the next conj. You have all the signs.
08:52chousernot at all comfortable yet with the new arrangement
08:52technomancyouch, no more tiling?
08:53chousertechnomancy: yeah, I'm using pywo for a kind of ad-hoc fake tiling
08:53cemerickI took a look at the tiling "window managers" for OS X last week. Was not impressed at all. I'm intrigued by the idea, but I don't see any decent OS X impls.
08:53chouserhoping to hack on it with a friend to add more features
08:53technomancychouser: oh, ok, so a layered approach. I approve of this notion. =)
08:53chousertechnomancy: :-)
08:54technomancytiling rulesets can be orthogonal to the program that does decorations etc.
08:54chouserright
08:55chouserand tiling as a tree of horizontal or vertical splits was never an ideal approach, afaic
09:02LauJensenAm I alone in pretty much having a maximized app on each screen?
09:03technomancyLauJensen: I do that when I don't have my external monitor in.
09:03technomancyactually I do that always except for using skype for work
09:03LauJensenThat was the reason I could say goodbye to Awesome WM...
09:03dakroneLauJensen: I do the same
09:03LauJensenk
09:30lpetitAs for tiling wms, etc. : I just want to be able to move both edges of adjacent windows at the same time. This is what really bothers me. First resizing one window. Then the other one.
09:35lpetitYeah, ccw's repl view now uses the same structural edition mode (default or strict) than is configured at workbench level, yoohoo !)
09:37lpetitchouser by the end of the quarter :-p
10:25AWizzArdI have a ns with a (:genclass) and AOT'ed it and JAR'ed. Now I want to set a window icon which I read from my jar. In Java this is: ImageIO.read(getClass().getResource("picture.gif"));
10:25AWizzArdHow do I do the getClass() part?
10:25technomancyjust pass the class itself
10:27LauJensenlpetit: When will CCW be ready for me ?
10:27lpetitLauJensen: When will you be ready for CCW ? :-p
10:28AWizzArdtechnomancy: ok thx, will try that
10:28LauJensenlpetit: As soon as it supports all of Emacs keybindings and preferably has a built in IRC client, inspector, debugger etc...
10:29lpetitLauJensen: why ask, then ? you already know the answer.
10:29LauJensenlpetit: Why, have you stopped improving on it already?
10:30lpetitNo, but I'm not trying to rewrite emacs in java :-p
10:31lpetitso YMMMV as to whether ccw is ready or not
10:31lpetits/YMMMV/YMMV/
10:31sexpbot<lpetit> so YMMV as to whether ccw is ready or not
10:33mduerksenlpetit: ccw 0.0.64 had to many disadvantages comparing to emacs, but i think ccw 0.2 stable has a chance of replacing emacs for me
10:33lpetitmduersken: btw, a new ccw0.2 is around the corner. A matter of a few days
10:34technomancylpetit: have you tried the lein-eclipse plugin? any good?
10:34cemerick…and hopefully one more RC so I can slip my fixes in before it goes final ;-)
10:34lpetitcemerick: yeah, I owe you this one
10:34mduerksenlpetit: looking forward to it :) will it be available on the update site at the same time?
10:34lpetittechnomancy: alas not, too focused on ccw today (which, overall, is a good thing :) )
10:35LauJensentechnomancy: what does it do that eclipse doesnt?
10:35lpetitmduerksen: yes, with a different Feature name than the main branch.
10:35technomancyLauJensen: I don't know, that's why I was asking if he'd tried it.
10:35LauJensen:)
10:36lpetittechnomancy: but I've left a comment on the owner's blog, so I'm also waiting for his answer before getting my hands on it
10:36technomancyok, just curious
10:37cemerickIIRC, it generates an eclipse project from a lein project.clj
10:37cemerickI think there was someone on the ML that used it successfully.
10:37lpetitLauJensen: creates the 2 Eclipse project's metadata files from project.clj, without having to go the install maven eclipse plugin -> lein pom -> import your project as a maven project. The steps become lein eclipse -> import your project as a regular eclipse project
10:38lpetitcemerick: the answer I gave the previous day on ccw ml would have been much shorter if I had discovered lein eclipse (and checked it worked) before :)
10:38AWizzArdtechnomancy: as long I haven't AOTed my module I can not refer to my class right? So am I supposed to use Class/forName and make a check if my app was started from a (emacs) repl or command line and see if I should execute that forName call?
10:39technomancyAWizzArd: sorry, I don't really use AOT. all my info is second-hand.
10:39technomancyhow you launched shouldn't be an issue though; it's just whether the .class files are present or net
10:39technomancy*not
10:40LauJensenok
10:41lpetitmust go get child at school, cu all later
10:41AWizzArdtechnomancy: though you can't have a NS with a :gensym, then (in-ns NS) and just eval NS to a class unless it is AOTed.
10:41AWizzArdOkay, I will try a dynamic solution with forName.
10:54hiredmanclojurebot: ping?
10:54clojurebotPONG!
11:31signalseekertechnomancy: I was able to get up and running with your swank-clojure instructions without a problem
11:32signalseekerThanks!
11:32technomancysignalseeker: great
11:33signalseekerNow, I need to decide which clojure book to start reading first - The Joy of Clojure or Programming Clojure?
11:33signalseekerAny suggestions?
11:33fogus`I personally recommend Joy of Clojure
11:33RaynesMan, I wish my book was finished. This would be the perfect place for shameless self-promotion.
11:34RaynesLike that!
11:34Raynesfogus`: High five.
11:34signalseekerhaha, Raynes: whats the name of your book?
11:34RaynesThe working name is Meet Clojure until I come up with something clever.
11:34RaynesMight have to consult technomancy on that one.
11:34signalseekerOh okay
11:35RaynesMy book should have the cleverest name of all the Clojure books.
11:35signalseekerYou could call it "Clever Clojure"
11:35RaynesNot clever enough. ;)
11:35redingersexpbook
11:35Derandersexy sexps
11:35Raynesredinger: "sexpbot: An Introduction to Clojure". You sir, are a God.
11:36Raynessexpbook*
11:37fogus`The problem is that technomancy might suggest you name your book "Lucian Gregory" :-O
11:37RaynesI actually like that name. I'm putting it on my seriously-consider list. Thanks redinger.
11:37Raynesfogus`: Yeah, I was thinking that as well. :\
11:38redingerSure
11:39redingersignalseeker: I guess I should recommend Programming Clojure, since I work for the author
11:39mduerksenRaynes: who or what is the focus of your book? that might give the right direction for your title
11:39redingerBut, Joy of Clojure is awesome as well
11:40signalseekerI am sure both are awesome! But I get the feeling the Programming Clojure is a little dated now?
11:40RaynesI'd recommend Joy of Clojure, not because Programming Clojure is bad but because it's somewhat outdated.
11:40redingeryeah, it was written in the 1.1 days
11:40redingerSo, none of the 1.2+ stuff is covered
11:41Raynesmduerksen: A freely available humorous and lighthearted introduction to Clojure for people of all walks of programming life. So, sexpbook is actually pretty 'there'.
11:42RaynesI can hear people now "Check out the sexpbook." in the same way you hear people talking about the Ruby Pickaxe. :p
11:42signalseekerI think I will start with The Joy of Clojure in that case, considering I am interested in the new (performance) oriented features
11:42mhi^What do you think of "Practical Clojure", BTW?
11:43RaynesClojure Programming, an upcoming book by cemerick, will be the one to cover most of the 1.3 stuff. My book wont be done until after 1.3 comes out (purposely) so that I can make amendments to recognize the 1.3 changes as well.
11:44RaynesSo, theoretically, both of our books will be the ones to cover 1.3 in the near future.
11:44signalseekerRaynes: that makes sense. You should definitely target the 1.3 features
11:44RaynesI imagine that mine will be done before his, given that publishers are weird and like to spend 6 months doing random stuff even after a book is finished, and mine isn't being published.
11:44signalseekerAre you doing a MEAP or some kind of early edition as well?
11:45RaynesNot that it's a competition. His book will be a lot longer than mine.
11:46RaynesMy book will be free (at least, the ebook version will be, and it'll be open source). Once it is close to completion, I'll throw the source on Github and put out early drafts for public review to gather feedback before the book is finalized.
11:46mduerksenRaynes, signalseeker: btw, what *are* the new 1.3 features? the only thing i was able to spot is the unchecked-math. where should i look to find out was else has changed/has been added?
11:46RaynesUntil then, I'm giving the draft to pretty much anybody that asks, but not making it totally public.
11:46opqdonutmduerksen: defstatic
11:46opqdonuti.e. typed functions
11:46opqdonutthat can return primitives, for example
11:47mduerksena, right, primitive hints in functions
11:47Raynesmduerksen: I am a bit uneducated in that. I haven't had time to do real investigation.
11:47mduerksen*function signatures
11:48redingermduerksen: https://github.com/clojure/clojure/blob/master/changes.txt
11:48signalseekerredinger: Perhaps you could ask your employer to update this book as well?
11:48mduerksenthanks redinger, thats helpful
11:49signalseekerI can't imagine it would be that much more work
11:49redingersignalseeker: agreed
11:50hiredmanopqdonut: the static stuff is not likely to survive to the 1.3 release
11:51opqdonutoh?
11:51opqdonuthow come?
11:51hiredmana combination of other changes provide a better solution to the problem defstatic was aimed at addressing
11:52opqdonutdo you have a link to a discussion on this? or do you care to elaborate?
11:52hiredmanIFn is going to have overloads for primitives to some degree, and they will still be first class function
11:52opqdonutokay
11:52opqdonutbecause our project is _really_ interested in performance upgrades
11:52hiredmanopqdonut: rhickey has talked about it in here and at the conj
11:52hiredmanthe other issue is var resolution, which the change from dynamic vars by default addresses
11:53opqdonutmhmm
11:53hiredmanwell, not resolution but dereferencing
11:54mduerksenRaynes: "Clojurify Your Ways", "Clojure - The Bright Side of Programming", "Clojure For Yummies"
11:55RaynesI'm still leaning toward sexpbook.
11:55opqdonuthiredman: thanks!
11:55hiredmanconfluence may have this
11:58hiredmanhttp://dev.clojure.org/pages/viewpage.action?pageId=950293 this page makes it sound less fleshed out than it is
12:05S11001001Bookjure
12:05ejackson(clojure)
12:06Raynesejackson: That's a good one.
12:06ejacksonthank you
12:06RaynesS11001001: I considered that one, but found it too... common.
12:06S11001001a little
12:06Raynesejackson: I'm putting it right up there with sexpbook.
12:06opqdonutthe name should be googleable
12:06S11001001was not meant in earnest :)
12:07Raynesopqdonut: sexpbook should be very googleable.
12:07opqdonutyes, it is
12:07opqdonut(clojure) very ungoogleable
12:08RaynesOne of the chapters of the book is named "))))))))))))))))))))))))".
12:08RaynesSo, I'm pretty solid on parenthesis fun.
12:08Raynessexpbook is fantastic.
12:11fliebel"a parenthesis" "apparent he is"
12:19Raynesfliebel: http://www.reddit.com/r/programming/comments/f1nh9/im_tired_of_the_nosql_buzz_and_bring_you_slouchdb/
12:19RaynesI also put it on hacker news.
12:20fliebelRaynes: "seq a Clojure book?" "(peek Clojure)" "cons-tructive Clojure"
12:20fliebelRaynes: Thanks :)
12:20RaynesYou people suck at names. Except redinger.
12:21fliebelAh, found it: http://news.ycombinator.com/item?id=2100496
12:43LauJensenRaynes: I'd go with "Meet Clojure"
12:43LauJensenSimple, professional. "sexpbook" is guaranteed to put you in an unfortunate google space
12:44RaynesSimple, boring, professional.
12:45RaynesI'm not really looking for publicity or top google results. Plus, the book will be qualified with ": An Introduction to Clojure".
12:48RaynesLauJensen: Clever trumps boring and professional in this case. This book should, with any luck, fill some of the niche that Learn You a Haskell fills.
13:34mhi^http://shootout.alioth.debian.org/u32/benchmark.php?test=all&amp;lang=clojure&amp;lang2=lua
13:40Scriptormhi^: http://shootout.alioth.debian.org/u32/benchmark.php?test=all&amp;lang=clojure&amp;lang2=luajit
13:42mhi^Scriptor: JIT doesn't count! No, I just wondered that Clojure is faster, because I always thought of Lua as a small and pretty fast language.
13:43mhi^You can also clearly see that Clojure uses a lot more memory. I'm not too familiar with functional programming yet.. I guess that's due to all the recursion used?
13:44fliebelOr just the JVM...
13:45mhi^Well, I guess that would make sense, too.
13:50harrowbitsEvery feature supported by Clojure is supported at runtime. - what does this mean? :)
13:50technomancyit means some of the blurbs on the website haven't been updated in a long time
13:51harrowbitsbut it also have several other meanings
13:51harrowbitsxD
13:51RaynesNope, it means precisely what technomancy said.
13:51harrowbitsokiedokie
13:51Raynes;)
13:51Scriptormhi^: technically, JIT does count since the JVM is jitted :)
13:53harrowbitswhat is clojure?
13:53Raynesmhi^: Yes, the JVM is definitely why Clojure uses a lot of memory. The JVM allocates it's memory at startup. You can make adjustments to the amount of space that is allocated via JVM options and stuff to lower the memory consumption.
13:53RaynesA programming language.
13:53ScriptorI guess that improves performance later on as it doesn't need to allocate memory later on?
13:53harrowbitsfrom the point of view of java
13:53harrowbitslang
13:54RaynesJava's point of view is hindered by severe tunnel vision.
13:54harrowbitsis it related to java, or just built on java as opposed to ie. C++
13:55Scriptorharrowbits: it's pretty well integrated with java
13:55harrowbitsam i safe to assume I can use java-like syntax in clojure?
13:55RaynesNo.
13:55RaynesClojure is a Lisp and uses a Lispy syntax.
13:55RaynesNothing even remotely like Java.
13:55RaynesScala would be closer to that.
13:55harrowbitsall right, that makes it clearer:)
13:56harrowbitsdoes it have an ide? :)
13:56Scriptor1. Compiles directly to jvm bytecodes (not just interpreted) 2. can interopt with existing java code
13:56RaynesIt is, however, extremely well-integrated with the JVM and interoperating with Java is a pleasant summer breeze.
13:56Scriptorharrowbits: there are plugins for eclipse, netbeans, etc.
13:56Scriptorthough most use emacs
13:56harrowbitseclipse plugins sound good
13:57Scriptorharrowbits: how much example code have you seen
13:57Scriptor?
13:57harrowbitsthough looking at this: http://clojure.org/runtime_polymorphism seems rather cryptic, are there many assumptions or "connections" that need to be kept in the user's brain?
13:57fogus`Scala is to Java as a car is to a murder weapon
13:58harrowbitsa second level vehicle then
13:58Raynesfogus`: It has curly brackets though. It *is* closer.
13:58Raynesfogus`: Also, what if the victim was ran over by the car? The car would be the murder weapon.
13:59harrowbitskiller transports weapon and gets in car with it and now car transports kill then weapon :)
13:59Raynesinb4clojurehascurlybracketstoo ##{:I :am :a :map}
13:59sexpbot⟹ {:I :am, :a :map}
13:59harrowbitskill=killer* was last heh
13:59harrowbitswhat's the first char though?
13:59harrowbitsok i like lists
14:00harrowbits(defmethod encounter [:Bunny :Lion] [b l] :run-away)
14:00harrowbitstrying to understand anythingO_o
14:01harrowbitsok here http://clojure.org/getting_started
14:02harrowbits(+ 1 2 3) this one makes sense :)
14:02clojurebot*suffusion of yellow*
14:02Scriptorharrowbits: the defmethod stuff is more advanced, dealing with a concept called multimethods
14:03harrowbitsok
14:03Scriptorharrowbits: http://www.moxleystratton.com/article/clojure/for-non-lisp-programmers
14:03mhi^Raynes: Ah, I see. Thanks for the hint.
14:03Scriptorthat article is a great introduction for someone not used to lisps
14:03Raynes(defmulti encounter #{:bunny :lion}) (defmethod encounter :bunny [_] :cuddle) (defmethod encounter :lion [_] :run-away)
14:03RaynesScriptor: And, if I'm right, it's older than planet Earth itself.
14:04ScriptorRaynes: yea, but it doesn't cover much beyond the absolute basics
14:04harrowbitsthanks, checking
14:04Scriptoreverything in there is still pretty relevant
14:04harrowbitswhat happens if you need to use a comma between ()
14:05Scriptorharrowbits: in clojure, commas are basically considered whitespace, so it's purely an aesthetic thing
14:05harrowbitsawesome
14:05Scriptorthough they're mostly used when dealing with map literals and such, separating key-value pairs
14:06harrowbitsis there any 3d representation of all idioms in the language or some kind of 3d ide for working with clojure such that I can easily parse connections ?
14:06Scriptora 3d ide?
14:06amalloywhat...what...what would a 3d anything mean
14:07harrowbitsI guess some sort of treeview(in 3d?) of all that makes clojure
14:08harrowbitsand all that I add with my clojure program
14:08harrowbitsoh wait, what year is this?
14:08harrowbitsah sorry
14:18amalloyi guess his new year resolution was to learn clojure in 2012?
14:27cemerickRaynes: I'll have to hire you as my PR man ;-)
14:35fogus`Opinion: a) insane, b) awesome, c) all of the above? https://github.com/fogus/marginalia/blob/master/src/marginalia/parser.clj
14:38ejacksonfogus`: something be wrong with my browser... i'm only seeing about 40 lines. Where's the rest of it ?
14:39fogus`ejackson: :p
14:40arjI know this is common complain but java is really slow at starting up. It used to be ok, but now with the google libraries added as well, it can take many minutes to start up. Any ideas, hints? This is on my ubuntu laptop
14:41arjit's pure I/O since I can hear the disc crunching all the time while it's loading. top shows on wait and no cpu :(
14:43S11001001minutes?
14:56benreesmananyone here used cascalog?
14:57technomancyclojurebot: anyone?
14:57clojurebotPlease do not ask if anyone uses, knows, is good with, can help you with <some program or library>. Instead, ask your real question and someone will answer if they can help.
14:59arjS11001001: yes, minutes :(
14:59cemerickbenreesman: were you looking for a recommendation pro or con, or do you have a question you'd like help with? :-)
15:00benreesmancemerick: just wondering if folks have had good experiences with it
15:02cemerickbenreesman: a number of people use it and are happy with it from what I've overheard. Talk of cascalog (and really, hadoop in general) is rare in this channel.
15:02cincharj: you could put the JVM in a ramdisk to help with the startup time
15:03benreesmancemerick: cool thanks for the recommendation. i'm going to need to start learning hadoop and i'd love to do it using clojure if possible. cheers.
15:03cemerickhere-say, sure
15:03technomancyif you have to do hadoop, cascalog seems like the least-painful way from what I've heard.
15:04S11001001I was bothered by Zope/Plone startup time when I did that, so I added a Plone daemon to startup, and it got faster :)
15:05cemerickIt seems common for people that think they need hadoop to take a look at it and its supporting libs, and then back away slowly to something just a little less intimidating (yet perfectly suitable for their needs).
15:06cemerickmyself included :-)
15:06technomancycemerick: sounds ... familiar.
15:06cemerickbenreesman: ^^
15:06cemericktechnomancy: I think it's a right of passage to a certain extent.
15:06david`are there any clojure programmers that weren't java programmers or even lisp programmers?
15:06S11001001the sentence at the top of http://clojure.org/protocols seems out-of-date
15:07cemerick"First, we looked at hadoop. After a little while we backed off to couchdb/mongo/mysql." :-P
15:07cemerickdavid`: there is a large contingent of python and ruby folk
15:07david`cool, I am a ruby programmer by day as well
15:08benreesmanat the moment i'm just map reducing directly in clojure off the disk
15:08benreesmanmap of line-seq of file-seq, very simple stuff
15:13cemerickbenreesman: in that case, you might want to approach hadoop warily, if you're not certain you actually need it. Because if you don't, you'll wish you could have had those N weeks of your life back. ;-)
15:14benreesmancemerick: this particular project i'm probably going to get away with some simpler, but hadoop is in heavy use at my company so i'm looking for a gentle way to learn more about it. it does seem a little intimidating at first glance though :)
15:17cemerickbenreesman: In that case, godspeed, and make sure you bring a towel. :-)
15:17benreesmanhaha
15:34Raynescemerick: 10 bucks an hour, and I'm always on.
15:42chouserdavid`: I didn't know java or lisp well at all before starting on Clojure.
15:48lpetitCounterclockwise 0.2.0 RC4 sent to the wild. /me going offline right n
15:51Raynescandlejack was he
15:52TobiasRaederis there a complete downloadable version of the clojure (doesn't need to include contrib) documentation? (as seen on clojure.org for example)? cant find one
15:52RaynesTobiasRaeder: If you use Firefox, there are a few extensions that can download web pages recursively.
15:53mrBlissor wget :)
15:53RaynesOr wget, yes.
15:53Rayneswget is the son of my God.
15:54TobiasRaederalright, thanks
15:55lpetittechnomancy: if at some point in time lein-eclipse seemed rock solid, would it be an option to have it included in lein's distrib ?
15:56raekthe question re downloadable docs comes up every now and then
15:56technomancylpetit: no, even lein swank is kept outside lein
15:56lpetitoh, so Im' not jealous :-)
15:56technomancybut now it's easy to install plugins like that for the whole user so they don't have to be included in every project.clj
15:57raekmaybe some hudson+autodoc wiz could cook up something...
15:57lpetitok, fair enough, and good to know
15:57technomancyjust want to keep the core slim
15:59lpetitI understand. Now I know this is not an option. That's fine with me.
16:00technomancyI'm even starting to wonder if javac belongs in the core.
16:00Rayneslpetit: Not that I'm the final word on the subject, but a port to cake might be something considered for cake proper, assuming it's light weight.
16:02BerengalIs there a way to reset the swank-server environment without restarting the server entirely?
16:02lpetitRaynes: good to know, too. Thx. I indeed have some plans on making a cake-eclipse. lein-eclipse is currently 91 locs, fyi (though I've still not tested it, so maybe, after intensive edge case tests, on linux, windows, etc., it may grow a little bit more, but my guess is that it'll still average one or two hundred lines max.
16:03Rayneslpetit: I think that, as long as it doesn't add dependencies, it would be lightweight enough.
16:04lpetitRaynes: ok. I'll come back to you when ready, keeping your constraints in mind.
16:05RaynesSpeaking of plugins, I recently added a clojars plugin to cake. It uses cljr's clojars code, and thus works the same. I rewrote the part that adds the library to project.clj so that it doesn't mutilate the file. Fun stuff.
16:05RaynesIt has the search functionality of cljr and all that.
16:05lpetitlate here, must leave, 'night all
16:06technomancydoes anyone use leiningen with archiva or nexus?
16:08S11001001yes
16:10abrenkRaynes: just talked to lpetit, I'll give him commit access to lein-eclipse tomorrow
16:10Raynesabrenk: Neat. :>
16:11abrenkRaynes: don't know what you guys were talking about, he just pinged me on github
16:12Raynesabrenk: We were talking about porting it to cake and it possibly ending up in cake proper.
16:12Berengaltechnomancy: I did, but our nexus server didn't mirror clojars properly
16:17technomancyBerengal: I just added a task so you can deploy directly to private servers.
16:18technomancyrather than clojars' somewhat-hacky scp deployment
16:18abrenkRaynes: okay, great! Shouldn't be hard. Most of it is just using clojure.contrib.prxml to produce the XML. Anyway, I'm also off to bed.
16:19S11001001technomancy: nifty
16:19Berengaltechnomancy: Private servers as in arbitrary repos?
16:21technomancyBerengal: not sure what that means... you can deploy to remote repositories that you have access to
16:22Berengaltechnomancy: That's sort of what I meant. In maven you define repos in your settings.xml, along with url and password, and then in the pom you say to which repo snapshots and releases go
16:22BerengalIs that what's added?
16:23technomancyyeah, you can provide url/credentials either in project.clj, ~/.lein/init.clj, or on the command-line
16:23BerengalNice :)
16:23technomancyright now it only deploys to http:// and file:/// repos; haven't gotten scp working yet
16:23technomancybut it's a start
16:24technomancyespecially nice for having hudson builds initiate a deploy
16:48robonobohi, can anyone tell me what the function is to get a sequence without the n first elements?
16:49Raynes&(drop 2 [1 2 3 4])
16:49sexpbot⟹ (3 4)
16:50ossareh&(drop-last [1 2 3])
16:50sexpbot⟹ (1 2)
16:50robonobothanks
16:51Raynes&(doc drop-last)
16:51sexpbot⟹ "([s] [n s]); Return a lazy sequence of all but the last n (default 1) items in coll"
16:51amalloyossareh: drop-last is wildly inefficient
16:51Raynes&(butlast [1 2 3])
16:51sexpbot⟹ (1 2)
16:51ossarehI felt bad for 1 and 2.
16:51amalloyi don't see how it can actually be lazy
16:51amalloyoh, i take it back. that's not so bad
16:51amalloyit only needs to buffer N elements, not read the whole seq
16:52amalloy&(take 10 (drop-last 10 (range)))
16:52sexpbot⟹ (0 1 2 3 4 5 6 7 8 9)
16:52ossareh&(take 3 (map #(prn %) (range)))
16:52sexpbot⟹ (012345678910111213141516171819202122232425262728293031nil nil nil)
16:52ossarehthe whole lazy thing confuses me a fair bit tbh
16:53RaynesIt's actually really simple.
16:53RaynesI hardly even dedicate a section to it in my book.
16:53ossarehI get the theory - but in that example I should only see prn of 3 items no?
16:53RaynesIt's a simple thing that is usually explained horribly.
16:54ossarehclearly some pre-caching is taking place
16:54amalloyossareh: chunking
16:54RaynesSome lazy sequences are chunked.
16:54ossarehhas there been a thread in the news group on chunking?
16:54amalloyit's a performance "optimization" that "rarely affects semantics". i don't buy it myself
16:55Raynesamalloy: And it sounds disgusting to book.
16:55amalloy?
16:55Raynes"That sequence is chunking. Get out of the way before some of it gets on you."
16:55raekside-effects (except for reading) in lazy sequences does not make much sense for me
16:55ossarehheh
16:55S11001001technomancy: how about https repos?
16:56RaynesAnd if you have a stackoverflow in a function working with a chunked sequence, is that function blowing chunks?
16:56ossarehraek: fair point - tis an efficient way to demonstrate that lazy isn't always as clear as it sounds like it will.
16:56Raynes</end cleverness>
16:56ossarehs/\.$/ be./
16:56sexpbot<ossareh> raek: fair point - tis an efficient way to demonstrate that lazy isn't always as clear as it sounds like it will be.
16:58technomancyS11001001: haven't tried it, but it should work.
16:58raeksince a sequence is a value, it shouldn't matter whether it's a chunked lazy seq or not
16:58raekside-effect for each thing in a collection => doseq
17:01dnolenamalloy: I haven't really seen it affect semantics, and it's not hard to construct real one-at-a-time lazy-seqs. I've only needed that to get TCO-like behavior, less common desire I should think.
17:02dnolenit's also discourages people from leaning on loop/recur too much, which was common the early days.
17:02ossareh&(type (range))
17:02sexpbot⟹ clojure.lang.LazySeq
17:03dnolen&(take 2 (map #(prn %) (lazy-seq (cons 1 (lazy-seq (cons 2 (lazy-seq (cons 3 nil))))))))
17:03sexpbot⟹ (12nil nil)
17:04ossarehheh
17:05amalloydnolen: it's never been a problem for me either, but there ought to be an easier way to turn it off
17:06dnolenamalloy: have you needed to turn it off?
17:06ossarehare there any 'tells' around whether your getting a chunked seq or not? (other than the side effecting code).
17:06dnolenossareh: I expect sequences to be chunked unless I explicitly wrote code for one-at-a-time behavior
17:07amalloydnolen: no, i haven't
17:08ossarehdnolen: and a chunk will always be the first 32 elements regardless of their size?
17:08dnolenamalloy: I'm sure that's why rhickey hasn't included it, nobody would actually use it and for small the % of folks that do need it, they know what to do and it's quite simple.
17:09ossareh32 elements*. "the first" is poor wording.
17:10dnolenossareh: yes I think so, tho I'd consider the exact behavior of chunked seqs an implementation detail.
17:12ossarehdnolen: true that. Good to know about the fact things are chunked though, a mate put me onto it a few days ago and I didn't think about it until just now. I could see this tripping you up accidentally - "I have a sequence of data where every element is pretty large", let me make it lazy - and you actually incur the cost of 32 of them being realized.
17:13ossarehI'm sure I'll never find myself in this situation, mind you :)
17:13dnolenossareh: yes, most complaints come from people doing Project Euler.
17:13ossarehah, so I may stumble across this then if I ever get back to it.
17:14dnolendefinitely one of the many cases where Clojure favors production oriented practicality over textbook purity
17:14ossareh*nod*
17:17david`if I am making a Justin Beiber fan site with blog and forums, should I use conjure
17:17david`or is there something better
17:17robonobodavid`: definitly clojure
17:18robonobobieber uses it himself
17:18david`o rly
17:18david`is that cuz he gets DDOSed and needs something fast/reliable
17:18scottjdavid`: conjure is like rails. I would use something prebuilt with blog/forums functionality written in whatever language and call it a day :)
17:18david`but I want to learn clojure
17:19david`while I make my justin bieber site
17:19david`I couldn't get conjure to run on clojure 1.2 last time I tried
17:19david`let me try again
17:21robonoboossareh: i think he's trolling
17:22david`:(
17:22robonoboi would think the intersection of people who want to learn or even know about clojure and beiberfans is quite small
17:22ossarehprobably - but such is my disdain for that floppy haired bastard.
17:23ossareh320m views on you tube of his latest crap.
17:24tonyldavid`: I think now there are more options to help with web development in clojure then conjure, but I haven't use any
17:25robonobo&(str (reduce str (repeat 3 "baby, ")) " oh!")
17:25sexpbot⟹ "baby, baby, baby, oh!"
17:25scottjcompojure/hiccup, ring/enlive, */slice are some options, and mixtures of them
17:25scottjI think there was a graphic of all the clojure web libraries/layers
17:26tonylhere is a link that might help http://stackoverflow.com/questions/3325033/comparison-of-clojure-web-frameworks#3325078
17:27brehauttonyl: the comment about clojureql is clearly wrong now :)
17:29tonylyeah, I should add that comment. I am looking for a real project to work with the new clojureql
17:30brehauttonyl: ive just started porting my site over from clutch/couchdb to mysql/clojureql; its been good so far and lau is fixing most of my days issues by the time i start the next day :)
17:31tonylbrehaut: haha that lau. Interesting, I need to get a new server for my personal site pretty soon. I'll try it then :) it looks like a nice piece of code and api
17:32midsbrehaut: NoNoSQL?
17:32brehauttonyl: yeah. the api is especially nice. just watch out for column name qualification corner cases ATM
17:32tonylbrehaut: thanks
17:33brehautmids: heres my metric for leaving couch: it was going to take more effort to get couch to do what i wanted (both in terms of learning and doing) than to port the whole thing to mysql and just do it there
17:37david`thanks scottj and tonyl
17:56ossarehbrehaut: not having used couch - I've found the ability to represent and use my data as json (aka clojure data structures) so powerful.
17:56ossarehbrehaut: I use riak, fwiw.
17:56brehautossareh: yeah that part of couch is great
17:56ossarehthough I agree with the learning curve - particularly wrt maintaining your own indexes
17:57brehautossareh: in couch i ran into problems around reuse of view code and expressiveness of (in particular) reduce functions
17:57brehautossareh: no doubt a more learned couch user wouldnt suffer these
17:57ossarehdoes couch permit you to run javascript on the server?
17:57brehautbut im learning clojure, and enlive at the same time
17:57brehautossareh: yes
17:58brehautossareh: as long as it is referentially transparent
17:58ossarehbrehaut: does that mean it shouldn't change the data when it runs?
17:59brehautossareh: it means that all the calculations are based on the arguments (eg the documents content)
17:59ossarehbrehaut: huh. interesting.
17:59brehautossareh: oh, and that you dont mutate the world, but couch ensures that so its not a problem
18:23dnolenhmm anybody messed w/ SLaTeX to generate nice Clojure source PDF output ?
19:10hercyniumBoston Clojure meetup starting now \o/
19:11headlessClownaww. i totally would have come had i known
19:11hercyniumnext month then!
19:11headlessClownabsolutely
19:19BerengalWoo, 3 hours of sharp flow, and I've reimplemented my first-year project from my uni days. Anyone care to check for pathologies? --> http://hpaste.org/43014/tictactoe
19:51amalloyhey what's a good intro book these days? JoC is the only one i've read but i can't remember which other ones are up-to-date/good
20:04amalloyClinteger: i just wrote my first not-actually-blog-post on clojure at http://hubpages.com/hub/What-is-Clojure
20:22brehautamalloy_: your code snippets could do with a bit more line-height
20:30chettso (merge ["a" "b"] ["1" "2"]) gives ["a" "b" ["1" "2"]], what will give me ["a" "b" "1" "2"]?
20:35pdk,(concat ['a 'b] [1 2])
20:35clojurebot(a b 1 2)
20:35pdkvoila chett
20:35chettthanks
20:35pdkgranted you'll need to turn it back into a vector after doing concat
20:35pdk,(vector (concat ['a 'b] [1 2]))
20:35clojurebot[(a b 1 2)]
20:35pdkummm
20:36pdkcorrection
20:36pdk,(vec (concat ['a 'b] [1 2]))
20:36clojurebot[a b 1 2]
20:36pdksuccess
20:37pdkalso take note you can try out 1 line bits of code within the chat if you put , in front of them
20:38chett,(println 'test)
20:38clojurebottest
20:38chett(println test)
20:38pdkyeah the bot looks for the ,
20:39chett,;(println 'test)
20:39clojurebotEOF while reading
20:40chettstep two -> generate an error
20:41pdkthe ; did it in
20:41pdk; is a sly one i tells ya
20:42chett,(def test 'test)
20:42clojurebotDENIED
20:42chettheh
20:42chettI could see how that would cause problems
20:55raekyou don't need the vector -> seq -> vector trip
20:56raek,(into ['a 'b] [1 2])
20:56clojurebot[a b 1 2]
20:58tonyl&(apply (partial conj ['a 'b]) [3 4 5 6] )
20:58sexpbot⟹ [a b 3 4 5 6]
21:03chett,(doc into)
21:03clojurebot"([to from]); Returns a new coll consisting of to-coll with all of the items of from-coll conjoined."
21:03chett,(doc partial)
21:03clojurebot"([f arg1] [f arg1 arg2] [f arg1 arg2 arg3] [f arg1 arg2 arg3 & more]); Takes a function f and fewer than the normal arguments to f, and returns a fn that takes a variable number of additional args. When called, the returned function calls f with args + additional args."
21:06tonylor what into basically does ##(reduce conj [:a :b] [1 2 3 4])
21:06sexpbot⟹ [:a :b 1 2 3 4]
21:06brehauttonyl: with an added transient
21:07tonylyeah, that helps in transient contexts
21:07brehautinto is one of the functions that needs to be emblazened on the clojuredocs front pages so that everyone knows about it
21:09tonylwhen I first saw it i had the "everything looks like a nail" syndrome, I am trying to learn to use it where it is needed only now :P
21:09brehauthah yeah :)
21:09tonylit is a nice tool
21:11pdkpartial is used for currying functions
21:12brehautpdk for a fuzzy definition of currying
21:13pdki aim to please
21:13pdktl;dr currying = turning multi-argument functions into series of one-argument functions
21:13brehauthah
21:14brehautwhich are then trivially partially applicable
21:26cheezeyi'd like to override the assoc function to check for a specific key, how can i do this?
21:27brehautcheezey: what do you mean by that?
21:27brehautcheezey: are you wanting to override it just for your own code, or for all code in your program?
21:28cheezeyjust my code
21:28cheezeylike it would do the same thing as assoc but i can do additional things by checking the keys from the arguments
21:29brehautcheezey: whats stopping you just writing your own function and using that in place of assoc?
21:29cheezeybrehaut: nothing, im wondering how to do that =P
21:29cheezeylike the whole multi arguments thing
21:30brehaut,(source assoc)
21:30clojurebotjava.lang.Exception: Unable to resolve symbol: source in this context
21:30brehautcheezey: do you have a clojure repl open?
21:30cheezeyoh i can look at source
21:30cheezey:D
21:30cheezeythnx
21:30brehautuhuh
21:31brehauttheres two things that assoc does; first it has two arities
21:31brehautthe second arity has a varargs
21:32brehautthe second arity loops over the varargs pairs calling its non-varargs arity for each pair
21:33brehautcheezey: http://clojure.org/special_forms for more details on the fn definition forms
21:39cheezeythnx brehaut
21:39brehautcheezey: no problem
22:00amalloy$source assoc
22:00sexpbotassoc is http://is.gd/akhg2O
22:00amalloy^ easiest way to get source
22:01brehaut(inc amalloy)
22:01sexpbot⟹ 3
22:09Deranderis there a nice way to have a swank server for clojure repls just hanging around for testing stuff?
22:09Deranderright now i have a "test" project
22:11amalloyDerander: cake has a global project, which is used if you run a cake command outside of a real project - you can start swank from there. lein has something similar but i'm not familiar with it
22:13amalloybrehaut: thanks for the suggestion about code snippets. i'll get on it
22:14brehautamalloy: no problem. the article was good
22:15amalloybrehaut: hm. apparently i don't have access to detailed formatting options
22:15brehautamalloy: dont you work there?
22:16amalloybrehaut: i know, right?
22:16brehautamalloy: classic :)
22:16amalloyi'll put the code snippets in bold. that's almost the same thing.....
22:16brehaut:)
22:17amalloyat least i know who to talk to, to get that changed
22:22brehautamalloy: do you use clojure at your job?
22:23amalloybrehaut: not for anything i get paid for. sometimes when nobody's looking i do open-source clojure stuff
22:23brehautamalloy: nothing like a bit of skunk works to may like easier
22:23amalloy*squint* okay, i couldn't puzzle that one out. skunk works?
22:24brehautsneaky projects
22:24brehautgive or take
22:24brehauti think its some sort of old military jargon
22:26Deranderamalloy: that's neato
22:26amalloyDerander: the cake global project?
22:26Deranderyes :-)
22:28amalloyyeah, it's handy. check out ~/.cake/project.clj and ~/.cake/templates/default too for some sweet cake features
22:28DeranderI will do this
22:28DeranderThanks for the heads up
22:33technomancyDerander: swank-clojure comes with a shell wrapper that sets up a project-independent swank server
22:34technomancylein install swank-clojure 1.3.0-SNAPSHOT; ~/.lein/swank-clojure
22:34DeranderNo project.clj found in this directory.
22:34Derandertechnomancy: ^
22:35Derander☁ ~ lein install swank-clojure 1.3.0-SNAPSHOT
22:43cheezeycan i get :import to not print out stuff?
22:44amalloycheezey: it doesn't print anything. it just returns the last class it imported; when you type it by hand at a repl, that results in a class being displayed
22:45cheezeyoh ok
22:45amalloy&(import javax.swing.JFrame)
22:45sexpbot⟹ javax.swing.JFrame
22:45amalloy&(do (import javax.swing.JFrame))
22:45sexpbot⟹ javax.swing.JFrame
22:45amalloyer
22:45amalloy&(do (import javax.swing.JFrame) nil)
22:45sexpbot⟹ nil
22:45amalloyif you really don't want that
22:46technomancyDerander: you need a newer lein probably
22:47Derandertechnomancy: alright. I'll work on it
22:47Deranderthanks
23:20davekb
23:56amalloyseancorfield, talios: http://hubpages.com/hub/What-is-Clojure at your request
23:57seancorfieldi requested that? :)
23:57amalloyyou're not exactly the target audience for the first entry, but it's my new bloggish thing
23:57seancorfieldah, yes, i did request that you blog!! good man!!
23:59amalloyi'd love topic suggestions, in the comment area, or via the Contact amalloy link, or irc or whatever