2009-01-14
| 01:16 | lisppaste8 | durka annotated #73563 with "trivial: i reinvented a small wheel (number?)" at http://paste.lisp.org/display/73563#2 |
| 01:24 | lisppaste8 | durka annotated #73563 with "use peek in rpn-repl so that stack can truly be any type of seq" at http://paste.lisp.org/display/73563#3 |
| 01:25 | durka | at this point i will cease and desist using lisppaste as a VCS |
| 01:30 | sleven | without reader-macros does Clojure really support syntactic abstraction? or "merely" evaluation-control? |
| 02:21 | burkelibbey | Hmm, looks like now I need to go learn Haskell so I can figure out clojure.contrib.monads... :/ |
| 02:24 | burkelibbey | oh cool, I didn't notice the examples directory before. |
| 02:24 | Raynes | Learn Haskell anyways. It rocks. |
| 02:25 | burkelibbey | It's definitely on my todo list. I want to get a better grip on clojure first. |
| 02:25 | burkelibbey | I think haskell is next though |
| 02:26 | burkelibbey | How is it? I leafed through it once, but didn't take a very good look |
| 02:26 | Raynes | It's avery good book. |
| 02:26 | Raynes | a very* |
| 02:27 | burkelibbey | Hmm, maybe I'll order a copy then. |
| 02:28 | Raynes | You can read it online for free. I don't require a dead tree version. |
| 02:29 | burkelibbey | Oh right, I remember hearing that. Thanks |
| 02:29 | Raynes | book.realworldhaskell.org/read |
| 02:30 | burkelibbey | Heh, if only I could just do this stuff instead of my boring Java OO courses :P |
| 03:54 | AWizzArd | Moin |
| 04:06 | Kerris7 | yay Clojure book update |
| 04:07 | Kerris7 | Morning AWizzArd :) |
| 08:11 | duck1123 | It would be fun to have a program that could "compile" clojure forms into java source files. The generated code would be ugly as hell, but it would be cool to play with "because you can" |
| 08:12 | duck1123 | That way, burkelibbey could do his assignments in clojure, convert to java, and the teacher would be none the wiser. :) |
| 08:12 | Chousuke | he'd get bad marks for ugly code though. |
| 08:13 | duck1123 | If you could keep the generated code clean and logical enough, you could convert, say clojure-contrib, then run javadoc on it |
| 08:21 | leafw | duck1123: does not sound so difficult ... nice weekend project |
| 08:22 | leafw | to render the code reasable, one would have to handle gensym-generated forms a bit better, checking for local overlaps within the java file, if any. |
| 08:23 | duck1123 | I have a feeling it would prove to be more difficult than it sounds, but you would probably find something in the core code that makes it that much easier |
| 08:23 | rhickey | duck1123: the early Clojure compiler was a CL app that generated Java and C# source. |
| 08:24 | duck1123 | that's cool |
| 08:24 | rhickey | readability was a non-objective :) |
| 08:24 | leafw | rhickey: one would say that macroexpand-1 inherits from those days, ehem ehem |
| 08:25 | Fib | If I have an s-expression containing arbitrary symbols and a map of symbols to values, can I evaluate that expression in a contaxt that will resolve those symbols to values in the map? Do I need to write my own eval? |
| 08:25 | duck1123 | I bet it would be an interesting way to debug a tricky bit of code. Compile it to java, look through it, see what the compiler is doing and see what you need to change. |
| 08:25 | Fib | e.g. I have '(+ x 1) and {'x 1} and want to get the result 2. |
| 08:26 | duck1123 | rhickey: btw, have you received my CA yet? |
| 08:26 | duck1123 | Daniel E. Renfer |
| 08:28 | Chousuke | ,(let [mymap {'x 2 'y 3}] (map #(get mymap % %) '(+ 1 x y))) |
| 08:28 | clojurebot | (+ 1 2 3) |
| 08:28 | Chousuke | Fib: like that |
| 08:29 | rhickey | duck1123: no, but I only check the box once a week or so |
| 08:29 | Chousuke | Fib: of course, the result will be a list. if you want to compute it, you'll need eval |
| 08:30 | duck1123 | ok, my stamps were kinda old, but they said first class. Wasn't sure if they were still good, so I put 2 on. |
| 08:31 | rhickey | Linj attempted to produce readable Java from a Lisp-like language |
| 08:31 | rhickey | duck1123: sent when? |
| 08:32 | duck1123 | thursday? I dropped it in the outgoing mailbox at work, so I'm conserned about that as well |
| 08:32 | Fib | Chousuke: hm, okay. That doesn't handle nested s-expressions though, and if it's modified to do so it will still miss let-bound symbols... |
| 08:32 | duck1123 | I'm sure it's there |
| 08:32 | Fib | So I guess I'd have to walk the expression keeping track of rebindings on the way down |
| 08:33 | AWizzArd | When I start a fresh repl in slime and type (def fc (new javax.swing.JFileChooser)) then my Clojure hangs. As if the thread would be busy with something. Does that work for you? |
| 09:14 | StartsWithK | Fib: http://is.gd/fQGf |
| 09:15 | StartsWithK | Fib: but notice the comment: gross - please don't write code like this!!! |
| 09:18 | Fib | Haha, thanks :) |
| 09:40 | StartsWithK | AWizzArd: JFilleChooser works fine for me in standard repl, maybe a slime issue |
| 09:41 | AWizzArd | oki, I will try it from the shell |
| 09:43 | AWizzArd | yes, in the shell it works fine |
| 09:43 | AWizzArd | must be a slime issue... very strange though |
| 09:44 | AWizzArd | Anyone here who knows Swing as if he wrote it himself? ;-) |
| 09:46 | asbjxrn | I've written some code I know as well as I know swing... |
| 09:47 | Chouser | hehe |
| 09:51 | AWizzArd | Do you see a way to get out of an instance of a JFileChooser the combo box which shows directories (indented and with symbols)? |
| 09:55 | asbjxrn | Sorry, I hardly know Swing at all. |
| 09:55 | mattrepl | AWizzArd: there are problems with Swing on Windows and Emacs/Slime. don't recall if there was a workaround, may want to search the list |
| 09:58 | leafw | AWizzArd: JFileChooser is likely a Container:just inspect throgh its hierarchy of Containers and Components |
| 10:01 | AWizzArd | leafw: yes, I am doing this right now in the repl. Is there an easier way to do this? Maybe in NetBeans somehow? |
| 10:01 | asbjxrn | how do you inspect? |
| 10:01 | AWizzArd | I call (.getComponents fc) where fc is a JFileChooser |
| 10:02 | Chouser | I bet you could add a little defmethod to inspector for that, and have a nice graphical explorer of the container tree |
| 10:04 | asbjxrn | I got to learn about the inspector. |
| 10:04 | AWizzArd | I don't understand why Sun does not give users full control to anything in those ready dialogs, with easy access through some methods |
| 10:04 | asbjxrn | That is one of the things I miss from CL. |
| 10:04 | AWizzArd | asbjxrn: there is no "the inspector" |
| 10:04 | Chouser | clojure.inspector |
| 10:05 | AWizzArd | ah ok |
| 10:05 | AWizzArd | asbjxrn: yes, in CL I would (inspect fc) |
| 10:05 | asbjxrn | AWizzArd: That was my reaction about 2 minutes ago :) |
| 10:07 | asbjxrn | Also, being able to expand the backtrace when a condition happen to see local variables etc. is nice. Clojure exceptions makes me feel lost compared to that. |
| 10:07 | Chouser | hah, sweet, it works. Dunno if it's useful, though. |
| 10:09 | lisppaste8 | Chouser pasted "inspect swing tree" at http://paste.lisp.org/display/73577 |
| 10:10 | Chouser | oh, I left out the (use 'clojure.inspector) |
| 10:11 | AWizzArd | yes, nice |
| 10:12 | sleven | its not until I really learned Clojure that I saw what a big inelegant mess my Jav,C++ and Python programs were. |
| 10:12 | Chouser | sleven: I'm right there with you. |
| 10:14 | Chousuke | Well, as the saying goes, even if you never use it for real, learning lisp makes you a better programmer for the rest of your days. |
| 10:15 | Chousuke | I guess that applies to functional programming in general too |
| 10:23 | lisppaste8 | asbjxrn pasted "Performance challenge, how much can you improve this" at http://paste.lisp.org/display/73578 |
| 10:24 | asbjxrn | (Thought I'd submit this to the performance thread in the clojure group, do anyone see any improvements first.) |
| 10:25 | asbjxrn | This is one step in this fluid dynamics solver: http://www.dgp.toronto.edu/people/stam/reality/Research/pdf/GDC03.pdf |
| 10:26 | asbjxrn | It gets called 3 times for each frame, and is presented as if it is to be used for games, so I suspect they need a reasonable framerate. |
| 10:28 | Chousuke | asbjxrn: I get an exception trying to run that. |
| 10:28 | Chousuke | I wonder if it's slime's fault :/ |
| 10:28 | asbjxrn | Oops. |
| 10:31 | asbjxrn | (def foo (make-grid)) should be (def foo (ref (make-grid))) |
| 10:32 | Chousuke | I wonder why the classcast exception just says "[F" though |
| 10:32 | Chousuke | not very helpful |
| 10:33 | asbjxrn | I think it's the start of the name of the array, see the return value from the function. |
| 10:34 | asbjxrn | It tried to cast it to a ref |
| 10:36 | karmazilla | I think [F is the classname for a primitive array of floats. Could be wrong about the floats part though |
| 10:36 | asbjxrn | I think you're right. |
| 10:37 | Chousuke | why is it a ref though? |
| 10:40 | asbjxrn | A little bit cleaner I thought. After the diffusion is done, the result needs to be copied into the grid array again. It was either using a ref of looping through an copy. |
| 10:43 | asbjxrn | The ref is only dereferenced once, so the overhead is minimal. I was a bit worried about creating a new array for each time the function is called as well. But that seems quick as well. |
| 10:45 | asbjxrn | The original algorithm avoids that, of course. It allocates two arrays and swaps the pointers to them. I think of refs as pointers, so.. |
| 10:47 | Chousuke | as far as I can see, you don't do anything useful with that ref :/ |
| 10:52 | gnuvince | Guys, I'm getting some weird results when reading from urandom from Clojure |
| 10:52 | gnuvince | > (let [buf (reader "/dev/urandom")] (for [_ (range 20)] (.read buf))) |
| 10:52 | gnuvince | (65533 65533 120 16 84 71 60 36 65533 65533 29 72 65533 14 65533 17 64 65533 65533 65533) |
| 10:52 | gnuvince | If I try the same code with Haskell or Python, I don't get any 65533 |
| 10:54 | asbjxrn | Chousuke: This is just part of the algorithm. But a time critical part so any improvements here makes a big difference. |
| 10:55 | Chousuke | gnuvince: try with java? |
| 10:55 | gnuvince | Chousuke: I probably should |
| 10:56 | gnuvince | Chousuke: it was just easier with languages where it was a single line and in a REPL |
| 10:56 | Chousuke | also, definline seems broken :/ |
| 10:59 | Chousuke | I wanted to make a gget helper to get rid of the (aget diffused-grid ...) repetition but making a local fn raises the execution time by an order of magnitute |
| 10:59 | Chousuke | magnitude* |
| 11:00 | Chousuke | even though the jvm really should be autoinlining it, it seems like it's not even trying. :p |
| 11:02 | asbjxrn | Hmm. Maybe I should check if it's the calculations or the array lookups that take time. |
| 11:03 | karmazilla | calls on interface types are harder to optimize, methinks |
| 11:05 | Chousuke | I wish there were a way to define local inline fns :/ |
| 11:05 | Chousuke | sort of minimacros |
| 11:06 | asbjxrn | Shouldn't a array lookup be pretty fast anyway? Almost like a ref/pointer? |
| 11:07 | Chousuke | the lookup is probably as fast as it can be |
| 11:07 | Chouser | Chousuke: I think that's called 'macrolet' and is on Rich's wishlist. |
| 11:08 | Chouser | definline is used in core.clj. How broken could it be? |
| 11:09 | gnuvince | Chousuke: found my problem. I switched to a FileInputStream and it fixed the problem. |
| 11:10 | asbjxrn | Hmm, 50% of the time is in the aset, it seems. But then, maybe the JIT optimizes more if the value isn't used for anything. |
| 11:10 | Chousuke | Chouser: maybe I don't understand how it's used |
| 11:10 | Chousuke | user=> (definline foo [] (+ 1 1)) |
| 11:10 | Chousuke | java.lang.ExceptionInInitializerError (NO_SOURCE_FILE:1) |
| 11:10 | gnuvince | > (let [stream (java.io.FileInputStream. "/dev/urandom")] (for [_ (range 20)] (.read stream))) |
| 11:10 | gnuvince | (168 64 2 210 238 108 10 128 156 41 65 167 79 218 213 10 205 175 169 239) |
| 11:10 | Chouser | gnuvince: It was being read as UTF-8. |
| 11:10 | asbjxrn | (sorry, 30%, not 50%) |
| 11:11 | gnuvince | Chouser: yeah, someone explained to me that Streams read bytes and Readers read characters. |
| 11:12 | StartsWithK | will something brake if i move from rev1132 to rev1194 or rev1207? I looked but didn't find anything that looks like it will break code that worked with rev1132 |
| 11:12 | StartsWithK | is rev1207 'safe', i see there is new stream stuff in there, will that break any old behaviour? |
| 11:13 | Chouser | StartsWithK: you can always got back if the new version breaks something. |
| 11:13 | Chouser | if there's any stream stuff in trunk, it's non-breaking changes. |
| 11:14 | StartsWithK | i know, just asking, i would like to get watcher for refs and condp, they look realy good |
| 11:15 | karmazilla | asbjxrn: the JIT can make your code do nothing a trillion times in no time at all :) |
| 11:19 | Chouser | Chousuke: definline works more like a macro |
| 11:20 | Chouser | hm, though I can't get that to work either. |
| 11:21 | StartsWithK | for what sould unquote be used? |
| 11:21 | StartsWithK | is there any example? |
| 11:22 | Chousuke | it's there for the occasion that you want to assign your own semantics to ~foo |
| 11:22 | Chouser | StartsWithK: http://groups.google.com/group/clojure/msg/62437f3b96835b58 |
| 11:23 | Chouser | I think ClojureQL is actually using it for real now. |
| 11:24 | Chouser | using the definline examples directly from core.clj at my repl still break. How can that be? |
| 11:25 | Chouser | maybe they have to be compiled now? |
| 11:27 | StartsWithK | Chouser: thanks, will look in ClojureQL for more examples |
| 11:29 | ccmtaylor | hi all, quick newbie question: i'm writing a macro and want to conditionally include some stuff in a form, if it's non-nil... |
| 11:30 | StartsWithK | and are there maybe any examples of using watcher for refs to create similar effect to the one in http://is.gd/fRKs |
| 11:31 | ccmtaylor | `(stuff ~@(when conditional-stuff [conditional-stuff]) more-stuff) |
| 11:31 | ccmtaylor | works, but seems un-pretty. does anyone have a better solution? |
| 11:32 | Chouser | ccmtaylor: Off the top of my head, I think that's about as pretty as you're going to get. |
| 11:32 | StartsWithK | ccmtaylor: is 'stuff' ok to accept nil for its first argument? |
| 11:32 | Chouser | StartsWithK: the only watcher example I know of is one I wrote for watching agents. |
| 11:33 | Chouser | But I know a much smaller percentage of what's going on in the Clojure world than I used to. ...getting hard to keep up. |
| 11:34 | ccmtaylor | StartsWithK: no, it needs to be completely not-there |
| 11:35 | Chouser | ccmtaylor: I think the only other route is to cons up the form, which is not likely to be prettier than what you've got. |
| 11:35 | ccmtaylor | ok, thanks! |
| 11:36 | StartsWithK | yes, you'll have to have two routes to that `(stuff ...) expansion then |
| 11:36 | Chouser | hm, you could filter the list after you've made it. |
| 11:37 | Lau_of_DK | Chouser: Its a shame you dont have enough time to keep up anymore, do you want to tips on some Clojure/SQL implementations? |
| 11:37 | Chouser | ccmtaylor: (defn f [x] (remove nil? `(stuff ~(when (odd? x) x) 2 3))) |
| 11:37 | Chouser | seems a bit dangerous though. I think ~@( ... [foo]) is fine |
| 11:38 | Chouser | Lau_of_DK: give tips? get tips? |
| 11:38 | Lau_of_DK | s/to/some :) |
| 11:38 | Lau_of_DK | Oh, you want more money? |
| 11:38 | Lau_of_DK | fine... |
| 11:39 | ccmtaylor | Chouser: nice idea, but it won;t work in my case since there might be more nils in the form. Guess, i'll leave it like it is. |
| 11:39 | ccmtaylor | won't |
| 11:41 | Chouser | you could use some other sentinel besides nil |
| 11:41 | Chouser | I'm not really arguing for this, just trying to drum up options. |
| 11:42 | Chouser | (defn f [x] (remove #{:skipit} `(stuff ~(if (odd? x) x :skipit) 2 nil))) |
| 11:59 | _hrrld | Ratios are so awesome, and Java floats are so lame in comparison. It's really paining me calling Math/sin and Math/toRadians on my beautiful ratios. Is there any way to preserve ratios while calculating sine/cosine? |
| 12:01 | _hrrld | (Math/sin 52163/16604) ;le cry. |
| 12:06 | Chouser | _hrrld: I suppose you'd have to write your own, or try to convert back to a ratio after calling Math/sin |
| 12:24 | drewr | Does dispatching to defmethods occur in any particular order? |
| 12:25 | drewr | Since methodTable is a PersistentHashMap in MultiFn, I'm guessing not. |
| 12:44 | Lau_of_DK | Is there a clojure-func to upper-case a string? |
| 12:45 | danlarkin | yes |
| 12:45 | danlarkin | (.toUpperCase "foo") |
| 12:45 | danlarkin | :) |
| 12:45 | danlarkin | or, if you prefer, #(.toUpperCase %) |
| 12:47 | Lau_of_DK | Gotcha |
| 12:47 | Lau_of_DK | Thanks |
| 12:54 | lisppaste8 | durka pasted "is there a way to do this without the ~' ugliness?" at http://paste.lisp.org/display/73582 |
| 12:57 | Chouser | durka: are you willing to let the caller pass in the name to be used, instead of always capturing 'get-value'? |
| 12:58 | durka | i'd rather not... |
| 12:58 | durka | this is related to the RPN thing i was playing with yesterday |
| 12:59 | durka | where quasiquote wants to resolve things at macroexpansion time but i'd like it to wait |
| 12:59 | durka | (is it called quasiquote?) |
| 12:59 | Chouser | if you want to capture a name, ~' is the way to do it. |
| 12:59 | durka | ok |
| 13:00 | Chousuke | it serves as a hint that capturing names is ugly :) |
| 13:08 | durka | fair enough |
| 13:49 | Lau_of_DK | Anyone here, whos strong on the SQL statement Alter ? |
| 13:51 | gnuvince | Is it possible to get the address of an object in clojure? Something like id() in Python |
| 13:52 | Lau_of_DK | For what purpose would you need that gnuvince ? |
| 13:52 | gnuvince | Lau_of_DK: I would like to show to someone that structures share data and are not copied |
| 13:52 | gnuvince | But he's got a Thomas syndrome |
| 13:53 | Lau_of_DK | hmmm |
| 13:54 | Lau_of_DK | http://www.velocityreviews.com/forums/t145498-how-to-get-address-of-a-java-object.html |
| 13:54 | Lau_of_DK | gnuvince: Theres a discussion which ends with the conclusion that its not possible |
| 13:55 | gnuvince | hmmm |
| 13:55 | gnuvince | I could probably use identical? then |
| 13:56 | Lau_of_DK | Couldnt you make a specific example and then refer to the clojure source code? |
| 13:56 | gnuvince | I think I can manage with identical? |
| 13:56 | Chouser | gnuvince: you may be able to use .hashCode |
| 13:58 | Chouser | ,(let [a '(3 2 1) b (cons 4 a)] (map #(.hashCode %) [a b (rest b)])) |
| 13:58 | clojurebot | (1800990793 -467838107 1800990793) |
| 13:59 | gnuvince | ,(.hashCode "hi") |
| 13:59 | clojurebot | 3329 |
| 13:59 | gnuvince | ,(.hashCode "hi") |
| 13:59 | clojurebot | 3329 |
| 13:59 | Lau_of_DK | Chouser, doesnt your example show that the structure is shared? |
| 14:00 | Chouser | Lau_of_DK: that was the idea, wasn't it? |
| 14:00 | Lau_of_DK | I was under the impression that no structure was ever shared, because if you modified one, an entire new collection would be formed |
| 14:01 | Chouser | Lau_of_DK: no, a major advantage of immutable collections is that you *can* share structure safely, since none of it can be changed. |
| 14:01 | karmazilla | there's System/identityHashCode - closest thing to python's id() I think |
| 14:02 | Lau_of_DK | Chouser: yes of course, youre right |
| 14:02 | Lau_of_DK | I didnt have my thinking cap on :( |
| 14:02 | Chouser | karmazilla: that appears to be the same as .hashCode |
| 14:03 | Chouser | karmazilla: no, you're right. identityHashCode is what you want. |
| 14:03 | karmazilla | that depends on the object.. but Object.hashcode calls identityHashCode |
| 14:04 | gnuvince | ,(let [x1 (list "one" "two" "three") x2 (conj x1 "zero")] (every? #(apply identical %) (map vector x1 (rest x2))) |
| 14:04 | clojurebot | Eval-in-box threw an exception:EOF while reading |
| 14:04 | Chouser | ,(let [a {} b (dissoc {:c 1} :c)] (map #(vector (.hashCode %) (System/identityHashCode %)) [a b])) |
| 14:04 | clojurebot | ([0 16638032] [0 26336541]) |
| 14:04 | gnuvince | ,(let [x1 (list "one" "two" "three") x2 (conj x1 "zero")] (every? #(apply identical? %) (map vector x1 (rest x2))) |
| 14:04 | clojurebot | Eval-in-box threw an exception:EOF while reading |
| 14:05 | gnuvince | wth? |
| 14:05 | Chouser | one more ) |
| 14:05 | gnuvince | damn |
| 14:05 | gnuvince | ,(let [x1 (list "one" "two" "three") x2 (conj x1 "zero")] (every? #(apply identical? %) (map vector x1 (rest x2)))) |
| 14:05 | clojurebot | true |
| 14:05 | gnuvince | there |
| 14:06 | gnuvince | Writing Lisp code without paren-match is pretty hard |
| 14:07 | Lau_of_DK | gnuvince: you mean, you dont chat in emacs? |
| 14:07 | gnuvince | Lau_of_DK: irssi |
| 14:07 | gnuvince | I used to before with rcirc |
| 14:07 | Lau_of_DK | oh.. switch to emacs, then you can enable paredit on irc if you like :) |
| 14:07 | Lau_of_DK | :( |
| 14:07 | gnuvince | Yeah |
| 14:07 | Lau_of_DK | rcirc was really lacking if you ask me. ERC is cool though |
| 14:07 | gnuvince | There are some real advantages to using Emacs for IRC |
| 14:07 | gnuvince | paren matching, auto completion of words other than nicks, searching backwards |
| 14:08 | gnuvince | I think I lost my ERC config a few years ago |
| 14:08 | Lau_of_DK | Yea, and especially, you can send all of Chousers tips straight to the REPL |
| 14:08 | gnuvince | That too |
| 14:11 | Chousuke | I'm not that much of a lisper that I would give up irssi |
| 14:13 | erohtar | . |
| 14:13 | replaca | I've become kind of addicted to irssi + screen. I can lurk from wherever I sit down (I've even had conversations on the subway) |
| 14:13 | erohtar | danlarkin: thanks for your time yesterday on helping me with clojure-json |
| 14:13 | erohtar | danlarkin: it was a problem of the incoming json string being escaped twice - |
| 14:14 | danlarkin | erohtar: no problem. good to hear you solved it |
| 14:34 | Chouser | not yet halfway through January, and the group already has twice as many posts as all of September. |
| 14:35 | danlarkin | I can't keep up anymore :-/ |
| 14:36 | Chouser | there have been a couple attempts at summarizing the "important" threads, but I think the volume has overwhelmed those who were attempting it. |
| 14:37 | rhickey | Chouser: it does test the limits of all apps I try to manage it with |
| 14:39 | Chouser | gmail is hanging on for me, but I had to change tack a bit today -- we'll see if this holds up. |
| 14:41 | Lau_of_DK | Chouser: Tried thunderbird + digests ? |
| 14:41 | Chouser | nope |
| 14:41 | Lau_of_DK | I suspects its easier to keep up with, but I still cant keep up |
| 14:42 | Chouser | I really don't think digests would work for me, unless I wanted to stop posting and just read. |
| 14:42 | Chouser | Which come to think of it might be better for everyone. |
| 14:44 | rhickey | Mail.app is so much better than GMail at letting you walk through what's new - gmail's threaded-only viewing is fail |
| 14:44 | rhickey | for me |
| 14:46 | danlarkin | I appreciate that I can navigate with the keyboard only. Expand a thread with the right arrow, View next message with up arrow, close the thread with left, etc |
| 14:47 | Chouser | I use vi keybindings in gmail. :-) |
| 14:47 | danlarkin | *mind boggled* |
| 14:47 | hiredman | hit the escape key alot while trying to write emails in gmail |
| 14:48 | hiredman | I |
| 14:48 | Chousuke | does it delete all text? :) |
| 14:48 | Chouser | I edit emails in vim. Esc is ok. |
| 14:48 | hiredman | nope |
| 14:48 | Lau_of_DK | Also, you can get the mails directly in Emacs if you like |
| 14:48 | hiredman | it does nothing |
| 14:49 | hiredman | actually, I hit "<esc>:w<enter>" |
| 14:49 | Chousuke | I have vim keybindings for my browser... really nice. Though some sites suck for keyboard browsing |
| 14:50 | hiredman | clojurebot: mock? |
| 14:50 | clojurebot | Your mock object is a joke; that object is mocking you. For needing it. -- rhicky |
| 14:50 | Lau_of_DK | name mispelled :) |
| 14:52 | Lau_of_DK | http://tech.slashdot.org/article.pl?sid=09/01/14/1312210 |
| 14:52 | Lau_of_DK | Qt goes LGPL |
| 15:13 | hiredman | being able to roll everything into a jar file and ship it out is so nice |
| 15:34 | Lau_of_DK | Kota and I had planned to have an RC at January 15, and it looks like we're very close. If some of you who are knowledable in SQL could have a look through http://github.com/Lau-of-DK/clojureql/tree/master I'd be very grateful for your feedback. Especially if you find features missing that we havent yet implemented, but you badly want. |
| 15:37 | rhickey | asbjxrn: http://groups.google.com/group/clojure/msg/967ebe3133aa25ec |
| 15:58 | red_fish | someone can explain to me |
| 15:58 | red_fish | (defn add-points [& pts] |
| 15:58 | red_fish | (vec (apply map + pts))) |
| 15:58 | red_fish | (add-points [10 10] [-1 0]) |
| 15:59 | red_fish | I don't understand (apply map + pts) |
| 15:59 | danlarkin | do you understand map and apply? |
| 15:59 | red_fish | yep |
| 15:59 | Lau_of_DK | danlarkin: I dont think he does, no |
| 15:59 | red_fish | what is the order of evaluation? |
| 15:59 | danlarkin | red_fish: well then it's just applying map + to pts |
| 16:00 | kotarak | (apply map + pts) <=> (apply map + (list [10 10] [-1 0])) <=> (map + [10 10] [-1 0]) <=> (list (+ 10 -1) (+ 10 0)) |
| 16:03 | red_fish | kotarak: (apply #(map + %1 %2) (list [10 10] [-1 0])) |
| 16:03 | red_fish | kotarak: is it the same? |
| 16:03 | red_fish | how can apply know infer that "map +" is the function? |
| 16:03 | hiredman | ,(apply #(map + %1 %2) (list [10 10] [-1 0])) |
| 16:03 | clojurebot | (9 10) |
| 16:04 | hiredman | map + is not the function |
| 16:04 | hiredman | map is the function |
| 16:04 | hiredman | + is just another argument |
| 16:04 | hiredman | (that happens to be a function) |
| 16:04 | kotarak | and takes + as argument |
| 16:04 | kotarak | right |
| 16:05 | kotarak | (apply func arg1 ... argn arglist) (where arglist is something seqable) |
| 16:05 | hiredman | ring is a nice, but I think I like compojure's vector -> html stuff better than clj-html's |
| 16:05 | danlarkin | red_fish: sorry if what I said confused you. I guess I should have said it's applying map to pts, where map is also taking + as an arg |
| 16:05 | red_fish | kotarak: is this equivalent (apply map (list + [10 10] [-1 0]))? |
| 16:06 | kotarak | I think so. |
| 16:06 | hiredman | ,(apply map (list + [10 10] [-1 0])) |
| 16:06 | clojurebot | (9 10) |
| 16:06 | red_fish | ,(apply map (list + [10 10] [-1 0])) |
| 16:06 | clojurebot | (9 10) |
| 16:06 | red_fish | cool |
| 16:06 | kotarak | ,(apply map + [10 10] [[-1 0]]) |
| 16:06 | clojurebot | (9 10) |
| 16:07 | red_fish | thank you very much |
| 16:07 | kotarak | np |
| 16:07 | red_fish | I think i wanna see the source of "apply" |
| 16:07 | Chousuke | hiredman: clj-html is faster though. |
| 16:07 | kotarak | src/clj/clojure/core.clj |
| 16:07 | hiredman | Chousuke: I see |
| 16:07 | red_fish | kotarak: thx |
| 16:09 | Chouser | red_fish: http://code.google.com/p/clojure/source/browse/trunk/src/clj/clojure/core.clj#367 |
| 16:10 | danlarkin | and let me assure you, apply _is_ lazy :-D |
| 16:10 | hiredman | danlarkin: what? |
| 16:11 | hiredman | madness |
| 16:11 | danlarkin | :o |
| 16:18 | karmazilla | madness? this is Clojure! |
| 16:21 | Chouser | I love lazy apply. Another one of those features where my first reaction was simply to assume it was impossible. |
| 16:21 | Chouser | ,(apply (fn [a b & r] [a b (take 3 r)]) (iterate inc 0)) |
| 16:21 | clojurebot | [0 1 (2 3 4)] |
| 16:25 | gnuvince | neat< |
| 16:27 | danlarkin | Lau_of_DK: I know something I'd really like to see in clojureql: postgres support |
| 16:29 | kotarak | danlarkin: Ideally you just load the postgres JDBC driver and it "should work". For some definition of should and work. I have no experience with the different databases, but MySQL and SQLite work at the moment. |
| 16:29 | Chousuke | hmm |
| 16:30 | Chousuke | ,(apply (fn [a b] (list a b)) (iterate inc 0)) |
| 16:30 | clojurebot | java.lang.OutOfMemoryError: Java heap space |
| 16:30 | Chousuke | I guess the infinite seq goes to a in that case? |
| 16:31 | red_fish | (apply (fn [a b & r] [a b (apply identity (take 3 r))]) (iterate inc 0)) |
| 16:32 | red_fish | ,(apply (fn [a b & r] [a b (apply identity (take 3 r))]) (iterate inc 0)) |
| 16:32 | clojurebot | java.lang.IllegalArgumentException: Wrong number of args passed to: core$identity |
| 16:32 | red_fish | ,(apply (fn [a b & r] [a b (apply map identity (take 3 r))]) (iterate inc 0)) |
| 16:32 | clojurebot | java.lang.IllegalArgumentException: Don't know how to create ISeq from: Integer |
| 16:33 | Chouser | Chousuke: odd -- you should have gotten a "Wrong number of args" |
| 16:34 | red_fish | ,(apply (fn [a b & r] [a b (take 3 r)]) (iterate inc 0)) |
| 16:34 | clojurebot | [0 1 (2 3 4)] |
| 16:35 | Chouser | ,(apply (fn [a b & r] [a b (map identity (take 3 r))]) (iterate inc 0)) ; red_fish: looking for this? |
| 16:35 | clojurebot | [0 1 (2 3 4)] |
| 16:35 | red_fish | Chouser: yes |
| 16:36 | Chouser | of course since 'map' is also lazy, you can move the 'map' to inside the 'take |
| 16:36 | red_fish | ,(apply (fn [a b & r] [a b (appy map identity (take 3 r))]) (iterate inc 0)) |
| 16:36 | clojurebot | java.lang.Exception: Unable to resolve symbol: appy in this context |
| 16:37 | red_fish | ,(apply (fn [a b & r] [a b (apply map identity (take 3 r))]) (iterate inc 0)) |
| 16:37 | clojurebot | java.lang.IllegalArgumentException: Don't know how to create ISeq from: Integer |
| 16:46 | burkelibbey | Does clojure have a function like cons, but with a reversed signature? Is (defn revcons [coll x] (cons x coll)) the best way to do it? |
| 16:46 | kotarak | (doc conj) |
| 16:46 | clojurebot | conj[oin]. Returns a new collection with the xs 'added'. (conj nil item) returns (item). The 'addition' may happen at different 'places' depending on the concrete type.; arglists ([coll x] [coll x & xs]) |
| 16:46 | rhickey | burkelibbey: conj works that way, for all collections |
| 16:47 | burkelibbey | Ah, I thought conj added to the end of a collection, but apparently I was using a vector without really realizing :P. Thanks. |
| 16:48 | red_fish | (doc conj) |
| 16:48 | clojurebot | conj[oin]. Returns a new collection with the xs 'added'. (conj nil item) returns (item). The 'addition' may happen at different 'places' depending on the concrete type.; arglists ([coll x] [coll x & xs]) |
| 16:53 | red_fish | can I use ctags with clojure? |
| 16:54 | kotarak | red_fish: I write a simple cljtags. |
| 16:54 | red_fish | cool |
| 16:54 | kotarak | red_fish: http://bitbucket.org/kotarak/cljtags/ there is only a repo at the moment, but it has download link |
| 17:15 | gnuvince_ | Hmmm |
| 17:15 | gnuvince_ | Somebody ought to reply to Slava on reddit to point out that Clojure is not like the Lisp he mentions |
| 17:16 | rhickey | link? |
| 17:16 | gnuvince_ | Me again? |
| 17:17 | gnuvince_ | http://www.reddit.com/r/programming/comments/7pohw/why_haskell_is_beyond_ready_for_prime_time/c071i7o |
| 17:18 | rhickey | Not sure there's a point to arguing with Slava about this, he doesn't think it benefits Clojure much to have access to Java libs |
| 17:20 | gnuvince_ | Really? |
| 17:27 | Nafai | I think Slava has sufficiently demonstrated that he has no interest in the Java language or platform |
| 17:28 | Chouser | I do think there's remarkably little scolding here |
| 17:29 | albino | they're talking about that thread in #concatenative right now, you could join them and make it real time |
| 17:30 | rhickey | Chouser: yes, I'm extremely pleased with this irc and the google group for general pleasantness, helpfulness and respectfulness |
| 17:30 | Lau_of_DK | Funny argument Slava puts forth, he's not entirely wrong |
| 17:32 | karmazilla | something is wrong with swing :( |
| 17:35 | Chouser | karmazilla: seems likely :-) |
| 17:35 | Nafai | :) |
| 17:37 | karmazilla | a JList and a TextField... KeyEvents to the text field will modify the ListModel for the jlist, but the damn thing only figures out that it needs to redraw after I make a second event happen, so the contents of the displayed list is always one keystroke behind... who the hell thought that up? |
| 17:46 | karmazilla | ohh... a little animal of mythical origin shared with me the arcane secrets of SwingUtilities.invokeLater. I'm a now bewildered by its magic |
| 17:46 | Chouser | karmazilla: there's a macro for that in textjure.clj |
| 17:48 | karmazilla | yeah, that might have been the animal, but I am still prototyping with netbeans and its gui builder from the land of control |
| 17:49 | karmazilla | it's the document-switcher-slash-file-opener for textjure that I'm trying to build :) |
| 18:03 | meredydd | Hey all. Is there a convention for calling out of a sub-namespace? |
| 18:03 | meredydd | Say I have two components X and Y that each need to send events to the other |
| 18:04 | meredydd | If I define them as 'com.xxx.X and 'com.xxx.Y, then (:require) them both from 'com.xxx, I have a forward-definitions problem. |
| 18:04 | meredydd | Is there a conventional way of handling this situation? |
| 18:06 | hiredman | meredydd: have them require each other? |
| 18:06 | meredydd | hiredman: That didn't work last time I tried it |
| 18:06 | meredydd | Can't remember the failure mode now - might just be an infinite loop of interpreter-ness |
| 18:10 | meredydd | hiredman: Yeah, there we go. "No such var: com.xxx.x/var" |
| 18:11 | durka | isn't this was declare is for? |
| 18:11 | hiredman | meredydd: a.a requires a.a.a requires a.a.b requires a.a.a |
| 18:11 | meredydd | declare? Fee fi fo fum, I smell a new keyword. |
| 18:11 | durka | (doc declare) |
| 18:11 | clojurebot | defs the supplied var names with no bindings, useful for making forward declarations.; arglists ([& names]) |
| 18:12 | Chousuke | can you declare vars in other namespaces? :/ |
| 18:12 | hiredman | durka: declare would not work across namespaces I don't think |
| 18:12 | durka | yes |
| 18:12 | meredydd | Chousuke: Nope. |
| 18:12 | hiredman | ,(declare 'foo/fum) |
| 18:12 | clojurebot | DENIED |
| 18:12 | Chousuke | so your problem is that a.a.b and a.a.a call each other directly. |
| 18:12 | hiredman | clojurebot: thanks man |
| 18:12 | clojurebot | No entiendo |
| 18:12 | Chousuke | add indirection! |
| 18:12 | durka | (binding [*ns* *ns*] (in-ns 'other) (def a b)) |
| 18:13 | meredydd | durka: Yep, but then you've got to break up your (ns) and do all your definitions before your use/require/etc statements |
| 18:13 | durka | seems like there should be a better way to do this |
| 18:13 | meredydd | durka: ...or you've got to do something unpleasant like that. |
| 18:13 | meredydd | (which is what I've been doing so far. But it's frankly ugly.) |
| 18:13 | durka | how does java handle it? |
| 18:14 | hiredman | meredydd: what I said should work |
| 18:14 | hiredman | I just tried it |
| 18:14 | meredydd | hiredman: Try referring to a var in a.a.a from a.a.b |
| 18:14 | meredydd | and vice versa |
| 18:14 | meredydd | that'll break it. |
| 18:15 | meredydd | durka: javac copes with mutual references between classes supplied in the same invocation. |
| 18:15 | meredydd | durka: It's a regular problem when spanning different languages (eg one class in Groovy, one in Java - there's no simple way of having each of them refer to the other) |
| 18:16 | durka | i see |
| 18:17 | hiredman | meredydd: what I said works fine here |
| 18:17 | meredydd | Where's the local pastebin? |
| 18:17 | hiredman | lisppaste8: url? |
| 18:17 | meredydd | clojurebot: paste |
| 18:17 | clojurebot | No entiendo |
| 18:17 | lisppaste8 | To use the lisppaste bot, visit http://paste.lisp.org/new/clojure and enter your paste. |
| 18:18 | meredydd | Oh, well - worth a shot :) |
| 18:18 | hiredman | clojurebot: paste is http://paste.lisp.org/new/clojure |
| 18:18 | clojurebot | Ik begrijp |
| 18:18 | walters | meredydd: groovy actually has a joint compiler, so it can do that |
| 18:18 | meredydd | walters: That was a later development, explicitly developed to solve that problem. |
| 18:19 | walters | meredydd: http://groovy.codehaus.org/The+groovyc+Ant+Task |
| 18:19 | meredydd | (I first tried Groovy before that was introduced, when it was still a publicised "gotcha", and haven't gone back to it since; my apologies for being out of date) |
| 18:19 | walters | yeah, it's relatively recent |
| 18:20 | meredydd | (My point was that it requires explicit compiler smarts.) |
| 18:20 | walters | yeah...ideally there would be a way for a language to plug into javac, so it sees ".clj" -> hand off to clojure.Compiler etc |
| 18:20 | lisppaste8 | meredydd pasted "reference problems" at http://paste.lisp.org/display/73606 |
| 18:21 | erohtar | hey - does anyone know if dynamic variables set via binding are visible through agents? |
| 18:21 | meredydd | hiredman: That breaks, with the error message I pasted. |
| 18:21 | walters | there's some sort of compiler API now, but I don't know whether it helps with this at all |
| 18:22 | meredydd | erohtar: Give an example? Generally not - dynamic bindings are thread-local, and agents run in a separate thread. |
| 18:22 | hiredman | meredydd: you are correct, I did not have enough references between namespaces to check everything |
| 18:22 | erohtar | meredydd: ah, i see - makes sense |
| 18:22 | meredydd | hiredman: That's why I said "[23:17:19] <meredydd> hiredman: Try referring to a var in a.a.a from a.a.b, and vice versa" |
| 18:23 | erohtar | meredydd: so if I need to do something from an agent that involves changing a dynamic variable, i should do it from the function i use in the send? |
| 18:24 | meredydd | erohtar: No; the function you send will run in the agent's thread(pool), and won't see the dynamic binding either. |
| 18:24 | erohtar | meredydd: right - ok... so can i change the dynamic binding within *that* function, then? |
| 18:24 | meredydd | erohtar: Generally speaking, if it's a value you want to change, you should be using Refs. Think of (binding)s as "temporarily set this variable to this value" |
| 18:25 | meredydd | Refs are "this is a value that can change over time" |
| 18:25 | erohtar | meredydd: well, in my case, im using a dynamic variable to hold database config information, which I want to set at call time |
| 18:26 | rhickey | meredydd: hm? |
| 18:26 | meredydd | rhickey: How do I cope with mutual references between two namespaces? |
| 18:26 | meredydd | eg, I have com.xxx.x and com.xxx.y and they both want to talk to each other. |
| 18:27 | meredydd | (say, each wants to call a funciton in the other) |
| 18:27 | rhickey | meredydd: don't do it |
| 18:27 | meredydd | And if the answer is "that's the wrong question, you're doing it wrong", what patterns should I be using instead? |
| 18:27 | meredydd | Thought that would be the answer :) |
| 18:27 | meredydd | So what should I be doing instead? |
| 18:28 | hiredman | meredydd: if they are subname spaces of another name space, maybe they a can just assume they are both there and leave out the require |
| 18:28 | meredydd | It's not easy to write, say, a message queue in the parent namespace that the the two can use to communicate |
| 18:28 | meredydd | (because the (:require) and (:use) clauses of the parent's (ns) macro come before any of the parent's (def)s) |
| 18:29 | meredydd | and by "not easy" I don't mean "insurmountably hard", I mean "it's breaking the expected usage of the (ns) macro, therefore probably isn't the right way to be going about things" |
| 18:35 | hiredman | I think it may be time to re-examine your purpose in creating such a namespace arrangement |
| 18:39 | meredydd | That's quite possible; nay, probable. |
| 18:41 | meredydd | I have a suspicion that there is such a thing as a legitimate need for two components to talk to one another, rather than forcing one to be effectively a library called by the other |
| 18:43 | meredydd | In this particular case, there are ways I can make one a library of the other, and pass in function pointers for the callouts, but I still feel slightly unpleasant. |
| 18:43 | meredydd | That said, last time I was convinced I was right and Rich was wrong....well, you can guess the result :) |
| 18:43 | danlarkin | is it too complicated for an summary of what each does? |
| 18:44 | Chousuke | if they're interlocked libraries, is there a reason they aren't in the same namespace? |
| 18:44 | hiredman | ^- |
| 18:47 | meredydd | danlarkin: Okay... |
| 18:47 | meredydd | Chousuke: Essentially, because they're too big to put the whole hairball in one file; I'd like to destructure it a little. |
| 18:48 | grosours | Hi everybody |
| 18:48 | meredydd | danlarkin: A chat system that falls back to email. |
| 18:48 | Chousuke | meredydd: well, you can put some code in another file and just (load) it, can't you= |
| 18:49 | meredydd | The webchat system is a hairy MVC beast that definitely wants to live in its own namespace. |
| 18:49 | Chousuke | hmm :/ |
| 18:49 | meredydd | The mail system is also moderately hairy, and I don't want to go blending it with anything else. |
| 18:49 | danlarkin | Hmmmm |
| 18:50 | meredydd | Depending on whether there's a chat session open (ie internal state of chat system), mails need to be intercepted and diverted to chat |
| 18:50 | danlarkin | can you do something like have a 3rd file with a function like send-chat-or-email ? |
| 18:50 | meredydd | And when a chat session times out, unseen messages get dispatched via the email system. |
| 18:51 | meredydd | danlarkin: How would that work? That function sounds like it would want to refer to functions in both the chat and email systems...and yet both the chat and email systems would want to refer to it. |
| 18:51 | danlarkin | nah |
| 18:52 | danlarkin | it'd call try-to-send-chat and if that fails it calls try-to-send-email |
| 18:52 | danlarkin | or whatever |
| 18:52 | danlarkin | oh |
| 18:52 | meredydd | Okay. Now, in what namespace is 'try-to-send-chat located? |
| 18:53 | meredydd | (I take it that "oh" was you getting the problem) |
| 18:53 | danlarkin | haha |
| 18:53 | danlarkin | ...maybe :) |
| 18:54 | meredydd | Now, this kind of thing happens all the time at the within-namespace level, and we solve the problem with forward declarations (empty (def)s, or nowadays the (declare) macro) |
| 18:54 | Chousuke | maybe you need to abstract away the message handling somehow |
| 18:55 | meredydd | I'm just curious as to why rhickey is so certain that such a thing is illegitimate between two namespaces when it's legitimate between two functions |
| 18:55 | hiredman | *shrug* |
| 18:55 | Chousuke | mail system receives message, notifies some message center, message center sees chat system is interested, forwards to it |
| 18:55 | Chousuke | hmm |
| 18:56 | meredydd | aand once again, we have the mail system needing to refer to the message center, but the message center needing to refer to the mail system, and... |
| 18:57 | Chousuke | the message center doesn't need to directly know about the mail system. the mail system could just tell the message center that it produces messages of type "mail" |
| 18:58 | meredydd | yep, and then pass in a handler function for messages of type "mail", and chat does the same thing... |
| 18:58 | hiredman | you could leave out the require and have a fourth file that requires all three |
| 18:58 | meredydd | But now we're reinventing something that smells distinctly like Enterprise Java, just to try to dance around the fact that we have a circular reference. (Which we still do, because the string "mail" will be hard-coded into the chat system) |
| 18:58 | meredydd | hiredman: How does that work? |
| 19:00 | hiredman | actually |
| 19:01 | hiredman | you may want a look at the clojurebot code |
| 19:01 | meredydd | ? |
| 19:01 | hiredman | (the ns and callback stuff is Chousuke's) |
| 19:02 | meredydd | Oh, yes. If you want to do it with callbacks, that's all very well. |
| 19:02 | hiredman | yeah |
| 19:02 | hiredman | it is very well |
| 19:02 | meredydd | You create both halves as libraries with empty callbacks for "send mail" and "intercept-message?" |
| 19:03 | meredydd | (with specific signatures designed to match their one and only implementation...) |
| 19:03 | hiredman | meredydd: the control center has a place where message handlers can latch on to |
| 19:03 | Chouser | I find I have to use 'declare' only very rarely in well-organized files. |
| 19:03 | meredydd | then write a separate NS which just wires them together by plugging one's functions into the other's callbacks |
| 19:04 | meredydd | Chouser: Oh, I agree. In fact, in this example, I want to use it all of once. (Maybe twice.) |
| 19:05 | hiredman | meredydd: you can have the ns plug themselves into the callbacks |
| 19:05 | meredydd | hiredman: How? By referencing which common component? |
| 19:06 | hiredman | meredydd: http://github.com/hiredman/clojurebot/blob/369ceedc238d8fe1539e0bca3b087d89827523ca/hiredman/clojurebot/svn.clj |
| 19:06 | hiredman | line 85 |
| 19:06 | hiredman | when the ns is loaded |
| 19:07 | hiredman | it calls that function, which hooks it in to the dispatching function in hiredman.clojurebot.core |
| 19:07 | meredydd | (And if this common component is anything like the "message center" referred to earlier, which dispatches to functions or handlers based on strings, we've just "solved" the syntactic issue by implementing exactly the same dependency, at great length, in a value domain less suited for the job (identifying functions with strings rather than function pointers)) |
| 19:08 | meredydd | Aha. You're dispatching on regexp there? |
| 19:09 | hiredman | meredydd: you big long message there does not make sense to me, so we must be talking across each other, so maybe I should stop talking if it is just noise |
| 19:10 | Chousuke | it's not a very clean solution though. it lacks priorities so the first dispatch that matches gets called :P |
| 19:10 | hiredman | :P |
| 19:11 | hiredman | I am not suggesting he take it verbatim |
| 19:11 | hiredman | I am suggesting a similar model could be used |
| 19:11 | meredydd | hiredman: I guess all I was trying to say was that building a full dispatch mechanism is overkill when all I ever want to do here is have component A call component B, and B call A. |
| 19:12 | hiredman | meredydd: you can do that, just leave out the requires and load the files |
| 19:13 | meredydd | Yeah, I guess. I'd just prefer not to have to sacrifice the internal namespace structures of A and B to do this. |
| 19:14 | meredydd | Anyway, you're right here; I think this is a round-in-circles maneuver. |
| 19:15 | meredydd | I guess I'll do it the hacky way, with forward declarations, and if one day someone clever comes along and shows me how I should have done this more simply then I'll change it. |
| 19:53 | erohtar | can anyone tell me how agents die? i see that the thead count is increasing (under Activity Monitor)... |
| 19:54 | durka | you mean how to forcibly kill them? |
| 20:03 | erohtar | durka: no, do they (the associated thread) die when the function sent to them is over? |
| 20:04 | durka | i don't think so, not necessarily |
| 20:04 | Chouser | an agent is not a thread. When the action is complete, the thread returns to the pool. |
| 20:05 | durka | even with send-off? |
| 20:05 | Chouser | The agent stays around as long as something is referencing it, after that it can be GC'd |
| 20:05 | erohtar | chouser: ok understood, then why does the thead-count increase? |
| 20:05 | erohtar | chouser: also - is there a limit to the size of the thread-pool? |
| 20:05 | Chouser | durka: yes, even with send-off. |
| 20:06 | Chouser | send's use a pool that's capped based on the number of CPUs. send-off's pool will grow as needed, but when the action is done the thread can hang around for a later send-off to another (or the same) agent. |
| 20:07 | erohtar | chouser: ok thanks |
| 20:08 | Chouser | I don't think the send-off pool should ever have more threads than the maximum number of actions being processed at one time. |
| 20:11 | Chouser | ,(.getPoolSize clojure.lang.Agent/pooledExecutor) |
| 20:11 | clojurebot | 0 |
| 20:11 | Chouser | ,(.getPoolSize clojure.lang.Agent/soloExecutor) |
| 20:11 | clojurebot | java.lang.Exception: No such namespace: clojure.lang.Agent |
| 20:13 | Chouser | ,(send (agent 1) inc) |
| 20:13 | clojurebot | #<Agent clojure.lang.Agent@1e881b6> |
| 20:13 | Chouser | ,(.getPoolSize clojure.lang.Agent/pooledExecutor) |
| 20:13 | clojurebot | 1 |
| 20:13 | Chouser | so that's the 'send' thread pool |
| 20:13 | Chouser | ,(send (agent 1) inc) |
| 20:13 | clojurebot | #<Agent clojure.lang.Agent@94310b> |
| 20:13 | Chouser | ,(.getPoolSize clojure.lang.Agent/pooledExecutor) |
| 20:13 | clojurebot | 2 |
| 20:14 | Chouser | ,(dotimes [_ 100] (send (agent 1) #(do (Thread/sleep 1000))) |
| 20:14 | clojurebot | Eval-in-box threw an exception:EOF while reading |
| 20:14 | Chouser | ,(dotimes [_ 100] (send (agent 1) #(do (Thread/sleep 1000)))) |
| 20:14 | clojurebot | nil |
| 20:14 | Chouser | ,(.getPoolSize clojure.lang.Agent/pooledExecutor) |
| 20:14 | clojurebot | 3 |
| 20:14 | Chouser | capped out at 3 |
| 20:15 | Chouser | looks like the send-off pool is no longer public, so I can't see its thread count anymore |
| 20:24 | Chouser | ok, I coulda *sworn* there was a verion of Clojure where I could get at both pools. But i can't find it now. |
| 20:30 | erohtar | wow - i didnt even know about clojurebot |
| 20:30 | erohtar | amazing |
| 20:31 | erohtar | chouser: why was the threadpool capped at 3? |
| 20:42 | Chouser | Apparently clojurebot's running on a single-CPU machine. the 'send' pool uses CPU count plus 2. |
| 20:43 | hiredman | yep |
| 20:45 | danlarkin | leaking implementation details!!!111oneonewon |
| 20:48 | RSchulz | Hey, danlarkin! I'm not gone, just otherwise occupied. I upgraded my primary development system to openSUSE 11.1, and there were... complications. |
| 20:48 | RSchulz | All is well, now, though. |
| 20:48 | RSchulz | 345 unread messages in the Clojure list! |
| 20:48 | hiredman | heh |
| 20:49 | RSchulz | What have I missed?? |
| 20:49 | danlarkin | :) |
| 20:49 | hiredman | the internet is over |
| 20:49 | hiredman | clojure won |
| 20:49 | danlarkin | glad to see you're still alive |
| 20:49 | RSchulz | The tubes are terminally clogged? |
| 20:49 | RSchulz | (Couldn't think of a good word beginning with 't') |
| 20:50 | durka | no, it's not that |
| 20:50 | durka | they caught tuberculosis |
| 20:50 | RSchulz | Ah. Good one! |
| 20:50 | durka | this is unrelated to last year's bout of tubercuilosis |
| 20:51 | RSchulz | Anyway, almost 100% of my old stuff is restored and much is better than it was. Now I can run, among other things, VimClojure. |
| 20:51 | RSchulz | And the various Git programs. It seems inevitable... |
| 20:55 | durka | let's use reflection to break Agent's encapsulation |
| 20:55 | durka | ,(.. (agent nil) getClass (getDeclaredField "soloExecutor") (get (agent nil)) getPoolSize) |
| 20:55 | clojurebot | 2 |
| 20:55 | durka | (send-off (agent 1) inc) |
| 20:55 | durka | ,(send-off (agent 1) inc) |
| 20:55 | clojurebot | #<Agent clojure.lang.Agent@130671e> |
| 20:55 | durka | ,(.. (agent nil) getClass (getDeclaredField "soloExecutor") (get (agent nil)) getPoolSize) |
| 20:55 | clojurebot | 3 |
| 20:55 | hiredman | I was poking around nautilus a few days ago, and last night when I turned on my laptop, all my *.clj files had the clojure icon |
| 20:56 | durka | really? what put it there? |
| 20:56 | RSchulz | hiredman: You use Windows? |
| 20:56 | hiredman | nope |
| 20:57 | durka | i don't think nautilus has been ported to windows yet |
| 20:57 | RSchulz | Which Nautilus are we talking about? |
| 20:57 | hiredman | I was messing with gnome's mimetype database trying to get the clojure icon has the icon for clojure files, but it did not seem to work |
| 20:57 | hiredman | but I guess it did |
| 20:57 | RSchulz | I think that's more likely the explanation. |
| 20:58 | hiredman | I poked a lot of places, so I am note sure what did it |
| 20:58 | RSchulz | And... What's with using Gnome? ... Real Programmers (TM) use KDE! |
| 20:58 | hiredman | RSchulz: I will refrain from bring a flame war into to #clojure (but KDE is junk, and I hate it) |
| 20:58 | hiredman | bringing |
| 20:58 | RSchulz | You're thinking of KDE 4.x |
| 20:59 | hiredman | KDE. |
| 20:59 | RSchulz | Control freaks prefer KDE 3.5. |
| 20:59 | hiredman | well, thats just like, your opinion man. |
| 21:00 | RSchulz | The only wrong opinion is "meh. don't care." |
| 21:00 | RSchulz | (I've known that type...) |
| 21:02 | RSchulz | Let's try another tack... Which distro do you use?? |
| 21:02 | hiredman | I don't use linux |
| 21:04 | RSchulz | Eh? You use Gnome but not on a Linux or Windows? |
| 21:05 | RSchulz | OSX? |
| 21:05 | hiredman | fbsd |
| 21:06 | RSchulz | Ah. A real minority. |
| 21:06 | hiredman | not in ##freebsd |
| 21:07 | albino | heh |
| 21:07 | RSchulz | The long tail. |
| 21:07 | albino | we welcome all minorities, don't we? |
| 21:08 | RSchulz | One would hope. |
| 21:10 | albino | hiredman: what do you like about freebsd? If you don't mind me being curious |
| 21:10 | hiredman | it is very together |
| 21:11 | RSchulz | What's the latest FreeBSD version? |
| 21:11 | hiredman | uh, the latest release was 7 something |
| 21:11 | hiredman | 7.1 |
| 21:11 | albino | I need to try it out sometime |
| 21:11 | albino | my only expereince with it was when someone else installed it and I was floored that tab completion wasn't there by default |
| 21:12 | hiredman | someone recommended it to me, about ten years ago, I tried it, and have not switched back |
| 21:12 | hiredman | well, I also use zsh not bash |
| 21:12 | RSchulz | You dare bash BASH? |
| 21:13 | albino | but zsh has tab completion by default, doesn't it? |
| 21:13 | hiredman | yes |
| 21:13 | RSchulz | You are quite the heretic! |
| 21:13 | RSchulz | Commendible! |
| 21:13 | albino | all the real smarties use zsh |
| 21:13 | RSchulz | But where do you you go from zsh? There aren't any more letters... |
| 21:13 | hiredman | freebsd 's /bin/sh is not bash and nothing like bash or zsh, if you want those with those features you can install them |
| 21:14 | RSchulz | Ooh. Zsh has a new-user configurator / wizard! |
| 21:15 | RSchulz | (I have so run it before) |
| 21:15 | albino | hiredman: so do you hack for a living? |
| 21:16 | hiredman | no, actaully |
| 21:16 | RSchulz | "Will hack for food." |
| 21:16 | Nafai | I used to run zsh |
| 21:16 | Nafai | But I never really used the specific features of it |
| 21:16 | RSchulz | hiredman is a Software Engineer. No hacking allowed. |
| 21:16 | Nafai | And when I installed my OS on a new machine, I never got around to installing zsh, so I just use bash |
| 21:17 | hiredman | I am the junior estimator at a commercial painting company |
| 21:18 | RSchulz | Well, that doesn't admit much in the way of bon mots... |
| 21:19 | albino | hiredman: sounds kind of interesting |
| 21:20 | hiredman | nah, just stare at plans all day |
| 21:21 | RSchulz | Lots of Excel, I suppose. |
| 21:21 | hiredman | Yes. |
| 21:21 | albino | hiredman: well it's kind of interesting that you hack on clojure stuff on the side, I would expect most people here aren't in painting businesses |
| 21:21 | RSchulz | Spreadsheets are pretty cool. A Clojure-oriented spreadsheet could be interesting. |
| 21:22 | RSchulz | Hmmm. I mowed lawns, painted houses, shovelled snow and fried donuts when I was young. |
| 21:41 | drewolson | how can i get access to command line arguments? |
| 21:42 | Chouser | *command-line-args* |
| 21:42 | Chouser | ,*command-line-args* |
| 21:42 | Chouser | ,(prn *command-line-args*) |
| 21:42 | drewolson | thanks :) |
| 21:42 | clojurebot | nil |
| 21:42 | Chouser | heh, sure. |
| 21:43 | drewolson | i've been messing with a toy program to create fractals with clojure...but i can't seem to find a java turtle graphics lib that _works_ |
| 21:43 | Chouser | I wrote a toy program to draw fractals in clojure. |
| 21:44 | drewolson | damn you for beating me to it :) |
| 21:44 | drewolson | do you have the source somewhere? |
| 21:44 | Chouser | hm, I know I posted an older version. |
| 21:45 | Chouser | http://blog.n01se.net/?p=35 |
| 21:47 | drewolson | that looks cool |
| 21:47 | Chouser | I've got a more flexible version somewhere... |
| 21:48 | Chouser | :-) thanks. It proved more difficult for me than I expected. |
| 21:48 | drewolson | http://github.com/drewolson/dragon/tree/master |
| 21:48 | drewolson | this is my feeble attempt so far |
| 21:48 | drewolson | trying to draw the dragon fractal |
| 21:48 | drewolson | i swear it's right, but the turtle graphics programing isn't working as expected |
| 21:50 | rhickey | Many patches applied - thanks all! http://code.google.com/p/clojure/source/list |
| 21:53 | Chouser | drewolson: ah, here's a commented more fleixble version: http://gist.github.com/44584 |
| 21:53 | Chouser | that one is an applet |
| 21:53 | drewolson | ah, thanks |
| 21:54 | Chouser | page with embedded applet: http://chouser.n01se.net/misc/tree.html |
| 21:54 | Chouser | durka: it does not :-) |
| 21:55 | Chouser | durka: but the last version I asked you to try was, I thought, compiled using java 1.5, and I now think it wasn't. |
| 21:57 | drewolson | i think it's probably because i'm still getting used to it, but it takes me much longer to read clojure code than, say ruby. it feels much more "dense"...not it a bad way. just lots of info per line |
| 21:57 | Chouser | it is definitely more dense |
| 21:58 | Chouser | I've heard different people specifically call that out as bad or good. |
| 21:58 | drewolson | it can't decide if that's a good thing |
| 21:58 | drewolson | i find myself thinking that my clojure code is "clever" in a somewhat bad way |
| 21:58 | drewolson | terse but very dense |
| 21:58 | drewolson | i suppose like anything else it gets better with practice |
| 21:59 | Chouser | I guess I come down on the side of it being good. Why would I want to spend more space, more lines, more words, saying the same thing? |
| 21:59 | Chouser | But yes, it takes practice and especially at first a certain amount of persistence to dig in. |
| 22:00 | drewolson | specifically concurrency has been a hurdle for me. never really touched it before. |
| 22:00 | Chouser | One "trick" I tend to forget and have to rediscover occasionally is that if a block I'm reading is just too impenetrable, to try reading it from the inside out. |
| 22:00 | drewolson | yes, totally agree |
| 22:01 | Chouser | I guess this is especially for the more deeply nested structures. |
| 22:02 | Chouser | oh, you're trying to read the Tree code, aren't you. I'm afraid there's a couple things in there that kinda obfuscate what's going on. |
| 22:02 | Chouser | that 'branch' macro is -- substantial. |
| 22:03 | drewolson | It's interesting though, worth looking at. I'm going to have to scurry off and figure out what's going on with the agents |
| 22:04 | drewolson | you're mapping across a range of ints to start the agent pool, right? |
| 22:05 | Chouser | yes, just to create a batch of agents |
| 22:05 | drewolson | and then you create another agent to monitor them |
| 22:05 | drewolson | ? |
| 22:06 | Chouser | each agent just computes a random point in fractal, draws it, and then loops around to do it again. The agents are completely independent of each other. |
| 22:06 | Chouser | yes, that's just for debugging. |
| 22:06 | drewolson | i see |
| 22:06 | Chouser | if an agent's action function throws an exception, the agent quits working but you may never know about it. |
| 22:06 | drewolson | ah, i see |
| 22:07 | Chouser | so I made a monitor agent to occasionally check all the other agents for any errors and print them to stdout |
| 22:07 | Chouser | of course if the monitor agent has an error.... |
| 22:08 | drewolson | metamonitoring? heh |
| 22:08 | Chouser | but it was the code for the other agents I was changing a lot, experimenting with different shapes and such, so that's where errors were likely to occur. |
| 22:12 | drewolson | i took a quick look at the agents section on clojure.org, but i'm not groking the reduce in run |
| 22:14 | Chouser | sorry, I'm not sure what you're talking about. |
| 22:16 | drewolson | there's some example code on clojure.org under the agents section. in the run function, there is a reduce function called to build the ring of agents. i can't quite parse it. |
| 22:16 | Chouser | ah, yeah. talk about dense... |
| 22:18 | Chouser | ok, reduce there has 3 args, a fn, an initial value, and a seq |
| 22:18 | drewolson | sure |
| 22:19 | drewolson | oh i get it |
| 22:19 | drewolson | :) |
| 22:19 | drewolson | next is the last agent |
| 22:19 | Chouser | so the first time the fn is called, it's 'next' is the :report-queue agent and it's 'i' is 0 |
| 22:19 | drewolson | which becomes part of the state of the current agent |
| 22:19 | drewolson | which is returned |
| 22:19 | drewolson | and then used for the next agent |
| 22:19 | drewolson | and so on |
| 22:19 | drewolson | yes? |
| 22:19 | Chouser | well, if you get it, then can I stop trying? :-) |
| 22:19 | drewolson | haha |
| 22:20 | drewolson | i'm still slightly confused how the range is involved |
| 22:20 | drewolson | is that just providing something to iterate over? |
| 22:20 | Chouser | yes, the value of 'i' isn't used |
| 22:20 | drewolson | gotcha |
| 22:20 | drewolson | is there an idiom in clojure to use, say _ when a param will not be used? |
| 22:20 | Chouser | yes |
| 22:20 | drewolson | gotcha |
| 22:21 | Chouser | there, fixed. |
| 22:22 | drewolson | cool :) |
| 22:23 | Chouser | surely Halloway's examples are easier to follow? |
| 22:23 | drewolson | well, they are more gradual |
| 22:23 | drewolson | however i love to ponder these more real examples |
| 22:24 | drewolson | when you finally get them it's quite gratifying |
| 22:24 | Chouser | ah, true. |
| 22:27 | freddy_d | hi all |
| 22:27 | Chouser | hello |
| 22:27 | freddy_d | anyone using Clojure in the workplace? |
| 22:28 | Chouser | there was a interesting post to the group recently about a Clojure deployment. |
| 22:28 | drewr | freddy_d: Almost every day. |
| 22:29 | freddy_d | drewr: interesting. what kind of applications? |
| 22:29 | drewolson | drewr: lucky. and nice name. |
| 22:29 | drewr | drewolson: :-) |
| 22:30 | drewr | freddy_d: Mostly back-end, data-mining types of things. |
| 22:30 | freddy_d | drewr: cool. |
| 22:31 | drewolson | Chouser: in the given agent example, how can we bet sure that all messages have reached the final agent. we aren't blocking anywhere waiting for them, correct? |
| 22:33 | drewolson | ah, nvm. java.util.concurrent.SynchronousQueue is a blocking queue |
| 22:33 | drewolson | tricky, very tricky |
| 22:33 | Chouser | good eye -- I hadn't spotted that yet. |
| 22:34 | drewolson | ok, this all makes sense now. very interesting example. |
| 22:40 | drewolson | thanks for the help, night all |
| 23:17 | danlarkin | JEEEEEZ it's cold outside |
| 23:32 | arohner | danlarkin: I know! It's like 50 outside! |
| 23:32 | arohner | :-p |
| 23:35 | pjb3 | I was just looking through some of the code in contrib/sql and I |
| 23:35 | pjb3 | have a question |
| 23:36 | pjb3 | in do-commans |
| 23:36 | pjb3 | do-commands |
| 23:36 | pjb3 | it has this: (with-open [stmt (.createStatement (connection))] |
| 23:36 | pjb3 | that means that connection must be a function that is being called, right? |
| 23:36 | pjb3 | where does connection come from? |
| 23:37 | pjb3 | ah, internal |
| 23:37 | pjb3 | nevermind, didn't see that |
| 23:39 | pjb3 | I suppose this was written before the introduction of defn- into the language? |