3:00 clj_newb: for classpath instead of saying foo/1.jar, foo/2.jar, foo/3.jar, ... is it possible to say foo/*.jar ?
3:00 [I tried foo/*.jar in zshrc, and it did not work; but I feel like there sholud be a way to do it]
3:01 alexyk_: i.e. convert nil to 0 and leave non-nils alone
3:09 bbloom: I'm only a few days into to "real" work with clojure… and I think I'm forever spoiled
3:09 I never want to write a line of code again without a live running compilation environment….
3:10 I've even got some crazy ideas of cool macros I can write with the clojurescript analyzer
3:17 lnostdal: hum, is *print-level* being bound to "no limit" (i.e. NIL) by default (root level) really a good idea? .. when debugging and looking at stacktraces and error messages, it sometimes causes the error message or stack trace to in-turn cause a stack-overflow x)
3:29 muhoo: hmm. midje or clojure.test ?
4:06 mrsep: #e
4:31 amalloy: $mail alexyk it looks like you were having connectivity problems, so i didn't catch your whole question, but you probably want fnil
4:31 lazybot: Message saved.
4:42 jrobie: what's the best emacs mode for clojure?
4:42 vijaykiran: clojure-mode ?
4:43 jrobie: thanks, vijaykiran - i'm just ramping up to play with the language
4:44 vijaykiran: if you are using any of the emacs-starter-kit or perlude etc, it should come with clojure-mode
4:46 jrobie: vijaykiran, i don't know about emacs-starter-kit or perlude
4:47 ah, google says http://
4:50 vijaykiran: which version of emacs are you using ?
4:57 jrobie: vijaykiran, GNU Emacs 23.3.1
4:57 vijaykiran, it does not seem to know clojure-mode
5:00 vijaykiran: jrobie: you may want to use the package.el to load the starter kit, I'm not sure if you have any customizations already, otherwise, just download and start with starter-kit
5:01 jrobie: the wiki page seems to have the info ( in the comments)
5:02 jrobie: thanks, vijaykiran
5:46 alexyk: hmm
5:46 lazybot: ?
6:06 Raynes: lazybot: kill
6:06 lazybot: KILL IT WITH FIRE!
6:07 clgv: alexyk: use $mail to get your mail
6:07 lazybot: kill
6:07 lazybot: KILL IT WITH FIRE!
6:10 alexyk: clgv: privately to /lazybot?
6:14 clgv: $mail
6:14 lazybot: You have no messages.
7:08 Raynes: Yay for income tax.
7:12 ejackson: Raynes: amen.
8:31 osa1: what is "root value" of a var? I'm trying to understand `defonce`
8:31 ordnungswidrig: osa1: vars can be rebound locally, e.g. using "binding"
8:32 osa1: ...if the var is declared as dynamic
8:32 Raynes: *Some* vars.
8:32 TimMc: Raynes: I believe that all vars, deep inside, have the capacity for change.
8:33 raek: osa1: the value you usually deal with. the exception is when the var is dynamically rebound using 'binding', as ordnungswidrig mentioned
8:33 Raynes: TimMc: That's very glass half full of you, man.
8:33 TimMc: I want to be more like you. I want to see good in the world.
8:34 TimMc: Raynes: Well, you're in luck. I believe that all IRC users, deep inside, have the capacity for change.
8:35 ordnungswidrig: I was defonced and I to not want to be rebound.
8:36 Raynes: ordnungswidrig: Put that on a tshirt.
8:36 ordnungswidrig: s/to/do/
8:48 TimMc: &(do (do (do (require '[clojure.string :as s5])) (do s5/join)))
8:48 lazybot: ⇒ #<string$join clojure.string$join@548695>
8:48 TimMc: \o/
8:49 So nested top-level 'do forms are also unrolled.
8:49 That takes a load off.
8:54 Argh, I can't run deftest in a separate namespace for some reason...
8:56 ...and I can't run the contents in a different namespace, since that's not the top level.
9:09 * TimMc writes own test framework
9:12 clgv: TimMc: why?
9:23 TimMc: clgv: I want to run tests that are sandboxed in their own namespaces such that they can play with custom variations of 'import and 'require
9:24 deftest is apparently not compatible with this.
9:25 clgv: ah ok.
9:49 aidy: What does the <int>M print syntax mean?
9:51 Raynes: &(type 1M)
9:51 lazybot: ⇒ java.math.BigDecimal
9:52 aidy: thanks :)
10:00 babilen: Hi all. I would be grateful if you could criticize my code at http://
10:00 I'd also like to have another function that splits at variable numbers of subsequences (in order), but I'd like to get the single sequence case right first. :)
10:01 tsdh: babilen: Instead of (empty? someseq), it's idiomatic to use (seq someseq) which returns nil for empty collections, so it's the other way round.
10:03 Raynes: Holy crap
10:03 I'm starting to feel bad for contributing another pastebin to the world.
10:03 There are obviously more pastebins than websites of any other sort combined.
10:03 babilen: Indeed :)
10:03 Raynes: At least mine isn't bright pink.
10:04 bhenry: can someone point me in the direction of the clojurescript one example (i think by brenton) that shows the commands to send expressions to the two different repls?
10:05 babilen: tsdh: Thanks - I'll use seq in that case. I am fairly new to clojure so I am not sure if loop+logic is the best way to handle this. I primarily want to have a function that removes a subsequence (if present) from a sequence and returns both prefix/suffix of that subsequence.
10:05 bhenry: Raynes: there's no need for another pastebin when you have gist.
10:05 babilen: I might use take-while/drop-while but process element-wise now.
10:06 Raynes: bhenry: Well, I obviously disagree.
10:06 bhenry: Raynes: well prove me wrong.
10:06 TimMc: Raynes: I WARNED YOU ABOUT PASTEBINS BRO!!!!
10:06 Raynes: Isn't really the goal I was aiming for, but I'll certainly try.
10:06 TimMc: I TOLD YOU DOG!
10:07 I told you man. I TOLD you about pastebins!
10:07 Raynes: You did. You really did.
10:08 TimMc: http://
10:08 babilen: Ok, excuse me for initiating this discussion about pastebins and their merits, but is the approach I am using correct?
10:09 Raynes: I don't know. I'm still trying to get past your pink pastebin.
10:09 * Raynes promises that that will be his last snarky remark.
10:09 Raynes: I've used up my quota for today.
10:10 babilen: Raynes: Hehe, ok. I happily paste it somewhere else if that helps ;)
10:10 Raynes: I think you're okay.
10:12 ivan: someone should write a program that backs up all of the pastebins incrementally
10:13 except for pastebin.com, that's all crap
10:14 babilen: tsdh: How would I implement line 7 using seq? That is (or (seq ) (seq )) obviously evaluates to (1), which is not what I want. I am also reluctand to split this into multiple ifs.
10:16 TimMc: babilen: You're building up an awful lot of nested concats there.
10:16 Raynes: I like cats.
10:16 TimMc: I see a StackOverflowError in your future.
10:16 Raynes: How do you feel about turtles?
10:17 tsdh: babilen: DeMorgans law, (and (seq sub-seq) (seq s')) and reverse the branches of the if.
10:17 babilen: TimMc: True, but that is what I have so far. What would be a better approach?
10:17 tsdh: ta!
10:17 TimMc: babilen: No need for s', you can just call it s.
10:18 babilen: yeah, had that on my list already
10:18 tsdh: babilen: Maybe it's better to convert to a vector before and then use the fast subvec function. Then it should be linear.
10:21 babilen: tsdh: Ok, I'll investigate that. Thanks for the input so far!
10:21 tsdh: babilen: I mean, recur thru the vector v (= (vec s)) and check if the (subvec v 0 (count sub-seq)) equals subvec. if so, then that's the position and (subvec v (count sub-seq)) is the rest you need to concat to the beginning.
10:21 babilen: You're welcome.
10:22 babilen: tsdh: That would essentially get rid of the backtracking, yes.
10:23 TimMc: babilen: I take it you want the subsequences to be lazy as well?
10:23 babilen: TimMc: That would be nice
10:24 Just criticize and give me some pointers, I am merely looking for other ideas or things that I unwillingly screwed up :)
10:24 TimMc: e.g. (first (first (split-at-subsequence (range) [10 10]))) => 0
10:25 babilen: exactly
10:25 Raynes: babilen: You're loud and your voice is annoying.
10:25 Oh, you mean code?
10:26 TimMc: Raynes: You're over-quota. o\__/o
10:26 Raynes: Damn!
10:26 TimMc: So, what's up with trycljs?
10:26 TimMc: Nothing.
10:26 Raynes: Guys, you've got to WORK on it. :(
10:27 TimMc: Hey, if *you* have any brilliant ideas on how to get it to compile correctly, let me know!
10:27 s/compile/compile CLJS/
10:27 babilen: TimMc: So, how to be lazy?
10:27 Raynes: TimMc: You should get dnolen on board.
10:28 TimMc: Raynes: THat would certainly fix everything.
10:28 "Pull requests welcome (especially from dnolen)"
10:31 Raynes: TimMc: Sounds legit.
10:36 pandeiro: is there a way to disable the property access syntax warnings with the ClojureScript REPL?
10:38 TimMc: Why?
10:38 clojurebot: #<ClassCastException java.lang.ClassCastException: clojure.lang.Cons cannot be cast to clojure.lang.IPersistentStack>
10:38 TimMc: Nuts to you, clojurebot.
10:39 pandeiro: TimMc: dunno minor annoyance
10:39 if it were warning that I was using antiquated syntax, that would be one thing... it's warning me that i'm using the new, correct syntax
10:45 TimMc: Oh, weird.
10:46 * TimMc mutters something half-baked about lazy-seq in babilen's direction
10:47 clj_newb: is tehre a way to take my *.clj, compiel them into a *.jar, so I don't have to recompile on every load?
10:47 (I've done writing my editor; and am argely using it now)
10:48 and don't want to go through the recompilation process on every use
10:48 * babilen puts it back in the oven and waits for TimMc's utterings to be done :)
10:48 TimMc: babilen: Maybe you could have a first pass that converts split-points into (Object.) sentinals, and then a second pass that splits into subsequences?
10:48 clj_newb: lein uberjar?
10:49 babilen: TimMc: I'll see what I can come up with. I tried a lazy-seq approach first, but my clojure-fu was too weak and .. well .. You saw what my best attempt was :)
10:49 clj_newb: I don't have lein
10:49 I have been coding i the repl athis whole time
10:56 cemerick: clj_newb: get lein :-)
10:58 TimMc: clj_newb: Dare I ask how you've been downloading dependencies, executing your code, running tests...
10:58 I dursn't.
11:11 babilen: First write a fn that checks if a seq is a prefix of another seq.
11:13 babilen: Then write a fn that uses lazy-seq to iteratively either skip a prefix and cons on a sentinal or cons on the next element.
11:14 babilen: TimMc: Thanks -- I've incidentally started working on the first one just now. Great help and may you have a nice day :)
11:15 TimMc: babilen: Finally, write a fn to split on sentinals.
11:20 babilen: TimMc: Hmm, what is the best approach to achieve the "iteratively" part?
11:24 TimMc: babilen: (source partition-by) Look at the call to lazy-seq, which contains some conditionals, which contains calls to cons, which then contains calls to partition-by again
11:25 (It look recursive, but lazy-seq actually makes it iterative.)
11:26 babilen: TimMc: Oh, perfect example and exactly what I need. Wonderful :)
11:39 TimMc: clgv: Actually, the problem with sandboxing deftest seems to be that with deftest itself in a pocket namespace. lein test doesn't see it. >_<
11:40 clgv: TimMc: cant you just write a macro that doest the actual execution in another namespace and use that within a deftest?
11:41 TimMc: clgv: import, require, and other name-resolution or evaluation modifiers have to be in preceding top-level forms to the stuff they modify.
11:41 I'm going to try using eval, actually.
11:42 clgv: TimMc: you do not need to use these
11:42 TimMc: hmm?
11:42 clgv: TimMc: you can intern the symbols for the testnamespace yourself
11:42 TimMc: have a look at the namespace related function in core
11:43 TimMc: clgv: I'm testing a lib that manipulates namespaces.
11:46 clgv: It manipulates the namespace via various methods -- I would like it if the test cases could capture and confine that manipulation.
11:48 clgv: TimMc: sounds like a bootstraping problem then ;)
11:49 TimMc: sort of?
12:19 jkdufair: because i think in smalltalk and/or lisp, I can't help conclude, with forehead against keyboard during my day job that oo design patterns are nothing more than language feature workarounds
12:19 gtrak: norvig has a good site about that
12:20 clgv: jkdufair: they are as well vocabulary ;)
12:21 jkdufair: yeah, a good vocabulary is essential
12:21 gtrak: a pattern is something repetitive, what do we do when things are repetitive?
12:21 jkdufair: i get the impression in clojure there are fewer design patterns and more idioms
12:21 `fogus: write a macro
12:21 * clgv raises his hand and waves
12:21 gtrak: wait for fogus to write a macro :-)
12:21 clgv: gtrak: name them? ;)
12:23 jkdufair: yeah macros are sort of the anti-design pattern
12:23 gtrak: just, abstraction in general
12:24 jkdufair: i think i'd seen that norvig bit before. at least the part about 16 of the 23 design patterns are simplified in dynamic languages
12:24 i think c# is like the cute girl/boy in choir in high school. hot & talented but you always end up in tears in the end
12:26 thx all for letting me rant
12:26 xorola: @jkdufair:How ? i am referring to c#
12:26 jkdufair: how what?
12:27 TimMc: xorola is asking you to explain your analogy.
12:27 jkdufair: oh it's a weak one :-)
12:27 xorola: :)
12:28 jkdufair: all these libraries and fast JITs and such. but when i want a class instance var like smalltalk it says "sorry, i don't do that"
12:28 you walk away a bit... blue
12:29 and i could probably start doing inner classes and whatever voodoo clojure probably has to do to kick things up a notch. but zawinski's law starts coming into play
12:29 guess it's not zawinski
12:30 technomancy: the tyranny of greenspun is inescapable
12:31 jkdufair: tyranny is right
12:32 dnolen: jkdufair: I'm of the opinion that OO is powerful stuff - but like mutability - too easy to get wrong. I think Clojure's strategy of putting the OO stuff at the bottom (instead of at the surface) of the language is a killer, killer idea.
12:32 jkdufair: yeah i suppose i don't disagree with OO's power. smalltalk is still a great love of mine. half-baked OO like Java and C# make me cry.
12:33 and i wholeheartedly agree with clojure's strategy
12:33 `fogus: (inc dnolen)
12:33 lazybot: ⇒ 4
12:34 technomancy: MenTaLguY: any luck with that lein deps hack you were trying?
12:34 I have a feeling it might be nicer on lein2
12:34 dnolen: jkdufair: the story is more complicated then that I think. I don't think Smalltalk is all that ideal either - C# and Java bring good stuff to the table.
12:34 xorola: can somebody tell me how smalltalk OO is different from C# or Java OO? a resource is helpful
12:35 i dunno smalltalk
12:35 TimMc: $google greenspun's law
12:35 lazybot: [Greenspun's tenth rule - Wikipedia, the free encyclopedia] http://
12:35 TimMc: haha, that one
12:35 jkdufair: in smalltalk, everything is an object. all the way down. so classes themselves are objects
12:35 dnolen: xorola: the purple Smalltalk-80 book is good, download Squeak
12:36 jkdufair: it's just more consistent
12:36 dnolen: i don't disagree. plenty of good stuff. and most of the time i like my day job. just not today
12:36 xorola: it sounds more like python OO, am i right?
12:36 technomancy: xorola: smalltalk is all about passing messages to objects
12:36 rather than objects being a bucket full of methods where you reach in and find what you want to call
12:37 jkdufair: yeah python has many of the same design constraints as smalltalk
12:37 technomancy: python uses the bucket-o-methods approach, ruby uses smalltalk's approach
12:37 more or less
12:37 jkdufair: ah i had them backwards
12:38 * technomancy is not aware of any other mainstream-ish OO languages that do message passing
12:39 technomancy: self and IO I guess, depending on how far you want to stretch the definition of mainstream-ish
12:39 dnolen: technomancy: Objective-C
12:39 technomancy: oh, of course
12:39 chewbranca: erlang ;-)
12:40 `fogus: not everything in Smalltalk is an object
12:41 jkdufair: primitives may not be, but they can be treated as such
12:41 kurtharriger: in leiningen I'm trying to specify 2 sperate hooks, :hooks [leiningen.hooks.groovyc leiningen.hooks.junit] but this results in a Caused by: java.lang.IllegalArgumentException: argument type mismatch if the list only contains one hook it works
12:41 `fogus: jkdufair: not talking about primitives
12:41 jkdufair: hmm. what have i forgotten?
12:42 `fogus: What is the Smalltalk object type of |x y z| ?
12:42 technomancy: kurtharriger: :hooks is just a declarative shorthand for requiring a namespace, so as a workaround you can just slap (require 'leiningen.hooks.groovyc leiningen.hooks.junit) after your defproject form.
12:42 jkdufair: alas. all values are objects :-)
12:42 technomancy: kurtharriger: but if you could paste your full project.clj I could attempt repro and see if we should open an isue
12:43 kurtharriger: ok, actually it might be something wrong with my junit plugin compile fails if that hook is included but test works
12:44 I thought maybe I had the syntax for hooks wrong but might be something else
12:44 `fogus: jkdufair: One could say that I'm just picking nits ;-)
12:44 jkdufair: :-) it's an important distinction. one i wouldn't have gotten without learning clojure. more specifically having read Joy of Clojure :-)
12:45 awesome book, btw
12:45 just curious - do you get the same royalties whether i buy it from manning or amazon?
12:45 `fogus: jkdufair: Just buy from wherever is cheapest. I'm not getting rich in either case.
12:46 jkdufair: `fogus: bought it from amazon. just wanted to gauge how much guilt to feel
12:46 anyway, thx for writing it
12:47 `fogus: jkdufair: You should feel about $0.43 worth of guilt
12:47 jkdufair: haha
12:47 xorola: fogus:heard jeff ritcher and joshua bloch royalties are high ,is it true?
12:47 ibdknox: how far the writing industry has fallen :(
12:47 `fogus: no idea
12:47 * technomancy would have a hard time ever writing for not-peepcode
12:49 kurtharriger: technomancy: figured it out, the first groovyc is in a jar and on classpath, I had changed my project classpath to src/clj but still had my leiningen hook in src/leiningen so it wasn't on the classpath
12:49 technomancy: tricky
12:50 kurtharriger: the exception changed when I tried the require form to the much more obvious class not found
12:50 technomancy: hm; that is a pretty strange exceptino
12:51 * technomancy just got an email from someone who asked him about his "My other car is a cdr" sticker in a coffee shop
12:52 cemerick: Barring a miracle, I'm sure I'd self-publish if I were to ever write another book (or any other for-pay content).
12:52 technomancy: I'm afraid I must have been less than totally clear; he says he wants to try out "my lisp implementation" o_O
12:52 kurtharriger: the werid thing is the plugin itself worked just not the hook
12:52 * jkdufair would like a sticker like that
12:52 technomancy: cemerick: peepcode does all the video recording, payment handling, and promotion but still gives you half.
12:53 kurtharriger: At clojure conj I saw a guy riding a bike with a t-shirt reading "one less car"
12:53 cemerick: technomancy: I've never considered doing screencasts. Maybe that should change. *shrug*
12:53 technomancy: it's ridiculous
12:53 ibdknox: cemerick: as someone who might do that... I'd love to hear why :)
12:54 TimMc: babilen: partition 2 interleave is just map vector
12:54 `fogus: technomancy: ridiculous == lucrative?
12:54 cemerick: ibdknox: I'm reserving full judgement for a year, but you can ask me for details so far next month if you like.
12:54 babilen: TimMc: Right, but still -- Why the difference?
12:54 ibdknox: will do
12:54 TimMc: babilen: and this approach of counting, welll... better off doing a loop recur, I think
12:54 technomancy: `fogus: yes, but I was thinking more in terms of comparing it to the rest of the industry
12:55 ibdknox: cemerick: I would've thought that with oreilley's reach it'd be worth it
12:55 TimMc: Also, the subseq should be the first arg, I think...
12:55 ibdknox: -e
12:55 cemerick: ibdknox: well, that's why I'm reserving judgement :-)
12:55 mi6_x3m: hello, am I right that a clojure form is just executable data?
12:55 cemerick: technomancy: I think the prags do 50/50 too
12:55 babilen: TimMc: I am just playing around, but do not understand the difference in the behaviour. (which might highlight a more general misunderstanding I have)
12:55 technomancy: cemerick: oh, really? that's fantastic.
12:56 semperos: reading through the congomongo code, looking at how the set-connection! function "resets" a var; can someone explain why both alter-var-root and set! are used like this?
12:56 `fogus: Prags are notoriously generous
12:57 cemerick: technomancy: http://
12:57 ibdknox: but truthfully writing a book, especially a technical one, will never amass a fortune
12:57 technomancy: cool
12:57 ibdknox: it's the cred that's the reward ;)
12:57 `fogus: ibdknox: Maybe not, but certain authors can live comfortably
12:57 cemerick: ibdknox: Nevermind fortune, it's probably rare to make minimum wage.
12:58 technomancy: ibdknox: considering it only took me a month and I still get checks every quarter, both my peepcode screencasts were an excellent investment of my time economically
12:58 ibdknox: `fogus: I suspect they're the exception?
12:58 technomancy: I'll have to check out this peepcode thing :)
12:58 `fogus: ibdknox: Flanagan was living off of his JS: TDG for many years as I understand it
12:59 ibdknox: Yes, he's an exception
12:59 cemerick: technomancy: is yours the only Clojure vid they have?
12:59 technomancy: my situation was maybe somewhat unique given that I was between jobs at the time
12:59 cemerick: yeah, but I also did the Emacs one
12:59 they've been focusing on JS a lot recently
13:00 cemerick: That's probably a big factor: if you're not busy otherwise, a book/video/etc is a great investment.
13:00 babilen: TimMc: Sorry, have to run now. If you have any idea why it works in the repl, but not as functions let me know. I'll be back later and grateful for all your tips and help so far :)
13:00 ibdknox: yeah
13:00 xorola: exception in the sense,js everywhere :)
13:00 * cemerick hopes cross-sells will up the ante a bit in his favor
13:00 xorola: so many buy flanagan's books
13:00 ibdknox: cemerick: anything that generates passive income
13:00 `fogus: cemerick: cross-sells?
13:01 technomancy: mine came out a couple weeks before the prags', so it was technically the first commercial Clojure documentation released =)
13:01 cemerick: `fogus: going to bring the atlas up to date and a general polishing; buy the book, get the atlas for $X
13:01 `fogus: Ahhh
13:02 I only have Marginalia and Trammel to offer :-(
13:02 cemerick: Between that and amazon affiliate chits…
13:02 ibdknox: cemerick's building a little empire ;)
13:02 technomancy: every time I see Trammel my mind autocorrects it to Pummel
13:02 ibdknox: lol
13:02 cemerick: emphasis on *little*
13:02 `fogus: cemerick: Yes! I get one free book per year thanks to affiliate links. :p
13:03 cemerick: really?
13:03 `fogus: technomancy: That about sums it up
13:03 arohner: semperos: alter-var-root doesn't change a thread local binding, I believe
13:04 `fogus: cemerick: that among 2 or 3 others
13:04 cemerick: oh, didn't see the amazon icon at the bottom of the home page
13:04 `fogus: should put an amazon link right below the book cover on blog.fogus.me
13:05 technomancy: the word "pummel" has such a great background
13:05 comes from "pommel", which is the non-pointy end of a sword
13:05 semperos: arohner: I understand that alter-var-root atomically changes the root binding
13:05 but I guess I don't understand why both of those operations are stringed together
13:06 `fogus: technomancy: We created a function named pummel in JoC :-)
13:06 semperos: as the root binding is used by default
13:06 technomancy: `fogus: refresh my memory?
13:06 arohner: semperos: a var can have two values: the 'root' value, which is what you see if the current thread is not using (binding), and the thread local value
13:06 alter-var-root sets the root value, but not the thread-local value
13:07 mongo uses both, set-connection! sets the root value, with-mongo sets the thread-local value
13:07 `fogus: technomancy: It just throws a bunch of mutations against a reference across a bunch of threads.
13:08 technomancy: nice
13:09 semperos: arohner: so it's just setting the root value, which will be shared by all threads not having a local binding, as well as the thread local value, just to have the local one set explicitly?
13:09 arohner: semperos: right
13:10 semperos: is it just to be explicit? am I wrong in understanding that the root value would be defaulted to anyway?
13:10 (sorry for beating this, just want to make sure I understand the nuances)
13:11 arohner: notice the check for a thread binding. If the the user did (with-mongo …. (set-connection!)), they wouldn't see a change in the local thread, because the previous thread-local would still be in effect
13:13 semperos: right, so after changing the root binding, it checks to make sure it's bound locally as well, and only if that's the case, changes the thread-local binding as well?
13:13 arohner: semperos: right
13:14 semperos: arohner: thanks for the hand-holding, I think I've got a better grip now
13:14 `fogus: OMG That video is awesome
13:15 hugod: `fogus: any plans for a marginalia release?
13:16 `fogus: hugod: I want to have 0.7.0 out before CljWest
13:17 * jaimef kicks lein
13:17 hugod: `fogus: ok, thanks (I would love to have a 1.3 compatible goal for marginalia in zi)
13:17 jaimef: so you point lein directly at the clojure.jar via the env var CLOJURE_JAR and it bombs with ClassNotFoundException: clojure.main
13:17 technomancy: jaimef: yeah, don't do that
13:17 `fogus: hugod: Any feedback for v0.7.0-SNAPSHOT?
13:17 technomancy: CLOJURE_JAR is an implementation detail
13:18 jaimef: yeah well I unset it, it downloads it, then gets the same error :P
13:18 technomancy: jaimef: oh, crap. =(
13:18 jaimef: oddly was fine on bsd just bombing on linux
13:18 technomancy: I have checksumming in there to protect against corrupted downloads
13:19 hugod: `fogus: haven't tried it, since I can't run it from zi ;) - I should give it a go...
13:19 technomancy: jaimef: can you rm the jar, retry, and see if it gives a checksum warning?
13:19 jaimef: it download to ~/.m2?
13:19 technomancy: jaimef: yeah
13:19 jaimef: enoent
13:20 ok nuked ~/.lein
13:20 reran, it downloads the standalone jar for lein, then bombs with Exception in thread "main" java.io.FileNotFoundException: Could not locate leiningen/core/main__init.class or leiningen/core/main.clj on classpath:
13:21 technomancy: jaimef: oh, you're using lein2?
13:21 jaimef: leiningen-2.0.0-SNAPSHOT-standalone.jar guessing so
13:21 technomancy: on purpose? =)
13:21 jaimef: yeah LEIN_VERSION is 2.0.0-SNAPSHOT
13:21 obviously I don't know better :P
13:21 technomancy: hehe; ok.
13:21 if you just want to get stuff done, you should use the stable branch
13:22 jaimef: yeah pulled it from github
13:26 technomancy: yeah, I have a warning in the readme about the master branch, but it's easy to miss
13:28 would be happy to have help testing out lein2, but if you just want to get stuff done it's not the most convenient right now
13:29 jaimef: sure
13:31 odd M-x slime asks to download items.
13:31 technomancy: that would be from swank-clojure.el; you want either M-x slime-connect or M-x clojure-jack-in
13:31 M-x slime has been deprecated for Clojure for ... I want to say 2 years?
13:33 sorenmacbeth: technomancy: Is there an equivalent to clojure-jack-in when you want to kill your repl session, something like clojure-jack-off (sorry, couldn't resist)?
13:33 * technomancy pretends he hasn't heard that one before =)
13:33 sorenmacbeth: I usually just kill the swank and repl buffers
13:34 technomancy: I just re-run M-x clojure-jack-in
13:34 it knows to kill the existing connection
13:34 sorenmacbeth: ok, that is what I tend to do as well
13:39 tmciver: sorenmacbeth: you can also comma "," followed by quit, in the repl, but as I may have mentioned here in the past (technomancy), the follow up clojure-jack-in occasionally fails in which case I must restart emacs.
13:39 technomancy: hm; haven't seen that myself
13:41 tmciver: technomancy: doesn't bother me much but I would be interested to know what's going on there. Could be my setup though I don't believe I'm doing anything very strange. Running emacs 23, if that could matter.
13:41 technomancy: could be why I'm not seeing it
13:41 sorenmacbeth: tmciver: I see, that closes the repl, but leave the swank server running in the *swank* buffer
13:42 Null-A: Has anyone gotten autodoc working with emacs24?
13:42 sorenmacbeth: The typical reason I want to close my repl session is because it can hog a ton of ram (because I have it configure to do so in my project.clj)
13:43 jaimef: slime -> "Clojure is not installed do you want to download?" Y-> fails, N-> Exception noclassdef for clojure/main
13:43 sorenmacbeth: tmciver: Hi, btw =)
13:43 tmciver: Hello!
13:43 Did you get my email?
13:43 sorenmacbeth: tmciver: I did, that time should be fine
13:43 jaimef: odd thing is the same emacs config works on one system.
13:43 sorenmacbeth: I'll reply to the email now though
13:44 technomancy: jaimef: see above; that's been deprecated for about two years
13:44 jaimef: technomancy: yeah tried jack-in same error
13:44 tmciver: sorenmacbeth: concerning the swank buffer, I see that it is still there for me as well, but I don't get a complaint from emacs when I quit as I will if I don't kill slime.
13:44 jaimef: rather exits with error code 1
13:44 technomancy: jaimef: need to get rid of the swank-clojure emacs lisp package
13:45 jaimef: yeah already installed
13:45 ahhh so it runs "cd /home/jaimef && lein jack-in 2621" but the error is "That's not a task Use "lein help" to list all tasks"
13:46 technomancy: it only works from a project
13:46 plus you need swank-clojure as a lein plugin, not an emacs plugin
13:47 jaimef: yes I already ran lein plugin install swank-clojure
13:48 will double check my ~/.m2 dirs between the two
13:48 so "M-x slime" was replaced with "M-x clojure-jack-in" which only works on projects?
13:48 tmciver: technomancy: does the existence of the swank buffer in emacs imply that the swank server is still running?
13:48 technomancy: tmciver: no, the swank buffer stays open after the project exits
13:49 tmciver: OK
13:49 technomancy: jaimef: more or less; you can use slime-connect to work outside a project
13:49 jaimef: hmm ~/.m2 is the same on both. same contents. clj-stacktrace, org, swank-clojure. same emacs config, and emacs version. including same clojure.jar location.
13:50 jre is different
13:50 technomancy: if it says "that's not a task" then you don't have the swank-clojure plugin
13:50 jaimef: ok I can rerun plugin install
13:55 mrevil`: for Leiningen projects is there a best practice for a directory location to store test data? Sorta like a resources dir, but for test. I need to store an XML file that is normally fetched by an HTTP GET in order to mock some functionality.
13:56 technomancy: mrevil`: dev-resources should do the trick
13:56 jaimef: rinse repeat
13:57 mrevil`: sweet, ty
13:58 technomancy: maybe it has to be test-resources in lein1; can't remember
14:29 * jaimef ponders if there is an equivalent to .class to identify an object
14:32 dnolen: jaimef ?
14:34 jaimef: dnolen: ?
14:34 dnolen: jaimef: what are you asking?
14:34 jaimef: ahh more context.
14:35 in ruby you can take any object and run .class to see what type of object it is, e.g. int, float, array, hash
14:35 cemerick: ,(class 5)
14:35 clojurebot: java.lang.Long
14:36 cemerick: jamiei: ^
14:37 dnolen: ,(class :foo)
14:37 clojurebot: clojure.lang.Keyword
14:37 dnolen: ,(bases (class :foo))
14:37 clojurebot: (java.lang.Object clojure.lang.IFn java.lang.Comparable clojure.lang.Named java.io.Serializable)
14:48 jaimef: thanks
15:08 duck1123: Keep in mind, with clojure, you want to think more in interfaces and basic abstractions than in concrete class names
15:18 TimMc: &(class (list* 3 nil))
15:18 lazybot: ⇒ clojure.lang.PersistentList
15:18 TimMc: &(class (list* 3 (range 5)))
15:18 lazybot: ⇒ clojure.lang.Cons
15:18 TimMc: :>
15:22 Null-A: when I call str on a lazyseq, it returns "clojure.lang.LazySeq@c0dddfb" even with a doall
15:23 tmciver: Null-A: (apply str mylazyseq)
15:24 Null-A: hm, what if I have a seq of lazyseq?
15:24 i'll try that first
15:25 Here's the code (defn fail [format-str & args]
15:25 (throw (Exception. (apply format format-str args))))
15:25 args is a seq of lazyseqs
15:27 this works:
15:27 tmciver: what do you want returned? A string? seq of strings?
15:27 Null-A: (defn fail [format-str & args]
15:27 (throw (Exception. (apply format format-str (doall (map #(apply str %) args))))))
15:27 I want the exception to not print lazyseq@xxxx
15:27 Null-A: that works though
15:31 Raynes: $max
15:31 clojurebot: Titim gan éirí ort.
15:31 Raynes: Damn it.
15:33 cemerick: seems like a new-ish high, huh?
15:35 amalloy: pr-str, Null-A
15:35 &(pr-str (range 3))
15:35 lazybot: ⇒ "(0 1 2)"
15:35 Null-A: amalloy: ah thanks
15:42 foodoo: dnolen: I just watched your Conj video on match. Where can I find documentation for your module?
15:44 foodoo: dnolen: thanks. I wish clojars.org had a link to the homepages of the projects (I even searched github, but couldn't find it)
15:46 emezeske: foodoo: clojars *will* link to project homepages, if those projects include a :url
15:46 Null-A: Is it possible to change the toString implementation of an existing object?
15:46 emezeske: foodoo: so it's not clojars' fault, it's projects that omit the :url entry
15:47 dnolen: foodoo: core.match isn't provided via clojars, i should probably remove core.match from clojars.
15:48 Null-A: in Clojure? no
15:48 Null-A: dnolen: I thought so, thanks
15:48 foodoo: dnolen: I think the good thing about clojars is that Leiningen can easily pull dependencies from it. I don't know if it supports git urls.
15:50 Null-A: dnolen: Is there any way to reset relation and index state in core logic? like retract-all-facts?
15:50 dnolen: foodoo: [org.clojure/core.match ...] will work fine
15:50 Null-A: just redef the relation
15:50 Null-A: dnolen: hm, i tried that, but it didn''t work, i'll try again
15:50 dnolen: Null-A: there's no way besides that at the moment
15:53 zakwilson_: ibdknox: does korma know anything about postgres hstore?
15:55 Null-A: dnolen: Yah I get null pointer exception with var-get, then fact in stack trace
15:55 dnolen: I put the defrel inside a function
15:55 dnolen: Null-A: probably not a good idea, defrel is meant to be top level
15:56 Null-A: hm, makes it hard to retract facts then dynamically
15:56 i wrote a hack to do it anyways
15:56 but it's not patch worthy
15:57 tscheibl: from a functional programming standpoint, is it wise to adhere to the "with" paradigm as e.g. applied in clojure/java.jdbc? ... or is it generally better to pass explicit arguments to functions and use dynamic var binding for commonly required data in a local context where you often just split functionality over separate functions not to facilitate code reuse but to increase readability?
15:57 dnolen: Null-A: patch welcome, the defrel/fact stuff could use some attention from someone - don' t have the bandwidth for it at the moment
15:58 Null-A: dnolen: actually I just got it working by binding *ns*
15:58 I guess *ns* is not available during runtime
16:14 tscheibl: I'd rather not apply the patch given ^
16:15 tscheibl: dnolen: so it would be more adequate to fix the compiler?
16:15 ivan: Google will tell you that putting non-ASCII in your .js is wrong
16:15 IE does Noncharacter->replacement char in other places as well, like XDomainRequest responses. seems to hate them.
16:16 Null-A: dnolen: just submitted two patches on jira
16:16 dnolen: tscheibl: I'm not clear on what has to be done - do you have a proposal?
16:16 Null-A: thx
16:20 dakrone: tb
16:21 tscheibl: dnolen: as you can see by running the tests I've attached it only happens when the code does not get optimized by the google closure compiler. So ClojureScript somehow converts the \u unicode representations to their utf-8 equivalents which makes (only) IE behave the described way (considering the "characters" of the mentioned unicode range as equal). What I would do is to fix the ClojureScript to Java compiler not to do the converion as it happens when
16:21 switched to a google closure optimization mode.
16:21 Null-A: i've noticed C-xC-k is much faster in emacs24
16:22 tscheibl: dnolen: otherwise it's not possible to test non trivial ClojureScript apps in "development mode" on IE
16:24 dnolen "non trivial" was probably not the correct phrase... it starts to fail when it has to distinguish between symbols and keywords
16:25 e.g. when doing read-string containing keywords
16:25 dnolen: tscheibl: I agree it's a big problem. Just not clear to me where the problem is occurring in Compiler. Perhaps an artifact of Java strings?
16:29 tscheibl: dnolen: I could have a look at the ClojureScript compiler (in the meantime I should be fit enough with Clojure to understand what's going on) when I find some time, the next 2 days I will be quite busy in trying to satisfy a "nasty" customer.. but afterwards
16:30 dnolen: tscheibl: please do, what precisely does GClosure do to those chars under optimization?
16:30 tscheibl: nothing.. that'S the point
16:30 dnolen: it leaves the /u notation untouched
16:30 ivan: I think GClosure turns all UTF-8 into \u escapes
16:31 tscheibl: .. or maybe reencodes it from the utf-8 strings the ClojureScript compiler produces
16:31 ivan: can't you stick more backslashes in ClojureScript somewhere? ;)
16:31 mi6_x3m: can someone explain to me exactly what keywords are
16:31 I know they resolve to themselves
16:31 tscheibl: ivan: nah.. it's not Windows :D
16:32 mi6_x3m: what is their type
16:32 dnolen: tscheibl: oh ok, then probably a result of not escaping Java strings seems like an easy fix. Will look into, thanks for the clarification
16:33 ,(class :foo)
16:33 clojurebot: clojure.lang.Keyword
16:33 dnolen: mi6_x3m: ^
16:33 mi6_x3m: dnolen: do you happen to know what the type consists of?
16:33 some string description of the keyword?
16:33 some identifier?
16:34 mi6_x3m: dnolen: ah, okay, sorry, I am all new to this stuff
16:39 ibdknox: zakwilson: it knows no vendor specific things
16:40 zakwilson: ibdknox: I thought not. It seemed very confused by my attempt to give an hstore field a map.
17:12 mrevil`: what should I be googling to find examples of mocking in midje?
17:12 TimMc: mrevil`: Alex Baranosky's email address.
17:20 Null-A: i'm having font-lock issues with emacs24 while editing clojure, has anyone else run into this?
17:24 wthidden: Null-A: what plateform is emacs running on?
17:24 Null-A: wthidden: osx
17:25 it's odd, it wasn't happening until I recompiled clojure-mode
17:25 i might have upgraded slime in the process
17:25 dnolen: Null-A: I've had no problems
17:25 Null-A: hm
17:25 i'll keep playing
17:26 wthidden: Null-A: hmmm, i've had little experience with OSX. I've had some issues in the past with linux
17:26 Null-A: what is the error/symptom?
17:26 Null-A: wthidden: The coloring gets messed up as I type stuff
17:26 wthidden: e.g. it doesn't really fix coloring when I use paredit to unquote strings
17:26 wthidden: Null-A: are you using color-themes?
17:27 Null-A: wthidden: yes but I tried without , and no difference
17:28 wthidden: Null-A: do you have some font-lock setting set in the customize section of your .emacs?
17:28 Null-A: oh I might
17:28 i'll try removing it
17:29 wthidden: Null-A: I sometimes get over zealous with customize setting ... and thus conflicts
17:33 Null-A: wthidden: it's working now, but I need to wait longer to make sure
17:35 mi6_x3m: can someone explain to me whz
17:35 why* (def myfunc (fn [w] (count w))) is different than
17:35 wthidden: Null-A:good luck.
17:35 mi6_x3m: (defn myfunc (count w))
17:35 Null-A: wthidden: thanks
17:39 wthidden: mi6_x3m: well the first thing that jumps out to me is that your defn is form is ill-formed.
17:39 mi6_x3m: wthidden: yes, I know I missed [w]
17:39 it's a general question
17:40 brehaut: ,(macroexpand '(defn mf [x] (count c))) ; mi6_x3m
17:41 technomancy: mi6_x3m: defn will give you better stack traces
17:41 clojurebot: #<Exception java.lang.Exception: SANBOX DENIED>
17:41 brehaut: ,(macroexpand '(defn mf [x] (count x)))
17:41 clojurebot: #<Exception java.lang.Exception: SANBOX DENIED>
17:41 technomancy: the only practical difference is the metadata attached to the function
17:41 brehaut: bah, ##(macroexpand '(defn mf [x] (count c)))
17:41 lazybot: ⇒ (def mf (clojure.core/fn ([x] (count c))))
17:41 mi6_x3m: technomancy: OK, thank you very much
17:45 dhmdhm: /_dhm
17:49 amalloy: technomancy: better stacktraces, really?
17:49 technomancy: amalloy: well, you could put a name inside your fn as well
17:50 ibdknox: you get the name of the function
17:50 technomancy: but a nameless fn sucks to see in a stack trace
17:50 pandeiro: is it possible to test cljs macros at the browser repl?
17:50 ibdknox: not that I'm aware of
17:51 pandeiro: ibdknox: can't get defpartial to work and dunno how to debug it
17:51 amalloy: mmmm, i don't think that's true, technomancy
17:51 dnolen: pandeiro: something that could be solved by some kind of reflection facility
17:51 ibdknox: pandeiro: get the latest crate
17:51 amalloy: (def f (fn ...)) compiles the function into a class named user$f
17:52 ibdknox: pandeiro: there was a bug in defpartial
17:52 amalloy: there's special magic in the compiler's handling of (def ...), that checks if the value is a (fn) literal and calls compileForDefn instead of just compile
17:52 pandeiro: ibdknox: thanks
17:54 technomancy: amalloy: huh; I guess that makes sense
17:54 I wish it went the other way where the fn would get the metadata from the var =(
17:54 ibdknox: +1
17:55 technomancy: no arglists make for sad pandas
17:56 pandeiro: ibdknox: what are the special crate group attrs useful for?
17:56 ibdknox: pandeiro: if you use jayq you can then do things like ($ my-partial)
17:57 and bind events, or animate, or whatever
17:57 and it will take effect on anything that is created by that partial function
18:06 pandeiro: ibdknox: still no luck w/ defpartial
18:06 ibdknox: maybe I didn't push
18:06 pandeiro: looks like it's expanding into a call to crate.html()
18:06 but it returns undefined
18:07 emezeske: pandeiro: do you have a (:require crate.core :as whatever) ?
18:07 pandeiro: emezeske: yep
18:07 emezeske: pandeiro: nm then! that's bitten me before. :/
18:07 pandeiro: but not sure i would need it right?
18:07 ibdknox: you do
18:07 pandeiro: k
18:08 emezeske: yeah, anything that the macro's output references must be available :(
18:08 ibdknox: pandeiro: you restarted cljsbuild and and saved that file to get it to recompile, right?
18:08 emezeske: pandeiro: could also do a "lein cljsbuild clean" first
18:08 pandeiro: ibdknox: still hacking on top of one but yeah it has a handler that rebuilds cljs every time
18:08 let me empty the browser cache too (for some reason chromium is caching js randomly)
18:09 ibdknox: pandeiro: I have this crate and it works: crate-0.1.0-20120214.022223-8.jar
18:10 pandeiro: ibdknox: i have the master from github as of now, should be good?
18:10 ibdknox: hm
18:11 pandeiro: ibdknox: k
18:11 ibdknox: pandeiro: pull
18:12 I should automate that so that I can't lein push without commiting and pushing
18:13 people haven't been working against my source much, so it's never been an issue before
18:13 pandeiro: ibdknox: something's weird, the js looks fine but it still returns undefined... probabl something on my end
18:14 ibdknox: i am still working on something with one, soon i'll mix up my workflow for cljsbuild and jars and stuff
18:14 ibdknox: pandeiro: it's pretty darn easy these days
18:15 especially with the classpath stuff it's even easy to do the externs and whatnot
18:15 pandeiro: ibdknox: i admit the externs convo scared me
18:15 ibdknox: pandeiro: it's easy :)
18:16 pandeiro: just have to add :externs ["externs/jquery.js"] to your cljsbuild params
18:16 pandeiro: ibdknox: you are pushing the jayq pretty hard :)
18:16 ibdknox: and done
18:16 eh, not really
18:16 just trying to convince people that things have gotten better/much easier
18:17 pandeiro: ibdknox: i will definitely try it, tell me though can it automate compiling a dev and production version like one does?
18:18 ibdknox: the only difference is :advanced vs. :simple, right?
18:18 pandeiro: yeah
18:18 ibdknox: sure
18:18 pandeiro: i run into some weird stuff with :advanced so i'm testing it every commit to avoid having to track down stuff after
18:19 ibdknox: you just need to switch a keyword in your project file
18:19 it's easy enough to have that happen based on env vars or something
18:19 technomancy: babilen: (range) is infinite
18:19 pandeiro: ibdknox: yeah could be in the repl module maybe
18:19 technomancy: if you interleave a finite seq with an infinite seq, you get an infinite seq =)
18:20 pandeiro: but i think one had an interesting idea putting that scaffolding around the app in the browser
18:20 technomancy: which is weird because map operates on two seqs but stops when one runs out
18:20 ibdknox: pandeiro: what do you mean?
18:21 pandeiro: ibdknox: well they have a handler doing advanced compilation wired up to a link on the top bar
18:21 technomancy: hm; I guess it should still work with laziness though
18:21 ibdknox: oh
18:21 pandeiro: so when you test dev, you just right click a link to test advanced in another tab, done
18:21 ibdknox: I see
18:21 pandeiro: it's clever since you have to be at the browser anyway to test
18:22 rather than having to go into the repl or project.clj specifically just to do that
18:22 emezeske: ibdknox: I just had an idea. What if I made lein-cljsbuild hook into the "lein deps" task, and clean/rebuild when that happened
18:22 ibdknox: Would that make life easier when dealing with rapidly changing upstream jars?
18:22 babilen: technomancy: Yes, sure. But why does it work when I run it in the repl? And shouldn't all these functions return lazy-seqs anyway? (so the indefiniteness doesn't matter) -- I mean "(take-while #(= (first %) (second %)) (partition 2 (interleave (range) [0 1 2 2])))" works fine.
18:23 ibdknox: emezeske: you should talk to technomancy, not sure if things are supposed to hook deps
18:23 emezeske: it seems like a good idea to me though
18:23 pandeiro: something like that would have to operate closer to the server level
18:23 emezeske: ibdknox: thanks
18:23 pandeiro: ibdknox: yeah exactly, one is doing all compilation at the server
18:24 ibdknox: pandeiro: I've been considering bringing noir-cljs back, which could easily mimic that behavior
18:24 emezeske: technomancy: see my note above about cljsbuild hooking into "lein deps" ? does that make sense?
18:24 pandeiro: ibdknox: just tie it altogether into the ultimate framework, man :)
18:24 ibdknox: lol
18:24 babilen: technomancy: I just don't understand the difference in behaviour (emacs, clojure-jack-in, clojure 1.3 if that matters)
18:24 ibdknox: pandeiro: if I had more time I would ;)
18:24 technomancy: babilen: aha
18:24 you got slimed
18:24 TimMc: :-D
18:24 technomancy: babilen: starts-with-seq? vs starts-with-subseq?
18:25 must have had a stale definition left in the repl
18:25 babilen: *sigh*
18:25 technomancy: happens to everyone =)
18:25 babilen: damn
18:25 technomancy: emezeske: seems reasonable
18:26 babilen: technomancy: Thanks -- At least I am not crazy, just tired.
18:26 technomancy: emezeske: in lein2 there's a way to register your task as something that runs before every eval-in-project form. would that be sufficient for your use case?
18:27 * technomancy makes a note to mention this in the plugin guide
18:27 emezeske: technomancy: yeah, I think that could work, although it might be overkill
18:27 technomancy: thanks.
18:27 technomancy: emezeske: you could keep a checksum and only rebuild if you detect a change
18:29 emezeske: technomancy: you are some kind of genuius
18:29 technomancy: and a genuius is better than a genius
18:29 technomancy: why didn't I think of that? *sigh*
18:30 technomancy: thanks! that will make things way better.
18:30 technomancy: emezeske: heh, well it's a bit more work, but if the delay is noticeable then it's worth the bother
18:30 emezeske: we do a checksumming of :dependencies in lein deps in 1.x; feel free to steal the codes =)
18:31 emezeske: technomancy: the problem people have with cljsbuild now is that if an upstream jar containing cljs is updated, it doesn't trigger a rebuild
18:31 technomancy: using a checksum will make that work like it should
18:31 technomancy: cool, I'll peek at that code!
18:31 muhoo: geeeeeenius
19:38 * emezeske smacks hithub in the forehead.
19:38 * emezeske smacks github too.
19:40 TimMc: Can't push?
19:40 emezeske: Haven't tried that, but I'm getting 500s on the web ui :/
19:40 brehaut: TimMc: i recall hiredman saying that you have to do the dispatch yourself somehow for proxies in that situation
19:40 TimMc: brehaut: Huh?
19:40 dgrnbrg: Is there a protocol I can implement so that I can work w/ keywords as map accessors?
19:41 brehaut: TimMc: unfortunately it was a few weeks ago so i have forgotten the details
19:41 TimMc: Was this in this channel?
19:41 brehaut: yeah
19:42 gtrak`: anyone managed to get the midi example working with overtone? I can't tell if it's taking in notes, and I can't get the defsynth to play on its own
19:43 TimMc: brehaut: Found it, but that's about overriding, not overloading.
19:43 brehaut: TimMc: oh, sorry my bad
19:44 TimMc: im pretty sure proxies are a map under the hood; (as you can monkey patch the methods later) its possible you need to provide a single function that implements both overloads
19:45 TimMc: ugh
19:45 brehaut: (invokePrim ([^long p_312] …) ([^double …] …)) ?
19:45 TimMc: Let me try that.
19:45 Wait... that doesn't make sense, does it?
19:45 THat only allows one return type.
19:46 brehaut: that does appear to be a downside of that approach
19:46 TimMc: brehaut: "CompilerException java.lang.RuntimeException: Can't have 2 overloads with same arity"
19:47 brehaut: timm: oh of course. sorry :/
19:49 amalloy: dgrnbrg: ILookup or Associative or something. just check the source of clojure.lang.*
19:49 brehaut: TimMc: it defintely looks like it collects up all the methods as functions and sticks them into a map
19:50 amalloy: yes, ILookup
19:50 dgrnbrg: amalloy: thanks
19:50 but eit! github is down
19:51 where else is the sourceR?
19:52 amalloy: cloned on your machine, i strongly suggest (in future). way easier to navigate your local filesystem than a bunch of point-and-click on github's web ui
19:53 TimMc: yup
19:53 Got tired of clicking around, finally cloned EVERYTHING.
20:05 dgrnbrg: I like clicking :)
20:05 i have rsi; it's a nice break
20:07 TimMc: OK. WELL THEN.
20:08 brehaut: Any idea how to get around this?
20:09 brehaut: TimMc: no sorry. i got lost spelunking into the innards. you'll need to find someone more knowledgable i think
20:09 TimMc: I think deftype will allow hinting...
20:09 brehaut: that does sound right
20:09 amalloy: deftype allows the same things reify does, right?
20:09 TimMc: I'll need to redo the same stuff AFn does for IFn, but whatever... :-(
20:10 amalloy: i wouldn't deftype here unless you have to; they both have the same relevant features
20:11 TimMc: Ah, reify gives an object back, I see.
20:13 mdeboard: amalloy: Is that you introducing cemerick here http://
20:13 amalloy: no
20:14 brehaut: stuart sierra isn't it?
20:14 amalloy: right
20:14 brehaut: also is the full vid of that up yet?
20:14 mdeboard: brehaut: of?
20:15 brehaut: cemerick's presentation; it was abbreviated by accident i think
20:15 mdeboard: no idea where these talks were held
20:15 oh yeah looks like it's 13min long
20:15 brehaut: clojure conj 2011, in reaiaealeigh NC i think
20:15 mdeboard: oic
20:17 amalloy: good hedging there
20:19 or maybe you were just making fun of pronunciation? i thought you were unsure which mess of vowels to use
20:20 brehaut: amalloy: i have _no idea_ how its pronounced at all
20:20 and i can never remember how its spelt
20:21 amalloy: raleigh, pronounced rah-lay or rah-lee, by geography
20:21 not that there's any reason you should care, i suppose
20:21 brehaut: oh right. thanks
20:21 i hear it has a cool lemur zoo
20:22 TimMc: R'lyah
20:22 brehaut: F'tagn TimMc
20:50 citizenparker: emezeske: You around? Had some questions on lein-cljsbuild
20:50 (which is great, btw)
20:55 emezeske: citizenparker: Yeah, what's up?
20:57 citizenparker: I noticed you have an open issue around the possibility of incorporating a repl command into that plugin
20:57 Have you actually going a ClojureScript repl to work with files built from cljsbuild today?
20:57 emezeske: citizenparker: Funny you should bring that up; I was just thinking about working on it tonight
20:57 citizenparker: Ha!
20:57 emezeske: citizenparker: No, I haven't messed with CLJS repls yet
20:57 citizenparker: But I am forming a plan
20:58 citizenparker: Some solution would be great. I love the plugin, but I haven't managed to get a repl connected via the generated files
20:58 I'm guessing it's because cljsbuild compiles them all down into one file, which the clojurescript wiki advises against
20:59 emezeske: citizenparker: Do you have a link to the "advises against" part?
20:59 citizenparker: Yeah, one sec
20:59 ibdknox: citizenparker: that shouldn't matter
20:59 I've definitely run the REPL after it's compiled everything into one file :)
21:00 citizenparker: https://
21:00 ibdknox: Oh? Maybe I'm missing something obvious then, hmm
21:00 ibdknox: with cljsbuild? or with clojurescript proper?
21:01 ibdknox: with cljs-watch, but that's equivalent to cljsbuild at this point
21:01 either way though, the files shouldn't really matter so long as that call to start the repl exists :)
21:02 citizenparker: Good to know! I'll recheck my work again. When I was trying with the cljsbuild output, I was getting some truly obscure JS errors upon loading the page
21:03 I thought that went away when I went to a pure clojurescript approach, but I could have changed something else along the way
21:03 emezeske: citizenparker: If you check back later, I plan to have something basic working in cljsbuild soon to make repls easy
21:03 citizenparker: Oh man, that would be dreamy
21:04 And I think would really help ease the barrier to cljs adoption
21:05 emezeske: Yeah, should be handy
21:10 cjfrisz: So it seems that function definitions with "defn" created inside the scope of another function are visible outside the enclosing function's scope in Clojure.
21:11 This doesn't jive with my notions from Scheme that a procedure defined in the scope of another is only visible within the enclosing scope.
21:11 Is this a feature or a bug in Clojure?
21:11 technomancy: in Clojure anything that starts with "def" shouldn't be called anywhere but the top level
21:11 amalloy: a bug in scheme </troll>
21:11 technomancy: if you want locals, use let.
21:12 the difference between locals and "globals" in Clojure is much bigger than it is in most languages
21:12 amalloy: cjfrisz: that's a special-case rule in scheme that only applies to defines at the *very beginning* of a procedure, to avoid having to write a let or something
21:12 which is pretty gross imo
21:13 cjfrisz: amalloy: Er...that's not true
21:13 It doesn't have to be the very beginning of a procedure.
21:14 zakwilson: I've seen defun used non-toplevel in Common Lisp a few times. Those are global and were intended to be by the programmer in question.
21:14 cjfrisz: And it's just a stylistic difference as to whether that looks nice ;-)
21:14 shaunxcode: I think he means not nested lower?
21:14 amalloy: it's only guaranteed to behave the way you want at the beginning. scheme implementations may choose to make it work elsewhere, but it's not standard-compatible. that's my understanding from reading SICP, but i'm not a scheme expert
21:15 cjfrisz: I don't think that's true, but I'm not 100% sure, either.
21:15 amalloy: some quick googling confirms, with text like: Some implementations of Scheme permit definitions to occur at the beginning of a <body> (that is, the body of a lambda, let, let*, letrec, ordefine expression)
21:15 arohner: cjfrisz: in clojure, def and let have different semantics in clojure, so they're named differently. def always creates a global, regardless of where you call it
21:16 amalloy: There's a restriction on internal defines--they must be at the beginning of the procedure body (or the beginning of another body, like a letbody, before the normal executable expressions in the body.
21:16 cjfrisz: amalloy: They still don't break lexical scoping, which is the issue I'm concerned with
21:17 amalloy: "break"
21:17 there is no breaking going on. you're using def, which is for globals. in scheme, some define forms happen to not define globals; i don't see how either of these involves breaking anything
21:18 cjfrisz: Ahh, ok
21:18 arohner's answer is the one I was looking for.
21:19 That was not intended as a troll, btw
21:19 I'm sorry if it came off that way.
21:20 I wasn't aware of the distinction of def for globals and was seriously concerned about the sanctity of lexical scope.
21:20 amalloy: no, i was </troll>ing myself for saying it's a bug in scheme
21:21 it's obviously not, it's just a feature i don't like the flavor of
21:21 cjfrisz: I'm a recent Clojure convert and I'm noticing that there's a marked difference between Scheme and Clojure style.
21:22 Schemers find internal defines to be perfectly nice.
21:22 Not that either is wrong!
21:40 gtrak: success with the midi!
21:45 jkdufair: technomancy: I believe i have a fix for lein and cygwin. what's the best way to test? lein jar of swank-clojure then just copy to plugins dir? or is it more complicated than that?
21:45 i should say for swank-clojure and cygwin
21:59 dgrnbrg: Is it possible to get all the semantics of defrecord but override the ILookup interface provision?
22:01 cjfrisz: Stylistic question: is it standard to do all function-level documentation as docstrings?
22:02 I've got some namespace-local functions, and I can't tell if it's silly to document them with docstrings instead of comments.'
22:03 duck1123: if you use docstrings, then those docs can be accessed from c.repl/doc and others
22:04 TimMc: cjfrisz: docstrings are standard
22:04 duck1123: so even if it's a private function, it's still worth it to put it in the docstring when you document
22:04 cjfrisz: Alright
22:04 TimMc: Comments can't be retrieved programmatically.
22:11 dgrnbrg: How do you override a function with multiple arities with deftype?
22:12 (deftype … IProtocol (fnname ([arglist1] body1) (arglist2 body))) doesn't seem to work
22:19 this is very sticky…I want all the features of defrecord except for the ILookup
22:19 but if I use deftype, I have to write a tremendous amount of code that should be autogenerated
22:22 alexbaranosky: one option might be to make your on macro for it if you have to do it more than once
22:22 dgrnbrg: I could copy the code out of clojure.core
22:22 but that seems unfortunate
22:22 is there a good way to delegate with reify?
22:22 or some other macro/lib, similar to Groovy's @Delegate?
22:23 alexbaranosky: nothing like @Delegate as far as I know
22:23 dgrnbrg: hack it is, then
22:27 TimMc: OMG, what the hell is clojure.lang.Util/ret1 doing
22:27 and why does clojure.lang.AFn/applyTo use it?
22:27 Is that some sort of bizarre GC trick?
22:29 alexbaranosky: TimMc, you're in the belly of the beast, man
22:31 TimMc: Anyone know if fn args undergo locals clearing like let bindings do?
22:32 cemerick: TimMc: I believe so, yes.
22:34 TimMc: Phew, I think that I can ignore Util/reet1 then.
22:35 Context: There's a "tail call" in a Clojure core Java file which includes Util.ret1(arglist,arglist = null) -- arglist is one of the function's arguments.
22:35 Util.ret1 simply returns the first argument.
22:42 amalloy: TimMc: that's how locals clearing is accomplished
22:43 on the java side, that is (i believe. not sure about any of this)
22:43 you call ret1, passing it a pointer to your thing, and then clearing your own pointer to it
22:44 String x = "data"; someMethod(x); // x can't be GCed until someMethod finishes, because it's in your scope
22:45 String x = "data"; someMethod(ret1(x, x = null)); // now x isn't referred to locally anymore when someMethod is running
22:45 cemerick: what amalloy said
22:46 * cemerick adding value at every turn :-P
22:46 amalloy: cemerick: you saved me the trouble of "just in case cemerick says anything, he'll be right"
22:47 cemerick: ha!
22:47 clojurebot: Pardon?
22:47 cemerick: I fall down faster than anyone else I know.
22:51 Tcepsa: I'm a little confused, if you're up for explaining this a little further. While I realize that x no longer points to whatever it was x pointed to (e.g. the string "data"), won't that thing still be ineligible for GC while someMethod is on the stack? If so, then what's the point? (If not, how come?)
22:52 amalloy: someMethod might decide it no longer needs its reference to data, clear it, and then keep doing other work
22:52 Tcepsa: Oh! At which point it can be GC'ed because the calling function no longer has a reference to it. Got it, thanks! ^_^
22:56 amalloy: right. that's an important part of how lazy sequences work - otherwise the closures they create would keep references to the closed-over variables indefinitely
22:58 TimMc: I was partly having trouble with order-of-operations in the call to ret1.
22:58 But that's Java for you. -.-
22:58 amalloy: function calls go left-to-right
22:58 just like in clojure
22:58 TimMc: I eventually decided that there was only one interpretation that would be useful, so I went with that...
22:59 amalloy: i was actually surprised in both cases that the left-to-right order is guaranteed
23:01 TimMc: I guess the JVM is putting evaluated args on the stack left to right, then invoking the method.
23:22 java.lang.ClassNotFoundException: Object
23:23 I should really be going to bed.
23:24 (Yes, it should be java.lang.Object)