4:54 LauJensen: Top 'o da morning gents
4:59 Ok, lemme try that in #scala and see if I get some love
5:09 cgrand: come back Lau!
5:10 LauJensen: Alright alright - You know I can't leave you guys :)
6:48 angerman: how do I add additional jars to the default slime-repl clojure?
8:07 raphinou_: Hi!
8:10 arbscht: angerman: customize swank-clojure-extra-classpaths
8:10 angerman: alternately, link your jars in ~/.clojure, if that applies
9:15 * Chousuke is currently engaged in some major rewriting of history.
9:16 Chousuke: I decided it would help to have my reader development history a bit cleaner, so now I'm splitting, merging and reorganising the commits :P
10:00 angerman: arbscht: thanks
10:00 Hmm I have 44700 items and I want to draw 10000 pairs from it, how would I do that?
10:01 e.g. I have 447000 x 447000 paris. and I want to have 10000 different items from that set
10:09 le3: f
10:17 meredydd: Hi all.
10:17 Is it just me, or has HTTP header updating in Compojure never worked?
10:18 The handling method is defined with "(defmethod update-response Map", so it never triggers on Clojure persistent maps
10:18 But if I hand it an honest-to-goodness Java Map, it complains it can't cast it into an IPersistentHashMap.
10:24 duck1123_: Is it possible to actually run a repl (or a swank server) to an application on an android phone
10:44 le3: ,(doc alter)
10:44 clojurebot: "([ref fun & args]); Must be called in a transaction. Sets the in-transaction-value of ref to: (apply fun in-transaction-value-of-ref args) and returns the in-transaction-value of ref."
11:07 triyo: Anyone purchased the Alpha Program license for the new, up and coming, book "Practical Clojure"? Just wondering if it'd be worth it.
11:30 manic12: now that you point it out (the book), I may get it
11:30 triyo: :)
11:31 I think I'm gonna join you in on that one.....You get the updates till final release anyway.
11:32 manic12: I disagree with Hickey's description of clojure as a lisp. I think clojure is definitely a clojure and may be influenced by lisp, but leaves that era behind
11:32 or, I guess you could say that if clojure is a lisp, it's pushing the envelope of what it means to be a lisp
11:33 Chouser: "Clojure: redefining LISP"
11:33 manic12: sequence processing
11:34 lazy sequence processing (LSP)
11:35 yesterday I had to make a file in the default package called "user.clj" and in the ns declaration I used com.akw.init namespace...
11:36 ...init.clj then had to include com.akw.user, and have an "init" defn which called a defn in com.akw.user to load my foreign libs and change the ns
11:37 it was the only way I could get the repl to start, where I could type one function (init) and have my foreign code be loaded and work
11:38 so it took three files to do one thing, and I'm wondering if I am doing something wrong
11:39 Chouser: you can provide multiple options at the clojure.main command line
11:39 manic12: enclojure definitely needs a dialog box option to pass in a custom init to the clojure.main/repl
11:40 I'm really having a hard time with this java package & clojure namespace stuff
11:40 Chouser: something like -e "(use 'com.akw.user)" -r ought to do it.
11:41 manic12: does enclojure have a place to put that?
11:41 Chouser: I don't know.
11:42 manic12: I'll ask that one on google groups and/or submit a patch
11:42 Chouser: good idea
11:42 I really do mean to try enclojure again soon...
11:43 manic12: it just seemed very "unlispy" for the "project repl" to not have any correspondence to the project main
11:43 it knows where the libs are, but it doesn't use them by default
11:44 (the project repl that is)
11:45 also, the foreign lib I use is quite large
11:46 for every namespace I use that lib from, I have to have a huge import list in the ns form
11:47 so I will probably make a macro that wraps (ns ...) that is like (smlib-ns ...) that includes the package classnames
11:49 just seems weird I can't export the classnames as a whole to any nanespace with just one *short* import
11:55 I think that my native calls will only work from the namespace I loaded the libs from, so one is forced to use that namespace, maybe it's my imagination
11:55 Chouser: have your macro just generate an appropriate call to the 'import' fn. In fact, you might be able to write a fn instead of a macro.
11:56 oh, 'import' is a macro now, so you'll have to write a macro.
11:58 however, it's quite intentional that there's no "import foo.*" -- that makes class names available without it ever being explicit where they're coming from, which can lead to confusion and unexpected conflicts.
11:58 manic12: (it was my imagination...i think)
11:58 Chouser: I like 'use' does this too (for fn names), but I wish it didn't. :-)
11:59 manic12: well in this case, all my classes are explicitly defined to java from swig
11:59 so it's not protecting me from anything real
12:00 I'll look at the sources to import and see if I can make my own import
12:01 (which would break anytime clojure changes, but that's better than putting all these class names in a file)
12:08 is there a way to get a sequence of all the classes in a java package?
12:15 Chouser: manic12: no, you have to examine the .jar itself, or the file system.
12:15 once you have a list of the classes, your macro can expand to a regular call to 'import' so that it won't break when clojure changes.
12:15 manic12: yah
13:39 ole2: h
13:43 manic12: is there a way to stack allocate instances of java classes inside a clojure function?
13:47 Chouser: I don't think you can allocate objects on the stack in the JVM at all, in any language
13:48 manic12: this is tricky
13:48 (native call stuff)
13:51 i guess it doesn't matter since swig has defined finalizations on the objects
13:52 the tricky part is that my native calls will be looking for arrays of structs
13:52 and the jvm ain't gonna line-em-up for me
13:55 i can work around.
13:56 it was just cool with double-float arrays in allegro and displaced arrays and such
14:27 so in the form (let [x 1 y 2] ... you cannot rebind x to 3 in there?
14:30 ole2: ,(let [x 1 y 2 x 3] x)
14:30 clojurebot: 3
14:31 manic12: (let [x 1 y 2] (do-something-with x) (change x) (do-something-with x))
14:32 ole2: i dont think so, but you can rebind it with a let
14:32 ,(let [x 9] (let [x 10] x))
14:32 clojurebot: 10
14:32 ole2: there is no setf or setq
14:33 i think
14:33 ,(doc set!)
14:33 clojurebot: Gabh mo leithscéal?
14:33 ole2: ,(doc set!)
14:33 clojurebot: Titim gan éirí ort.
14:33 ole2: ,(doc setf)
14:33 clojurebot: Pardon?
14:56 Chouser: names introduced by 'let' are not variables, their values cannot change
14:56 the closest you can get it to shadow the old local with a new one of the same name
14:57 ,(let [a 1] (prn a) (let [a 2] (prn 2)))
14:57 clojurebot: 1 2
17:33 ole3: n
19:11 kanzenryu: Hello all. I'm thinking of writing a clojure program for Java coders that would demo language features that are awkward to do in Java.
19:11 Probably a visual demo that can demonstrate on-the-fly logic changes, showing shapes that are processed according to various rules
19:11 - Realtime code updating via a socket REPL while running
19:11 - Macros for simple rule DSL
19:11 - Agents/STM for multithreaded behaviour.
19:11 - Multimethods, hierarchies and derive
19:11 - Maybe error-kit for flexible error handling
19:12 - Metadata for extra decision logic
19:12 - Maybe the dataflow contrib
19:12 Any more suggestions?
19:16 Chouser: sounds interesting
19:17 kanzenryu: Various groups of shapes appear on the left, and get handled by some rules and sent to various places on the right
19:17 Chouser: I like the javadoc and show functions at the REPL.
19:18 kanzenryu: The shapes will be sandwiches with various contents. I call it the Edible Sandwich Business
19:22 My plan is to showcase whatever aspects of Clojure would make the average Java guy think "man, how would I code that?"
19:28 briancarper: If I do (def x "助") with any Japanese kanji, and then view x at a REPL, it shows "???". Also (count x) gives me 3, should be 1. Any idea where I can begin to debug this?
19:30 Chouser: that's a plain terminal repl?
19:30 ,(.getEncoding *out*)
19:30 clojurebot: java.lang.IllegalArgumentException: No matching field found: getEncoding for class java.io.StringWriter
19:30 briancarper: Plain REPL, yes.
19:30 Chouser: I'd look at the encoding of the in and out streams the repl is using, make sure they match what you expect.
19:30 hiredman: briancarper: are you using jline or anything like that?
19:31 briancarper: .getEncoding returns "ASCII". Probably not right. What's a safe way to change it?
19:31 hiredman: huh
19:31 briancarper: hiredman: Nope, no jline.
19:32 hiredman: I wonder were it gets the ASCII
19:32 briancarper: No idea. On one of my systems it's "UTF8" but my server gives me "ASCII".
19:32 Chouser: briancarper: that's the encoding of *in* or *out*? Or both?
19:32 hiredman: what platform is this? which jvm, which os?
19:32 Chousuke: briancarper: works for me.
19:32 briancarper: are you using a UTF-8 locale?
19:33 though hm, the count is still 3
19:33 briancarper: hiredman: Just *out*, not sure how to inspect it on *in*, no .getEncoding method apparently.
19:33 hiredman: Chousuke: 1 here
19:34 briancarper: Chousuke: Not sure which encoding the system is using. How could I check? It's a Linux box. Checked for LC* variables but there are none set.
19:35 Chousuke: (System/getProperty "file.encoding") I guess.
19:35 mine is apparently MacRoman...
19:35 briancarper: "ANSI_X3.4-1968", bwuh
19:36 Chousuke: try launchign java with java -Dfile.encoding=UTF8
19:36 that works for me.
19:37 user=> (def foo "テスト") user=> (count foo) -> 3
19:38 briancarper: Awesome, that worked. Thanks! Thanks everyone else too.
19:39 Chousuke: generally everything should be fine unless you try to use characters beyond the basic multilingual plane in your identifiers (I think strings will still work)
19:40 briancarper: Yeah I only need it in strings. Wouldn't try it in identifiers.
19:40 Chousuke: and even if you were writing code with characters from the higher planes I would have to ask you why you're writing code that maybe a dozen people in the world can read...
19:41 hiredman: ,(let [テ1] テ)
19:41 clojurebot: java.lang.IllegalArgumentException: let requires an even number of forms in binding vector
19:41 hiredman: ,(let [テ 1] テ)
19:41 clojurebot: 1
19:42 Chousuke: テ is not beyond the BMP :)
19:44 AFAIK any character that can be represented with one UTF-16 character (as opposed to "multibyte encoding" it) is supported by Clojure in identifiers
19:44 luis: Chousuke: come on, writing code with egyptian hieroglyphs should be fun!
19:45 Chousuke: handling all of unicode is a bit of a chore in java because char is just 16-bit, but for most purposes it works fine.
20:21 cschreiner: Does this list channel have a log?
20:21 hiredman: ~logs
20:21 cschreiner: thx
20:25 there is much nice stuff in the logs
20:25 thought I spend the next week reading them
20:38 ChrisPS: testing
20:38 ok good
20:45 wtetzner: what's the reasoning for having peek and pop?
20:45 are they any different from first and rest?
20:46 licoresse: I believe they have different semantics
20:47 wtetzner: you mean the names just match what you would use with a stack?
20:47 or are there technical differences?
20:47 i get it
20:48 on a vector, peek and pop happen at the end of the vector
20:49 licoresse: right
20:50 pop on vector and lists behave differently
20:50 ,(doc pop)
20:50 clojurebot: "([coll]); For a list or queue, returns a new list/queue without the first item, for a vector, returns a new vector without the last item. If the collection is empty, throws an exception. Note - not the same as next/butlast."
21:03 Chouser: peek and pop are only like first and rest for list. they are different for vectors and queues
21:29 wtetzner: how do i create a queue?
21:32 Chouser: ,(-> clojure.lang.PersistentQueue/EMPTY (conj 1) (conj 2))
21:32 clojurebot: (1 2)
21:32 Chouser: ,(-> clojure.lang.PersistentQueue/EMPTY (conj 1) (conj 2) pop class)
21:32 clojurebot: clojure.lang.PersistentQueue
21:32 Chouser: ,(-> clojure.lang.PersistentQueue/EMPTY (conj 1) (conj 2) rest class)
21:32 clojurebot: clojure.lang.PersistentQueue$Seq
21:33 wtetzner: oh, so there's not built-in function for creating them?
21:37 Chouser: right. I think rhickey is still a bit undecided on the right way to expose queue-like things in general.
21:38 wtetzner: oh, ok
21:42 Chouser: but PersistentQueue works well. More efficient than, say, a finger tree...
21:43 hiredman: …
21:46 => (h (g "suddenly"))
21:48 so I think maybe sometime in the comming week, if I can disentangle all the factoid code from clojurebot's core, clojurebot will start using derby for storage
21:49 durka42: why a relational database?
21:50 hiredman: because it's there?
21:51 durka42: :)
21:51 hiredman: it's just a five column table
21:51 durka42: it seems to me clojurebot would have more of a fit for a key-value store, but i know much more about RDBs than key-value DBs, so clabango
21:54 hiredman: "oh look, derby! and what's that? clojureql!"
21:55 all though I think either I don't understand clojureql, or it has a wart or two
21:56 clojurebot: how much do you know?
21:56 clojurebot: I know 352 things
21:56 hiredman: => (count (query (derby "/tmp/triples.db") :y "is" :x))
21:57 so once this gets done, clojurebot should be able to store relations besides "is"
21:58 durka42: cool
22:07 ChrisPS: ...
23:15 miltonsilva: hey
23:16 JAS415: hi :-)
23:16 miltonsilva: I'm having a bit of troble understanding his piece of code "(fn [[a b]] [b (+ a b)])"
23:16 JAS415: ok
23:17 it destructures vector [b a]
23:17 and then makes a vector of
23:17 b and (a + b)
23:17 and is an anonymous function
23:17 miltonsilva: wait..
23:18 JAS415: vector [a b] i mean
23:18 i made a typo
23:18 [[a b]] is a destructuring pattern
23:21 miltonsilva: the problem I'm having is that acording to the fn defenition there should be something like this (fn name? [params* ] exprs*) so why is this different?
23:21 JAS415: the name is optional
23:21 hence the ?
23:22 miltonsilva: :) yes but why two [...] [...] is the seconde an expression?
23:23 JAS415: yes
23:23 second is an expression
23:23 hiredman: the first is too, btw
23:23 JAS415: is syntactic sugar
23:24 hiredman:  is a vector
23:24 JAS415: well i guess but i feel like that is confusing the matter
23:24 hiredman: fns use a vector to specify the argument list
23:25 (fn [x] x)
23:25 JAS415: well the vector gets macroexpanded into some sort of bindy-form, so afterwards its no longer really a vector, wholly i guess
23:25 hiredman: the function you pasted is like (fn [x] [x])
23:25 JAS415: no
23:25 JAS415: hmm
23:25 are you sure?
23:26 hiredman: when the function is compiled it is turned into something else
23:26 JAS415: right...
23:26 but if you look at the destructuring bind macro
23:27 it gets used in the (fn [[a b]] ) thing
23:27 hiredman: sure
23:27 Chouser: in (fn [x] [y]) I guess [x] is an s-expression, but it doesn't get evaluated. [y] is a normal expression that gets evaluated in the normal way.
23:27 hiredman: but destucture just emits a more complicated vector
23:27 ,(destructure '[[x y] [a b]])
23:27 clojurebot: [vec__2425 [a b] x (clojure.core/nth vec__2425 0 nil) y (clojure.core/nth vec__2425 1 nil)]
23:27 hiredman: ^- vector
23:28 Chouser: ,(macroexpand '(fn [[x y]]))
23:28 clojurebot: (fn* ([p__2431] (clojure.core/let [[x y] p__2431])))
23:28 Chouser: nested list, let, and vectors.
23:29 hiredman: :(
23:29 then let calls destrucutre
23:29 miltonsilva: ok first... I lack some fundamental knowledge what is destructing?
23:29 hiredman: my poor beautiful code
23:30 miltonsilva: oh handy bot
23:31 hiredman: you can basically pull apart a datastructure and bind names to parts of it
23:32 JAS415: its the best for macros
23:32 hiredman: ,(let [[x y] [1 2 3]] (+ 1 2))
23:32 clojurebot: 3
23:32 hiredman: er
23:32 ,(let [[x y] [1 2 3]] (+ x y))
23:32 clojurebot: 3
23:32 hiredman: that puts 1 and 2 from the vector [1 2 3] and binds them to x and y
23:33 miltonsilva: so [[a b]] [b (+ a b)] is actually binding /a to /b and /b to (+ a b) ?
23:34 hiredman: no
23:34 (fn [[a b]] … )
23:34 JAS415: returns new vector
23:34 miltonsilva: (my... imperative guys sure are dumb :( )
23:34 hiredman: it's a function that takes 1 arg
23:34 miltonsilva: hmm
23:35 hiredman: the one arg is pulled apart and the first element of the arg is bound to a and the second is bound to b
23:35 ,((fn [[a b]] a) [1 2])
23:35 clojurebot: 1
23:35 miltonsilva: hmmmmmmmmmmmm
23:35 now I see
23:36 hiredman: so you have a binding form that mirrors the structure of the value you are binding
23:36 ,((fn [[a]] a) "hello")
23:36 clojurebot: \h
23:41 miltonsilva: ok I understand how these nested forms work... but could you explain again what the second vector does? ] [b (+ a b)] [3 5])
23:42 JAS415: it makes a new vector
23:43 can you post the whole form
23:43 miltonsilva: (fn [[a b]] [b (+ a b)])[1 2] [2 3] [3 5])
23:43 (fn [[a b]] [b (+ a b)])
23:44 JAS415: [b (+ a b)] is like making a new vector with those as contents
23:46 miltonsilva: oh... so the declaration of a vector is an expression... that's what confused me... thank you hiredman & JAS415