2009-01-29
| 00:00 | hiredman | you appearing to be indicating that you agree with me, but what you are saying seems contradictory to what I am saying |
| 00:00 | whidden | hmm eval is not quit the same thing as i understand it. |
| 00:00 | pjb3 | yeah, I know what happens at the jvm level is stack based |
| 00:01 | pjb3 | so in some way, shape or form, when eval happens, the jvm pushs some values onto a stack, and then eventually executes some instruction that pulls values off the stack and maybe puts new ones on |
| 00:01 | hiredman | (defn eval "Evaluates the form data structure (not text!) and returns the result." [form] (. clojure.lang.Compiler (eval form))) |
| 00:01 | hiredman | ^- source |
| 00:02 | whidden | Sorry just having nightmares with the evils of eval from CL days. |
| 00:03 | pjb3 | Wow, that's interesting. It recursively calls eval? When does it stop? |
| 00:03 | whidden | if you "save" the sequences of evals on forms you will be doing pretty much much load-file does. |
| 00:03 | durka42 | no, that is calling the eval method on clojure.lang.Compiler |
| 00:03 | durka42 | not recursing |
| 00:03 | hiredman | pjb3: eval is a method of clojure.lang.Compiler |
| 00:04 | hiredman | ,(macroexpand '(.foo bar)) |
| 00:04 | clojurebot | (. bar foo) |
| 00:04 | whidden | recursive calls to eval can be done |
| 00:04 | hiredman | ,(macroexpand '(.foo bar baz)) |
| 00:04 | clojurebot | (. bar foo baz) |
| 00:04 | knapr | clojurebot: download? |
| 00:04 | clojurebot | download is http://code.google.com/p/clojure/downloads/list |
| 00:04 | pjb3 | ah, didn't realize that |
| 00:05 | hiredman | huh |
| 00:05 | hiredman | actually it isn't |
| 00:05 | hiredman | wai |
| 00:05 | pjb3 | ok, so can we say that compile time and evaluation are roughly the same thing and there's very little distinction between the two? |
| 00:05 | hiredman | it is |
| 00:05 | hiredman | I liad |
| 00:06 | knapr | how do i build the clojure.jar? |
| 00:06 | hiredman | pjb3: clojure compiles everything |
| 00:06 | pjb3 | Obviously the difference between expansion time and compile/eval time are critical |
| 00:06 | hiredman | knapr: with ant |
| 00:06 | durka42 | or maven |
| 00:06 | durka42 | i know nothing about maven |
| 00:06 | hiredman | expansion happens between read and eval |
| 00:06 | pjb3 | hiredman: Right, but do I really care about at which point clojure is compiling and at which point it's evaluating? |
| 00:07 | hiredman | it depends |
| 00:07 | knapr | fack why is it compiling to clojure/classes? |
| 00:07 | pjb3 | hiredman: righ, read the text, expand the macros, then compile/eval |
| 00:07 | pjb3 | knapr: (prn *compile-path*) |
| 00:07 | hiredman | close enough for me |
| 00:07 | hiredman | pjb3: reader macros happen at read time |
| 00:08 | pjb3 | I should say, read the text, build the data structures, expand the macros, then compile/eval? |
| 00:08 | whidden | dang can't find a good source for recursive evaluation. But its somewhere in the scheme lit. |
| 00:08 | durka42 | ,(read-string "(.foo bar)") |
| 00:08 | clojurebot | (.foo bar) |
| 00:10 | hiredman | ,(. clojure.lang.Compiler (eval '(+ 1 2))) |
| 00:10 | clojurebot | DENIED |
| 00:10 | hiredman | good |
| 00:10 | whidden | expand macro's is a bit of tricky thing in clojure, being lispy-ish |
| 00:11 | whidden | one has to keep in mind that "code" is being created and maybe evaluated before sending on to the compiler. |
| 00:11 | hiredman | whidden: evaluated == sent to the compiler |
| 00:12 | hiredman | we just saw, looking at the clojure source, that eval calls the compiler |
| 00:13 | hiredman | Compiler.java has some weird looking formating |
| 00:13 | durka42 | most of rhickey's java does :) |
| 00:14 | pjb3 | durka42: Maybe Rich wrote clojure because he couldn't read his own Java code :) |
| 00:14 | hiredman | :P |
| 00:16 | whidden | where does the fx load come from? |
| 00:17 | durka42 | hmm? |
| 00:18 | whidden | ah.. its in compiler |
| 00:20 | whidden | and load eventually calls eval - the heart of the compiler interpreter. |
| 00:21 | whidden | so its a wave and a particle. |
| 00:21 | hiredman | ... |
| 00:21 | durka42 | what is it with clojure and physics analogies |
| 00:22 | hiredman | an "interpreter" that emits bytecode is a compiler |
| 00:23 | durka42 | yes |
| 00:23 | durka42 | although you can play games with calling the JVM an interpreter of bytecode |
| 00:23 | whidden | i guess here is where where cross swords as to what is a compiler. :) |
| 00:23 | whidden | s/where/where we/ |
| 00:24 | whidden | but its really a small small thing |
| 00:24 | durka42 | yeah |
| 00:24 | durka42 | unless one is trying to get clojure to work in an applet or on android |
| 00:24 | whidden | so i'll give the point. |
| 00:24 | durka42 | where bytecode generation is entirely taboo |
| 00:25 | whidden | it wold not matter |
| 00:25 | hiredman | durka42: is why you, you know, pre-*compile* to bytecode |
| 00:25 | whidden | you would just have to do a two step process at most |
| 00:25 | durka42 | but no eval, right? |
| 00:25 | hiredman | durka42: if you say so |
| 00:26 | hiredman | 21:26 durka42 : where bytecode generation is entirely taboo |
| 00:26 | whidden | eval is built into the clojure, so you could still get away with eval, even if there is only machine code underneath. |
| 00:26 | hiredman | *sigh* |
| 00:26 | hiredman | clojuer is on a vm |
| 00:26 | hiredman | there is never just machine code underneath |
| 00:26 | whidden | if the jvm is flat on the hardware |
| 00:27 | hiredman | it is still a jvm |
| 00:27 | whidden | so a jvm instruction is a native hardware instruction |
| 00:27 | pjb3 | hiredman: it doesn't have to be, you could but hardware that implements the jvm instruction set directly |
| 00:27 | whidden | what would you have then? |
| 00:27 | pjb3 | what he said :) |
| 00:27 | whidden | that ajile chip does just that. |
| 00:28 | hiredman | whidden: if it was am chien like the one durka42 described where "bytecode generation is entirely taboo" then even then, no eval |
| 00:28 | whidden | but you can "compile" on an x86 and run the "byte" code on the ajile chip. |
| 00:28 | hiredman | eval generates bytecode |
| 00:29 | whidden | yes, i agree, but it need not. |
| 00:29 | durka42 | wow, cool |
| 00:29 | hiredman | whidden: if we are just making stuff up then why not have puff the magic dragon add up your numbers? |
| 00:29 | whidden | on your system you would have to tell eval to generate native. |
| 00:30 | whidden | that's what all the decent lisps do today. |
| 00:30 | hiredman | whidden: you would have to write an entirely new eval |
| 00:30 | whidden | only the back end. |
| 00:30 | whidden | i.e. the emitter |
| 00:31 | whidden | and if your native code followed the jvm byte code then things would go very fast |
| 00:31 | hiredman | the difference between jvm bytecode and x86 asm is huge |
| 00:32 | whidden | yep.. if that was my target then I'd use SBCL and call it a day. :) |
| 00:33 | whidden | but a lot of the RISCs like android have similar characteristics as a JVM byte code. |
| 00:34 | whidden | you also might get some help from the chip supplier to make a byte-code to native conversion tool for you. |
| 00:34 | whidden | taking that you could cobble eval to it and have fun. |
| 00:36 | whidden | of course there is still the compile time semantics and run-time semantics that may crop up. Have not thought all those issues through. |
| 00:37 | whidden | have a gander at : http://sbcl-internals.cliki.net/Compiler |
| 00:38 | whidden | that's basiclly what hotspot does for us with the jvm i think. |
| 00:39 | whidden | gtg... have fun |
| 00:40 | durka42 | it's near the on button |
| 02:30 | fffej | Is there a Clojure equivalent to sublis in Lisp? |
| 02:33 | dhaya | ffailla: I don't know CL. but check out replace, if thats what you want. |
| 02:34 | fffej | thanks dhaya, that's near enough! |
| 02:35 | dhaya | np |
| 02:39 | Lau_of_DK | Top of the morning gents |
| 02:52 | replaca | Lau_of_DK: hi! |
| 03:24 | tuna-fish | This is a really stupid and basic question from a newbie lisper: What is the proper way to call a function (that takes no arguments) n times and collect the responses into a list. |
| 03:24 | tuna-fish | map and for both seem to have clumsy syntax for this case. |
| 03:28 | hiredman | tuna-fish: you could build a lazy-cons of function calls |
| 03:28 | zakwilson | I would use (take n (repeatedly f)), though that gives you a lazy seq instead of a list. |
| 03:28 | hiredman | *cough* |
| 03:28 | hiredman | or that |
| 03:28 | hoeck | zakwilson: yeah |
| 03:28 | tuna-fish | zakwilso: thank you, that seems nice |
| 03:28 | tuna-fish | Laziness is not a problem. |
| 03:29 | zakwilson | This being Clojure, it's probably more idiomatic in most cases to use the lazy seq. |
| 03:42 | zakwilson | I'm trying to use the AOT compiler and having fail. (ClassNotFoundException) I can use or require the lib in question and the classes directory exists. |
| 03:45 | hoeck | zakwilson: classes directory must also be in classpath |
| 03:46 | zakwilson | classes directory is in the same directory as the source file (which I can load by ns name with use or require) |
| 03:48 | hiredman | ./classes/ needs to be on the classpath, relative to where you running compile |
| 03:48 | hiredman | not in the same dir as the .clj file |
| 03:50 | zakwilson | The working directory is the same dir as the .clj file and contains a classes directory. I also tried setting *compile-path* to the absolute pathname of the classes directory. |
| 03:50 | hiredman | zakwilson: that is not right |
| 03:51 | hiredman | the .clj file needs to be in a directory that matches the namespace it uses |
| 03:51 | zakwilson | Right... it is. |
| 03:52 | hiredman | single segment namespace? |
| 03:52 | hiredman | eg (ns foo) |
| 03:53 | hoeck | zakwilson: the classpath must include the wherever/classes/ directory cause it tries to load the compiled stuff from that directory |
| 03:53 | hiredman | zakwilson: how are you launching clojure? |
| 03:54 | zakwilson | Wait... I think I know what the problem is. |
| 03:54 | zakwilson | I'm launching it from emacs with slime. |
| 03:54 | hiredman | tell me you aren;t using add-classpath |
| 03:55 | Lau_of_DK | im not, dont worry |
| 03:55 | zakwilson | No, though I just tried to see if I could fix it that way. One moment. |
| 03:55 | hiredman | ~add-classpath |
| 03:55 | clojurebot | add-classpath is bad, avoid it. I mean it! |
| 03:59 | zakwilson | Ok, fixed. I hadn't had enough caffeine to properly parse what you were saying, hoeck. |
| 04:04 | zakwilson | Does working with classpaths ever get less annoying? |
| 04:09 | hiredman | ~jar directory |
| 04:09 | clojurebot | jar directory is find .jars/ -type f -name \*.jar -print0|xargs -0|sed "s/ /:/g" |
| 04:10 | hiredman | I have a directory I put all my jars in,do CP=`that command line` |
| 04:10 | hiredman | and java -cp $CP clojure.main |
| 04:11 | hiredman | swank-clojure seems to add all the jars in ~/.clojure/ to the classpath |
| 04:34 | ayrnieu | zakwilson - yeah, it's one of those 'newbie mirage' problems that goes away as you approach it. |
| 04:36 | Raynes | In my experiences Classpath never gets less annoying. |
| 04:39 | zakwilson | I guess I could have emacs add the working directory and any "classes" directory in it to the classpath before starting slime. |
| 04:40 | zakwilson | Come to think of it... ASDF can be annoying too. |
| 04:40 | Raynes | I don't actually use Clojure, I just idle in here because all the cool kids are doing it. |
| 04:52 | ayrnieu | I have (for x in $HOME/java/lib/*.jar; do CLASSPATH=$CLASSPATH:$x done), and then have makefiles near my projects that ( cd clojure; svn up; ant ). symlinks in the first directory already point to the newly created ifles. |
| 05:53 | zakwilson | Is there currently a definative "how to make an executable jar" page? The ones I'm finding seem to be a bit out of date, and my uninformed attempts are producing jars that don't work. |
| 05:57 | AWizzArd | ,(def counter (atom 0)) |
| 05:57 | clojurebot | DENIED |
| 05:58 | Raynes | zakwilson: This helps http://groups.google.com/group/clojure/browse_thread/thread/192d9ed627ee4dcb?hl=en |
| 06:00 | AWizzArd | ,(time (let [counter (atom 0)] (doseq [i (range 1000000)] (swap! counter inc)))) |
| 06:00 | clojurebot | "Elapsed time: 756.384 msecs" |
| 06:00 | AWizzArd | ,(time (let [counter (atom 0)] (doseq [i (range 1000000)] (swap! counter inc)))) |
| 06:00 | clojurebot | "Elapsed time: 514.148 msecs" |
| 06:03 | zakwilson | Raynes: That's looking a lot like what I'm doing, but I'm getting "can't find main class", even though it looks like it's in the right place when I look inside the jar. |
| 06:05 | Raynes | I got that as well, and I gave up because I was sleepy. |
| 06:05 | Raynes | Good luck. |
| 06:06 | zakwilson | At least I'm not the only one. |
| 06:08 | ayrnieu | http://java.sun.com/docs/books/tutorial/deployment/jar/ |
| 06:12 | zakwilson | ayrnieu: Thanks. I've looked at the docs and my jar appears to be correct. I suspect the problem is elsewhere, as I get the same error trying to run it on the command line. |
| 06:13 | zakwilson | as in "java -cp ./ my.classname" from the classes directory |
| 06:35 | zakwilson | Got it working - the problem was that all of clojure wasn't there in the classes folder. |
| 07:53 | Holcxjo | Start-up times of such a simple "Hello world" jar are quite sobering... 0.3 sec for a Java hello worlds app, 6.5 sec for a Clojure one... (on my low-power netbook) |
| 07:53 | Raynes | That's sickening. |
| 07:53 | Raynes | D'oh well. I'm off to bed. |
| 08:06 | jdz | Holcxjo: is your app compiled? |
| 08:06 | jdz | and more importantly, is the Clojure compiled... |
| 08:09 | Chouser | I have this on my java command line to shave a few percent off my clojure startup time: -Xbootclasspath/a:clojure.jar |
| 08:12 | Holcxjo | jdz: I followed the instructions on http://groups.google.com/group/clojure/browse_thread/thread/192d9ed627ee4dcb?hl=en |
| 08:12 | Holcxjo | I.e. compile clojure files and clojure.jar unpacked before re-packing into my hello.jar |
| 08:14 | Holcxjo | classes/clojure/ still contains both the *.clj and the *.class files |
| 08:14 | Holcxjo | Will clojure pick the pre-compiled class files or load the .clj files? |
| 08:15 | zakwilson | clojure will prefer the compilled class file unless the clj is newer. |
| 08:18 | Holcxjo | Hmmm. Removed the .clj files and now it takes ~4.6 sec |
| 08:19 | Holcxjo | Better, but still in the oder of 15x slower than Java |
| 08:20 | zakwilson | Clojure's startup time is going to be slower. |
| 08:21 | Holcxjo | Yes, I understand that... |
| 08:21 | Holcxjo | ... was just a bit shocked about the order of difference |
| 08:23 | zakwilson | What sort of machine are you on? |
| 08:24 | zakwilson | I'm getting 1.4s for a hello-world type jar on a T2300. |
| 09:08 | Lau_of_DK | The latest partition-by from contrib breaks on my system, after eating all of my memory - why? |
| 09:34 | Lau_of_DK | (partition-by #(> % 5) [1 2 3 4 5 6 7 8 9 10]) |
| 09:35 | Lau_of_DK | This fries my memory in about 5 minutes - why? |
| 09:36 | cgrand | hmm nice bug |
| 09:36 | cgrand | ,(let [s (seq [1 2])] (identical? (rest s) (rest s))) |
| 09:36 | clojurebot | false |
| 09:37 | cgrand | that's why partion-by fails on vectors |
| 09:37 | cgrand | (or ranges) |
| 09:38 | cgrand | ,(partition-by #(> % 5) (apply list [1 2 3 4 5 6 7 8 9 10])) |
| 09:38 | clojurebot | java.lang.Exception: Unable to resolve symbol: partition-by in this context |
| 09:49 | Lau_of_DK | hmm |
| 09:49 | lisppaste8 | cgrand pasted "fixed partition-by: now works with vectors and ranges!" at http://paste.lisp.org/display/74492 |
| 09:53 | Chouser | danlarkin: people are working on that. you could help! |
| 09:55 | Chouser | danlarkin: do you want your json lib to be in contrib? |
| 09:56 | danlarkin | if it is do I have to send someone patches to update it? |
| 09:57 | Chouser | danlarkin: not if you have commit privs to the svn repo |
| 10:01 | danlarkin | Chouser: I guess there's certainly advantages for having it in contrib |
| 10:02 | Chouser | there are, though there may also be drawbacks. ...which is why I'm asking. :-) |
| 10:03 | Chouser | The reason I thought to ask is that it may be more "discoverable" in contrib than at github. |
| 10:03 | rhickey_ | danlarkin: Library authors can get contrib privileges |
| 10:03 | rhickey_ | danlarkin: what've you got? |
| 10:04 | danlarkin | rhickey_: ah, a json lib |
| 10:05 | Chouser | I haven't talked to Stuart Sierra yet, but it's possible he knew of your lib but wanted one in contrib (for licensing or dependency reasons) |
| 10:05 | Chouser | or perhaps he didn't know about yours. Either way, including yours in contrib may help solve whatever his problem may be. |
| 10:05 | shoover`` | danlarkin: what regressions are you concerned about? there are some tests and I'm willing to do more |
| 10:08 | danlarkin | shoover``: just worried about the weird small corner cases that see bug fixes but no tests, so that bug (or a related one) can pop up again |
| 10:10 | shoover`` | I submitted tests for the last 6 or so trunk bug fixes. I will continue to monitor |
| 10:11 | danlarkin | shoover``: oh cool very nice |
| 10:11 | danlarkin | Chouser: I'll think this over |
| 10:12 | rhickey_ | danlarkin: I'm definitely interesting in hearing about things that cause people to not contrib |
| 10:12 | Chouser | danlarkin: ok. but at the very least you should tell the google group that your lib exists. |
| 10:13 | rhickey_ | http://groups.google.com/group/clojure/browse_frm/thread/affb08d66c048c7f |
| 10:19 | danlarkin | :o now I have no excuses left not to mention it |
| 10:20 | Chouser | rhickey_: I just noticed gen-interface is still in contrib. That should go away, right? |
| 10:20 | shoover`` | clojure, knocking down barriers since 2007 |
| 10:21 | rhickey_ | Chouser: I think so, yes |
| 10:21 | fanda | shoover``: i was also monitoring bugs, here they are: |
| 10:21 | fanda | Bug? overflow check in Numbers.minus |
| 10:21 | fanda | http://groups.google.com/group/clojure/browse_thread/thread/3db6cb2b71008e73 |
| 10:21 | fanda | Is this boolean behavior intentional? |
| 10:21 | fanda | http://groups.google.com/group/clojure/browse_thread/thread/d2c7c33d5b1e25aa/81ba3175da9a877c |
| 10:22 | fanda | Bug (I think): Can't sort collection of vectors containing big integers |
| 10:22 | fanda | http://groups.google.com/group/clojure/browse_thread/thread/14873f9b1a1f65a8/2ce5be560683f0d2 |
| 10:22 | fanda | Non-numeric characters clarification |
| 10:22 | fanda | http://groups.google.com/group/clojure/browse_frm/thread/56500dabe531258a |
| 10:22 | fanda | bug: bean returns the wrong kind of false |
| 10:22 | fanda | http://groups.google.com/group/clojure/browse_thread/thread/6191b681c669247d# |
| 10:23 | shoover`` | fanda: are you writing tests for those, or asking me to? |
| 10:24 | StartsWithK | lisppaste8: help |
| 10:24 | lisppaste8 | To use the lisppaste bot, visit http://paste.lisp.org/new/clojure and enter your paste. |
| 10:25 | fanda | shoover``: no, I am not writing those tests |
| 10:25 | fanda | I was writing some sequence tests, but all my finished tests are now as patched in clojure-contrib issues page |
| 10:25 | lisppaste8 | StartsWithK pasted "untitled" at http://paste.lisp.org/display/74493 |
| 10:26 | fanda | (fanda = Frantisek = fsodomka) |
| 10:26 | StartsWithK | brr.. not title; well, cells system using watchers |
| 10:27 | StartsWithK | i modeled it after the one posted on mailing list |
| 10:27 | shoover`` | fanda: ok, those are on my list now |
| 10:28 | StartsWithK | so, is it ok to implement IRef in such a way when my Cell class is just a proxy for real Ref? |
| 10:28 | fanda | shoover``: thank you! |
| 10:28 | shoover`` | except the first one... I don't see a fix commit number, so I'll wait for that |
| 10:29 | shoover`` | you're welcom |
| 10:29 | shoover`` | e |
| 10:29 | gnuvince | ,(apply str (take-while #(not= % \u0000) [65 66 67 0 68 69])) |
| 10:29 | clojurebot | "65666706869" |
| 10:29 | gnuvince | ,(apply str (take-while #(not= % \u0000) (map char [65 66 67 0 68 69]))) |
| 10:29 | clojurebot | "ABC" |
| 10:32 | ayrnieu | ,"hi\0there" |
| 10:32 | clojurebot | Eval-in-box threw an exception:Invalid digit: t |
| 10:39 | fanda | as discussed earlier: |
| 10:39 | fanda | (let [s (seq [1 2])] (identical? (rest s) (rest s))) => false |
| 10:39 | fanda | is this a bug or not? |
| 10:40 | whidden | Shoover et. all: thanks for the help yesterday |
| 10:41 | Chouser | fanda: I doubt that's a bug. There's not much in clojure that promises identity. |
| 10:41 | kefka | Question: if I call a function and it blocks, and I want to exit the function without killing the Repl, how do I do so? |
| 10:42 | shoover`` | whidden: you're welcome. btw, do you have to press Enter to get a REPL? |
| 10:42 | Chouser | kefka: that question applies equally well to Java, and as far as I can tell the answer is "you shouldn't" |
| 10:42 | whidden | Shoover: twice |
| 10:43 | Chouser | kefka: http://java.sun.com/j2se/1.5.0/docs/guide/misc/threadPrimitiveDeprecation.html |
| 10:43 | kefka | Chouser: Got it. However, I'm just testing something at the Repl, not running it in production. |
| 10:44 | whidden | shoover: for novices to emacs that might be an issue, right now i shrug and plow ahead. |
| 10:44 | shoover`` | whidden: right. the point of the Box is 0-click REPL for beginners. I'm not pushing a new version until I figure that out |
| 10:45 | Chouser | kefka: well, you could try one of those functions they're warning against. :-) |
| 10:45 | whidden | i'd be happy to test and poke around. I had some time this morning while stranded on the train and I couldn't see where to start looking. |
| 10:46 | whidden | a pointer as to where the problem might be would be helpful, if you knew.. ;) |
| 10:47 | whidden | its a strange disconnect looking at clojure code in one panel, emacs lisp in another, and CL in a third. |
| 10:47 | francois___ | Hi all! |
| 10:47 | francois___ | Just wondering what library you use to parse YAML from Clojure |
| 10:47 | francois___ | Or do yo call into Java? |
| 10:47 | shoover`` | my guess is something with encodings or newline processing. the only clues are double "user>" prompts and that it works correctly on Vista |
| 10:49 | shoover`` | if you search for encoding in slime.el, you'll be busy for weeks |
| 10:49 | whidden | lol |
| 10:51 | whidden | yes i can well imagine that would be the case. |
| 10:52 | fanda | shoover``: Are you working on any tests except bugs? I was working on predicates (basically anything with '?' at the end :-) and on sequences. Asking, so that we don't duplicate our effort :-) |
| 10:52 | fanda | Chouser: identical? is still strange to me. I found it on http://clojure.org/other_functions |
| 10:52 | fanda | Is there any place where I can look for deeper description? |
| 10:55 | knapr | how do I create a script for windows to be run at the command prompt? |
| 10:55 | whidden | on a separate, but equally important front for me, is doing serial IO from clojure under Win32 and/or linux. Is javax.comm the only player? |
| 10:57 | shoover`` | fanda: just bugs. I'll post to the group if that changes |
| 10:57 | Chouser | fanda: 'identical?' in Clojure is the same as == in Java |
| 10:58 | fanda | ouky douky |
| 10:59 | shoover`` | knapr: you want to run a clojure script from the command prompt? run this and check out the options: java -cp clojure.jar clojure.main --help |
| 11:04 | shoover`` | you can make a batch file to doctor the classpath and command line args |
| 11:09 | AWizzArd | Clojure basically offers two commonly needed test functions for equality, out of the infinite set of equalities. |
| 11:11 | knapr | shoover: iw ant to run a java .class file, but i dont want to fill in all the details every time |
| 11:11 | rhickey_ | danlarkin: we haver a winner! http://clojure.org/libraries |
| 11:12 | danlarkin | it's so lonely :) |
| 11:13 | rhickey_ | danlarkin: not for long, I'm sure |
| 11:25 | fanda | rhickey_: just don't forget to put http://clojure.org/libraries link somewhere on the menu... |
| 11:25 | fanda | streams are hidden too - what about some group named R&D :-) |
| 11:28 | scottj | I have some flat sorted data (vector of strings) and I need to be able to search it quickly by prefix substring. filter isn't quite fast enough. Is there an easy way to turn it into a tree or something that can take advantage of the sort? |
| 11:29 | rhickey_ | fanda: libraries will go on menu when more populated, streams maybe never |
| 11:29 | fanda | rhickey_: ok |
| 11:30 | rhickey_ | ok, next episode of the name game... |
| 11:30 | danlarkin | *sigh* |
| 11:31 | fanda | rhickey_: almost thought I was bugging you too much |
| 11:31 | fanda | ;-) |
| 11:32 | rhickey_ | I'm working on the lazy branch, where sequences can be fully lazy. Calling seq on some-coll yields nil or an ISeq as always, |
| 11:33 | rhickey_ | but now a non-nil seq has a first and (name to be determined, code-name "more"), where more is not iseq/nil, but something on which you can call seq |
| 11:34 | Chouser | maybe-more |
| 11:34 | rhickey_ | One option is to change the meaning and type of rest to be more, e.g. (rest aseq) -> seqable |
| 11:34 | rhickey_ | lots of breakage |
| 11:35 | rhickey_ | the other is to define (rest aseq) === (seq (more aseq)) |
| 11:35 | rhickey_ | and have a new more fn |
| 11:36 | rhickey_ | I'm inclined towards the latter, and am looking for a good name for "more" |
| 11:36 | rhickey_ | should be short |
| 11:37 | danlarkin | cdr :) |
| 11:37 | rhickey_ | danlarkin: it's definitely not cdr, although I haven't decided how far to constrain the type |
| 11:38 | rhickey_ | meaningful would be good too :) |
| 11:39 | Chouser | rest, others, further |
| 11:39 | danlarkin | my brainstorm has resulted in: further, additional, extra |
| 11:39 | Chouser | I don't know why I said 'rest'. sorry. |
| 11:40 | fanda | rest => more, remain, remaining, remainder, tail, leftover, residual :-) |
| 11:40 | achim_p_ | butfirst :) |
| 11:40 | Chouser | after |
| 11:41 | fanda | so far 'tail' looks nice to me |
| 11:42 | rhickey_ | the existence of rest, as well as the need to change lazy code currently using rest, and the possible (likely) confusion between when to use rest and more, makes it possibly desirable to use a rest variant, like lazy-rest, restl, rest-coll etc |
| 11:43 | Chouser | I don't love the length, but the meaning of 'lazy-rest' is nice. |
| 11:43 | danlarkin | I like lazy-rest the best out of those options, even though it's kinda long |
| 11:43 | jkantz | lazy-rest plays well with lazy-cons |
| 11:43 | danlarkin | Chouser: get out of my head! |
| 11:43 | fanda | + lazy-rest |
| 11:44 | Chouser | You'd call 'seq' on it to make it concrete, right? ...either nil or a LazyCons |
| 11:44 | Chouser | lrest might be ok, but I still might prefer lazy-rest. |
| 11:45 | Chouser | It seems likely 'rest' would still be used a good deal more often. lazy-rest would help point out to readers you've being particularly careful about laziness when you use it. |
| 11:45 | AWizzArd | is the l prefix already used somewhere else for indicating lazyness? |
| 11:46 | jkantz | (with-out-str (map print '(1))) => "" ??? |
| 11:47 | Chouser | not that I know of |
| 11:47 | lisppaste8 | rhickey pasted "fully lazy filter" at http://paste.lisp.org/display/74500 |
| 11:47 | Chouser | jkantz: 'map' is lazy |
| 11:48 | Chouser | ,(with-out-str (dorun (map print '(1)))) |
| 11:48 | clojurebot | "1" |
| 11:48 | rhickey_ | the fully lazy filter above is correct in the new model, and free of the current spanning bug |
| 11:48 | jkantz | oh ok, I'm still adjusting to laziness |
| 11:48 | Chouser | jkantz: the reason you're running into it here is that 'print' has side-effects |
| 11:49 | rhickey_ | but using lazy- where more goes is not quite right, as no additional laziness is there. more can return nil/iseq for concrete data structures |
| 11:49 | Chouser | jkantz: it probably doesn't belong as an argument to 'map', though without seeing your real usage, it's hard to know what else to recommend. |
| 11:51 | fanda | can I know which function is lazy or not? is there something like (lazy? map) => true ??? |
| 11:51 | noidi | what's wrong with "more"? |
| 11:51 | jkantz | oh I'm doing this wrong ... trying to flatten a list of strings into one with spaces between |
| 11:52 | Chouser | jkantz: I'm guessing you've used other lisps before? |
| 11:52 | jkantz | yeah ... this is close (map concat (interleave '("1" "2") (repeat " "))) ... what's concat for strings? |
| 11:52 | jkantz | oh, java fns |
| 11:52 | Chouser | jkantz: 'str' builds a string of its arguments |
| 11:52 | arbscht | ,(str "a" "b") |
| 11:52 | clojurebot | "ab" |
| 11:53 | Chouser | ,(apply str (range 10)) |
| 11:53 | clojurebot | "0123456789" |
| 11:53 | fanda | jkantz: http://code.google.com/p/clojure-contrib/source/browse/trunk/src/clojure/contrib/str_utils.clj |
| 11:53 | fanda | see str-join |
| 11:54 | jkantz | thanks fanda |
| 11:54 | fanda | you are welcome |
| 11:55 | rhickey_ | noidi: nothing inherently wrong with more |
| 11:59 | noidi | i prefere "more"... it's like saying "more, please" instead of referring directly to the rest of the elements, like "rest" and its variants imply, imo |
| 11:59 | noidi | -r |
| 11:59 | noidi | +r-e... can't even fix my typos :) |
| 12:00 | rhickey_ | noidi: very Oliver Twist-ian interpretation, but I'll take it :) |
| 12:01 | noidi | hehe |
| 12:15 | fanda | (doc nth) |
| 12:15 | clojurebot | Returns the value at the index. get returns nil if index out of bounds, nth throws an exception unless not-found is supplied. nth also works for strings, Java arrays, regex Matchers and Lists, and, in O(n) time, for sequences.; arglists ([coll index] [coll index not-found]) |
| 12:16 | brianh | hi all. I'm trying to wrap my head around all this lazy stuff. |
| 12:16 | fanda | nth says that it works on "regex Matchers" - what is it? |
| 12:16 | brianh | how would more differ from force? |
| 12:16 | fanda | is it #"a*b" etc... |
| 12:17 | ayrnieu | ,(nth #"a*b" 1) |
| 12:17 | clojurebot | java.lang.UnsupportedOperationException: nth not supported on this type: Pattern |
| 12:17 | fanda | exactly |
| 12:18 | bitbckt | ,(doc re-find) |
| 12:18 | clojurebot | "([m] [re s]); Returns the next regex match, if any, of string to pattern, using java.util.regex.Matcher.find(). Uses re-groups to return the groups." |
| 12:18 | bitbckt | (for example) |
| 12:18 | fanda | no no, I am questioning nth behavior or its doc |
| 12:19 | leafw | any recommended way to capture the output of a program that runs and finishes, in a terminal? Via (.exec (Runtime/getRuntime) "xmms2 list") , for example |
| 12:21 | bitbckt | fanda: re-* all operate on regex matchers; to use nth, you could use something like re-matcher to return a matcher |
| 12:21 | fanda | ok, I get it now |
| 12:21 | fanda | thanks |
| 12:21 | bitbckt | np |
| 12:21 | cooldude127 | so is there anyway to make the clojure repl print certain objects differently? |
| 12:22 | durka42 | you can add methods to the print-method multimethod |
| 12:22 | durka42 | see Chouser's recent patch for ref printing |
| 12:22 | ayrnieu | look in src/clj/clojure/core_print.clj |
| 12:23 | cooldude127 | ayrnieu, durka42: thank you |
| 12:23 | durka42 | http://clojure.googlecode.com/issues/attachment?aid=3251654005916676481&name=print-iref.patch |
| 12:23 | cooldude127 | shit that's what i was afraid of, that's not gonna do anything for me |
| 12:24 | ayrnieu | why isn't it? |
| 12:24 | cooldude127 | ayrnieu: i wanted a way to say, print a certain struct differently |
| 12:25 | cooldude127 | but it looks like it dispatches on class |
| 12:26 | cooldude127 | yup definitely dispatches on class |
| 12:27 | Chouser | cooldude127: I have an unposted unmentioned patch I was playing with to do that. |
| 12:27 | ayrnieu | so write a method for all structs and then have it do its own dispatching. |
| 12:27 | cooldude127 | yeah i just thought about that |
| 12:28 | cooldude127 | Chouser: care to paste what you got? |
| 12:29 | cooldude127 | i assume just do a (defmethod print-method clojure.lang.PersistentStructMap |
| 12:30 | cooldude127 | do structs have something that indicates what type of struct they are? |
| 12:31 | Chouser | withuser=> #^{:custom-print (fn [o w] (.write w (format "#<my-map %s>" (pr-str (with-meta o nil)))))} {:a 1} |
| 12:31 | Chouser | #<my-map {:a 1}> |
| 12:33 | lisppaste8 | Chousear pasted "patch to support :custom-print" at http://paste.lisp.org/display/74507 |
| 12:33 | cooldude127 | Chouser: so if i have a function that creates these for me, i could just attach the metadata there and it would just work |
| 12:33 | Chouser | cooldude127: right |
| 12:34 | Chouser | and because meta-data is carried through assoc/dissoc etc., you could tag your empty map with a :custom-print and then as you build and change it, it would print the way you want. |
| 12:35 | cooldude127 | Chouser: so your patch makes that work for anything, but if i want to do this for just my purposes, i could make a defmethod on just structs, and do essentially the same thing, cuz i don't want to mess with clojure.core |
| 12:38 | Chouser | yeah, that ought to work. Though you're messing with the global print-method table, so I'd be careful. |
| 12:38 | cooldude127 | i'll try it in a little bit, i need to go, we'll see how this works |
| 12:38 | Chouser | for example, what happens if somebody else has their own custom defmethod for structs |
| 12:39 | Chouser | I'd much prefer to have :custom-print officially supported -- it composes much better for multiple libs |
| 12:40 | cooldude127 | Chouser: yeah, i just want something right now, i'll do it your way once it's part of the language |
| 12:40 | leafw | how can one pass a character literal to indexOf method of String? |
| 12:40 | leafw | (.indexOf "that" \h) fails |
| 12:40 | ayrnieu | ,(class \a) |
| 12:40 | clojurebot | java.lang.Character |
| 12:40 | leafw | yes, I know. But (char \h) also fails. |
| 12:41 | Chouser | ,(.indexOf "that" (int \h)) |
| 12:41 | clojurebot | 1 |
| 12:41 | leafw | int! |
| 12:41 | leafw | woah |
| 12:41 | Chouser | .indexOf actually wants an int. :-P |
| 12:41 | ayrnieu | http://java.sun.com/j2se/1.4.2/docs/api/java/lang/String.html |
| 12:42 | leafw | indeed. I always passed 'h' on the java side. |
| 12:42 | ayrnieu | I guess those are ints the way they are in C. |
| 12:43 | ayrnieu | (no, they're char.) |
| 12:59 | cooldude127 | Chouser: i just realized something. if a struct doesn't have custom-print, i need to fallback on the default printing of the map behavior. how do i do that? |
| 13:02 | durka42 | this might help: |
| 13:02 | durka42 | ,((methods print-method) clojure.lang.IPersistentMap) |
| 13:02 | clojurebot | #<core$fn__5324 clojure.core$fn__5324@eb840f> |
| 13:03 | durka42 | i.e. you could grab the old one before you override it |
| 13:04 | durka42 | ,(((methods print-method) clojure.lang.IPersistentMap) {:a 1} *out*) |
| 13:04 | clojurebot | {:a 1} |
| 13:05 | durka42 | i believe that line of code soundly defeats the purpose of a multimethod |
| 13:07 | bitbckt | durka42: you did good, kid. real good. |
| 13:10 | durka42 | hmm |
| 13:10 | hiredman | clojurebot: comp is <reply>use comp for a point free, pointless style |
| 13:10 | clojurebot | Ok. |
| 13:10 | cooldude127 | lol |
| 13:10 | durka42 | ,(((methods print-method) java.lang.Number) {:a 1} *out*) |
| 13:10 | clojurebot | {:a 1} |
| 13:10 | durka42 | i forgot about comp |
| 13:10 | durka42 | dammit, i overrode clojure.core with a parameter name again |
| 13:14 | acieroid | how can I say to clojure that I define methods later in the source code ? |
| 13:15 | durka42 | declare |
| 13:15 | durka42 | (doc declare) |
| 13:15 | clojurebot | defs the supplied var names with no bindings, useful for making forward declarations.; arglists ([& names]) |
| 13:16 | Peter_anagio1 | join #wauk |
| 13:16 | acieroid | ok, thanks durka42 |
| 13:17 | rhickey | Chouser: have you got URLs for the net.n01se libraries? http://clojure.org/libraries |
| 13:19 | lisppaste8 | knapr pasted "py" at http://paste.lisp.org/display/74512 |
| 13:26 | Chouser | rhickey: net.n01se.clojure-classes is at http://tinyurl.com/clojure-classes |
| 13:26 | rhickey | Chouser: and repl-utils? |
| 13:27 | durka42 | that's in contrib, no? |
| 13:27 | Chouser | oh, I posted the wrong namespace for that one |
| 13:27 | Chouser | i'll fix it |
| 13:27 | rhickey | Chouser: thanks |
| 13:29 | Chouser | done |
| 13:44 | Kerris7 | Quantity of Stuart Halloway's weekly "Programming Clojure" edit count as an indicator of Clojure volatility :) |
| 13:45 | durka42 | what is the quantity? |
| 13:47 | Kerris7 | I'm afraid I don't know, durka42. |
| 13:48 | Kerris7 | It was a tongue-in-cheek (?) suggestion since I don't know about measuring volatility. :) |
| 13:48 | knapr | anyone good with windows batch scripts? i want to have a script than i can just run so i dont have to append allt he class fiels each time |
| 13:49 | ayrnieu | knapr: http://en.wikibooks.org/wiki/Clojure_Programming/Getting_Started |
| 13:54 | cooldude127 | ok i got my structs printing correctly. it feels so dirty, but it works |
| 14:01 | Chouser | I wonder if individual defmethods should be marked with the namespace where they were defined, so that other namespaces can't replace them. |
| 14:01 | Chouser | eh, I guess that doesn't fully clean up the situation. |
| 14:06 | Kerris7 | clojurebot: help |
| 14:06 | clojurebot | macro help is http://clojure-log.n01se.net/macro.html |
| 14:06 | Kerris7 | clojurebot: latest |
| 14:06 | clojurebot | latest is 1238 |
| 14:08 | cooldude127 | how long has that macro help thing been there? |
| 14:16 | Kerris7 | cooldude127: no idea, I was just trying to find help for clojurebot |
| 14:16 | Kerris7 | does anyone here use Clojure installed from MacPorts? |
| 14:17 | Kerris7 | I also have JLine installed from MacPorts and I'm wondering if there's a convenient way to launch clj-jline |
| 14:17 | durka42 | i remember someone trying, and running into problems |
| 14:17 | durka42 | trying macports clojure, that is |
| 14:18 | Kerris7 | durka42: macports clojure does work now, they've included a clj-jline.sh file which doesn't quite work |
| 14:18 | Kerris7 | ah well, I can live without this |
| 14:19 | durka42 | hmm, what's the error |
| 14:19 | Kerris7 | clojurebot: paste? |
| 14:19 | clojurebot | lisppaste8, url |
| 14:19 | lisppaste8 | To use the lisppaste bot, visit http://paste.lisp.org/new/clojure and enter your paste. |
| 14:19 | lisppaste8 | Kerris7 pasted "bash script error" at http://paste.lisp.org/display/74514 |
| 14:21 | hiredman | Kerris7: looks like jline isn't in your classpath |
| 14:21 | durka42 | hmm, where does macports put clj-jline.sh? |
| 14:21 | Kerris7 | durka42: /opt/local/var/macports/sources/rsync.macports.org/release/ports/lang/clojure/files/clj-jline.sh by deafult |
| 14:21 | Kerris7 | default* |
| 14:22 | durka42 | oh ok, thought it might be somewhere else too |
| 14:22 | durka42 | maybe a more concise path |
| 14:23 | Kerris7 | only two instances of that file exists on my computer, the other is the same file cp'd to my home with chmod +x |
| 14:23 | Kerris7 | hiredman: you're right, I forgot that the macports installation of JLine doesn't place jline into the classpath automagically |
| 14:27 | durka42 | if you edit the last line in clj-jline.sh to include $CLASSPATH in the -classpath argument to java, and then add jline.jar and clojure.jar to your $CLASSPATH, then it works |
| 14:30 | Kerris7 | thanks durka42 |
| 14:30 | durka42 | probably clojure-contrib.jar for good measure |
| 14:42 | knapr | when i un my scrip runmp3.py it starts the subprocess as it should but the script is still active. can i escape from the pyhonscript and return to the command prompt once the java program is started? |
| 14:45 | skillet-thief | if I type (spit "file" (str "12:34:34")) |
| 14:45 | skillet-thief | and then (with-in-str (slurp "flomp") (read)) |
| 14:45 | cooldude127 | what's the write way to write docstrings, in regards to wrapping and indentation |
| 14:45 | cooldude127 | *right |
| 14:46 | skillet-thief | i get an error "Invalid number: 12:34:34" |
| 14:47 | kotarak | cooldude127: "foo\n<space><space>bar", at least this looks nice when printed. Having a reasonable line limit also helps when printed in the terminal |
| 14:47 | kotarak | cooldude127: YMMV |
| 14:47 | skillet-thief | why is (str "12:34:34") being treated as a number and not as a string? |
| 14:48 | kotarak | skillet-thief: 1:1 user=> (str "12:34:34") |
| 14:48 | kotarak | "12:34:34" |
| 14:48 | cooldude127 | kotarak: the problem with <space><space> is it's not always two space indentation. like i'm using test-is with (with-test), so all my defns are indented 4 spaces to start |
| 14:48 | kotarak | skillet-thief: looks like a string |
| 14:48 | kotarak | cooldude127: I had this case also. Then I still chose two space indent. It looks ugly in the code, but nice when printed. |
| 14:49 | cooldude127 | skillet-thief: (read) sees 12:34:34, which looks like a number to start, and it tries to parse it as such |
| 14:49 | cooldude127 | (read) is the clojure reader, so it is trying to parse clojure code |
| 14:49 | skillet-thief | cooldude127: that makes sense. So what do I do to serialize correctly? |
| 14:49 | cooldude127 | not really sure |
| 14:49 | cooldude127 | ,(pr "str") |
| 14:49 | clojurebot | "str" |
| 14:50 | cooldude127 | ,(print "str") |
| 14:50 | clojurebot | str |
| 14:50 | cooldude127 | that might be a clue |
| 14:50 | cooldude127 | i have to go |
| 14:50 | durka42 | read-string? |
| 14:50 | cooldude127 | i'll be back |
| 14:50 | skillet-thief | thanks |
| 14:50 | durka42 | ,(read-string "\"12:34:34\"") |
| 14:50 | clojurebot | "12:34:34" |
| 14:50 | kotarak | (pr-str) returns a string. Might be handy. |
| 14:52 | skillet-thief | ok, (read-string) would work if that was all I was reading, but "12:34:34" is part of a bigger file I am slurping. |
| 14:52 | kotarak | skillet-thief: try (pr-str ...) instead of (str ...) in your original example. |
| 14:53 | skillet-thief | kotarak: ok, just a sec |
| 14:53 | kotarak | 1:1 user=> (with-in-str (pr-str "12:34:34") (read)) |
| 14:53 | kotarak | "12:34:34" |
| 14:54 | skillet-thief | yeah, me too |
| 14:55 | skillet-thief | and in the file, there are quotes. so I need quotes for this to work, but I might need to add them manually before serializing... |
| 14:56 | skillet-thief | (pr-str "12:34:34") => "\"12:34:34\"" |
| 14:56 | kotarak | skillet-thief: there is a way to print clojure "things" in a way to read them back in. |
| 14:57 | kotarak | skillet-thief: doesn't work for everything though... eg. fns |
| 14:58 | kotarak | skillet-thief: 1:11 user=> (binding [*print-dup* true] (println (sorted-set 1 2 3) "String")) |
| 14:58 | kotarak | #=(clojure.lang.PersistentTreeSet/create [1 2 3]) "String" |
| 14:59 | skillet-thief | kotarak: ok, that looks interesting. |
| 14:59 | skillet-thief | i guess I thought it would be kind of automagic. |
| 14:59 | kotarak | Hmm.. Maybe fns *do* work under certain conditions. |
| 15:00 | kotarak | skillet-thief: yes. you simply print like above and then simply (read) to get stuff back. |
| 15:01 | skillet-thief | kotarak: I'm going to try to work through your suggestion with (binding... |
| 15:01 | skillet-thief | I'll end up learning something anyway. |
| 15:08 | lisppaste8 | leafw pasted "xmms2 GUI" at http://paste.lisp.org/display/74518 |
| 15:08 | leafw | just for fun: a trivial GUI front-end to XMMS2 (which is command-line only). |
| 15:11 | Chousuke | not really command line only... just multi-client :) |
| 15:13 | leafw | the only tricky part of this simple GUI is knowing how to use the AbstractTableModel, or rather, knowing that JTable has such bizarre way of working. |
| 15:13 | cooldude127 | JTable = pain |
| 15:14 | Chousuke | are there no java bindings for xmms2 though? :/ |
| 15:14 | Chousuke | I guess the C bindings could be wrapped with JNA |
| 15:16 | cooldude127 | i just discovered the clojure inspector. that freaked me out a little bit |
| 15:18 | knapr | (not (empty? xs)) , is there (not-empty? xs) or soemthing? |
| 15:18 | cooldude127 | knapr: ,(not-empty [1 2 3]) |
| 15:18 | cooldude127 | ,(not-empty [1 2 3]) |
| 15:18 | clojurebot | [1 2 3] |
| 15:19 | cooldude127 | ,(not-empty []) |
| 15:19 | clojurebot | nil |
| 15:19 | Chousuke | isn't there a line-seq or something for going through lines in a stream? |
| 15:19 | cooldude127 | knapr: yes there is :) |
| 15:21 | Chousuke | ah, right, there is |
| 15:21 | Chousuke | (doc line-seq) |
| 15:21 | clojurebot | Returns the lines of text from rdr as a lazy sequence of strings. rdr must implement java.io.BufferedReader.; arglists ([rdr]) |
| 15:21 | Chousuke | knapr: see that :) |
| 15:21 | cooldude127 | (doc not-empty) |
| 15:21 | clojurebot | If coll is empty, returns nil, else coll; arglists ([coll]) |
| 15:27 | Chouser | It's more normal to use 'seq' instead of 'not-empty', unless you specifically need the original collection object in the not-empty case. |
| 15:28 | Cark | chouser : what if rich removes nil punning ? |
| 15:28 | Cark | or was that scraped ? |
| 15:30 | Chouser | even then he was going to keep 'seq' returning nil for empty things |
| 15:30 | Chouser | it was just a matter of 'rest' or other seq functions returning "seq or nil" vs. possibly a stream or other object. |
| 15:30 | Cark | ah i see |
| 15:36 | StartsWithK | i have a small question about post "Got a Clojure library? ", if my lib contains number of sub-libraries, all for different purpose, should i list them all under one description or divide them in separate descriptions per sublib? (it is cca 10 libs under same repository) |
| 15:36 | hiredman | is it possible to compare two symbols disregarding their namespaces? |
| 15:36 | StartsWithK | and, there will be no end date to responding? so if new libs are created it is ok to list them later? |
| 15:37 | hiredman | well of course it is possible, but, you know, without turning them into strings or keywords |
| 15:37 | cooldude127 | why doesn't (assert ...) have some sort of message argument? it would be nice to explain these sometimes |
| 15:38 | StartsWithK | also, what counts as library.. like, i have a web framework/lib, and another project with generic web componets using that lib, should i list them too? |
| 15:43 | danlarkin | hiredman: use (name) on them both perhaps? |
| 15:44 | cooldude127 | i think he wanted to avoid that, but i don't think theres another way |
| 15:45 | danlarkin | StartsWithK: whatever you want/think is justified to be listed on clojure.org/libraries |
| 15:45 | danlarkin | cooldude127: re: assert, I know! I wrote a "my-assert" |
| 15:46 | cooldude127 | danlarkin: code? |
| 15:46 | danlarkin | cooldude127: I just copy&pasted the assert macro and added another arg and had it print that out |
| 15:47 | cooldude127 | lol that works |
| 15:48 | StartsWithK | danlarkin: and listink dependencies, is it ok to just list organisation artifact and version of dependency as specified in ibiblio maven repository? |
| 15:49 | hiredman | danlarkin: :( |
| 15:49 | hiredman | I guess that'll do |
| 15:50 | Chouser | ,(apply = (map name '(foo/bar baz/bar))) |
| 15:50 | clojurebot | true |
| 15:53 | danlarkin | StartsWithK: I'm sure just the name of the dependency and a revision number if need be is fine |
| 15:54 | StartsWithK | danlarkin: thanks |
| 15:56 | hiredman | I think clojure.zip needs a find-replace function, that takes a zipper, a predicate, and a fn, nexts through the zipper and if the predicate is true for any next, it applies the fn |
| 15:56 | cooldude127 | does the with-test macro in test-is work on defmethods? |
| 15:57 | red_fish | how can I implement a persistent linkedblockedqueue |
| 15:57 | red_fish | ? |
| 15:57 | hiredman | lisppaste8: url? |
| 15:57 | lisppaste8 | To use the lisppaste bot, visit http://paste.lisp.org/new/clojure and enter your paste. |
| 15:58 | lisppaste8 | hiredman pasted "pointlessly pointful" at http://paste.lisp.org/display/74521 |
| 16:02 | durka42 | interesting |
| 16:02 | durka42 | zippers used to implement infix operators |
| 16:02 | lisppaste8 | hiredman annotated #74521 with "example usage" at http://paste.lisp.org/display/74521#1 |
| 16:04 | Chousuke | lisppaste8: generalise that for arbitrary operators. |
| 16:04 | Chousuke | eh |
| 16:04 | Chousuke | hiredman: ! |
| 16:04 | hiredman | Chousuke: ! |
| 16:05 | hiredman | so I copied the MIT license from somewhere and just sort of stuck my name in the copyright bit, but you are have done alot with clojurebot so I was wondering if you want to be included in LICENSE? |
| 16:05 | Chousuke | I'm fine either way :) |
| 16:06 | hiredman | yeah |
| 16:07 | hiredman | well, fix it then :P |
| 16:07 | lisppaste8 | StartsWithK pasted "Cell system; cells can now depend on normal object properties, like swing widgets" at http://paste.lisp.org/display/74522 |
| 16:09 | durka42 | hey, that could be useful |
| 16:09 | durka42 | so cells are like lazy variables? |
| 16:10 | StartsWithK | durka42: yes, they are updated only when there parent are updated |
| 16:10 | Chousuke | neat |
| 16:10 | StartsWithK | for now parent can be anything you can attach watcher with add-watcher and in this version any object property for who you can provide some sort od listenere |
| 16:10 | Chousuke | looks like something that should go into contrib :) |
| 16:11 | Chousuke | certainly somewhere other than a lisppaste :P |
| 16:11 | StartsWithK | Chousuke: http://bitbucket.org/ksojat/neman/ |
| 16:11 | hiredman | and lisppaste has not root in which to look for the CPL.txt mentioned in the header |
| 16:13 | StartsWithK | so for now its missing object-property -> cell and object-property -> object-property connection types |
| 16:32 | AWizzArd | Is it just me or is http://clojure.org/repl_and_main blank for others too? rhickey, should there be something on that page? |
| 16:32 | lisppaste8 | knapr pasted "unbound variable" at http://paste.lisp.org/display/74526 |
| 16:32 | knapr | someone can take a look at that? |
| 16:33 | Kerris7 | AWizzArd: looks blank to me too |
| 16:34 | danlarkin | AWizzArd: there was a post on the mailing list about that very page |
| 16:35 | AWizzArd | ic |
| 16:35 | danlarkin | AWizzArd: Stephen C. Gilardi says he'll have something there in a few days |
| 16:36 | durka42 | knapr: display-song looks internal the layout function |
| 16:36 | durka42 | so you can't get at it from outside |
| 16:37 | scottj | How do you define an alias for a function in a way that the function parameters will still display in slime? |
| 16:37 | knapr | durka42: ah ok, ofc |
| 16:37 | knapr | but then how do I do? then I have to redeisgn the whole thing... |
| 16:38 | StartsWithK | knapr: just (def display-song (JLabel.)) outside your layout function (for quick fix) |
| 16:39 | knapr | yeah i was thinking that but its ugly no? |
| 16:42 | StartsWithK | knapr: you can change play-next so it takes that label as one of the arguments |
| 16:44 | durka42 | can gen'ed classes have members? |
| 16:45 | StartsWithK | durka42: you can declare :state |
| 16:45 | AWizzArd | scottj: you would have to write a macro for aliasing, which expends into a defn |
| 16:46 | AWizzArd | expands |
| 16:47 | knapr | StartsWithK: thanks ofc good tip |
| 16:47 | StartsWithK | durka42: but i think it will be declared public, so if you declare in gen-class :state state, you can acces it from outside with (.state your-object) |
| 16:52 | hiredman | how can I find the arity of a fn? |
| 16:52 | hiredman | is there some function? I looked a little through IFn.java and friends |
| 16:52 | AWizzArd | hiredman: (:arglists (meta #'+)) |
| 16:53 | hiredman | AWizzArd: that is getting it from a var |
| 16:53 | hiredman | what about anonymous functions? |
| 16:53 | hiredman | (fn [a b] [a b]) |
| 16:54 | hiredman | if that was handed to you as x, how do you get an arity count for x |
| 16:55 | Chouser | I don't think you can |
| 16:55 | AWizzArd | with some tricks |
| 16:55 | shoover`` | Does anyone have examples of clojure apps actually using clojure.contrib.sql or resultset-seq? |
| 16:55 | AWizzArd | you could try to call it inside a try/catch block |
| 16:55 | AWizzArd | and if you land in catch you have a chance to find out more about it :-) |
| 16:56 | hiredman | Chouser: :( |
| 16:56 | Chouser | the official interface of a fn is that it accepts any number of args |
| 16:56 | Chouser | it's just that calling some of them throws an exception |
| 16:57 | hiredman | internally fn throws and Arity exception but that gets caught and a more generic IllegalArgumentException is thrown |
| 16:57 | hiredman | ugh, putting try catch around everything is lame |
| 16:58 | Chouser | and since fn's don't take metadata (yet), there's nowhere else to put that kind of info. |
| 16:58 | hiredman | maybe I'll wait on auto-partial till fn's can take metadata then |
| 16:59 | Chouser | you can require users to pass in a Var |
| 17:29 | Chouser | I just don't understand what people have against (some #{3} '(2 3 4)) |
| 17:30 | hiredman | *shrug* |
| 17:31 | hiredman | hmm |
| 17:32 | cooldude127 | wait so sets are functions that indicate if something is in the set? |
| 17:32 | Chouser | yep |
| 17:33 | cooldude127 | i love the way clojure makes functions out of EVERYTHING |
| 17:33 | Chouser | except regular expressions |
| 17:34 | cooldude127 | :( |
| 17:34 | Hun | that'd be perlish |
| 17:34 | Hun | (: |
| 17:35 | Chouser | I thought I saw somewhere that a patch for that would be accepted, but it's hard to figure out how to make a final Java class act like a Clojure function. |
| 17:37 | cooldude127 | can multimethods have multiple arities? |
| 17:37 | Chouser | yes |
| 17:37 | kotarak | cooldude127: yep |
| 17:37 | cooldude127 | how does that work out in practice? |
| 17:37 | Chouser | frequently the dispatch function ignores all but the first arg |
| 17:38 | Chouser | Holloway's book has a fantastic example, though. |
| 17:38 | kotarak | (defmutli foo (fn [x & _] (class x)) (defmethod foo String [x a] ...) (defmethod foo Integer [x a b c & bla] ...) |
| 17:39 | cooldude127 | cuz i'm writing a library for linear algebra, so i'm doing stuff with adding matrices and numbers and stuff, and so it'd be cool to have the addition and multiplication functions and stuff accept many arguments |
| 17:39 | cooldude127 | but maybe this is easier to do with multimethods for just the two-arg case and then just use reduce |
| 17:42 | hiredman | ,((comp (partial apply some) list) #{3} '(1 2 3)) |
| 17:42 | clojurebot | 3 |
| 17:42 | hiredman | hmmm |
| 17:42 | hiredman | no improvement at all |
| 17:45 | cads | does anyone here use the enclojure addon for netbeans? |
| 17:51 | hiredman | ,(((comp (partial partial (comp (partial apply some) list)) (comp set list)) 3) '(1 2 3)) |
| 17:51 | clojurebot | 3 |
| 17:51 | hiredman | ,(((comp (partial partial (comp (partial apply some) list)) (comp set list)) 10) '(1 2 3)) |
| 17:51 | clojurebot | nil |
| 17:51 | hiredman | partial partial is a bad sign |
| 17:51 | cooldude127 | oh |
| 17:51 | cooldude127 | my |
| 17:51 | cooldude127 | god |
| 17:51 | cooldude127 | hiredman: what are you trying to achieve here? |
| 17:52 | hiredman | point free contains? |
| 17:52 | cooldude127 | whyyyyy |
| 17:52 | cooldude127 | lol |
| 17:52 | Chouser | "point free"? |
| 17:52 | hiredman | point free seems so hip and happening |
| 17:52 | cooldude127 | hiredman: it is in haskell, but nobody likes it in lisp |
| 17:53 | cooldude127 | only in the simplest of cases |
| 17:53 | hiredman | http://www.haskell.org/haskellwiki/Pointfree |
| 17:53 | hiredman | Chouser: I rewrote ther version of your inits that I have in clojurebot in point free style |
| 17:54 | hiredman | I am pretty sure it still works too |
| 17:54 | hiredman | tons of partial application |
| 17:58 | hiredman | I guess it isn't completely pointless |
| 17:58 | ayrnieu | Chouser: I rewrote ther version of your finals that I have in clojurebot in befunge style. I am pretty sure it still works too. Tons of n-dimensional character-based computing. |
| 17:59 | hiredman | ayrnieu: I fixed the macroexpand exploding or thing |
| 17:59 | ayrnieu | (actually I only used 2 dimensions) |
| 17:59 | hiredman | ,(macroexpand '(or 1 1)) |
| 17:59 | clojurebot | (let* [or__3164__auto__ 1] (if or__3164__auto__ or__3164__auto__ (clojure.core/or 1))) |
| 17:59 | ayrnieu | awesome! |
| 18:00 | hiredman | turns out it was exploding on the (or 1 1) bit not the macroexpand |
| 18:02 | danlarkin | Chouser: the contains? debate lives on!!!! |
| 18:04 | Chouser | apparently |
| 18:07 | kotarak | Someone (don't remember who) said, that after sufficient time each and every discussion will turn around the definition of words..... Instead of simply writing cool code in clojure, they prefer discussion names... |
| 18:08 | ayrnieu | names are hard. |
| 18:08 | Chouser | Ah, thank you Mr. Engelberg. |
| 18:08 | danlarkin | pah! "in?" is still shorter :) |
| 18:13 | hiredman | is there a function that given f and a evaluates to (f a) ? |
| 18:14 | Chouser | what's a? |
| 18:14 | hiredman | anything |
| 18:14 | Chouser | oh, "and a" sorry, I didn't see that. |
| 18:14 | Chouser | (apply f a nil) ;-) |
| 18:15 | ayrnieu | no, that's too straightforward. |
| 18:15 | Chouser | (.invoke f a) |
| 18:21 | Chousuke | why the nil :/ |
| 18:21 | Chouser | apply is all about a seq for its final arg. |
| 18:21 | Chousuke | ah, right. |
| 18:22 | rhickey | user=> (.contains [1 2 3] 2) |
| 18:22 | rhickey | true |
| 18:22 | rhickey | user=> (.contains '(1 2 3) 2) |
| 18:22 | rhickey | true |
| 18:22 | rhickey | what contains debate? :) |
| 18:22 | ayrnieu | (.contains nil 2) |
| 18:22 | ayrnieu | ,(.contains nil 2) |
| 18:22 | clojurebot | java.lang.NullPointerException |
| 18:27 | ayrnieu | is there something like all-ns for the java side, to get java.lang , org.jdom, etc.? |
| 18:27 | AWizzArd | what I find a bit strange is: |
| 18:27 | AWizzArd | ,(.pow 2M (.pow 2M 256)) |
| 18:27 | clojurebot | 1M |
| 18:27 | AWizzArd | instead of 2M one could also use (BigInteger. "2") |
| 18:28 | rhickey | ayrnieu: no, java packages are not enumerable through the API |
| 18:28 | rhickey | neither the set of packages nor the members of a package |
| 18:29 | keithb | Hi, all...How can I create a multiline comment for a function with defn? |
| 18:29 | ayrnieu | just put multiple newlines in your string. |
| 18:29 | AWizzArd | shouldn't .pow throw some exception if the resulting numbers would be too big to fit into ram, instead of just returning 1? |
| 18:30 | AWizzArd | keithb: do you want to make a comment or documentation string? |
| 18:30 | ozy` | keithb: strings can span multiple lines |
| 18:30 | AWizzArd | if it is just a comment and you don't want to type semicolons over and over again just do (comment anything can be here) |
| 18:31 | hiredman | AWizzArd: decent editors have a facility for that sort of thing |
| 18:31 | keithb | AWizzArd, sorry, I meant documentation string. I want the doc string to be on several lines so that the reader doesn't have to horizontally scroll to read the whole thing. |
| 18:32 | Chousuke | keithb: just add newlines :) |
| 18:34 | keithb | Here's a minimal example of it not working...what am I doing wrong?: http://pastie.org/374702 |
| 18:34 | ayrnieu | you have multiple strings. |
| 18:35 | keithb | How do I create a single string spanning multiple lines? |
| 18:35 | ayrnieu | "this is |
| 18:35 | ayrnieu | one long |
| 18:35 | ayrnieu | string" |
| 18:35 | hiredman | keithb: http://code.google.com/p/clojure/source/browse/trunk/src/clj/clojure/core.clj#2706 |
| 18:35 | hiredman | ^- example |
| 18:35 | dreish | Or "foo\nbar" |
| 18:36 | keithb | ayrnieu, That's what I needed. I had no idea it would be that easy. ;) |
| 18:36 | keithb | Thanks. |
| 18:36 | Chousuke | I don't like the fact that multiline docstrings have to be manually aligned though :( |
| 18:37 | hiredman | rhickey: so, any plans to expose information on fn arity? |
| 18:37 | ayrnieu | you could put (clojure.contrib.fun-util/realign-docstrings) at the end of your module. |
| 18:39 | ayrnieu | hm, and pass it the namespace. |
| 18:45 | Chousuke | oh, such a thing exists now? |
| 18:54 | knapr | what does (. obj ...) mean? |
| 18:54 | knapr | is (.method obj) == (. obj method) ? |
| 18:59 | hiredman | knapr: (.method obj) is more like (. obj (method)) if I recall |
| 18:59 | hiredman | (.method obj) is the prefered style |
| 18:59 | hiredman | ,(macroexpand '(.method obj)) |
| 18:59 | clojurebot | (. obj method) |
| 19:00 | hiredman | or not |
| 19:00 | hiredman | ,(macroexpand '(.method obj foo)) |
| 19:00 | clojurebot | (. obj method foo) |
| 19:00 | hiredman | hmmm |
| 19:00 | hiredman | I have been forgeting how . syntax works |
| 19:00 | hiredman | because of using hte new style |
| 19:00 | burkelibbey | If anyone's interested, here's a list of dictionary words that work with the clojure / compojure -style s->j munging: http://gist.github.com/54847 |
| 19:01 | hiredman | I call Xiphojura |
| 19:02 | burkelibbey | I think expojure has a nice ring to it, but I don't want to write anything that it would make sense for :P |
| 19:03 | hiredman | clojurebot: Xiphojura is <reply>2009:Jan:29:16:03:17 <hiredman> I call Xiphojura |
| 19:03 | clojurebot | 'Sea, mhuise. |
| 19:03 | hiredman | clojurebot: jure words is <reply>http://gist.github.com/54847 |
| 19:03 | clojurebot | Ack. Ack. |
| 19:05 | Chousuke | conjure is cool |
| 19:06 | clojurebot | svn rev 1239; [lazy] added more to ISeq |
| 19:06 | hiredman | Chousuke: a library that auto magically turns ((fn [a b] a) a) into (partial (fn [a b] a) a) |
| 19:07 | knapr | when I close my mp3player it stills keeps playing(it uses other threads), how do I tell it to kill all threads when the app is closed(by pressing X in the upper right)? |
| 19:07 | hiredman | knapr: there is some thing you set on the JFrame that causes the jvm to exit |
| 19:07 | Chousuke | hiredman: that's really difficult in a dynamic language :P |
| 19:07 | AWizzArd | hiredman: we had this discussion some time ago |
| 19:08 | ayrnieu | a dynamic language can do it, actually, but a dynamic language programmer cannot. |
| 19:08 | Chousuke | in haskell autocurrying works nicely because every function takes just a single argument |
| 19:08 | hiredman | setDefaultCloseOperation |
| 19:08 | ayrnieu | cannot reason about programs that make use of this haskell cutesiness. |
| 19:08 | hiredman | Chousuke: which is why it would be a real trick if you did it, hence "conjure" |
| 19:09 | burkelibbey | Idea: Somebody should make a nicer way to package up clojure code without mucking around with ant, and call it "enclojure". |
| 19:09 | Chousuke | I was hoping for something more useful |
| 19:09 | hiredman | enclojure is taken isn't it? |
| 19:09 | burkelibbey | might be |
| 19:09 | hiredman | the netbeans plugin |
| 19:09 | burkelibbey | oh right |
| 19:10 | Chousuke | wasn't there some clojure-based build system mentioned on the groups once |
| 19:10 | ayrnieu | egrep 'user$' /usr/share/dict/words # ooh, trejure |
| 19:11 | ayrnieu | (treajure. I can think of a use for displeajure.) |
| 19:11 | ayrnieu | Chousuke - Lancet. That's the one that's in the pragprog book. |
| 19:11 | burkelibbey | ah, also good. I didn't think there would be anything good with [^o]sure$ |
| 19:12 | ayrnieu | [^s]sure is what you really want |
| 19:12 | hiredman | Chousuke: lancet? |
| 19:13 | knapr | what is standard to use for storing userinfo in a one-user-app. ie not a webapp but a gui that saves some personal stuff like basedirectory etc. .txt files, database, serialzing object? |
| 19:13 | knapr | all this reajure, conjure, compojure. god it is so ugly |
| 19:13 | ayrnieu | knapr - it always is, in every language that people do it in, but they still do it. Names are hard. |
| 19:13 | danlarkin | no more -jure program names Puhleeeease |
| 19:14 | burkelibbey | Updated |
| 19:14 | burkelibbey | clojurebot: jure words |
| 19:14 | clojurebot | http://gist.github.com/54847 |
| 19:14 | knapr | does the name have to connect to clojure? |
| 19:14 | knapr | well in python ot sounds good usually but in clojure... |
| 19:16 | Chousuke | clojurebot: naming is <reply>The Clojury says to stop making puns. |
| 19:16 | clojurebot | You don't have to tell me twice. |
| 19:19 | knapr | clojurebot: namings is? |
| 19:19 | knapr | clojurebot: naming is? |
| 19:19 | knapr | clojurebot: naming? |
| 19:19 | clojurebot | excusez-moi |
| 19:19 | clojurebot | The Clojury says to stop making puns. |
| 19:19 | clojurebot | The Clojury says to stop making puns. |
| 19:19 | knapr | the Clojury == the clojure community? |
| 19:20 | hiredman | Chousuke: two puns don't make a right |
| 19:20 | keithb | Does a function defined with defn implement Runnable? |
| 19:20 | Chousuke | yes |
| 19:20 | knapr | so if i want to do a lot when closing awindow how do i do? because i cant pass a function in stupid-ass java... |
| 19:21 | knapr | clojurebot: OO? |
| 19:21 | clojurebot | OO is to programming what astrology is to astronomy |
| 19:21 | Chousuke | I think IFn implements both Runnable and Callable :/ |
| 19:22 | keithb | knapr, if you're using Swing, check out the WindowListener/WindowAdapter classes. You can catch the window closing event. But there are gotchas...if you're interested I'll try to find a resource that explains it more completely. |
| 19:22 | hiredman | knapr: look at the java docs on setDefaultCloseOperation for JFrame |
| 19:22 | keithb | definitely, if setDefaultCloseOperation does what you need, it's much simpler than catching the window event. |
| 19:23 | hiredman | huh |
| 19:23 | hiredman | Callable |
| 19:24 | Chousuke | or whatever the interface was called :p |
| 19:24 | hiredman | yeah that is it |
| 19:24 | ayrnieu | ,(ancestors (class (fn [] nil))) |
| 19:24 | clojurebot | #{java.lang.Object clojure.lang.IObj clojure.lang.AFn java.lang.Runnable clojure.lang.IFn clojure.lang.IMeta clojure.lang.AFunction java.util.concurrent.Callable clojure.lang.Obj java.io.Serializable clojure.lang.Fn java.util.Comparator} |
| 19:25 | hiredman | I've just never come across it before |
| 19:26 | keithb | Thanks, all. hiredman, my prev msg "definitely..." was directeod to knapr, sorry for any confusion. |
| 19:26 | hiredman | keithb: �I wasn't confused? |
| 19:26 | keithb | oh, I wasn't sure what your huh was about... |
| 19:27 | hiredman | huh, Callable |
| 19:27 | keithb | ah, I see, never mind... ;) |
| 19:27 | hiredman | I am very liberal with the linebreaks on irc |
| 19:35 | keithb | I want to write a function that loops over a range, and for each iteration, adds an item to a list, and then return the list at the end of the function. Is "for" the best approach for this? I'm finding that when I start this function in a thread, the loop doesn't seem to be run. |
| 19:35 | hiredman | keithb: for is lazy |
| 19:36 | Chouser | what do you intend to do with the list? |
| 19:37 | hiredman | there is also dotimes and doseq |
| 19:37 | hiredman | are |
| 19:37 | Chouser | usually such a list would be consumed by something, in which case 'for' should work fine. |
| 19:37 | knapr | reduce |
| 19:38 | keithb | I was hoping to return the list, but come to think of it, that's not really possible from a separate thread, since Thread.run() doesn't return anything (is defined with a return value of void). |
| 19:39 | knapr | (let [xs ["a" "b" "c"]] (reduce #(conj %1 (nth xs %2)) [] [0 1 2])) |
| 19:39 | knapr | > (let [xs ["a" "b" "c"]] (reduce #(conj %1 (nth xs %2)) [] [0 1 2])) |
| 19:40 | knapr | clojurebot: at home? |
| 19:40 | clojurebot | No entiendo |
| 19:40 | knapr | > (let [xs ["a" "b" "c"]] (reduce #(conj %1 (nth xs %2)) [] [0 1 2])) |
| 19:40 | keithb | knapr, I'm familiar with reduce, but that's not really what I want; the purpose is to do a simple illustration of Clojure concurrency, so I want to increment a shared counter and log its value, time, and thread info. |
| 19:40 | knapr | ok |
| 19:40 | keithb | I think what I really need to do is increment the counter, and add a log entry to a shared list in a given transaction. |
| 20:00 | knapr | so i need to call a clojure-function when i close the window |
| 20:00 | knapr | (.setDefaultCloseOperation JFrame/DISPOSE_ON_CLOSE) |
| 20:00 | knapr | can i do that there instead of JFrame/DIS... |
| 20:02 | hiredman | knapr: no |
| 20:02 | ayrnieu | ,(let [count (ref 0)] (doseq (take 100 (repeatedly #(commute count inc)))) @count) |
| 20:02 | clojurebot | java.lang.IllegalArgumentException: doseq requires a vector for its binding |
| 20:02 | hiredman | ayrnieu: doall |
| 20:03 | ayrnieu | no, not that one. |
| 20:03 | ayrnieu | the one for accessing refs. |
| 20:03 | hiredman | dorun? |
| 20:03 | hiredman | dosync? |
| 20:03 | ayrnieu | ,(let [count (ref 0)] (dosync (take 100 (repeatedly #(commute count inc)))) @count) |
| 20:03 | clojurebot | 0 |
| 20:03 | hiredman | erm |
| 20:03 | ayrnieu | I guess I do need doall :-) |
| 20:03 | ayrnieu | ,(let [count (ref 0)] (dosync (doall (take 100 (repeatedly #(commute count inc))))) @count) |
| 20:03 | clojurebot | 100 |
| 20:03 | hiredman | most likely you would want the dosync inside around the commute |
| 20:04 | hiredman | or else it all happens in one transaction |
| 20:04 | hiredman | which is kind of, meh |
| 20:04 | ayrnieu | right. |
| 20:07 | ayrnieu | er, hm. |
| 20:07 | ayrnieu | ,(let [count (ref 0)] (dosync (doall (take 100 (repeatedly #(commute count inc)))))) |
| 20:07 | clojurebot | (1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100) |
| 20:07 | ayrnieu | I don't want that, though. |
| 20:08 | ayrnieu | ,(let [count (ref 0)] (dosync (dorun (take 100 (repeatedly #(commute count inc)))))) |
| 20:08 | clojurebot | nil |
| 20:15 | ayrnieu | http://gist.github.com/54871 doesn't really demonstrate concurrency. |
| 20:16 | knapr | how can I generate a Java-method? |
| 20:16 | ayrnieu | proxy |
| 20:16 | clojurebot | svn rev 1240; [lazy] added more, made filter and map use lazy-seq, made Delay.Seq implement IPersistentCollection and List |
| 20:18 | ayrnieu | it's just refs and commute - with threads. In Erlang I'd make every moving part a process (or few) and then think about how they interrelate. Somebody quoted rich as planning to add something more Erlang-like. Until then, this is just parallel programming; a performance hack and not a way to design programs. |
| 20:24 | rhickey | fully-lazy approach using new more + compatible rest seems promising, moved over map and filter and Clojure still runs! |
| 20:28 | lisppaste8 | knapr pasted "untitled" at http://paste.lisp.org/display/74548 |
| 20:28 | lisppaste8 | knapr annotated #74548 with "untitled" at http://paste.lisp.org/display/74548#1 |
| 20:29 | ayrnieu | do you mean .addActionListener ? |
| 20:30 | baaj | http://paste.lisp.org/display/74548#1 |
| 20:30 | baaj | why cant i do ^^ ? |
| 20:31 | cooldude127 | baaj: addActionListener is not a function |
| 20:32 | ayrnieu | ,(let [x 1] `(1 ~x)) |
| 20:32 | clojurebot | (1 1) |
| 20:33 | baaj | then what is it? |
| 20:33 | baaj | it is a method |
| 20:33 | baaj | and i do doto |
| 20:33 | ayrnieu | do you mean .addActionListener ? |
| 20:33 | cooldude127 | baaj: if you want to call a method, you need to prefix it with a . |
| 20:33 | baaj | ah wait |
| 20:34 | baaj | welll illegalargument exception instead |
| 20:59 | ayrnieu | ,(let [n (ref 0) adder (agent nil)] (dosync (send adder #(dosync (commute n inc) %)) @n) |
| 20:59 | clojurebot | Eval-in-box threw an exception:EOF while reading |
| 21:00 | ayrnieu | ,(let [n (ref 0) adder (agent nil)] (dosync (send adder #(dosync (commute n inc) %)) @n)) |
| 21:00 | clojurebot | 0 |
| 21:00 | ayrnieu | ,(let [n (ref 0) adder (agent nil)] (dosync (send adder #(dosync (commute n inc) %)) (commute n identity)) |
| 21:00 | clojurebot | Eval-in-box threw an exception:EOF while reading |
| 21:00 | ayrnieu | ,(let [n (ref 0) adder (agent nil)] (dosync (send adder #(dosync (commute n inc) %)) (commute n identity))) |
| 21:00 | clojurebot | 0 |
| 21:01 | ayrnieu | ,(let [n (ref 0) adder (agent nil)] (dosync (send adder #(dosync (commute n inc) %)) (await-for 2000) (commute n identity))) |
| 21:01 | clojurebot | java.lang.IllegalStateException: await-for in transaction |
| 21:02 | ayrnieu | ,(let [n (ref 0) adder (agent nil)] (send adder #(dosync (commute n inc) %)) (await-for 2000) (dosync (commute n identity))) |
| 21:02 | clojurebot | 1 |
| 21:02 | ayrnieu | I hope that what's going is still clear through all of the stupid errors. |
| 21:13 | hiredman | ayrnieu: it sure isn't |
| 21:20 | gnuvince_ | Have we got a pretty printer yet? |
| 21:21 | cooldude127 | gnuvince_: i wish |
| 21:21 | knapr | isnt is possible to do everything from clojure that you can in Java? |
| 21:21 | gnuvince_ | cooldude127: thank you |
| 21:22 | cooldude127 | gnuvince_: why? |
| 21:22 | ayrnieu | knapr - what are you trying to do that you think you can't do? |
| 21:22 | cooldude127 | knapr: in theory, i'm not sure if we get everything |
| 21:23 | knapr | when I press X on my swing GUI I want to close a bunch of threads upon exiting but it seems really hard to do this since I must implement an WindowListener class and then somehow pass the running threads to that, |
| 21:23 | knapr | I mean why cant the jvm just close everything? |
| 21:23 | gnuvince_ | cooldude127: I'm writing a blog post, and I have a semi-large data structure spilled out by a function. I want to format it properly, but I'm a lazy dog |
| 21:24 | cooldude127 | gnuvince_: what kind of data structure? |
| 21:24 | gnuvince_ | map with nested vectors and maps |
| 21:24 | cooldude127 | gnuvince_: what editor you use? |
| 21:25 | hiredman | ayrnieu: (await adder) |
| 21:25 | gnuvince_ | cooldude127: for Clojure, Emacs. |
| 21:25 | cooldude127 | gnuvince_: can't emacs fix that up? |
| 21:25 | hiredman | ,(let [n (ref 0) adder (agent nil)] (send-off adder #(dosync (commute n inc) % 1)) (await adder) [@n @adder]) |
| 21:25 | clojurebot | [1 1] |
| 21:26 | gnuvince_ | cooldude127: I will still need to manually break the lines, won't I? |
| 21:26 | cooldude127 | gnuvince_: oh yeah probably |
| 21:28 | gnuvince_ | hmmm |
| 21:28 | gnuvince_ | that took all but 30 secondes |
| 21:28 | gnuvince_ | I must *really* be lazy |
| 21:28 | cooldude127 | lol |
| 21:32 | ayrnieu | OK, I was just confused about a few things earlier, but surely this is weird: |
| 21:32 | ayrnieu | ,(let [n (ref 0) adder (agent nil)] (send adder #(do % (commute n inc))) (await) [(agent-errors adder) @n])) |
| 21:32 | clojurebot | [nil 0] |
| 21:32 | hiredman | ayrnieu: also commute and alter return the "in-transaction-value of ref" |
| 21:33 | hiredman | *shrug* |
| 23:27 | cooldude127 | you know what? fuck matlab, i'm having way more fun with linear algebra in clojure |
| 23:27 | cooldude127 | maybe it's the joy of writing your own function for a determinant |
| 23:29 | cooldude127 | clojurebot: seen technomancy? |
| 23:29 | clojurebot | technomancy was last seen quiting IRC, 1624 minutes ago |
| 23:29 | cooldude127 | maybe clojurebot could get a more useful time formatter |
| 23:35 | cooldude127 | what's a good abbreviation for transformation? |
| 23:38 | LordOfTheNoobs | xform? |
| 23:39 | cooldude127 | LordOfTheNoobs: i like that |
| 23:48 | cooldude127 | lisppaste8: url? |
| 23:48 | lisppaste8 | To use the lisppaste bot, visit http://paste.lisp.org/new/clojure and enter your paste. |
| 23:49 | lisppaste8 | cooldude127 pasted "bad macro" at http://paste.lisp.org/display/74556 |
| 23:50 | cooldude127 | anybody want to lend some macro help |
| 23:50 | cooldude127 | when i evaluate this, i get an unsupportedoperationexception |
| 23:50 | ayrnieu | what do you want that to expand to? |
| 23:51 | cooldude127 | ayrnieu: i think i want it to expand into exactly what it does |
| 23:51 | ayrnieu | oh, then it works OK. |
| 23:51 | cooldude127 | i can't find anything wrong with the expansion |
| 23:51 | cooldude127 | ayrnieu: bad things happen when i enter that last expression in the repl |
| 23:52 | cooldude127 | and clojure's error handling is really unfortunate sometimes |
| 23:54 | cooldude127 | ok the problem is definitely the with-meta part |
| 23:54 | cooldude127 | the function itself is just fine |
| 23:55 | cooldude127 | let me guess, functions themselves can't have metadata? |
| 23:56 | ayrnieu | 15:55 < Chouser> and since fn's don't take metadata (yet), there's nowhere else to put that kind of info. |
| 23:56 | cooldude127 | AHHHH |
| 23:56 | cooldude127 | man that is not cool |
| 23:57 | cooldude127 | i think i have another way to make it work tho |
| 23:58 | cooldude127 | ok, a big fat hack: my function will give the definition when called with no args |