0:03 TimMc: mac: "not for now", basically
0:03 About what you'd expect.
0:25 JulioBarros: Hi, I'm trying to deploy an uber jar to a jetty server on ubuntu (to run it rather than lein run) and I'm getting an java.lang.ExceptionInInitializerError at sun.reflect.NativeConstructorAccessorImpl.newInstance0 when
0:25 it gets to the part in my code where I try to use enlive.
0:25 A basic hello world noir app works but my real app does not. Any ideas?
0:31 tmciver: $findfn [1 1 1 2 3 4] [[1 1 1] [2 3 4]]
0:31 lazybot: []
0:32 scriptor: trying to cheat? :)
0:32 tmciver: Hell yeah? wanna help me?
0:32 scriptor: which problem was this again?
0:32 pyninja: hi, in ClojureScript, what's the equivalent of field.value? I tried (.value field) and variations...
0:34 tmciver: I'm trying to remember a function that splits a seq into two groups based on the result of a predicate *changing*
0:34 scriptor: tmciver: something like this? http://
0:35 pyninja: what happens when you do (.value field)?
0:35 pyninja: scriptor: #<TypeError: Cannot call method 'value' of undefined>
0:36 scriptor: it tries to call ns.field.value();
0:36 muhoo: gawd, i can't escape clojurescript.
0:36 tmciver: scriptor: that may work but it's not the function I was thinking of.
0:36 muhoo: i just started hacking on this beaglebone, and all the libraries for doing digital i/o on it are in.... javascript
0:37 my goal was to use clojure to do some stuff on the beagle, since it runs java just fine
0:37 but instead, the libraries i need are in fucking javascript. so it'll have to be clojurescript instead.
0:37 running on node.
0:38 or maybe in rhino, that might work.
0:39 scriptor: pyninja: have you tried different values for field?
0:40 pyninja: scriptor: actually, (. field -value) worked, but I don't understand why
0:42 scriptor: hmm, don't know it enough to remember if - has any special meaning
0:42 does it just compile to _value?
0:55 muhoo: hehehe even easier, i can just read the data structures i need in as json , and make them into clojure data
0:56 json on an embededed device. soon, i predict, all development will be web development.
0:57 dnolen: 3
0:58 oops
1:02 amalloy: pyninja: (.foo bar) or (. bar foo) is always a "method" call, (.-foo bar) or (. bar -foo) is always a property lookup
1:03 pyninja: amalloy: oh ok thanks
1:03 amalloy: on the jvm, there's a way to tell properties and methods apart, so (.foo bar) just Does What You Mean
1:03 pyninja: yeah
1:11 mindbender1: hi
1:49 gtuckerkellogg: have *all* of the clojure.contrib libs moved to individual repos?
2:39 _ulises: morning all
2:46 gtuckerkellogg: morning
2:46 scriptor: marnin
2:47 gtuckerkellogg: could someone tell me what the current status is with clojure.contrib?
2:48 _ulises: being ported still I believe
2:48 gtuckerkellogg: http://
2:48 gtuckerkellogg: oh, hey that's useful
2:49 _ulises: indeed
2:49 gtuckerkellogg: much more so than the circular lnks at http://
2:49 lazybot: Nooooo, that's so out of date! Please see instead http://
2:49 gtuckerkellogg: well if it's out of date, i shouldn't need lazybot to tell me (IMHO)
2:49 clojurebot: Cool story bro.
2:50 _ulises: cool story indeed
3:04 tomoj: if I typed (def parse-parse [parse]), should I start over?
3:04 well
3:05 assume I already made it a defn :)
3:25 hsandhu: deploying a noir web app, any suggestions for daemonizing the instance (just using jetty as the container)
3:28 Fossi: hsandhu: there should be a way to package a war, most likely via lein
3:29 i don't know noir at all, so ymmw
3:29 hsandhu: hmm, that could be one option if I was using tomcat for example...how about supervisord?
3:30 Fossi: you can use jetty as you would use tomcat
3:30 never heard of supervisord
3:30 hsandhu: right, but the following will not create a daemon: "lein run"
3:55 tomoj: findfn "S=(NP=(DET=(the)N=(dog))VP=(V=(runs)))" {:S [{:NP [{:DET "the"} {:N "dog"}]} {:VP [{:V "runs"}]}]}
3:56 raek: tomoj: parsing natural language? :-)
3:56 tomoj: no, it's already parsed
3:56 I just need to parse the parse
3:56 :)
3:57 raek: https://
3:58 tomoj: sweet
3:58 raek: (this was before core.logic got support for special DCG syntax9
3:58 )
3:58 tomoj: I heard dnolen mention parsing but couldn't figure it out for myself
3:58 ah, shucks
4:00 raek: my proessor in Formal Languages and Automata Theory used this sentence as an example of ambiguity in grammars...
4:01 he telled the joked, said "and now an explanation of the joke", and showed two parse trees on the projector
4:04 tomoj: corenlp gets it right, but it also thinks "in the dressing room" is attached to the NP
4:29 sorenmacbeth: what the difference between #^ClassName and ^ClassName?
4:30 I see both and no clear description of the difference or when to use which
4:31 ejackson: the former is deprecated
4:32 sorenmacbeth: ejackson: thanks, that explains it
4:34 G0SUB: datomic!
4:40 ejackson, PM?
4:40 ejackson: DATOMIC!
4:45 muhoo: VerifyError class org.codehaus.jackson.smile.SmileParser overrides final method getBinaryValue.(Lorg/codehaus/jackson/Base64Variant;)[B java.lang.ClassLoader.defineClass1 (ClassLoader.java:-2)
4:46 it does?
5:07 mtd: with clojure 1.3 on posix, is there a way to get all of clojure-contrib into the classpath? Does nobody really do that?
5:07 s/a way/a way without rebuilding all the jars oneself/
5:08 ejackson: with 1.3 there is no clojure-contrib
5:08 you want to select the libs you want and put them into leiningen
5:08 which will put them onto the CP for you
5:08 mtd: ejackson: right
5:09 ejackson: it's called clojure contrib here, FWIW http://
5:09 ejackson: for repl use that's a bit of work, but not as much as compiling them all myself, sure.
5:09 ejackson: just wondering how people did it, thanks.
5:09 ejackson: you don't need to compile 'em, just let lein fetch the jars from clojars
5:09 mtd: ejackson: indeed
5:10 babilen: mtd: http://
5:10 mtd: ejackson: I was hoping for something I could stick in ~/bin/clj so that I could (use 'math.numeric-tower) and stuff without having to run through lein each time
5:10 babilen: thanks
5:11 ejackson: I can just have lein download them once or something
5:11 ejackson: mtd: i strongly recommend using lein for everything
5:11 mtd: ejackson: For pre-packaged stuff of course
5:11 ejackson: yes, lein will dl them and put them into ~/.m2/... and then into your project's ./lib
5:11 mtd: ejackson: I'm talking about one-off scripts / generic repl stuff
5:12 ejackson: even so, save yourself
5:12 i mean, >lein new, >emacs project.clj, >lein repl.... hard to beat
5:12 mtd: ejackson: sorry, I don't think I'm being clear: I want to let something like lein decide for me what jar to dl to get math.numeric-tower
5:13 ejackson: ...I just don't think I need it to decide that that oftern
5:13 babilen: mtd: Take a look at https://
5:13 mtd: ejackson: yeah but...I want oneoff scripts, not projects. I totally get what you're saying for projects, and I'm just being lazy
5:13 ejackson: mtd: lein should pull the deps for you
5:13 mtd: babilen: thanks, looks good
5:14 babilen: that's pretty much exactly what I want, thanks
5:14 ejackson: hm, numeric-tower is not in clojars, and its a maven thingy
5:14 mtd: ejackson: nooooo...hmm.
5:15 ejackson: so you'll have to build it w/ maven yourself
5:16 arbscht: hi from desktop
5:16 mtd: ejackson: awesome :) :/ thanks for saving me the headache of finding that out myself
5:16 ejackson: no sweat
5:17 babilen: mtd: AFAICT you can just include "[org.clojure/math.numeric-tower "0.0.1"]" in your project.clj and fetch it with "lein deps"
5:18 mtd: babilen: yeah, I'm cool with that usage of lein and deps...modulo ejackson's clojars comment re math.numeric-tower...
5:19 babilen: Yeah, but do not forget about http://
5:19 mtd: babilen: it's just I don't have project.clj, just playing with oneoff scripts (in fact, I just wanted a nicer sqrt fn but will just use java.lang.Math/sqrt for now
5:19 babilen: ah, cool, didn't know that
5:19 ejackson: hahaha, def easier
5:20 raek: mtd: with lein-oneoff the "defdeps" form at the top of the file serves as a "script-local project.clj"
5:20 clojurebot: It's greek to me.
5:21 raek: so you'll have (defdeps [[org.clojure/math.numeric-tower "0.0.1"]]) at the op of your file
5:21 *top
5:21 mtd: raek: yeah, thanks, that was exactly what I wanted...very useful, I think
5:21 raek: another approach is to have a "scratch project" whose project.clj include the libs you usually use
5:21 * mtd often gets the feeling he's fighting the whole "d/l a whole set of jars for project x, just like project y's jars" idea, but lein-oneoff is perfect
5:22 mtd: raek: yeah ISWYM about scratch project; that would work too
5:22 raek: you can run individual script files using lein "run -m the.name.space"
5:22 mtd: raek: gotcha, good to know
5:22 raek: if you provide a (defn -main [...] ...) function in that namespace
5:23 mtd: yeah, the install libs globally and run a file approach is perhaps more convenient for one-off scripts
5:23 mtd: raek: gotcha
5:24 raek: mtd: but Leinginen has higher ambitions. you need something like projects in the end for anything that becomes big
5:24 mtd: raek: definitely...I appreciate (in many senses) that goal, and it's quite easy to use.
5:25 raek: AFAICT, most other "dynamic" lagnuages have developed something similar to the proejct approach (e.g. virtualenv in python and rvm in ruby)
5:26 mtd: raek: yeah, though I never needed that level of flexibility in python; if I did, I would just stick the offending (older-version, usually) module in the project's pythonpath.
5:26 raek: can't speak for ruby. The set-of-jars-per-project really feels like overkill coming from python world, but I understand the idea from a defensive / deployment perspective.
5:27 raek: I know that I don't have to convince you, but here is the rationale in case you want to read more: https://
5:28 mtd: raek: I buy the arguments for repeatability in theory, and have never needed them in practice (though I of course understand tons of people would). I'm just lucky :).
5:28 raek: will read that in detail, thanks
5:29 raek: but it can be nice that you can still clone a two year old project on github and run lein deps and it still works
5:30 mtd: raek: indeed, good point
5:30 raek: immutability in build systems ftw!
5:31 * talios shudders at the thought of self modifying build systems - but then, thats kinda what the maven release plugin does
5:34 mtd: heh
5:36 raek: that is a good read, not least for the implicit survey of current-best-way-of-doing-X, for X in commonly-needed-thing. Thanks.
6:36 apologies for the vagueness, but is there a python dir() equivalent for the clojure REPL? I want something like clojure.contrib.repl_utils for clojure 1.3 that works both for java objects and clojure <waves hands> objects.
6:36 * mtd has seen http://
6:36 mtd: (it's basically unanswered for 1.3, AFAICS)
6:37 clgv: mtd: you can get the code from the old contrib if it wasnt migrated to a new library
6:38 mtd: clgv: sure - was hoping someone had already done it, but will go that route if not
6:38 clgv: dir() is super useful in python repl: applicable to everything, always present (as opposed to documentation)
6:38 * mtd misses that in clojure
6:39 clgv: mtd: hm yeah something like that for namespaces would be great
6:39 mtd: doc, dir, pr, clojure.reflect/reflect, etc.
6:40 clgv: yeah - clojure.repl/dir is a good start, but wish it took a whole bunch of types besides symbols-of-namespaces
6:40 clgv: mtd: ok, clojure.reflect/reflect does not print useful output ;)
6:40 mtd: clgv: indeed :)
6:41 clgv: (map prn (get (reflect f) :members)) is a bit more useful
6:41 (if I make my terminal font about 1pt :))
6:42 clgv: well they should have included show then^^
6:42 * mtd has used (inspect some-symbol) and was trying to discover, without using javadoc, the JFrame method to close (it's "dispose", but I had to cheat)
6:42 mtd: clgv: yeah, wish they had (in clojure.repl, I guess)
6:43 * mtd has "lost" a JFrame - it's still on my screen, (inspect foo) instantiated it, but I've evaluated plenty of forms at the REPL and I don't know how to get a symbol for the JFrame any more :(
6:43 mtd: (sorry for spamming the channel with newbie stuff)
6:45 clgv: what inspect did you use?
6:46 mtd: clgv: (use 'clojure.inspect) --> #<inspector$inspect clojure.inspector$inspect@1bfd9cd5>
6:47 clgv: oops, clojure.inspector
6:47 clgv: ah that one improved
6:48 hmm I wonder what the buttons are for
6:49 mtd: clgv: they don't do much in the few things I've inspected, yeah
6:49 clgv: mtd: I built my own inspect^^
6:49 but it needs to get more user friendly for customizing display^^
6:51 mtd: seems those buttons are for decoration only, yet ;)
6:51 they have no handler in the source I got
6:52 mtd: clgv: ah
7:38 Frozenlock: I'm trying to get clojure-jack-in to work on win7. I get this error: "Could not start swank server: '$SHELL'..." I think I need to add something to my environment variable, but what?
9:09 antares_: hi. how can I distinguish between maps and functions in a protocol w/o using all specific map implementation classes?
9:10 clgv: antares_: via 'map? and 'fn? - if that doesnt help you you have to explain in more detail what you really want to do.
9:11 antares_: clgv: those functions won't work for protocols
9:11 clgv: you got the idea right but I am trying to do this with protocols
9:11 so I have to provide types
9:11 bsteuber: clojure.lang.IPersistentMap ?
9:11 antares_: alternatively, is there a core function that returns "type" I can cond on?
9:11 clgv: antares_: well then I dont understand what you want to do^^
9:11 antares_: bsteuber: yes but maps are also functions
9:12 so I am getting IFn matching some of the time and IPersistentMap matching other times
9:12 clgv: I am trying to write a protocol function that can work with both maps and functions
9:12 but maps are also functions
9:12 clgv: so whats the problem?
9:13 bsteuber: IFn shouldn't match when you have implemented it for IPersistentMap
9:13 clgv: make (minimal) examples - they always help to understand^^
9:13 bsteuber: because the most concrete type should be matching
9:13 and I
9:14 IPersistenMap should be a subtype of IFn
9:14 antares_: clgv: sometimes compiler seems to pick on one implementation (tests pass), sometimes the other (obscure failures)
9:14 bsteuber: at least in clj, different story with cljs
9:14 antares_: bsteuber: yes, and that's exactly the issue
9:14 bsteuber: antares_: so you do cljs?
9:14 antares_: bsteuber: no I don't
9:15 clgv: https://
9:15 jsabeaudry: When working with gloss, if I have a prefix indicating the length of a string, is the proper way to do this a (repeated (string :length 1) :prefix :byte) ?
9:15 antares_: roughly half of the time I am getting obscure runtime exceptions about APersistentMap being invoked with 0 arguments
9:18 clgv: listing exact map implementation classes seems to help, I need to run tests 100 times to tell for sure :(
9:18 bsteuber: antares_: that's really weird, I can confirm this behavior
9:18 maybe write an issue
9:19 hiredman: emacs -nw /var/log/emacs.log
9:19 bsteuber: or there's just something I don't understand about protocols yet ^^
9:19 hiredman: whoops, pardon me
9:19 clgv: antares_: you can inspect the map belonging to the protocol. maybe you spot something odd in there
9:19 antares_: clgv: how can I do it?
9:19 (println [proto name]) ?
9:20 bsteuber: ok, will do
9:20 clgv: antares_: it is bound to the name of the protocol
9:21 antares_: clgv: yeah I figured it out. Awesome, thanks. I will play with it a bit more and file a ticket.
9:22 Frozenlock: I'm trying to get clojure-jack-in to work on win7. I get this error: "Could not start swank server: '$SHELL'..." I think I need to add something to my environment variable, but what?
9:22 bsteuber: antares_: actually, all the maps I tried trigger IFn
9:23 antares_: bsteuber: ok
9:23 dnolen: antares_: there is no way to accomplish what you want w/ protocols
9:23 antares_: bsteuber: so should I list implementation classes instead?
9:23 dnolen: even if I use specific classes and not interfaces?
9:24 dnolen: antares_: oh sorry, yes if you specify specific classes.
9:24 antares_: dnolen: I can rewrite this using multimethods. Is there a good way to get :map, :fn and similar kewords for a data structure, using some core functions?
9:24 dnolen: ok, I think that will work. Hopefully 1.4 won't introduce new classes :)
9:25 clgv: antares_: you dont need keywords for multimethods. you can use types there as well
9:26 antares_: clgv: hm, yeah, but it won't be any different from protocols
9:26 hm, but the comparison will be exact, right?
9:26 clgv: multimethods use 'isa?
9:26 antares_: I see
9:26 ok folks, thanks for your help
9:27 clgv: &(isa? clojure.lang.IFn {})
9:27 lazybot: ⇒ false
9:27 clgv: &(isa? {} clojure.lang.IFn)
9:27 lazybot: ⇒ false
9:27 raek: &(isa? clojure.lang.IFn (class {}))
9:27 lazybot: ⇒ false
9:28 TimMc: isa? is backwards
9:28 raek: &(isa? (class {}) clojure.lang.IFn)
9:28 lazybot: ⇒ true
9:28 TimMc: (relative to instance?)
9:30 antares_: dnolen: if I use AFunction or RestFn, will it cover all functions (that return true for clojure.core/fn?)
9:31 dnolen: antares_: you're running into the problem where things are overlapping w/ protocols. one possible workaround? let IFn be handled in the default case.
9:31 so first match all the types, then in the default case test for IFn and handle it there.
9:32 antares_: dnolen: the problem is, I have Object implementation already and I really need it
9:32 dnolen: antares_: so keep it, doesn't stop you from handling IFn.
9:33 antares_: dnolen: but won't function just match Object impl?
9:33 TimMc: Nothing stopping you from using instance? at that point is there?
9:34 dnolen: (extend-type Object PFoo (bar [x] (if (fn? x) fn-case-expr object-case-expr)))
9:35 antares_: dnolen: ok, thanks. It would work for me, too.
9:35 dnolen: I think clojure.lang.AFunction worked
9:38 dnolen: antares_: interesting, good to know if true.
9:38 antares_: dnolen: I am trying with AFunction and IPersistentMap
9:39 seems to work, 10 passes in a row
9:41 dnolen: antares_: looking at the JVM source, that looks right to me.
9:42 antares_: dnolen: it better be right, I already tweeted about it :D
9:48 bsteuber: good to know extend doesn't handle interface hierarchies
9:54 uvtc: Hi #clojure. I just noticed that this page http://
9:55 but evidently clojure.org uses wikispaces.
9:55 Also, the link to "demark" on the Confluence page is broken...
9:55 Just curious what the history is here, and what plans there are.
9:58 ... if there *are* any plans, anyway.
10:01 stuartsierra: no firm plans
10:01 clojure.org is a mess
10:01 uvtc: In what way? In that it requires updates?
10:05 bsteuber: how does lein-clojurescript deal with macros?
10:05 or is there a better cljs plugin?
10:07 uvtc: stuartsierra: Ok. Found this http://
10:12 bsteuber: ah I think it was lein-cljsbuild
10:28 jsabeaudry: What is the use for merge? Isn't conj enough?
10:31 TimMc: jsabeaudry: I give you two or more maps. Now merge them with conj.
10:31 hiredman: /win 15
10:32 jsabeaudry: ,(conj {:a 1} {:b 2} {:c 3})
10:32 clojurebot: {:c 3, :b 2, :a 1}
10:33 gtrak`: ,(conj {:a 1 :b 2} {:c 3 :d 4})
10:33 clojurebot: {:d 4, :c 3, :a 1, :b 2}
10:33 gtrak`: hmm, why does that make sense?
10:33 jsabeaudry: TimMc, I just did?
10:34 TimMc: gtrak`: It doesn't.
10:34 ,(conj {:a 1 :b 2} {:c 3 :d 4} {:e 5 :f 6})
10:34 clojurebot: {:e 5, :f 6, :d 4, :c 3, :a 1, ...}
10:34 gtrak`: i would have thought it would work with entries but not full maps
10:34 TimMc: &(conj {:a 1 :b 2} {:c 3 :d 4} {:e 5 :f 6})
10:34 lazybot: ⇒ {:e 5, :f 6, :d 4, :c 3, :a 1, :b 2}
10:35 TimMc: Ugh, this is that stupid special-casing.
10:35 &(conj {:a 1 :b 2} {:a 3 :d 4} {:a 5 :f 6})
10:35 lazybot: ⇒ {:f 6, :d 4, :a 5, :b 2}
10:35 TimMc: jsabeaudry: Carry on then. -.-
10:35 uvtc: ,(into {:a 1 :b 2} {:c 3 :d 4})
10:35 clojurebot: {:a 1, :b 2, :c 3, :d 4}
10:36 gtrak`: into makes more sense
10:36 uvtc: I was going to ask what bots are on this channel, and I see there's 2 (at least). What's the difference between clojurebot and lazybot?
10:36 jsabeaudry: TimMc, I'm not sure what the conclusion is here? conj works as merge but it shouldn't so I should use merge and not rely on the current behavior?
10:37 gtrak`: jsabeaudry, relying on the special-case is a form of obfuscation
10:37 TimMc: uvtc: Names, features, security, maintainers...
10:38 gtrak`: you should do the thing that matches your intent most closely, unless there's a performance win or something (there probably isn't)?
10:38 TimMc: uvtc: Use clojurebot when lazybot complains that you're trying to hax it.
10:38 jsabeaudry: gtrak, got it, thanks!
10:38 uvtc: TimMc: Hah. :) Thanks.
10:38 TimMc: uvtc: But lazybot is generally faster and smarter.
10:38 miltondsilva: jsabeaudry: if this works (conj [] [1] [2] [3]) why shouldn't your case?
10:39 TimMc: &(conj [] [1] [2] [3])
10:39 lazybot: ⇒ [[1] [2] [3]]
10:39 TimMc: miltondsilva: Did you want that, or [1 2 3]?
10:39 gtrak`: that's what I would have expected
10:39 miltondsilva: oh I see what you mean
10:39 gtrak`: since maps are seqs of entries, the map-case doesn't make sense
10:40 DrBenway_: ,(conj nil {:a 1 :b 2} {:a 3 :d 4} {:a 5 :f 6})
10:40 clojurebot: ({:a 5, :f 6} {:a 3, :d 4} {:a 1, :b 2})
10:41 DrBenway_: ,(merge nil {:a 1 :b 2} {:a 3 :d 4} {:a 5 :f 6})
10:41 clojurebot: {:f 6, :d 4, :b 2, :a 5}
10:41 DrBenway_: big difference in behavivor :-)
10:41 gtrak`: ,(conj {} {:a 1 :b 2} {:a 3 :d 4} {:a 5 :f 6})
10:41 clojurebot: {:f 6, :d 4, :b 2, :a 5}
10:41 TimMc: THat's right, the nil base case is completely different.
10:42 gtrak`: ,(conj {} :a 1 :b 2)
10:42 clojurebot: #<IllegalArgumentException java.lang.IllegalArgumentException: Don't know how to create ISeq from: clojure.lang.Keyword>
10:42 TimMc: The first arg's .cons method controls the behavior, and if it is nil, an empty seq is substituted in.
10:42 gtrak`: ,(conj {} [:a 1] [:b 2])
10:42 clojurebot: {:b 2, :a 1}
10:43 TimMc: Read PersistentHashMap's .cons method, it's fucked up.
10:43 (Possibly actually APersistentMap)
10:47 gtrak`: ,(conj {} [[:a 1] [:b 2]])
10:47 clojurebot: {[:a 1] [:b 2]}
10:47 gtrak`: ,(into {} [[:a 1] [:b 2]])
10:47 clojurebot: {:a 1, :b 2}
10:52 beardmigration: Big thank you to @babilen and @vijaykiran for help in getting me up and running with emacs a couple of days ago.
10:53 Now I've found time to do a bit of clojure I have another newbie problem with classpaths and name spaces...
10:53 ... I want to set up a leiningen project, write a couple of functions and unit tests for them.
10:53 However nothing seems to want to compile.
10:53 Any suggestions?
10:54 vijaykiran: beardmigration: hi there ..
10:54 amro: what's the error?
10:54 uvtc: What have you done so far?
10:55 vijaykiran: may be you want to paste your project.clj - somewhere
10:55 beardmigration: From the command line: lein compile No namespaces to :aot compile listed in project.clj.
10:55 uvtc: beardmigration: you might paste code to https://
10:55 clgv: beardmigration: try "lein uberjar" if you want a standalone jar of your project
10:56 neotyk: beardmigration: lein test
10:56 don't lein compile if you don't have to
10:56 devn: kibit is awesome.
10:56 * vijaykiran +1s kibit
10:56 * devn writes a github bot to wander around automating pull requests with kibit
10:57 devn: :X
10:57 neotyk: devn: are you aware of hubot?
10:58 how cool would it be if kibit could derive the rules from clojure source code?
10:59 gtrak`: kibit = awesome
10:59 beardmigration: lein test output - stacktrace starting with: Exception in thread "main" java.lang.RuntimeException: java.lang.Exception: namespace 'pruefungen.core' not found after loading '/pruefungen/core'
11:00 gtrak`: beardmigration, did you do 'lein new' to create your project or set it up manually?
11:01 beardmigration: <gtrak'> lein new.
11:02 I'm confused as to the role of two core.clj files - one in the testing tree and one in the src.
11:02 TimMc: beardmigration: The test one should test the src one.
11:03 beardmigration: By the way, "core" is just a suggestion -- you can name it anything.
11:03 owain`: Hey all. I'm interested to know if anyone has any experience in building large web apps in Clojure. I've built a few smaller apps but wondered if there are any example of big ish apps out there.
11:03 beardmigration: So must the name of the test file match the file it unit tests?
11:04 owain`: I'd love to do more and more work in clojure and know how to do mvc from scratch but some examples would be really useful to learn from.
11:04 TimMc: beardmigration: Nope. (But the namespace must match the file name and path.)
11:04 vijaykiran: no, it doesn't. You can put the test anywhere you like.
11:05 gtrak`: owain`, check out noir and korma
11:05 beardmigration: Ah that's the nub of it - how must the namespace match the paths?
11:05 owain`: thanks. I've looked at both. Noir is excellent
11:05 Vinzent: owain`, also, take a look at https://
11:05 owain`: Just wondering more about structuring things like how you'd do MVC in rails or Django.
11:05 Or does that not apply so much in a functional language?
11:06 Vinzent: not seen that before. thanks
11:06 gtrak`: mvc is a little different in functional-land, really I think no-one agrees on what MVC should be anyway
11:06 owain`: That's kind of what I was wondering.
11:06 duck1123: Ciste is the MVC part. Jiksnu is more of an implementation of Ciste
11:06 owain`: Does MVC matter as much in a language like Clojure. I'd LOVE to do all my web work in Clojure.
11:07 TimMc: beardmigration: - becomes _, . becomes /
11:07 DrBenway_: beardmigration, if you have any clj files in src or test paths where the path dosnt mach the (ns or have no (ns ... ) - you gets relly wired errors messages from lein
11:07 TimMc: Blame the JVM for those restrictions.
11:07 gtrak`: owain`, separation of concerns matters, but a controller can be a namespace instead of an object or something, for example
11:08 owain`: I'm still reaching for ROR for apps if I need things doing quickly. This is mainly becuase it's just easier to do. If I was doing a startup now I'd like to use Clojure ratherthan ror
11:08 TimMc: beardmigration: ./src/foo/bar/baz.clj has a namespace of foo.bar.baz (if src is the source root)
11:08 uvtc: Was just reading http://
11:08 owain`: This was the only really good example I've seen. https://
11:09 gtrak`: owain`, conjure was an attempt to be like rails, but I don't know how many folks actually use it
11:09 owain`: Yeah I didn't like the look of it.
11:09 Felt too "big"
11:09 Not sure how to describe it. Just seemed wrong for Clojure.
11:10 Certainly interesting.
11:10 beardmigration: <TimMc> Does that mean that ./test/pruefungen/test/test_core.clj should have ns test.pruefungen.test.test_core?
11:10 TimMc: uvtc: I havne't heard the latter sense before.
11:10 beardmigration: Drop the first "test."
11:10 vijaykiran: and I think test_core should be test-core
11:10 at the end
11:11 gtuckerkellogg: can anyone tell me what I'm doing wrong here? http://
11:11 TimMc: ^ yeah, hyphen in the ns
11:11 beardmigration: <TimMc> so the test directory is included in the classpath?
11:11 vijaykiran: I'd leave -/_ for now - just name it core.clj
11:11 uvtc: TimMc: Vars, Refs, Agents, and Atoms are mutable, correct?
11:11 TimMc: beardmigration: right
11:11 clgv: gtuckerkellogg: you are closing the file from with-open before the lazy-seq from map is evaluated
11:12 TimMc: uvtc: yup
11:12 beardmigration: <vijaykiran> yep I'd noticed some problems with _ being translated to - or vice versa - is it recommended not to use these in filenames?
11:12 TimMc: uvtc: "reference types"
11:12 gtuckerkellogg: am I?
11:12 huh
11:12 duck1123: owain`, I would suggest you check out Ciste, if you're looking for MVC.
11:12 clgv: gtuckerkellogg: it'll work if you put a 'doall in front of the map
11:12 gtuckerkellogg: thanks!
11:12 vijaykiran: beardmigration: the only caveat is _ in the file name means - in namespace .. but you can safely ignore it for now.
11:13 uvtc: TimMc, I think I saw that term in Joy of Clojure ... one sec...
11:13 gtuckerkellogg: yay! and so it did, thank you clgv
11:13 vijaykiran: beardmigration: since _ means something diff in clojure :)
11:14 beardmigration: <vijaykiran> yes of course.
11:14 Ok thanks for the input - let me try it out...
11:14 uvtc: TimMc: Yes, here it is, section 11.2 of JoC: "Clojure currently provides four different reference types to aide in concurrent programming: Refs, Agents, Atoms, and Vars."
11:15 gtrak`: owain`, also this guy: https://
11:15 they use it for real stuff
11:16 owain`: gtrac: Thanks. Looks good. What I was looking for.
11:16 uvtc: TimMc: my hunch is that the word "object" is simply overloaded, and somewhere along the line I thought it was equivalent to "value".
11:16 owain`: I was wondering how many people used a hybrid approach like Flightcaster where all the front end would be done in something like ror etc and the complex stuff done in Clojure.
11:17 uvtc: TimMc: Thanks.
11:17 gtrak`: owain`, I think twitter does stuff like that, slowly replacing their ruby backend with java/scala/clojure
11:18 owain`: I kind of like that idea. Splitting up into smaller apps that do specific things.
11:18 gtrak`: http://
11:18 owain`: I heard Etsy.com use Clojure/Scala as well. Might be wrong.
11:20 beardmigration: I'm making progress - at least lein seems to want to try to run some tests. However it doesn't recognise the assertions in this code: (ns pruefungen.test.test-core (use: pruefungen.core) (use: clojure.test)) (deftest core-test (is (= hello "Hello World!")) (is (= (hello "thing") "Hello thing!")))
11:20 owain`: Maybe that's a good way to go. Smaller apps working together rather than one giant monolithic framework.
11:20 duck1123: it all depends on how much you can break off into smaller tasks and how many queues you have
11:21 uvtc: beardmigration, just saw a blog post that might be useful to you: http://
11:22 beardmigration: Thanks <uvtc> - that post seems to be at my level!
11:23 gtrak`: meh, no sense in overengineering everything upfront, I think FP makes it easier to refactor out into services later
11:24 babilen: beardmigration: You are most welcome -- Great that you got it working! :)
11:24 uvtc: beardmigration, sure, yw
11:25 owain`, Regarding etsy.com, from the job postings I've seen, they don't mention explicitly Clojure ("Our current systems run PHP, Java, Python, Ruby, Solr/Lucene, Postgres, MySQL, and more.")
11:25 raek: beardmigration: :use, not use:
11:26 beardmigration: babilen: Erm not quite unfortunately - lein doesn't see my assertions in my testing file, for some reason. I've just put the use: namespaces in square brackets but that doesn't seem to help.
11:26 Suspect I still have a classpath / namespace problem.
11:27 babilen: beardmigration: See raek's remark
11:27 owain`: uvtc: I think this bit was done in Clojure. http://
11:27 vijaykiran: beardmigration: see what raek said (:use ....) not (use: ...)
11:27 owain`: Remember seeing it on HN I think. Hang on.
11:27 http://
11:27 They probably use a ton of stuff by the look of it.
11:28 PHP, Java, Python and Ruby? Why would you use so many languages? Haha.
11:29 dnolen: owain`: from what I hear they're pulling back on the number of languages they use.
11:29 uvtc: owain`, Ah, neat. Thanks.
11:29 hiredman: I wonder if I could interest them in my lisp->php compiler
11:31 langmartin: I have a java interop question, I'm trying to use a netty http client and I can't access some static class fields (which are just constants, as far as I can tell). (ns ... (:import org.jboss.netty.handler.codec.http.HttpHeaders)) is fine, it's meant to have a Names and Values static subclass with a bunch of static fields in each
11:32 gtrak`: hiredman, gross :-)
11:32 langmartin: Names and Values are both not found, and can't be imported directly. any help would be greatly appreciated
11:32 owain`: gtrack: +1 haha
11:32 babilen: beardmigration: Actually make that: (ns pruefungen.test.test-core (:use [pruefungen.core]))
11:33 hiredman: langmartin: you have to use the jvm class names
11:33 beardmigration: <facepalm!> Ahem - yes I should have paid attention to the syntax colouring. That's great - thanks all assertions are failing and passing as they should.
11:33 Is there a better workflow to test just the file you have edited in emacs rather than go out the shell?
11:33 hiredman: langmartin: javac turns inner classes into like HttpHeaders$Names
11:34 langmartin: hiredman: no shit! that goes on my newbie notes page then
11:34 dnolen: clojurebot: ~max
11:34 clojurebot: Pardon?
11:35 dnolen: ~max
11:35 clojurebot: Most users ever in #clojure: 404
11:35 hiredman: ~max users
11:35 clojurebot: Pardon?
11:35 uvtc: ~current
11:35 clojurebot: Titim gan éirí ort.
11:35 hiredman: clojurebot: jerk
11:35 clojurebot: you cut me deep, man.
11:35 vijaykiran: 404 :)
11:35 babilen: beardmigration: Well, I like lazytest -- https://
11:37 stuartsierra: Midje is under more active development than Lazytest right now.
11:37 babilen: stuartsierra: I still like lazytest -- Sad to hear that midje is under more active development (which probably means that lazytest is not)
11:38 jsabeaudry: &(bytes [1 2 3 4])
11:38 lazybot: java.lang.ClassCastException: clojure.lang.PersistentVector cannot be cast to [B
11:38 langmartin: hiredman: thanks so much, works like a char
11:38 m
11:38 stuartsierra: babilen: I wrote Lazytest, but have not had time to work on it in the past year or so.
11:38 babilen: stuartsierra: But you are right -- Given that the last commit was one year ago, I probably shouldn't recommend it anymore.
11:39 Vinzent: is there topological sort implementation somewhere in standart lib?
11:39 beardmigration: 'lein test' is somewhat slow for optimal test integration.
11:39 hiredman: "optimal test integration"
11:42 beardmigration: I suppose that would be a fast test runner integrated into the editor. But look I'm being picky - it's all new and exciting. I'll have a look at midje.
11:43 babilen: beardmigration: https://
11:43 gtrak`: midje uses core.unify, maybe it can use core.logic or does it matter?
11:43 owain`: babilen: that looks good. Thanks.
11:44 beardmigration: babilen: even better an emacs minor mode!
11:44 mdeboard: So, funny question: Is anyone here going to be at Pycon
11:45 gtrak`: mdeboard, I did pycon audio/visual in 2010, I'm sad I can't go, but I'm going to clojure/west :-)
11:45 mdeboard: Yeah unfortunately I'm a single parent otherwise I'd just stay out there :(
11:45 Well, "unfortunately my responsibilities prevent me from staying out there", not unfortunately @ single parent
11:46 beardmigration: Thanks again to all - I'm looking forward to writing something more substantial.
11:46 gtrak`: mdeboard, apparently stallman's giving a lecture, too
11:46 mdeboard: ya
11:49 gtrak`: is there any big news in python anyway? I lost interest a couple years back
11:52 mdeboard: gtrak`: Not really in my world of web dev. Nothign I personally get too excited about anyway.
11:52 (though admittedly it does take a lot to get me excited)
11:52 gtrak`: clojure stole my heart :-)
11:52 mdeboard: yeah
11:53 well, I'll probably be primarily python for a few years but clojure/scala/anything else is a great way to get better at programming in general
11:54 gtrak`: I think there's a lot of value in writing equivalent code in different methods/paradigms/languages
11:55 uvtc: gtrak, I hear about PyPy making strides. Actually, to keep things on-topic, I read about a Clojure impl in Python a few days ago: https://
11:55 gtrak`: yea, pypy was always interesting to me
11:55 unladen swallow died unfortunately
11:55 alexbaranosky: gtrak, I agree -- the best way to see alternative design solutions is to be able to come up with multiple isomorphic solutions
11:56 then you can compare and contrast their relative merits
11:57 gtrak`: alexbaranosky, on an even deeper level, you can just see the code is equivalent... i.e. static functions with a lookup-table on the first-arg vs polymorphic virtual functions
11:57 refactoring is a big part of what I do every day
11:57 lucian: gtrak`: i'd say unladen fortunately died :)
11:57 alexbaranosky: gtrak, that's the kind of thing I'm thinking, yeah!
11:58 geoffeg_c: with "lein deploy", it should push into the maven repo defined in :deploy-repositories in project.clj and with the auth defined in ~/.lein/profiles.clj?
11:58 lein doesn't seem to be picking up the auth definition in profiles.clj
11:59 martintrojer: So, who's gonna start an open-source datomic compatible project? The gauntlet is thrown...
11:59 gtrak`: alexbaranosky, making code look like what it is :-)
12:15 geoffeg_c: is there some full example of a profiles.clj file i can read? lein doesn't seem to be picking mine up
12:16 i can't find docs on what the file needs to contain
12:16 xeqi: what version of lein are you using?
12:17 geoffeg_c: 1.6.2
12:17 xeqi: profiles new for 2.0
12:18 sorenmacbeth: geoffeg: you have to use 1.7.0 to use ~/.lein/profiles.clj
12:18 xeqi: *are new
12:18 sorenmacbeth: xeqi: they are in 1.7.0 as well I believe
12:19 geoffeg_c: ok, i'll upgrade
12:24 ok. i upgraded to 1.7.0 and it does not appear to be reading profiles.clj. is there an example profiles.clj i can see?
12:25 TimMc: geoffeg_c: Yes, in the lein repository there is a sample project.clj.
12:25 erf, misread
12:26 geoffeg_c: yep, but i can't find an example profiles.clj
12:30 `fogus: Anyone have insight on how to get lein to spit out a different directory for the pom resources element?
12:30 kij: Hey, is there any guides how to do logins and security in clojurescriptone ?
12:30 xeqi: profiles are new in lein 2 which doesn't have a release yet, requires running from master; see https://
12:32 `fogus: have you tried :resources-path ?
12:33 `fogus: xeqi: Oh! You're supposed to spell that properly!?! ;-)
12:33 Thank you
12:34 technomancy: Lein 3.0 feature request: DWIM :p
12:35 sorenmacbeth: xeqi: I'm using profiles just fine in lein 1.7.0
12:36 technomancy: there's a plugin back-porting profiles to 1.x, but it won't work out of the box
12:37 it's also a bit behind the profiles implementation in lein 2
12:40 gtrak`: kij, there's sandbar for a clj solution, i think some folks use spring security for more comprehensive stuff
12:40 sorenmacbeth: technomancy: isn't profile.clj the recommended way to do site-wide plugin handling in 1.7?
12:40 profiles
12:40 technomancy: sorenmacbeth: no, the back-porting of profiles to 1.x is kind of experimental
12:40 great if it works for you though =D
12:41 sorenmacbeth: technomancy: seems to be :p
12:41 technomancy: I don't think I've actually told anyone about it, so congratulations on discovering the easter egg =)
12:41 sorenmacbeth: technomancy: though I did have to run `lein plugin install` still
12:42 so maybe I just thought it was working
12:45 kij: gtrak`: thanks!
12:53 geoffeg_c: how do i get "lein deploy" to also install the pom ("lein install" generates it)?
12:55 Licenser: did you ever notice that if you have the wrong font pom and porn look very much the same?
12:56 geoffeg_c: i hadn't previously
12:56 how can i install porn in maven?
12:57 eggsby: lol Licenser :D
12:57 that keming D:
12:57 sorenmacbeth: geoffeg_c: mvn porn:bow-chica-bow-wow
12:58 geoffeg_c: i'm amused that there are so very few discussions about deploying a jar to a maven repo.. apparently most clojure developers don't work in mutli-developer teams.. or if they do, they don't use maven
12:58 Licenser: now you guys have something to talk about that should end the quiet
12:58 gtuckerkellogg there is lein-clojars?
12:59 geoffeg_c I ment
12:59 TimMc: geoffeg_c: As in, deploying to a local nexus?
12:59 sorenmacbeth: geoffeg_c: see http://
12:59 geoffeg_c: yea, but my employer has their own private maven repo (artifactory), i don't want to push to clojars..
13:00 technomancy: geoffeg_c: "lein deploy" should get the pom installed too; I've never heard of that failing
13:00 it sounds like you may have found a bug?
13:00 geoffeg_c: hmmm, maybe artifactory is being stupid.. it seems to really enjoy doing stupid thjings
13:00 Licenser: stop saying pom … please?
13:00 geoffeg_c: technomancy: i'll look into what the problem with the pom is
13:01 technomancy: geoffeg_c: I try to encourage people to use private s3 buckets for private repositories since there's no maintenance burden, but if you've already got an archiva set up that should work
13:03 geoffeg_c: technomancy: hmm, that's an interesting idea.. but how will lein handle finding the jars i push up to s3? in other words: i have two projects we've developed in-house, one depends on the other and we have multiple developers (5-6) working on it
13:03 can i tell lein to go look in s3 for deps?
13:03 technomancy: just add a repository like "s3p://my-secret-bucket/releases" to :repositories in project.clj
13:03 and be sure the s3-wagon-private plugin is in :plugins
13:03 geoffeg_c: i like this idea :)
13:14 technomancy: would people use the backported profiles plugin if I updated it?
13:14 I'm hesitant to just because I want people to try out lein 2, but that's selfish of me =)
13:15 `fogus: thanks for getting that pushed out
13:18 hiredman: technomancy: if I had the time to do new things I would just move to lein 2
13:19 technomancy: yeah, with the migration path being helped by lein-precate I think backporting features is probably unnecessary
13:20 `fogus: technomancy: Thanks for the legwork on lein-marg
13:34 mrBliss: `fogus: I spotted a small mistake in your announcement about Marginalia (I use it a lot, thanks!) on the ML: `(def a-var value "The docstring")` should be `(def a-var "The docstring" value)`
13:35 `fogus: mrBliss: Thanks. Will fix now.
13:37 mrBliss: `fogus: that's quick! Thanks again for your hard work.
13:38 `fogus: Thank you
13:38 technomancy: `fogus: oh hum... marginalia needs to run in-process, doesn't it?
13:38 I mean in the project's process rather than Leiningen's?
13:38 `fogus: ja
13:39 technomancy: yeah I think I may have goofed on the lein2 support; I must have only been testing it with 1.7 =(
13:41 herp && derp
13:41 `fogus: DO'ETH!
13:45 technomancy: `fogus: I've got a fix
13:45 if you want to do an 0.7.1 of lein-marg alone I'll update the docs to reflect it
13:45 sorry =\
13:46 `fogus: Nah, it's been ~11 minutes. I'll repush v0.7.0
13:47 technomancy: sneaky
13:48 pull-req'd
13:58 * `fogus wonders how Ken will yell about the release notes this time.
14:04 technomancy: is he still around?
14:05 dnolen: perhaps reincarnated as Cedric Greevey
14:05 technomancy: wouldn't surprise me
14:06 `fogus: There is no chance that they are different people
14:07 TimMc: Who is this, some kind of complainer? troll? agent provacateur?
14:07 `fogus: You have no chance to survive make your time
14:10 emezeske: For great justice!
14:10 dgrnbrg: How do I split a string on a character?
14:10 I have a dot-separated string, and I'm trying to use .split, but I'm not getting the result I expect
14:11 nvm
14:11 I forgot . & regex interaction
14:11 technomancy: for some reason .split uses faux-regexes
14:11 it's pretty silly
14:12 I guess that's a coping mechanism for working in a language that doesn't have literal syntax for regexes
14:16 dgrnbrg: technomancy: i think they're real regexes
14:16 it just compiles them for you
14:17 technomancy: dgrnbrg: no, it takes a string argument
14:17 dgrnbrg: which is first compiled to a regex
14:17 it's a real regex, but it doesn't take the regex as the argument
14:17 it takes the pattern str-
14:17 technomancy: right; I'm just saying that a better-designed API would be to take a regex argument
14:18 if you didn't have to work around the shortcomings of the Java Programming Language™
14:19 danlarkin: technomancy: Sun's ex-lawyers thank you
14:19 technomancy: I should set up a dabbrev for that
14:20 dgrnbrg: technomancy: :)
14:20 at least the jvm is really fast
14:21 emezeske: *once it's running
14:26 dgrnbrg: *if it starts
14:29 rplevy: does cucumber-jvm's included clojure interface support the tabular data feature of cucumber? it seems like it doesn't yet, but I may be wrong.
14:53 Licenser: is there a way to make a callback function not callbacky?
14:53 `fogus: Unable to parse that sentence
14:54 amalloy: i think it parses fine but lacks semantics
14:55 Licenser: okay let me rephrase :)
14:55 solidsnack: Licenser: Do you mean, threads?
14:56 Licenser: I got some icky library that wants to only communicate via callbacks like bla.start(something, callback_function)
14:57 but I'd like to get the result out of that callback function and have the result outside of the call and not inside of the callback
14:57 TimMc: Licenser: atom & watcher?
14:58 * Licenser looks that up
14:59 `fogus: Licenser: You want to convert a function taking a callback into one that is synchronous?
14:59 amalloy: i suggest drinking their callback koolaid
14:59 Licenser: yes that is about what I want :)
14:59 amalloy it is annoying
14:59 `fogus: Licenser: https://
14:59 TimMc: Licenser: but that lacks certain concurrency characteristics, since there is only one atom involved
15:00 amalloy: a promise is certainly better than an atom
15:00 nicl: Hey all, beginner here looking to get into clojure. But I'm having a problems installing swank-clojure and getting it set up with emacs.
15:00 TimMc: Licenser: Forget everything I said about atoms, including my correction.
15:00 nicl: Clojure and Leiningen are installed fine
15:01 And I've installed swank-clojure
15:01 Licenser: what atoms TimMc ?
15:01 TimMc: Hmm? :-P
15:01 nicl: But when I run lein swank I get 'Couldn't find project.clj...'
15:01 Any good walkthroughs out there for ubuntu/linux or anyone come across this problem ?
15:02 ibdknox: hm, are promises in CLJS?
15:02 ldopa: nicl: are you trying to run lein swank outside of a leiningen project?
15:03 nicl: ldopa: yeah, I just want to check if it is working. Because I get the same problem when I try m-x-clojure-jack-in in emacs
15:03 Licenser: ibdknox that is what I am researching right now ^^
15:03 ibdknox: I don't think they are
15:03 nicl: ldopa: do I need to create a project for this to work / to playaround ?
15:03 ldopa: nicl: yep
15:03 Licenser: noooooo :(
15:03 nicl: ldopa: ok great, thanks for the heads up
15:04 ibdknox: ,(source promise)
15:04 clojurebot: Source not found
15:04 stuartsierra: A Clojure promise is basically an Atom + a j.u.c.CountDownLatch
15:04 * Licenser simply tries
15:05 TimMc: Locking is easier in JS. :-P
15:05 ibdknox: heh
15:05 unfortunately that can't really work in JS
15:05 * lucian wants CPS transform macro :)
15:05 ibdknox: thinking about it more
15:05 TimMc: ibdknox: Oh, hum... because you can't block threads.
15:05 amalloy: it can easily just be an atom, right?
15:06 `fogus: promise deliver in ClojureScript could just be aliasing of the atom stuff as a start
15:06 TimMc: You;d have to make it a callback thingy anyhow!
15:06 ibdknox: `fogus: but you can't block
15:06 ever
15:06 amalloy: oh, right, i see
15:06 Licenser: hmm seems it does not
15:06 ibdknox: stupid browsers
15:06 TimMc: Licenser: The good news is, we can write promise/deliver. The bad news is, it will need a callback.
15:06 `fogus: A promise doesn't block either if it doesn't block
15:06 ibdknox: programming on the UI thread is stupid
15:07 * TimMc insert Radio Yerevan joke here
15:07 TimMc: s,/me ,/say /,
15:07 Licenser: problem is I hate this silly return everything in callbacks stuff
15:07 ibdknox: I think the closest you could do is something like a more complicated form of my letrem in fetch
15:07 TimMc: Welcome to JS.
15:08 amalloy: Licenser: it's not really silly, even on the jvm. in javascript it's practically mandatory
15:08 ibdknox: which wouldn't be that hard
15:08 TimMc: Right, you could have a macro that hides the fact that it is a callback.
15:08 Licenser: amalloy I understand that in some palces callbacks are a great thing
15:08 but not when every forking function reutrns their stuff in callbacks
15:09 lucian: surely dealing with callbacks is easier than dealing with threads in most cases
15:09 Licenser: ibdknox do you have a link to that in code?
15:09 lucian: deferreds or CPS transform are very simple solutions
15:09 ibdknox: Licenser: https://
15:09 amalloy: meh. what's the difference? (my-fn (lib-call a)) vs (lib-call a my-fn)
15:10 nicl: ldopa: ok, created a project and it works great! Thanks
15:10 ibdknox: amalloy: try doing that when there's a loop involved
15:10 less common in Clojure
15:10 amalloy: it's true, i picked the most-convenient example
15:11 ibdknox: I think the problem is mostly that it requires an inversion of the implementation :(
15:11 and more importantly, the thinking around how to solve it
15:11 it works well enough and the simple case is certainly simple. It easily ends up degrading over time though. It's what pissed me off about Node
15:11 ldopa: nicl: np
15:12 Licenser: I just find it annoying this I don't want to put callbacks in every function call it is just annoying\
15:13 ibdknox: anyways, hiding it in a macro seems ok
15:14 Licenser: amalloy also if you want to do two things with the result from lib-call the first is a big difference to the second
15:15 ibdknox: I feel like this discussion about the ns form is mostly a non-discussion, the available options here are very narrow: break everyone or do nothing
15:16 I have a hard time believing the former would really be on the table
15:16 amalloy: ibdknox: for jvm-clojure, yes. for cljs, isn't it the opposite? fix it or do nothing?
15:17 ibdknox: amalloy: true, I bet the cljs "fix" is pretty trivial too
15:19 TimMc: ibdknox: ns discussion?
15:19 ibdknox: TimMc: http://
15:19 hiredman: multiple :requires is icky
15:20 arohner: ibdknox: I also have yet to see an opinion on why it needs a breaking change at all
15:20 ibdknox: arohner: yeah
15:20 arohner: hiredman: sure, but break all the existing code? why?
15:20 hiredman: arohner: to force people to do things in a not icky way
15:20 *shrug*
15:20 arohner: hiredman: would you like to come fix 50kLoC for me?
15:21 for free?
15:21 hiredman: arohner: you ahve 50kLoC of erroneous code
15:21 TimMc: If hiredman didn't have me on /ignore, I could explain to him some very compelling reasons.
15:21 gfredericks: reducing multiple requires to one shouldn't be hard to automate...
15:21 hiredman: I bet you could write a 10 line clojure program to fix it
15:21 TimMc: I'll just have to tell him in person at the meetup tonight.
15:21 arohner: hiredman: no, I don't. I have 50kLoC of other people's broken libraries
15:21 gfredericks: TimMc: what did you do to him?
15:22 TimMc: gfredericks: No idea.
15:22 arohner: "broken"
15:22 which is exactly why 1.3 was so painful
15:22 hiredman: arohner: ah, well, most of those are broken under 1.4 anyway
15:22 arohner: hiredman: what is breaking in 1.4?
15:22 hiredman: 1.3/1.4
15:23 TimMc: I don't have you on ignore
15:23 well, /ignore
15:23 Licenser: are we talking about combining require and use?
15:24 gfredericks: TimMc: the plot thickens!
15:24 hiredman: I am not deeply committed to the idea of breaking everything, I just can't believe the horrible style people write clojure code in
15:25 amalloy: i don't see why multiple requires are so offensive. i don't like them, but it's a reasonable choice to allow. maybe i want my app-related use/requires first, and then at the bottom some use/requires that i think nobody will care about
15:26 TimMc: Whoa, he acknowledges my existence!
15:26 gfredericks: amalloy: I due usually end up grouping things like that, but it makes me feel a little dirty
15:26 Raynes: Because it is.
15:26 hiredman: I've been thinking we could have one thing that does require+import that differentiated via () or []
15:27 Raynes: I hate when people use code with no meaning just to group code visually.
15:27 That's what comments are for.
15:27 TimMc: hiredman: Did you before? Because it's awfully curious how you'd answer people after I'd answered them, with the same advice, many seconds later.
15:27 Meh, whatever.
15:28 Licenser: can someone explain why multiple requires should be bad?
15:28 hiredman: TimMc: possibly, I have 74 people on ignore, so obviously I don't really keep track
15:28 but you are not on /ignore now
15:28 TimMc: *shrug*
15:28 amalloy: ibdknox: just poked around: you can get an almost-working version of multiple-require in cljs with like a one-line change
15:29 rplevy: Licenser: repetition is ugly and morally wrong
15:30 Licenser: but I have mutliple defn's in my code too
15:30 Vinzent: Without multiple :uses you can't e.g. :reload only namespaces which you want
15:30 TimMc: rplevy: Ah, but what about separating use/require against one set of libs from use/require against another set?
15:30 rplevy: TimMc: trying to picture it...
15:30 TimMc: I prefer to organize my ns by topic rather than how each piece is refer'd.
15:31 Licenser: I'd double TimMc there, that is a good reason
15:32 Vinzent: TimMc, could you explain what do you mean?
15:33 hiredman: emacs -nw /var/log/safe.log
15:33 pardon me
15:33 Licenser: Vinzent (ns bla (:rquire [liba.overloading]) (:use [liba.nonoverloding]) (:rquire [libb.overloading]) (:use [libb.nonoverloding]))
15:33 TimMc: Vinzent: (:use [clojure.java.jdbc :only (...)]) (:require clojure.java.jdbc.internal) ... some other libs using the same pattern
15:35 Vinzent: you can (:use [clojure.java.jdbc :only [...]] [clojure.java.jdbc.internal :only []] ...)
15:35 Actually, I don't understand why :require isn't deprecated already :)
15:36 Licenser: huh?
15:36 amalloy: haha
15:36 * lucian still doesn't quite understand clojure's importing system
15:38 Licenser: oddly enough someone on clojure.de suggested combining use and requrie into one today - actually a good Idea I think
15:38 Vinzent: Licenser, you can write (:use [a-lib :only [] :as a]) instead of (:require [a-lib :as a]), that'd allow you to avoid multiple use\require clauses
15:38 Licenser: really?
15:39 TimMc: Vinzent: Is that true on 1.3?
15:39 amalloy: yes, but that's atrocious
15:39 Vinzent: Licenser, TimMc, yes, try it :)
15:39 TimMc: Oh, that's not what I want anyway.
15:39 Raynes: Didn't require and use already get merged?
15:39 Vinzent: amalloy, why?
15:39 Raynes: I thought that ship had sailed.
15:40 Vinzent: Because it is atrocious.
15:40 rplevy: the new :require ... :refer vars solves all these problems elegantly, no?
15:41 TimMc: Definitely looking forward to that.
15:42 Vinzent: Raynes, hah :) but what exactly is wrong with it? It's supported in all versions of clojure and it requries much less typing than :require + :refer
15:43 Raynes: Vinzent: I don't have to explain myself to you. BEGONE.
15:43 TimMc: Vinzent: Doesn't it still refer all the ns publics?
15:43 Vinzent: Raynes, what's wrong with you?
15:44 TimMc, with :only [], no
15:44 TimMc: oh, I see. And ew.
15:44 That's atrocious.
15:44 Raynes: Hahaha
15:46 Vinzent: TimMc, lol :) well, that's better than using both :use and :require
15:47 * Bronsa actually likes use/require
15:47 Bronsa: am I a bad person?
15:47 lucian: wtf, (use 'clojure.set) moves everything into the current ns?
15:47 Raynes: You're a horrible person.
15:47 Bronsa: i suspected that
15:47 lucian: that's like doing python's from clojure.set import * by default
15:48 scriptor: lucian: only use :use with :only
15:48 unless if trolling
15:48 Vinzent: Bronsa, I feel silly when I have to e.g. (:use [foo :only [bar]]) and then (:require [foo :as f])
15:48 lucian: scriptor: but that's the other way around. it defaults to *
15:48 Vinzent: Bronsa, also, it's idiomatic to use only :use (see http://
15:48 scriptor: lucian: yea, that's just what use does, if you want something like import require is what you want
15:49 lucian: scriptor: that's a terrible default
15:49 Bronsa: wait what.
15:49 lucian: scriptor: isn't use considered idiomatic?
15:49 scriptor: lucian: only if you just want certain functions, I'm not sure tbh
15:49 Bronsa: i tought it was going to be considered idiomatic require
15:49 Vinzent: lucian, yes it is
15:50 Bronsa: and deprecated use
15:50 lucian: Bronsa: that would be good
15:50 haskell makes the same mistake
15:50 Bronsa: isn't that what technomancy proposed?
15:50 amalloy: :use/:as is fine, if a little tacky. but :use :only [] :as is disgusting
15:52 Bronsa: https://
15:52 Vinzent: Bronsa, well, as you can see on that page, looks like :use is idiomatic (after all, you're not going to argue with Rich Hickey about what is idiomatic clojure?! :)
15:53 lucian: ok, (require [foo :as bar]) is nice
15:54 Vinzent: amalloy, what's wrong with it? :use without :only considered harmful, so you always have to write [:use ... :only [...]]. If you don't want to imports symbols in your ns, :only list is empty. I think it's not that bad from this point of view.
15:54 Bronsa: well, http://
15:54 amalloy: that's what :require is for, dude
15:55 TimMc: Vinzent: When I am reading someone's code and I see "use" I think "OK, be on the lookout for the symbols in the :only clause (because you'd beter have one, dude)"
15:56 Vinzent: and then I see :only [], and I'm like "WTF, this is actually a :require :as in disguise."
15:57 tmciver: So, despite the constant advise to 'only use :use with :only', you shouldn't use :use at all?
15:57 s/advise/advice
15:57 gfredericks: tmciver: :only with a non-empty list is I think the purpose
15:58 Vinzent: Bronsa, I guess it was accepted so people can choose what style they prefer
15:58 amalloy, There can be only one! :)
15:58 stuartsierra: CLJ-879 is an attempt to unify :require/:use into just :require.
15:58 Bronsa: Vinzent: the propsal states that the intent is to deprecate :use
15:58 Raynes: stuartsierra: I thought that had already been accepted.
15:58 stuartsierra: Raynes: it has
15:58 and committed
15:59 Raynes: I see.
15:59 Bronsa: Cant a warning be printed whan using :use?
15:59 well, probabily it would be too noisy
15:59 Raynes: That'd probably not be the best idea.
15:59 People will support old versions on purpose.
16:00 Vinzent: ok, I give up then :) stuartsierra, thanks for clearing that out.
16:00 TimMc: I'll use the old-style stuff in libs, and the new syntax in top-level projects.
16:01 Raynes: TimMc: Same here.
16:01 TimMc: We should be friends or something, we have so much in common.
16:01 TimMc: A lint option would be nice.
16:01 Raynes: It's too bad you're a... what was it?
16:01 I have that alias around here somewhere...
16:02 "weak-ass ill-conceived piece of shit"
16:02 Bronsa: lol
16:02 Raynes: :D
16:02 TimMc: ...and so is BrowserID.
16:02 o\__/o
16:03 I wonder if Google has picked that up yet.
16:04 Interestingly, the 5th result for that (unquoted) is The Big Lebowski's IMDB page.
16:07 Raynes: What-all languages are you going to have eval for?
16:08 Raynes: TimMc: I don't have a list yet. It'll grow over time, I expect.
16:09 * lucian is now a lot less confused about require/use
16:18 uvtc: What is the purpose of this list: http://
16:19 technomancy: uvtc: that list is ancient; best to ignore it
16:20 uvtc: technomancy, Ok, thank you.
16:33 mrBliss: is github giving a 500 error to anyone else?
16:34 Raynes: Looks good to me.
16:35 mrBliss: it's fixed now
16:36 Raynes: mrBliss: Maybe someone haxed it again.
16:36 mrBliss: Raynes: that's what you get with Rails ;-)
16:37 * ibdknox inserts add about using noir in the top bar of girhub
16:37 ibdknox: ad*
16:37 eggsby: mmm, 4clojure is fun
16:37 ibdknox: so much fail in that
16:37 jodaro: girlhub?
16:38 ibdknox: you know how it is.
16:38 jodaro: is that porn equivalent?
16:38 ibdknox: lol
16:38 redinger: "noir: No mass assignment bug here"?
16:38 jodaro: i think there are probably more crass options
16:39 ibdknox: redinger: exactly. Seems like rails has set a new very low bar for success ;)
16:39 time to profit!
16:42 Raynes: redinger: Ohai.
16:42 redinger: Raynes: Hello there
16:43 ordnungswidrig: hi all
16:45 uvtc: With Clojure, is it customary to install contrib and other Clojure libraries into a central location (like how Python uses site-packages)? Or are necessary libs always installed per-project?
16:46 technomancy: relying on site-packages is repeatability-poison
16:46 brehaut: ~repeatabilty
16:46 clojurebot: Excuse me?
16:47 brehaut: bah
16:47 ibdknox: ~guards
16:47 clojurebot: SEIZE HIM!
16:47 technomancy: clojurebot: have you suffered severe head trauma?
16:47 clojurebot: No entiendo
16:47 TimMc: suffering from typos
16:47 ibdknox: lazybot: is clojurebot retarded???
16:47 lazybot: ibdknox: Yes, 100% for sure.
16:47 TimMc: lack of \i
16:47 ~repeatability
16:47 clojurebot: repeatability is crucial for builds, see https://
16:47 TimMc: <- clojurebot-whisperer
16:47 uvtc: technomancy, Ok. So, lein always installs per-project?
16:47 ibdknox: lol
16:48 brehaut: that'll teach me fore using a tiny font
16:48 (not really)
16:48 technomancy: uvtc: leiningen forces isolation and will only pull in dependency trees which are explicitly specified
16:49 it doesn't always mean copying things into the project directory, but it does mean you are forced to be explicit and are protected from sloppy dependency declarations a la ruby/python
16:49 uvtc: technomancy, by "forces isolation", you mean "installs libs into the current project", correct?
16:49 technomancy: uvtc: no, it means it limits the classpath to exactly what is specified
16:49 uvtc: technomancy, (sorry --- was typing while you were typing)
16:50 technomancy: leiningen 1 copies things to lib/ by default, but that's just one way to do it
16:50 leiningen 2 constructs classpaths with references to ~/.m2/repository
16:50 the end result is the same when it comes to isolation
16:50 TimMc: technomancy: Run into any command length limits with that yet?
16:51 technomancy: TimMc: no, but I don't use windows
16:51 jsabeaudry: &(try :a (finally :b))
16:51 lazybot: ⇒ :a
16:51 TimMc: Ah, is that mostly a Windows problem?
16:51 Too bad, I was thinking of clever symlink tricks to get around it.
16:51 technomancy: TimMc: I've never heard of it being a problem, so I'm assuming it's a winders thing
16:51 TimMc: haha, OK
16:51 uvtc: Is lein's job to pull in dependencies that I specify in the project.clj? Or can I tell it to install whatever I want?
16:52 technomancy: uvtc: I'm not sure what you are asking.
16:52 uvtc: I'm trying to learn the basic principles lein follows.
16:53 technomancy: the best place to start is "lein help tutorial"
16:53 uvtc: I read the tutorial at the github page.
16:55 amalloy: TimMc: there's a limit to command length on unix too, but only because the shell has a fixed-size buffer for you to type at (or something similar to that). if you construct a long command programmatically it works fine
16:56 eg, in a directory with a million files `echo *` fails because the shell can't glob that much, but `find . | xargs echo` works because xargs is willing to make the command as long as necessary
16:57 uvtc: technomancy, I'm asking about how contrib + other 3rd party libs are handled by lein. For example, `lein help install` says it installs the current project and deps into my local repository. What does "local repository" mean? Somewhere in my home dir?
16:57 technomancy: uvtc: that's correct; ~/.m2/repository
16:57 you can think of it as a local cache for Maven Central and Clojars
16:58 it will be available for other projects, but only those that explicitly request that specific version
16:59 uvtc: technomancy, Ah! Ok. Though, earlier you wrote, "relying on site-packages is repeatability-poison" ... were you talking about python there, or the ~/.m2/repository directory?
16:59 technomancy: uvtc: I meant having system-wide packages available implicitly
17:00 like python and ruby
17:00 amalloy: uvtc: he was talking about global installs in general. ~/.m2 isn't a global install because it's all neatly versioned and explicit
17:01 technomancy: at least in the ruby community they are experiencing a lot of pain moving away from that model
17:01 uvtc: Excellent. So then, what is the point of `lein install`? If I can run my project from within the project dir via `lein run`?
17:02 technomancy: if you make a change to a project, you may want to make it available to other projects that depend on it
17:02 you could do that by pushing it to clojars, or you could install it locally first to test before you push
17:02 uvtc: Why is the directory named ".m2"?
17:02 technomancy: it's an implementation detail; comes from maven2
17:03 brehaut: its an abbreviation of Maven Madness
17:04 amalloy: brehaut: c'mon, we need you commonwealthers to keep Muppetry alive
17:05 brehaut: amalloy: i dont understand
17:05 amalloy: instead of Madness
17:05 brehaut: oh right
17:06 uvtc: Ok. So when I use Leiningen, a local repository (~/.m2/repository) is automatically set up to hold common libs (jars).
17:07 And if I use `lein install`, libs are copied to that repository.
17:07 amalloy: so far so good, uvtc
17:08 geoffeg_c: so how do most people manage war files? developer builds war file, sends it to QA who tests it and then deploys it to production.. do most people put those war files in maven or git or some http server?
17:08 raek: libs are also copied to that directory when lein deps finds that it isn't there and it is available in one of the repos
17:08 geoffeg_c: putting war files in git seems wrong and maven doesn't seem like the right place
17:08 technomancy: geoffeg_c: definitely don't want those checked in
17:09 geoffeg_c: right, agreed
17:09 but at the same time you want to keep previous "versions" of war files around in case you need to roll back a deployment to prod.. and you need to keep checksums of the war files around to verify the correct one was deployed to prod..
17:10 technomancy: geoffeg_c: one way is to get a CI server that uploads each successful release to s3 or something
17:10 ordnungswidrig: I'd use a locale repository, either maven or a webserver. webdav might be of use here.
17:11 uvtc: raek, so, when you run `lein deps` it looks at the project.clj's :dependencies to see what it needs to download, correct?
17:11 geoffeg_c: ok, so s3 or some http server.. which is what i was thinking but wondering if there was something more... appropriate
17:11 ordnungswidrig: geoffeg_c: a private maven repository is appropriate.
17:12 raek: uvtc: yes
17:12 geoffeg_c: ordnungswidrig: hmm, but maven seems awkward for wars.. i mean, nothing depends on a war file so
17:12 uvtc: raek, Whoops -- sorry, it says that right there in `lein help deps`.
17:12 raek: it also downloads dependencies of dependencies, etc
17:13 ordnungswidrig: geoffeg_c: maven supports artifact types. "war" is one of them as is "pom" or "jar"
17:13 geoffeg_c: ok, i'll consider that again
17:13 raek: uvtc: "lein install" is most often used when you want to try an unreleased version of a project before releasing it properly
17:13 geoffeg_c: thanks everyone
17:13 ordnungswidrig: geoffeg_c: you might want to have a look at http://
17:14 raek: in some sense, you can think of it as a cousin to "make install"
17:14 geoffeg_c: technomancy: is there a way to get lein (1.7) to push a war file in addition to a jar file to a private maven repo?
17:14 raek: most importantly, you rarely need to use "lein install" when using someone else's library
17:15 technomancy: geoffeg_c: maybe using lein ring? I've never used war files.
17:15 geoffeg_c: ok
17:15 * technomancy is a peaceful kind of guy
17:15 geoffeg_c: LOLZ
17:15 ordnungswidrig: +1
17:15 technomancy: some day that joke might get old... but not today!
17:15 uvtc: raek, what I don't get is, it's customary to package Clojure libs as jars, correct? If that's the case, it seems really nice and simple to just have all my deps saved as jar files in my project's lib dir...
17:16 Guess that's why I'm not understanding the point of the .m2 repo.
17:16 amalloy: having your dependencies checked into git would be horrible
17:17 and if you don't put them someplace central (just save a copy in each project) you end up downloading all those jars hundreds of times
17:17 uvtc: amalloy, Ah! Of course. It's assumed you create a git repo for your project after you create it. Right right.
17:17 raek: some of it is explained here: https://
17:17 amalloy: *shrug* you can .gitignore them, but then everyone who uses your project needs to get a copy of the deps somehow
17:18 uvtc: Ok. Made some headway. Need to go read the docs again and absorb some more. Thanks so much!
17:26 dgrnbrg: How do I invoke a varargs java fn from clojure?
17:28 arohner: dgrnbrg: pass a java array
17:28 (.foo obj (into-array [:a :b :c])
17:29 might need to use the type argument of into-array
17:29 dgrnbrg: ok, thanks :)
17:29 that's what I thought, but I was having signature mismatches
17:30 jsabeaudry: What kind of problems will be encountered when "send"ing potentially blocking actions to an agent (instead of send-off)?
17:31 arohner: jsabeaudry: the send pool has N + 2 threads in the pool, where N is the number of cpus you have
17:31 while the send-off pool is unbounded
17:31 so send'ing could block your CPU bound actions
17:31 jsabeaudry: arohner, So it would potentially block all other actions, is that right?
17:32 justicefries: what are people actively using? compojure or noir?
17:32 m0smith: just: noir
17:32 arohner: jsabeaudry: yes, if you send enough blocking actions
17:33 justicefries: I'm trying to actively wrap my mind around Clojure and I'm not sure if books (programming clj, joy of clojure) are the best way for me to go.
17:33 or if I just need to reread.
17:33 jsabeaudry: justicefries, best way is to code imho
17:33 justicefries: that's what I'm thinking.
17:34 brehaut: joy of clojure and the orielly clojure book are both great resources though; they wont hurt.
17:34 justicefries: brehaut: trying to work my way through the o'reilly one right now, it's...hard work! :d
17:34 RickInGA: Clojure in Action is good too
17:34 justicefries: :D
17:35 AimHere: A lot of OReilly books probably hurt, if you drop them on your foot
17:35 brehaut: learning anything worth learning is hard work :)
17:35 justicefries: true.
17:35 RickInGA: each one covers things a bit differently, can learn from all.
17:35 dgrnbrg: arohner: anything quirky with inner interfaces?
17:36 I have (into-array qualified.name.of.inner.interface [elts])
17:36 and I import the inner interface directly
17:36 and it complains classnotfound
17:36 amalloy: that's not the real name of the interface
17:36 dgrnbrg: amalloy: what can I do to get it to work?
17:36 amalloy: package.foo.Class$InnerClass
17:37 is the actual name. javac just lets you pretend it's something else
17:38 dgrnbrg: I see :)
17:38 got it compiling :)
17:38 I suppose no one's written a clojure API for the new filesystem watching apis?
17:40 amalloy: $google clojure watchtower
17:40 lazybot: [ibdknox/watchtower - GitHub] https://
17:40 dgrnbrg: but that doesn't use the fs watching api
17:40 ibdknox: that doesn't use the NIO stuff in java 7 though
17:40 dgrnbrg: i have a lot of files
17:41 ibdknox: daaku wrote a watcher thing that uses the java 7 apis
17:41 dgrnbrg: i'm writing software to dynamically build indices of java code for vim & emacs completion
17:42 technomancy: dgrnbrg: like ctags?
17:42 ibdknox: what's wrong with ctags?
17:42 dgrnbrg: it's not dynamically reindexing
17:42 it doesn't follow jars & understand the classpath
17:43 unless i'm mistaken wrt ctag's functionality
17:45 ibdknox: that's a very expensive set of things to do in real time
17:45 jodaro: RickInGA: see that mail from alex?
17:45 dgrnbrg: I have a sqlite db with the indices to do cmd-T style completion in vim or emacs, and a daemon that monitors the directories
17:46 currently i'm using a doclet to parse the java, but I may have to move to antlr grammar
17:46 RickInGA: cool
17:46 I didn't know I got a discount too!
17:46 dgrnbrg: I can do it in real time now -- I got the idea to build it b/c I like nail gun/vimclojure, but I'm not aware of that functionality for java
17:54 ordnungswidrig: can defmacro destructure args in 1.3?
17:56 (defmacro foo [[[a b] [c & ds] & body] …)
17:58 Vinzent: ordnungswidrig, yes, why not?
17:59 ordnungswidrig: had some problems with it.
18:03 Vinzent: ok (let [[a & b] [nil]] a) => nil
18:03 Vinzent: that was the problem.
18:06 amalloy: so far i only see intended behavior, no problems
18:09 ordnungswidrig: amalloy: yes, it was a misunderstanding
18:38 OwenOu: a newbie question, keyword can be a function too, e.g., (:foo {:foo :bar}) is the same as ({:foo :bar} :foo), what's a good use for keyword being a function?
18:38 or what's the idiomatic way?
18:40 Vinzent: OwenOu, use keyword first when you treat a map like an object
18:40 technomancy: OwenOu: it's common to map a keyword over a vector of maps
18:41 OwenOu: Vinzent: that's a very good point
18:41 TimMc: I just mapped a map over a collection of keywords. Feels good, man.
18:41 OwenOu: technomancy: can u give me an example?
18:42 arohner: OwenOu: (map :foo [{:foo 1 :bar 2} {:foo 3 :bar 4}])
18:42 => (1 3)
18:42 oh right, we have clojurebot for that
18:42 Iceland_jack: ,(-> {:name {:first-name "Alice" :last-name "Silverman"}} :name :first-name)
18:42 clojurebot: "Alice"
18:43 Iceland_jack: you can access information from within nested data structures
18:43 emezeske: ,(get-in {:first-name "Alice" :last-name "Silverman"} [:name :first-name])
18:43 clojurebot: nil
18:43 emezeske: ,(get-in {:name {:first-name "Alice" :last-name "Silverman"}} [:name :first-name])
18:43 clojurebot: "Alice"
18:43 Iceland_jack: emezeske: thanks :)
18:43 amalloy: that's kinda a lame example, Iceland_jack, because get-in is at least as good at that
18:43 &(get-in {:name {:first-name "Alice" :last-name "Silverman"}} [:name :first-name])
18:43 lazybot: ⇒ "Alice"
18:43 Iceland_jack: I'll try to delame my examples in the future
18:44 * Vinzent tends to use get-in only when keys are not keywords
18:44 amalloy: wow, what is my ping time? like two minutes? you guys had a whole conversation at light-speed while i was typing
18:45 Vinzent: by the way, where is dissoc-in?
18:46 technomancy: Vinzent: there's update-in
18:46 Vinzent: technomancy, yes, but where is dissoc-in? :)
18:46 also, value of nil for the key is not the same as if there is no this key at all
18:49 kenth: How would I map a function that executes javascript over a list of strings, and returns the relevant results in a parallelized manner? My current code is (map #(.executeJavaScript) lst ), however it does not have Thread/sleep
18:49 OwenOu: arohner: thanks
18:49 clojurebot seems pretty neat, is it open sourced?
18:50 emezeske: clojurebot: where do you live?
18:50 clojurebot: It's greek to me.
18:50 emezeske: Aw :)
18:50 technomancy: clojurebot: source?
18:50 clojurebot: source is http://
18:50 emezeske: clojurebot: Yeah, help out technomancy but not me. Thanks.
18:50 clojurebot: Gabh mo leithscéal?
18:51 amalloy: clojurebot: who's your daddy?
18:51 clojurebot: excusez-moi
18:53 kenth: (pmap #(let [result (.executeJavaScript %1)] (do (Thread/sleep 5000) result)) JSlist) OR (map #(future (let [result (.executeJavaScript %1)] (do (Thread/sleep 5000) result))) JSlist) , which makes sense for javascript type stuff?
18:55 Raynes: OwenOu: Also, lazybot: https://
18:56 Which is more user-friendly (as in, it is possible to run it on your own machine without gouging your eyes out).
18:58 kenth: hm.., what happens with a combination of pmap and future?
19:01 emezeske: kenth: What is the Thread/sleep for?
19:01 kenth: waiting for the javascript execution to do its thing
19:01 OwenOu: Raynes: thanks
19:02 emezeske: kenth: So you're saying that .executeJavaScript returns before it's done?
19:03 kenth: (pmap #(let [reslt (.getNewPage (.executeJavaScript coursepage %1))] (Thread/sleep 5000) reslt) listOfJSstrings)
19:04 yep, waiting for the js info to come in before returning
19:05 emezeske: kenth: But.. what is the value of "result" between when (.executeJavaScript) returns, and when Thread/sleep finishes?
19:07 kenth: I just tried it out, the result wasn't quite right.. its part of http://
19:16 groovemonkey: I'm having an issue installing slime for emacs 23. I've followed Lau Jensen's tutorial on vimeo, but when I do M-x slime and choose "yes" for downloading and installing clojure jars, I get an error
19:17 Failed to download clojure jars
19:17 anyone have any ideas?
19:18 technomancy: groovemonkey: sounds like you found some old documentation; try https://
19:19 groovemonkey: thank you! I'll try that right away. Thanks for your time.
19:19 technomancy: sure
20:32 johnmn3: hello
20:32 Does semperos ever pop in?
20:37 amalloy: i know he used to. i don't remember hearing anythin from him for a fair while, but who knows
20:39 apparently he was here earlier today
20:39 so i am not a winner
20:41 johnmn3: hmm
20:41 juxt is the winner!
20:45 what is function A, such that (= 42 (A #(pred that returns true for 42) (range 1 100)))
20:45 Vinzent: some?
20:45 johnmn3: well, I want to stop searching on first find
20:46 take-while & not
20:46 Vinzent: johnmn3, it's some
20:46 johnmn3: Okay, will some return 42?
20:46 and it does
20:46 thanks Vinzent
20:47 Vinzent: np
20:51 johnmn3: ah, no. I want it to work like filter
20:51 where the pred will return true, but the value fed to the pred is returned, if true
20:52 I want filter-but-stop-on-first-success
20:52 (first (drop-while #(not (...
20:52 right?
20:54 well, it works
20:55 I guess I could have changed the pred to a function that returned it's input if true.
21:00 amalloy: (first (filter ...))
21:02 johnmn3: oh, duh
21:02 and filter is lazy, so it'll stop searching after the first, right? (chunking notwithstanding)
21:54 gtuckerkellogg: i'd like to be able to compare two data structure (as part of a unit test) and am unsure how to do it once they become more complicated than a simple map
21:54 For example, this fails (= (() ({:pos 0, :mark "5"})) (() ({:pos 0, :mark "5"})) )
21:54 Iceland_jack: gridaphobe: which properties would you like to compare?
21:54 gtuckerkellogg: all of them,
21:55 if I look at just the map, it works fine, but once I have a seq I can't compare, and can't find a way to use (map) to compare the elements
21:55 (with apologies for my clojure noob-ness)
21:55 gridaphobe: Iceland_jack: are you sure you meant to ping me?
21:55 Iceland_jack: haha, no I didn't
21:56 sorry :)
21:56 gridaphobe: np :)
21:57 Iceland_jack: gtuckerkellogg: I'm not sure how you'd do that without creating your own equality checker
21:58 hopefully someone who actually knows Clojure can come along 8)
21:58 gtuckerkellogg: shouldn't i be able to do that using (map ?
21:58 yet it seems to evade me
21:58 amalloy: just use [] instead of () for the seqs you want to compare
21:59 or quote it, or anything
21:59 Iceland_jack: oh, that was the problem
21:59 ,(= '(() ({:pos 0, :mark "5"}))'(() ({:pos 0, :mark "5"})))
21:59 this works?
21:59 clojurebot: true
21:59 Iceland_jack: thanks clojurebot
22:00 gtuckerkellogg: cool
22:19 ideally_world: is there a way to get output from the Swing thread in Slime?
22:22 technomancy: gtuckerkellogg: have you tried lein-difftest?
22:22 ideally_world: Programming in Clojure is far more revealing of how much of an idiot I am than any other language :)
22:23 gtuckerkellogg: technomancy, no but I'll look into it
22:23 i'm *really* new with clojure, but it's fun
22:24 I have to agree with ideally_world :-)
22:24 technomancy: it's more about making it easier to tell _how_ two data structures are different in the event of failures
22:26 gtuckerkellogg: that would be usefl
22:26 useful
22:37 aperiodic: oh wow, lein-difftest is awesome
23:03 ferd: any way to (set! *print-meta* true) so that slime-macroexpand-1 shows my metadata?
23:59 amalloy: i doubt if you want it to - there are usually zillions of {:line 342} meta entries on source code
23:59 and you can just macroexpand it by hand at the repl if you want to check on occasion