2009-09-12
| 04:54 | LauJensen | Top 'o da morning gents |
| 04:59 | LauJensen | Ok, lemme try that in #scala and see if I get some love |
| 05:09 | cgrand | come back Lau! |
| 05:10 | LauJensen | Alright alright - You know I can't leave you guys :) |
| 06:48 | angerman | how do I add additional jars to the default slime-repl clojure? |
| 08:07 | raphinou_ | Hi! |
| 08:10 | arbscht | angerman: customize swank-clojure-extra-classpaths |
| 08:10 | arbscht | angerman: alternately, link your jars in ~/.clojure, if that applies |
| 09: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 | angerman | Hmm I have 44700 items and I want to draw 10000 pairs from it, how would I do that? |
| 10:01 | angerman | 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 | meredydd | Is it just me, or has HTTP header updating in Compojure never worked? |
| 10:18 | meredydd | The handling method is defined with "(defmethod update-response Map", so it never triggers on Clojure persistent maps |
| 10:18 | meredydd | 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:07 | triyo | http://www.apress.com/book/view/9781430272311 |
| 11:30 | manic12 | now that you point it out (the book), I may get it |
| 11:30 | triyo | :) |
| 11:31 | triyo | 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 | manic12 | 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 | manic12 | lazy sequence processing (LSP) |
| 11:35 | manic12 | 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 | manic12 | ...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 | manic12 | 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 | manic12 | 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 | manic12 | 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 | Chouser | 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 | manic12 | it knows where the libs are, but it doesn't use them by default |
| 11:44 | manic12 | (the project repl that is) |
| 11:45 | manic12 | also, the foreign lib I use is quite large |
| 11:46 | manic12 | for every namespace I use that lib from, I have to have a huge import list in the ns form |
| 11:47 | manic12 | so I will probably make a macro that wraps (ns ...) that is like (smlib-ns ...) that includes the package classnames |
| 11:49 | manic12 | just seems weird I can't export the classnames as a whole to any nanespace with just one *short* import |
| 11:55 | manic12 | 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 | Chouser | oh, 'import' is a macro now, so you'll have to write a macro. |
| 11:58 | Chouser | 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 | manic12 | so it's not protecting me from anything real |
| 12:00 | manic12 | I'll look at the sources to import and see if I can make my own import |
| 12:01 | manic12 | (which would break anytime clojure changes, but that's better than putting all these class names in a file) |
| 12:08 | manic12 | 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 | Chouser | 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 | manic12 | (native call stuff) |
| 13:51 | manic12 | i guess it doesn't matter since swig has defined finalizations on the objects |
| 13:52 | manic12 | the tricky part is that my native calls will be looking for arrays of structs |
| 13:52 | manic12 | and the jvm ain't gonna line-em-up for me |
| 13:55 | manic12 | i can work around. |
| 13:56 | manic12 | it was just cool with double-float arrays in allegro and displaced arrays and such |
| 14:27 | manic12 | 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 | ole2 | ,(let [x 9] (let [x 10] x)) |
| 14:32 | clojurebot | 10 |
| 14:32 | ole2 | there is no setf or setq |
| 14:33 | ole2 | i think |
| 14:33 | ole2 | ,(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 | Chouser | the closest you can get it to shadow the old local with a new one of the same name |
| 14:57 | Chouser | ,(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 | kanzenryu | Probably a visual demo that can demonstrate on-the-fly logic changes, showing shapes that are processed according to various rules |
| 19:11 | kanzenryu | - Realtime code updating via a socket REPL while running |
| 19:11 | kanzenryu | - Macros for simple rule DSL |
| 19:11 | kanzenryu | - Agents/STM for multithreaded behaviour. |
| 19:11 | kanzenryu | - Multimethods, hierarchies and derive |
| 19:11 | kanzenryu | - Maybe error-kit for flexible error handling |
| 19:12 | kanzenryu | - Metadata for extra decision logic |
| 19:12 | kanzenryu | - Maybe the dataflow contrib |
| 19:12 | kanzenryu | 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 | kanzenryu | 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 | Chouser | ,(.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 | Chousuke | briancarper: are you using a UTF-8 locale? |
| 19:33 | Chousuke | 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 | Chousuke | 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 | Chousuke | that works for me. |
| 19:37 | Chousuke | 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 | Chousuke | 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 | clojurebot | logs is http://clojure-log.n01se.net/ |
| 20:21 | cschreiner | thx |
| 20:25 | cschreiner | there is much nice stuff in the logs |
| 20:25 | cschreiner | thought I spend the next week reading them |
| 20:38 | ChrisPS | testing |
| 20:38 | ChrisPS | ok good |
| 20:45 | wtetzner | what's the reasoning for having peek and pop? |
| 20:45 | wtetzner | 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 | wtetzner | or are there technical differences? |
| 20:47 | wtetzner | oh |
| 20:47 | wtetzner | i get it |
| 20:48 | wtetzner | on a vector, peek and pop happen at the end of the vector |
| 20:49 | licoresse | right |
| 20:50 | licoresse | pop on vector and lists behave differently |
| 20:50 | licoresse | ,(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 | hiredman | => (h (g "suddenly")) |
| 21:47 | hiredman | "CLABANGO!" |
| 21:48 | hiredman | 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 | hiredman | all though I think either I don't understand clojureql, or it has a wart or two |
| 21:56 | hiredman | 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:56 | hiredman | 423 |
| 21:57 | hiredman | 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:16 | JAS415 | well |
| 23:17 | JAS415 | it destructures vector [b a] |
| 23:17 | JAS415 | and then makes a vector of |
| 23:17 | JAS415 | b and (a + b) |
| 23:17 | JAS415 | oh |
| 23:17 | JAS415 | and is an anonymous function |
| 23:17 | miltonsilva | wait.. |
| 23:18 | JAS415 | vector [a b] i mean |
| 23:18 | JAS415 | i made a typo |
| 23:18 | JAS415 | [[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 | JAS415 | hence the ? |
| 23:22 | miltonsilva | :) yes but why two [...] [...] is the seconde an expression? |
| 23:23 | miltonsilva | second* |
| 23:23 | JAS415 | yes |
| 23:23 | JAS415 | 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 | hiredman | (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 | hiredman | JAS415: no |
| 23:25 | JAS415 | hmm |
| 23:25 | JAS415 | are you sure? |
| 23:26 | hiredman | when the function is compiled it is turned into something else |
| 23:26 | JAS415 | right... |
| 23:26 | JAS415 | but if you look at the destructuring bind macro |
| 23:27 | JAS415 | 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 | hiredman | ,(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 | hiredman | gnarly |
| 23:29 | hiredman | 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:29 | hiredman | ~destructuring |
| 23:29 | clojurebot | destructuring is http://clojure.org/special_forms#let |
| 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 | hiredman | ,(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 | hiredman | (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 | hiredman | ,((fn [[a b]] a) [1 2]) |
| 23:35 | clojurebot | 1 |
| 23:35 | miltonsilva | hmmmmmmmmmmmm |
| 23:35 | miltonsilva | now I see |
| 23:36 | hiredman | so you have a binding form that mirrors the structure of the value you are binding |
| 23:36 | hiredman | ,((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 | JAS415 | wait |
| 23:43 | JAS415 | can you post the whole form |
| 23:43 | miltonsilva | (fn [[a b]] [b (+ a b)])[1 2] [2 3] [3 5]) |
| 23:43 | miltonsilva | ups |
| 23:43 | miltonsilva | (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 |