0:08 AWizzArd: is (ensure ref) basically a lock?
0:19 arohner`: is there a good way to prevent "overwrapping" your arguments because of &rest args?
0:19 i.e. (defn foo [& args] args) (foo (foo (foo 1))) => (((1)))
0:20 or am I doing something wrong by getting into that situation?
0:30 AWizzArd: What would you expect should (foo (foo (foo 1))) return?
0:31 arohner`: I'm not sure. I'm just not aware of a clean solution to the problem
0:32 I could say "if the rest argument is already a list, don't add another list around it", but that is very ugly
0:33 AWizzArd: I don't see the problem
0:33 If you do [& args] it means args will be a list.
0:36 Asking "IF the rest argument is already a list .." makes not too much too much sense as it will always be one.
0:37 arohner`: I'm not sure if/where the problem is. All i know is that I'm passing arguments from one rest parameter to another, and I end up with big nested loops.
0:37 i.e. that (foo (foo (foo 1))) example. I started with 1 by itself, and ended up with (((1)))
0:38 AWizzArd: oh, maybe you want to magically have the parens around the argument to be removed?
0:38 (some-function rest) ==> as if you said: (some-function 10 20 30) and not (some-function (10 20 30))?
0:39 arohner`: yeah, sort of
0:39 AWizzArd: (apply foo (foo 1)) ==> 1
0:39 arohner`: I'm not sure what the right solution is
0:39 AWizzArd: you need to apply these arguments, that's the right solution
0:39 you can not solve it otherwise
0:39 arohner`: huh. ok.
0:39 I'll try that
0:39 thanks
0:40 AWizzArd: apply is a "magic function" that you can not implement yourself for the current "level" of programming.. You would need to provide one for an interpreter inside your language.
0:40 (+ 1 2 3) = (apply + '(1 2 3))
1:12 Lau_of_DK: Morning all! =)
6:31 alvin-x: when I run this snippet: http://
6:31 is this a java thing or a manifestation of clojure's lazyness?
6:31 . out* not output
6:32 tWip: I think that's just bufferedwriter
6:32 alvin-x: probably
6:39 it happens at the FileWriter level too; no output without flush/close.
6:43 tWip: what os?
6:43 alvin-x: win32
6:44 tWip: doesn't windows lock files that are open for writing?
6:46 alvin-x: i'm not sure; have to dig in MSDN. i just expect all buffered data to be written out on process exit.
6:46 cemerick: that's definitely not something to be relied upon
6:48 alvin-x: isn't that supposed to happen in unix/posix at least?
6:49 my process cleanly exited --- didn't die by a fatal signal or exception;
6:50 cemerick: I don't know about posix exit semantics, but no VM I've worked with will guarantee that anything is cleaned up before it exits.
6:51 alvin-x: hm
6:51 cemerick: Actually, most specify that you should expect buffered data, finalizers, etc., won't be flushed/run/whatever
6:52 Chousuke: doesn't cost anything to just close everything at the end anyway :)
6:54 alvin-x: not easy to know where "end" is sometimes, without a destructor mechanism...
6:55 no matter, i'll just flush whenever i write
6:55 cemerick: that's what finally blocks/forms are for
6:56 flushing on every write essentially eliminates the benefits of buffering
6:59 alvin-x: is there some form in clojure that i could use to ensure file closing?(with-open ?
7:01 :)
7:02 cemerick: yeah, with-open will automatically close the Closable object you bind in it
7:02 I don't think there's a form that will autoflush, but most (if not all) outputstream impls flush on close iirc
7:04 alvin-x: ha, this will work for JDBC too. nice.
7:05 jao: hi. in slime, when i compile a file (C-cC-k) and get errors, the compiler-notes window pops, but i cannot navigate from there to the error locations. is that normal?
7:05 cemerick: alvin-x: yes, indeed
8:38 rhickey: anyone want to tackle a simple pprint for Clojure?
8:47 jdz: that would be nice as hell :)
8:47 cemerick: and very helpful in enclojure
8:47 alvin-x: and probably non-trivial
8:48 jdz: well, one could learn a lot from CL's pretty-printer
8:48 rhickey: a first cut could be much less ambitious yet useful
8:49 jdz: like support for print-width and print-length
8:49 and depth
8:49 rhickey: jdz: yes
8:49 hoeck: and printing 'foo instead of (quote foo)
8:51 rhickey: I just don't see when I'll get time to do it myself
8:51 jdz: i could try doing it, but must finish a paper in a week...
8:51 and then there is some work queued after that...
8:51 rhickey: Wow - Clojure group just crossed 700 members and 5k messages
8:54 Chousuke: it says here it has 698 members.
8:54 rhickey: My admin screen says 712
8:54 Chousuke: I guess it hasn't updated yet, then
8:55 I just added myself.
8:55 cemerick: db consistency isn't key on g-g :-)
8:56 jdz: cemerick: consistency does not like concurrence
8:58 Chousuke: I keep dreaming of making a roguelike game in clojure but I don't have enough time to get started :/
8:58 cemerick: I'd say that scalability is more the driving factor, but sure :-)
8:58 Chousuke: it'd just be so much fun to include a repl in-game
9:39 lisppaste8: j-dot pasted "*ns* binding" at http://
9:40 j-dot: Does anyone know why, in the code I just pasted, the 'bar var is set in the 'user ns instead of the 'foo ns?
9:41 How do I go about def'ing a var in another namespace from within a 'do or 'binding expression?
9:42 wwmorgan: j-dot: (resolve 'bar) is nil when I run it. Could you have def'd it in user earlier?
9:43 Chouser: yeah, it's because *ns* controls the namespace resolution at compile time, so the original value is used when compiling that whole expression. By the time you actually bind and use in-ns to set it, it's too late.
9:44 j-dot: ah, I see ... thanks, Chouser
9:44 rhickey: j-dot: you need to control the ns where the code is compiled - the entire expression is compiled in the user ns, and def resolved there, then you execute the expression, getting runtime effects that don't matter
9:44 j-dot: That makes sense, thanks
10:08 rhickey: looking at proposed do-with, what is the preference - add do-with or breaking enhancement to doto (you'd just have to add . before method names)
10:08 * rhickey would prefer to just have one doto
10:09 H4ns: rhickey: better modify doto than having two things that do something subtly different in the base language
10:09 Chouser: I'd be content with a breaking change
10:09 H4ns: (certainly, i don't have a large code base that will break)
10:10 Chouser: esp. if it's coming at roughly the same time as a bunch of other simple structural breaking changes (like vectors for binding in if-let, deseq, etc.)
10:10 Lau_of_DK: Good afternoon gents
10:10 Chouser: Lau_of_DK: hi
10:25 walters_: rhickey: is the asm code in clojure a permanent fork or is it safe to use the system asm library?
10:27 charliekilo: aplogize upfront ... I'm watching Cojure for Java Programmers ...I got everything installed (Clojure, Aquamacs, clojure-mode), can bring up inferior-lisp, butr CAN'T figure out how he does that two frames trick with evaluate line in clj document in the inferior-lisp evaluator ... what's the magic key combination?
10:28 Lau_of_DK: The default in emacs is Ctrl-X Ctrl-X I believe
10:29 rhickey: walters_: it's not really a fork, just a snapshot, using a more current version is really a matter of compatibility between ASM versions - what are you trying to achieve?
10:29 tWip: I think it is C-M-x
10:29 walters_: rhickey: we (Fedora) try to avoid shipping duplicated source
10:31 rhickey: walters_: do you ship multiple versions of things?
10:31 walters_: rhickey: yeah, asm2 and asm3
10:31 Chousuke: charliekilo: two frames? do you mean how inf-lisp is at the bottom and the file buffer is at the top?
10:31 charliekilo: neither C-X C-X or C-M-x does not work for me ... is that part of Emacs or clojure-mode
10:32 Chousuke: do you have the clojure repl running?
10:32 charliekilo: Chousuke: yep ... like he does in the video ... top has (. Math PI) and I'm truying to have 3.14... show up in bottom
10:33 Chousuke: C-x C-e works for me
10:33 rhickey: walters_: the clojure asm is just a subset, just what's needed for Clojure runtime, done for size and ease of building
10:33 charliekilo: Chousuke: the bottom has 'user=>' running and I can eval stuff there ...
10:33 walters_: rhickey: aright, i may try to do a patch then to optionally build vs system asm
10:34 rhickey: walters_: ok
10:34 Chousuke: charliekilo: then you should be able to use C-M-x or C-x C-e to evaluate forms in any buffer that's in clojure-mode
10:34 charliekilo: if your buffer is in clojure-mode you should see a clojure menu in the menubar when the buffer is active
10:36 charliekilo: Chousuke: ahh ... it top window one was not in clujure mode ... it works now ... awesome!! ... thanks alot !!!!
10:39 rhickey: walters_: are you going to use jarjar or something to allow multiple libs to use different ASMs?
10:40 walters_: rhickey: that one is a bit of a mess; i think language implementations should probably use a private classloader for now; hopefully the Java 7 module stuff will sort this out somewhat more
10:41 rhickey: walters_: I think private classloader is a non-starter, as classloader issues usually push up to library consumers, containers etc
10:41 gnuvince: rhickey: the "Differences with other lisps" page mentions that the Clojure reader is side-effect free. I'm curious about the kind of side effects the CL reader has; it seems like this ought to be a pure function, take in a stream of characters and produce a data structure.
10:41 rhickey: that's why you see private-packages ASM
10:42 gnuvince: the CL reader interns symbols
10:42 walters_: rhickey: well, you could only use the separate classloader for the compiler, the generated bytecode would still be loaded in the main classloader, i think that would avoid most issues
10:43 rhickey: walters_: it gets really sticky, but the consumer often dictates classloaders, so I've been striving to reduce any dependencies on my own
10:43 walters_: rhickey: understood, yeah
10:44 rhickey: I don't see a compelling reason not to sub-package ASM, it's so small
10:57 lisppaste8: Lau_of_DK pasted "Euler52 - Sequences" at http://
10:57 Lau_of_DK: Gentlemen, I have a case here, were all my debug-steps work as they should, but when I try to produce the end result by parsing a seq of seqs, I get an incorrect output. Can somebody show me the error of my ways ?
11:01 Chouser: Lau_of_DK: can you include an example of find= working?
11:02 Lau_of_DK: Working?
11:02 Chouser: you have an example of it producing incorrect results, right? Can you include and example of it producing correct results?
11:03 Lau_of_DK: No, because if it did produce correct results, we wouldnt be having this discussion :) But its a modded version of this: http://
11:03 Chousuke: Lau_of_DK: nitpick: n-seq could be simply (iterate #(+ n %) n), no?
11:04 Lau_of_DK: If you replace the + with a * then yes :)
11:04 (btw., I like nitpicking, good to learn those things)
11:06 Chousuke: well, + is the correct function to get what your comment has. with * you get: (take 4 (mul-seq 3)) -> (3 9 27 81)
11:07 Lau_of_DK: oh ok
11:08 but, n-seq / map producdes the correct sequence
11:08 If you check the link to Euler, Im searching for the first hit where 1x n and 2x n ... 6x n, use the same digits
11:08 Chousuke: mapping works but the multiplication is unnecessary. :)
11:08 Lau_of_DK: so it needs to be (1 2 3) (2 4 6) (3 6 9) ...
11:11 Chousuke: whoops. accidentally evaluated a lazy sequence in the repl ;(
11:11 an infinite one, too
11:13 Chouser: Chousuke: not uncommon, unfortunately.
11:13 rhickey: *print-length* patch welcome
11:14 drewr: If I have a data structure of JdbcConnections that I set as available or unavailable in a ref, how what's the best way to block when all of them are busy?
11:14 s/how //
11:15 My gut is that Clojure will handle this automatically, but I want to make sure I set it up right.
11:17 rhickey: drewr: use j.u.concurrent for workflow: http://
11:17 maybe Semaphore?
11:18 but there is so much presumption in your question
11:18 another architecture is to put a fixed pool of resources in a queue - pull one off to work, put it back when done, will block on empty queue
11:18 I think that's better
11:19 Chouser: rhickey: you could just about maintain a todo list of things you're *not* going to do, that others could. pprint, *print-length*, due diligence on vector binding forms, etc.
11:20 drewr: rhickey: Thanks, that sounds like the behavior I want.
11:21 rhickey: Chouser: yes, definitely, just need to choose where. So far all of the free trac-like things I've seen allow anyone to enter tickets, e.g. Google Code
11:21 Chouser: rhickey: By the way, I spent last evening staring into Numbers.java. I think I get it now -- pretty clever set of indirections.
11:22 rhickey: Chouser: yeah, that still needs profiling
11:23 but so far perf is dominated by boxing rather than branching
11:23 Chouser: Before understanding what was going on there, Clojure script was doing (+ 1 (/ 5 2)) -> "15/2"
11:23 that's close enough, right?
11:23 rhickey: :)
11:29 Chouser: unless the todo list is going to be terrbily long or have high turnover, you might just keep a text file in clojure-contrib, or a message pinned to the top of the google group.
11:33 Lau_of_DK: No insights into my paste? :)
11:36 Chouser: Lau_of_DK: I've got it loaded in a repl, but haven't learned anything helpful yet.
11:39 rhickey: Clojure's ToDo list: http://
11:40 I didn't realize the thing I was using had public viewing ^^^
11:40 Lau_of_DK: Chouser, thanks, its good to know you're on it ! :)
11:40 Chouser: rhickey: heh.
11:40 drewr: rhickey: Nice!
11:40 rhickey: I'll split off requests for implementations into it's own list
11:42 its
11:43 Chouser: ah, that's good. Now I can know when to stop bugging you about patches I've sent in. :-)
11:44 drewr: Looks like LinkedBlockingQueue will do exactly what rhickey described.
11:56 http://
11:57 Bit of JSwat example at the end.
12:13 H4ns: another common lisper on the band wagon :)
12:16 Chousuke: Lau_of_DK: I think I found the problem
12:17 at least, I managed to modify the algorithm so that it produces 142857 which seems to be the correct answer.
12:18 Lau_of_DK: Can you enlighten me and annote ?
12:19 Chousuke: Lau_of_DK: your recur in find= seems incorrect
12:19 hircus: Lau_of_DK: hiyas
12:20 Lau_of_DK: hircus, hey man :)
12:21 Ok Chousuke, please annote so that I can try and understand
12:21 hircus: tried #76 yet?
12:21 Lau_of_DK: Not yet
12:21 I'm almost done with < 50's
12:21 hircus: pretty much the SICP count-change problem, but with the number of choices being high enough that it's impossible to brute-force it
12:21 Chousuke: after the first iteration seqs becomes ((2 3 4 5 6) (2 4 6 8 10 12) (3 6 9 12 15 18)), so you keep dropping the first element from the first sequence and sorting them until all the firsts match
12:21 hircus: ah, you're doing it sequentially; I just scatter-shot the problems :)
12:22 Chousuke: which in this case happens at 6 :/
12:22 Lau_of_DK: oh
12:22 oh yes I see, its only the first seq that I (rest)
12:22 How did you cure it?
12:23 Chousuke: I did (recur (map rest seqs))
12:23 Lau_of_DK: yea Im trying that now
12:24 Thanks Chousuke, I really appreciate you putting in the work, I had starred myself blind on it
12:24 How long did it take to compute on your system ?
12:24 Chousuke: hmm now I got a stack overflow error.
12:24 Lau_of_DK: How did you reach 142857 ?
12:26 Chousuke: apparently the sorting is needed to keep it from overflowing the stack
12:27 Lau_of_DK: Yea, for some reason, otherwise its quite redundant
12:27 Mine is still computing
12:27 Chousuke: really weird
12:28 is sort destructive?
12:28 Chouser: no
12:29 Chousuke: well what
12:29 lisppaste8: url
12:29 lisppaste8: To use the lisppaste bot, visit http://
12:31 digash`: http://
12:32 lisppaste8: chousuke pasted "weirdness" at http://
12:32 digash`: i like this trend
12:33 Chouser: digash`: nice. This will be fun to watch: http://
12:33 Chousuke: I also modified n-seq to be just (iterate #(+ % n) n)) but the rest is the same
12:35 Lau_of_DK: Chousuke, you really should anote, instead of pasting a new, gives better overview
12:35 Chousuke: ah right, forgot the annotation capability.
12:36 hircus: Lau_of_DK: oh wow, Petite Chez Scheme actually computes #76 by brute force
12:36 trying to work out a cleaner solution
12:37 Chousuke: but still that doesn't make sense. :/
12:37 why does a let affect recur so that it doesn't overflow the stack?
12:38 danlarkin: certain forms can become reentry points or whatever
12:38 Lau_of_DK: hircus, looking forward to seeing it
12:38 danlarkin: I don't know if let is one of them, though
12:39 hircus: Lau_of_DK: #78 is very similar and can't be brute-forced, so yes, will have to do it :) I just need pen and paper to work it out
12:40 lisppaste8: Chousuke annotated #69055 with "Weirdness" at http://
12:40 Lau_of_DK: hircus, have a look at that paste
12:41 Chousuke, I should have asked, sorry, I pasted in your name, a complete copy of your other paste
12:41 Chouser: let is not a recur target. I can't figure out what's going on.
12:41 hircus: weird!
12:41 Lau_of_DK: Chousuke, that one where you say "this works", doesnt return on my system, I dont get a reply
12:42 hircus: s1 & etc were not even used at all?
12:43 Lau_of_DK: no, not in Chosukes attempt
12:43 hircus: ..
12:43 Chousuke: Lau_of_DK: it does on mine
12:43 Lau_of_DK: really, what is your secret?
12:44 because using your exact code... does not return :)
12:44 lisppaste8: Chousuke annotated #69055 with "my n-seq" at http://
12:44 Chousuke: Lau_of_DK: try with that.
12:45 hircus: how should n-seq.. oh
12:46 Lau_of_DK: oh, sorry me
12:46 silly me
12:46 even
12:46 hircus: Lau_of_DK: was your n-seq eagerly-evaluating?
12:46 Lau_of_DK: no, it was lazy
12:46 hircus: so.. still not sure what was the problem
12:46 Lau_of_DK: oh wait
12:46 hircus: sort will force evaluation, right?
12:46 Lau_of_DK: typo - I was fiddling with it a minute ago, corrupted it
12:47 sort (in this case) only deals with the head
12:47 hircus: that's the only difference I could think of
12:47 yes, but sort forces evaluation of the entire sequence
12:47 lisppaste8: Chouser annotated #69055 with "also works" at http://
12:47 Lau_of_DK: anyway, the Euler is solved, but it raises a question about stack-usage
12:47 Chouser: hircus: I think that proves your hypothesis.
12:48 hircus: Chouser: the last paste? looks like it
12:48 Chousuke: so it was being too lazy? :/
12:48 hircus: a bit surprised that lazy sequences are put on the stack, but hey
12:48 Lau_of_DK: Chouser, you run doall on infiniate sequences?
12:48 Chouser: this isn't the final answer.
12:48 Lau_of_DK: no
12:49 don't run sort on infinite seqs either. :-)
12:49 Lau_of_DK: Americans...
12:50 hircus: seems easier to do #52 by converting to strings, anyway
12:50 Chousuke: (map n-seq [1 2 3 4 5 6]) is a finite sequence of infinite sequences; the doall just forces the n-seq to be called.
12:50 Lau_of_DK: hircus, can you run it in 2 secs with strings ?
12:50 hircus: for a number, convert to a string then to a seq of chars then sort
12:50 aha, no
12:50 Lau_of_DK: Chousuke, OH!
12:51 I didnt know that
12:51 hircus: actually, I can
12:51 0.174secs in Python
12:51 Chousuke: removing the doall from find= and putting it in the find= call like so (find= (doall (map n-seq [1 2 3 4 5 6])) will work
12:51 hircus: start it at 125874, though, no need to start from 0 :)
12:52 Chousuke: whoops, missing a parenthesis
12:52 I wonder if irssi has a syntax highlighting plugin :/
12:54 Hun: hmm... one could use emacs rcirc + multi-major-mode for this
12:56 Chousuke: this stack overflow problem looks like something that might bite again if there's a lot of laziness :/
12:56 Lau_of_DK: Chousuke, I believe youre right
12:57 I had to take off, but I'd like to thank everybody who helped bring me up to speed, youve been a fantastic help!! Have a good evening
13:01 gnuvince: Has it been discussed here how to translate the "classical" Haskell solution for sieve of erasthesomethings to Clojure? In Haskell it's usually: let { primes = sieve [2..]; sieve (x:xs) = filter [n | n <- xs, n `mod` x /= 0] }
13:09 hmmm
13:09 are LazyCons really lazy?
13:24 leafw: can one make a function that takes multiple sets of arguments (easy). but where some of these are private? I.e. [x] is private, but [x y] is public.
13:25 gnuvince: leafw: I don't think you can. Use a nested function for that.
13:25 leafw: ok
13:25 thanks
13:26 but aren't nested functions public? Perhaps defined only in a let, I guess
13:27 oh, or with #^{:private true}, I guess
13:34 can't a function refer to itself within its own declaration?
13:35 lisppaste8: leafw pasted "fibonacci" at http://
13:36 leafw: first one works, second fails to compile
13:36 wwmorgan: leafw: try using a named anonymous function
13:36 leafw: sorry: named anonymous function?
13:37 isn't that what the let is doing in this casE?
13:38 lisppaste8: wwmorgan annotated #69060 with "compiles" at http://
13:38 gnuvince: leafw: let don't allow recursion.
13:39 leafw: thanks people. That (fn this [...] ) is new to me.
13:57 Hun: leafw: you could do it like the second one by implementing the y-combinator
13:59 gnuvince: @url
13:59 lisppaste8: url
13:59 lisppaste8: url?
13:59 lisppaste8: To use the lisppaste bot, visit http://
13:59 To use the lisppaste bot, visit http://
13:59 leafw: Hun: show me
14:00 gnuvince: leafw: did you try the infinite fib list solution?
14:00 lisppaste8: gnuvince pasted "How's this implementation of rests?" at http://
14:00 Hun: leafw: i don't have a running clojure on this machine, so this might not work
14:00 (defn y (fun)
14:00 (fn [& args] (apply fun fun args)))
14:03 lisppaste8: Chouser annotated #69061 with "Another "rests"" at http://
14:04 leafw: Hun: haven't ever used the y-comb
14:05 've read about it, that's all.
14:05 your impl looks .. will trye
14:05 Hun: the basic idea is that the function gets itself as its first arg
14:05 which is what y does on the fn
14:05 end the function defines where to recourse
14:06 leafw: andinitial args to the fun are passed how?
14:06 trying
14:09 Hun: they are passed through to the function. that definition might not work, depending on how apply works in clojure
14:10 AWizzArd: Moin
14:57 lisppaste8: jochu annotated #69060 with "Using an infinite lazy seq" at http://
15:38 leafw: woah : jochu, that was awesome.
15:39 although I don't understand it.
15:40 lazy-cat concats two sequences, but you give it an array [0 1] and then the result of a mapping that involves sums, but I don't see how it sums the right pair of numbers.
15:41 somehow, the lazy-cat is defining the fibonacci sequence itself, in abstract form. This is briliant, reads almost like prolog
15:42 Chouser: yeah, impressive. The summing is of each fib and fib offset by one (via rest)
15:45 duck1123: how can I retrieve just the doc-string of a function? (doc) prints it, but doesn't return anything and (meta) doesn't return it either.
15:46 wwmorgan: duck1123: (with-out-str (doc doc))
15:47 also (:doc ^#'doc)
15:48 duck1123: that's what I wanted
15:48 thanks
16:00 AWizzArd: rhickey: Thanks for your comments about Currying Rich. I still think we could do it, with something else instead of #(). Maybe �() or something like that.
16:02 Chouser: AWizzArd: I don't know how to type that thing.
16:02 duck1123: that's going to be hell to type
16:02 Chouser: And although it looks ok in the browser, in this window it just shows up as the rectangle used when a font doesn't have that glyph.
16:03 AWizzArd: you all still use this 1886 keyboard layout yes? ;-)
16:03 cemerick: � is option-6 on Macs, fwiw
16:03 AWizzArd: This qwerty stuff
16:03 Shift 3 I guess on qwerty maybe?
16:03 Chouser: served me well so far
16:03 H4ns: AWizzArd: it is not ascii, forget it.
16:04 AWizzArd: H4ns: why not doing unicode? I would like to have greek symbols in my source. My keyboard layout can produce them so easily.
16:04 H4ns: AWizzArd: you certainly don't want things in the base language that only germans can type with reasonable effort
16:05 rhickey: I was thinking of something like this for apply/curry: #(@ + 5), where #(@ ...) means (fn [& args] (apply ... args))
16:05 AWizzArd: Well sure, and the � is just an example. It can be anything else that makes sense. My point is just: let us have currying.
16:05 rhickey: @ being special as first form in #()
16:05 duck1123: we should start using ? in code instead of #()
16:06 H4ns: AWizzArd: your point is: rhickey, implement currying! :)
16:06 rhickey: but not sure about more symbol overload
16:06 currying is overrated
16:06 H4ns: i like partial application a lot, but i don't need no fancy syntax for that.
16:06 rhickey: #() is pretty neat as is
16:07 AWizzArd: H4ns: well yes, I showed my implementation of it in Google Groups. I just can't implement reader macros.
16:07 duck1123: rhickey: the doc-string for -> has a redundant 'macro' in it.
16:08 AWizzArd: !(rgb _ 123) or having the @ or $(..) or whatever.
16:10 rhickey: there's already partial and #(), this doesn't seem pressing
16:12 gnuvince: currying is, in my opinion, one of the two pillars of unreadable Haskell code.
16:12 rhickey: :)
16:12 Chouser: heh
16:13 gnuvince: the other is succinct function composition
16:13 Check the forums of Project Euler, especially answers from the French Jedai
16:14 it's 3 lines of nothing but function composition of curried functions with a bunch of curry, uncurry and flip thrown in for good measure.
16:18 AWizzArd: I see partial as not too useful. The whole idea behind currying is to have syntactic sugar, to save a few keystrokes. So, (partial ..) is too long imo.
16:29 duck1123: what is the difference between a var quote and a normal quote?
16:30 nvm, I found it
16:35 Chouser: (partial foo) seems a _bit_ nicer than (fn [& x] (apply foo x))
16:36 and even a bit nicer than #(apply foo %&)
16:48 meredydd: Chouser: Also, doesn't (partial) date from before the introduction of #(...)?
17:08 Chouser: meredydd: I think so
17:11 schwartzwald: what do clojurers think of scala?
17:11 clojure is an alternative, not a replacement for java right?
17:12 Chouser: I came to clojure seeking refuge from Scala's type system.
17:12 kotarak: scala seems to be more verbose in syntax than Clojure or ML...
17:12 schwartzwald: or it would be a reasonable to write JAVA(enterprise)-stuff in clojure? i tried scala bu it felt pretty heavy and unflexible, like java
17:12 AWizzArd: Chouser: yes, but $(foo) is even nice than #(apply foo %&) or (partial foo)
17:12 schwartzwald: yes scala seemed great on paper but it didnt feel good
17:12 AWizzArd: Clojure is a functional programming language. It makes sense to have currying.
17:13 Chouser: schwartzwald: I don't know why you wouldn't be able to write whatever you want in Clojure. It's pretty practical.
17:14 kotarak: AWizzArd: How do you distinguish: (defn foo ([x] ...) ([x y] ...)) $(foo z)?
17:14 Chouser: kotarak: apply does that for you.
17:15 AWizzArd: app.. yes
17:15 Chouser: if you replace $(foo z) with (partial foo z)
17:15 kotarak: Chouser: I was asking for currying. When I curry, how do I decide which form to use?
17:16 AWizzArd: kotarak: can you be more specific?
17:16 kotarak: (foo z) is legal. (foo a b) is also legal. What does $(foo z) mean, the first or the curried second?
17:16 AWizzArd: btw, I want to replace $(foo z) with (fn [& args] (apply foo z args))
17:17 if you want to curry away some earlier args you would do it this way: $(foo _ z)
17:17 just read in google groups, it's explained there
17:17 http://
17:18 I used #(foo _ z) in that posting, but rhickey gave good arguments why to leave #() untouched so far. Now I suggest to think about having some other character. And that could even be recycled for a later addon like an infix reader for math.
17:19 We just need some other symbol than #. It could be a $ or a ! or maybe <foo _ z>.
17:20 I would implement it myself as a reader macro, but at this point CLJ doesn't allow us to access the *readtable*, so read macros need to be written in assem... in Java.
17:20 wwmorgan: AWizzArd: you could implement it as a non-reader macro too, right?
17:21 AWizzArd: yes, and I did that, just click the link
17:21 It's also not bad, but I think ($ < 5) is not as nice to read as $(< 5)
17:33 emacsen: rhickey, so, I've been reading about Lisp50, and here's the problem Clojure has. All the great language designers are weird looking. There's even a site my gf sent me to: Language designer or serial killer. You have to match the photo with the description. You look like a normal, regular (non-geek) man. Thus, I'm afraid, Clojure may be doomed to failure.
17:33 * Hun fetches popcorn
17:33 emacsen: ;)
17:34 Hun: popcorn and tacos for everyone!
17:37 emacsen: Hun: It's mainly a joke. I actually disagree with McCarthy. Languages /do/ need a single face, at least in the beginning.
17:38 Hun: true. i also believe that anybody needs a big beard. not that i have one though :/
17:38 emacsen: beards are really optional. that's more a Unix thing
17:39 wwmorgan: http://
17:45 * danlarkin has a beard
17:45 danlarkin: I wonder when I'll become a famous language designer
17:48 walters: the fact that matz grew a beard just for that article is awesome
17:57 * rhickey is working on his mad scientist hair
19:29 blbrown: http://
19:34 Chouser: blbrown: you want that for all functions defined after a certain point? Or just certain functions?
19:34 blbrown: Chouser, ideally of them. And the ability to print when a function is called is just one example. E.g. I might want to time how long a function executes
19:38 Chouser: going to leave me hanging?
19:40 Chouser: blbrown: I think it's possible, but it's hacking around at a level I don't have much experience with.
19:40 so I'm trying some things.
19:41 shoover: What about using the ns-* functions to get all the symbols in a given namespace. You could test a symbol's metadata to see if it's a function, then rebind thread-locally using binding and set!. Of course, that will only hold as long as you're in the binding scope.
19:41 blbrown: they say in lisp, you can use macros to achieve what I want
19:41 shoover: that is an idea
19:41 Chouser: shoover: ooh, that's better than what I'm trying.
19:43 shoover: Rich always mentions binding when people talk about logging and timing, so it should work
19:44 Chouser: yeah, now that you describe that, I think I may have seen code for it go by on the google group
19:45 shoover: blbrown: and you can wrap all that binding stuff in a macro, so there's your lisp way
19:45 blbrown: shoover: you have some code or examples I can look at. I will give you a reddit karma point if you code up something in 10 minutes
19:48 shoover: Chouser will beat me now that he knows what to do :)
19:49 Chouser: hehe
19:50 shoover: lisppaste8: url
19:50 lisppaste8: To use the lisppaste bot, visit http://
19:50 shoover pasted "wrapping an existing function" at http://
19:50 Chouser pasted "trace" at http://
19:50 shoover: no macro there, but it shows the binding process
19:53 Chouser: nice, with the var-get and trace-fn
19:53 blbrown: If you have used ASM, I did it with asm (and obviously reflection) but I was also looking for the clojure way. http://
19:54 Chouser, shoover: thanks guys
19:54 shoover: I thought there was something in the metadata to flag a fn, but I don't see it now that I look at my ^#'bar
19:55 Chouser: :arglists ?
19:56 shoover: yeah, that's close enough, as long as it doesn't have the macro flag
20:36 emacsen: anyone know if there's audio/video of lisp50?
20:37 rhickey: They recorded it, but I don't know that it's available yet
20:37 emacsen: k
20:43 lisppaste8: Chouser annotated #69086 with "trace namespace" at http://
20:46 Chouser: blbrown: That's as far as I'll mess with it.
20:46 I imagine you could make is so that the details of trace-wrap could be passed in.
20:48 blbrown: Chouser, that is cool, thanks
21:03 duck1123: is anyone here familiar with compojure
21:04 I'm trying to figure out how I can create a folder under app/ and have a file in there named other than the folder's name
21:22 chrisdone: rhickey: what is the font used in your Clojure for Lisp Programmers presentation (up on Blip.tv)? it's gorgeous and I want it!
21:24 danlarkin: chrisdone: looks a lot like Monaco to me
21:28 rhickey: chrisdone: yes, monaco for the code
21:29 duck1123_: is it possible to have clojure files named other than the name of the last folder?
21:29 chrisdone: danlarkin, rhickey: thank you :-)
21:30 danlarkin: duck1123: it sure is
21:31 duck1123: I'm trying to set up my namespaces for compojure, but it keeps wanting me to name it the same as the folder name
21:31 crathman: since the wiki says that sicp is not optimal for learning clojure, figured I'd be a contrarian.... :-)
21:32 chapter #1 has been translated to clojure - http://
21:33 duck1123: otherwise I get: Could not locate Clojure resource on classpath: mycyclopedia/view/view.clj
21:33 danlarkin: duck1123: having not used compojure I can't comment on any naming scheme it enforces
21:33 duck1123: but I can say the limitation isn't one imposed by clojure itself
21:33 duck1123: I don't think it really imposes anything other than what clojure does
21:35 the wiki pretty much says to do the same thing: Now we have to create a file in the classpath with the filename "example/ourlib/ourlib.clj".
21:36 danlarkin: well I've been using files that are named differently than their containing directory, but perhaps I'm doing things different
21:37 duck1123: do I have to explicitly add the folder to the classpath, or do you happen to have an example?
21:37 I noticed that clojure.contrib uses the same pattern
21:50 Chouser: naming the .clj the same as its folder allows the .clj to be loaded via the ns macro, require, use, etc.
21:51 duck1123_: so if I wanted to name it something else, I couldn't use the ns macro
21:52 Chouser: your file could still use ns, but nothing else could load your file using ns.
21:52 duck1123_: so how would I load it? That may almost be acceptable in this very limited senario
21:53 Chouser: you could use load or load-file
21:53 duck1123_: this file would only ever be loaded by one other file, I would go the proper route for anything else
22:25 ericthor: anything change on the gen-class front recently? I have a clojure gen-class extending a java class. I have a mypackage/ClassName/ClassName.clj...
22:26 and the function names are (defn ClassName-extendedClassFunc[this])
22:26 I can create an instance of the class but when I call any function I'm getting an AbstractMethodError...this used to work?
22:30 Chouser: was it working since the fn names changed to ClassName-fnName?
22:32 ericthor: Chouser: it worked as fn names are classname-fnnames
22:32 Chouser: has that changed since?
22:34 Chouser: might be time to redo my genclass stuff...going to turn in. Thanks for the help
22:34 Chouser: I probably just have some out of sync clojure stuff
22:35 Chouser: There were changes to genclass in August, but none since.
22:51 larrytheliquid: if i have a map that has a certain key, and a function that takes a parameter that would ideally be the same name as the map key, is there a convention to distinguish the two?
22:51 ie: description vs description-param
23:02 Chouser: I don't think I understand. It's common to use keywords for map keys.
23:03 does that help?
23:06 larrytheliquid: say i have something like (defstuct my-data :description), and then (defn do-something [description] ... )
23:07 inside do-something description would shadow the description method in the struct
23:09 Chouser: ah, for structs!
23:10 larrytheliquid: ah nevermind, i didn't realize that the symbol in the struct :description would be part of the method name too
23:10 so no conflicts
23:10 Chouser: um, no convention I'm aware of.
23:10 larrytheliquid: the colon*
23:10 the colon takes care of the difference
23:11 Chouser: ok, good.
23:14 I can't get definline to work. Anyone know how to use it?
23:22 duck1123: has anyone here managed to get slime working with compojure?
23:23 I can get standard clojure working, sbcl works, but I keep getting that stupid progn error when I try to use compojure