2010-04-23
| 00:04 | livingston | slyphon: you get your code working? |
| 00:22 | mmarczyk | livingston: that's a really cool project you were describing earlier |
| 00:22 | mmarczyk | can't wait to see it :-) |
| 00:23 | livingston | thanks |
| 00:24 | livingston | well it's a lot of open problems in AI combined, so there won't be a "done" for a long time, but the research will go on for a long while |
| 00:25 | mmarczyk | I'm inclined to consider this a good side of the endeavour :-) |
| 00:25 | livingston | (we have postdoc slots open if you know of anyone looking) |
| 00:26 | mmarczyk | where at? |
| 00:26 | livingston | UC Denver - CCP (center for computational pharmacology) |
| 00:27 | livingston | Anyone here ever worked with Jena? (or RDF anything for that matter) |
| 01:34 | livingston | isn't equals: "content equals" and ==: "pointer equals" (or identity or whatever you want to call it) |
| 01:35 | livingston | disregard that, wrong channel |
| 02:29 | zkim | Does anybody have an opinion on whether it's better to return an empty list, or nil? |
| 02:29 | zkim | i.e. {:results nil} vs {:results ()} |
| 02:29 | carkh | hum let it return what it would normally return |
| 02:30 | zkim | carkh: well if it was up to you, what would you do? |
| 02:30 | carkh | looks like that's a choice i never have to do |
| 02:31 | carkh | my guess is that you're doing something wrong if you're asking that question |
| 02:31 | carkh | what's the context ? |
| 02:32 | zkim | ProcessBuilder stuff, basically I'm running a process and collecting the stdout and stderrs into a map: |
| 02:32 | zkim | for example: la -aul |
| 02:33 | carkh | anyways when you're processing the result, being a list or nil doesn't change a thing |
| 02:33 | zkim | would return {:out ("drwxr-xr-x+ 108 zkim staff 3672 Apr 23 00:32 .") :err ("")} |
| 02:33 | zkim | so I'm thinking of turning that empty err result into either an empty list, or nil |
| 02:33 | carkh | allright, and how are you getting that list ? (out) |
| 02:33 | zkim | reading it from the Process output stream |
| 02:34 | carkh | and it might return several lines ? |
| 02:34 | zkim | yeah, which I would turn into a list of strings |
| 02:34 | carkh | what function are you using to turn it into a list ? |
| 02:34 | zkim | String.split |
| 02:35 | zkim | (seq (.split (:out res) "\n")) |
| 02:35 | carkh | ,(seq (.split "" "\n")) |
| 02:35 | clojurebot | ("") |
| 02:36 | zkim | so that gives '("") on an empty string |
| 02:37 | carkh | ,(clojure.contrib.string/partition #"\n" "") |
| 02:37 | clojurebot | java.lang.ClassNotFoundException: clojure.contrib.string |
| 02:38 | carkh | ,(require 'clojure.contrib.string) |
| 02:38 | clojurebot | java.io.FileNotFoundException: Could not locate clojure/contrib/string__init.class or clojure/contrib/string.clj on classpath: |
| 02:38 | carkh | ,(require 'clojure.contrib.str-utils) |
| 02:38 | clojurebot | nil |
| 02:38 | carkh | ah looks like clojurebot is not on latest +P |
| 02:38 | zkim | hehe yeah |
| 02:39 | zkim | guess I'm not either, getting classnotfound on c.c.string |
| 02:39 | carkh | me neither, and now the doc is not available =/ |
| 02:40 | carkh | ah got it, anyways same result |
| 02:40 | carkh | maybe we want to filter empty strings |
| 02:40 | zkim | so that would give an empty seq, correct? |
| 02:41 | zkim | ,(filter (fn [] false) ["hello" "world"]) |
| 02:41 | clojurebot | java.lang.IllegalArgumentException: Wrong number of args passed to: sandbox$eval--11080$fn |
| 02:41 | carkh | (filter #(not (.isEmpty %)) (seq (.split "" "\n"))) |
| 02:41 | carkh | ,(filter #(not (.isEmpty %)) (seq (.split "" "\n"))) |
| 02:41 | clojurebot | () |
| 02:42 | zkim | cool |
| 02:42 | carkh | looks like en empty list is the natural way ! |
| 02:42 | zkim | guess I'll go with empty list |
| 02:42 | zkim | thanks for the help carkh |
| 02:42 | carkh | anyways when you want to process it, you'll "seq" it |
| 02:42 | carkh | do i have errors ? (seq errors) |
| 02:42 | zkim | yeah, that makes sense |
| 02:43 | zkim | Nobody seems to be talking about nil handling in the community, but I'm pretty new to clojure, so maybe it's just a non issue |
| 02:44 | carkh | hum but it might be a bad idea to make a list out of your error output to begin with |
| 02:44 | zkim | feels more clojureish, instead of a block of text with newlines |
| 02:44 | carkh | if you have some error output, you're interested in the full output as a block, not in individual lines |
| 02:45 | mmarczyk | actually there is a pretty significant difference between () and nil |
| 02:45 | mmarczyk | in that the former is true in Boolean contexts |
| 02:46 | carkh | yes there is, that's why you always want to seq what could be a list |
| 02:46 | mmarczyk | also, ({:foo :bar} :quux) returns nil |
| 02:46 | zkim | hmm |
| 02:47 | zkim | I guess I could see the use case for checking for :err output by doing a (if (:err res) (do-stuff)) |
| 02:47 | mmarczyk | occasionally it might be useful to do, say, (if-let [val (my-map key)] ...) |
| 02:48 | mmarczyk | you can't do that when nil is a possible value, you'd have to use find instead |
| 02:48 | carkh | zkim: how about having a function that does that check ? it's good practice |
| 02:48 | mmarczyk | (or a default return value, if you can guarantee that it in turn will not be present in the map) |
| 02:48 | zkim | carkh: yeah, good point |
| 02:48 | mmarczyk | in this case, though, when you're holding sequences of errors (or whatever) |
| 02:49 | carkh | (defn result-has-errors? [result] (boolean (seq (:err res)))) |
| 02:49 | mmarczyk | and those sequences are strict anyway, since they were evaluated before being stuffed into the map |
| 02:49 | zkim | mmarczyk: wait, i think you just lost me, so the if-let would only work if the check was against an empty list? |
| 02:49 | mmarczyk | (finishing the last sentence) I'd use nil |
| 02:50 | mmarczyk | (answering that last question) yes |
| 02:50 | mmarczyk | (if-let [v nil] ...) always takes the false branch |
| 02:50 | mmarczyk | regardless of whether the nil came from not finding a value in a map or finding a nil value |
| 02:50 | carkh | ,(get {:foo :bar} :quux :not-found) |
| 02:50 | clojurebot | :not-found |
| 02:50 | zkim | ah |
| 02:51 | mmarczyk | carkh: as I said, that's ok if you know for sure that :not-found is not a possible value :-) |
| 02:51 | carkh | well you should know what's in your maps =P |
| 02:51 | mmarczyk | true |
| 02:52 | mmarczyk | I'd add to that that you should know why you're putting nils in your maps, if and when you do |
| 02:52 | carkh | if :not-found can be in it, just put something else |
| 02:52 | mmarczyk | like nil :-) |
| 02:52 | carkh | i think it's bad practice to use nil as a value |
| 02:53 | zkim | so a good rule of thumb is empty seq's the default, and nil's the exception? |
| 02:53 | carkh | i mean, i never have to put a nil in a map |
| 02:54 | zkim | carkh: yeah, and I guess the thing that's bugging me is that I'm worried that an aversion to nil's a bad hold-over habit from java |
| 02:54 | zkim | actually, it's mainly a lack of info, nobody's talking about it and I'm not experienced enough with clojure to drawn my own conclusions |
| 02:55 | carkh | i think your problem comes from making a list out of something that shouldn't be one |
| 02:55 | carkh | and i actually would put a nil there |
| 02:55 | carkh | either you have an error or it is empty |
| 02:56 | zkim | empty as in nil |
| 02:56 | carkh | see that's an implementation detail you shouldn't have to worry about outside your return value building function |
| 02:56 | carkh | do it one way or the other |
| 02:57 | mmarczyk | well, for this particular case you could just do something like |
| 02:57 | carkh | but close to that building function, have an has-error? predicate |
| 02:57 | mmarczyk | (zipmap [:in :out :err] (map line-seq [process-in process-out process-err])) |
| 02:57 | zkim | ,(doc zipmap) |
| 02:57 | clojurebot | "([keys vals]); Returns a map with the keys mapped to the corresponding vals." |
| 02:57 | mmarczyk | that would give you empty seqs for values in the map and you'd call seq when dealing with them |
| 02:58 | mmarczyk | or you could (remove empty? (map line-seq ...)) |
| 02:58 | mmarczyk | and I think there's a blank? function in clojure.contrib.string (used to be called c.c.str-utils) |
| 02:59 | zkim | yeah, so for now I think I'm going to go with the empty seq, since that seems to be what line-seq would return, and make a has-error? function to deal with checking for errors |
| 02:59 | zkim | thank you both for your help |
| 03:00 | mmarczyk | (if-let [errs (seq (:err your-map))] (had-errors ...) (no-errors ...)) is a possibility too |
| 03:00 | zkim | ,(doc if-let) |
| 03:00 | clojurebot | "([bindings then] [bindings then else & oldform]); bindings => binding-form test If test is true, evaluates then with binding-form bound to the value of test, if not, yields else" |
| 03:00 | mmarczyk | since seq will force enough of your sequence to determine whether it is empty or not |
| 03:00 | mmarczyk | returning nil if it is |
| 03:01 | mmarczyk | note binding-form can use destructuring safely |
| 03:01 | zkim | man, I think if-let's above my pay grade right now |
| 03:02 | mmarczyk | you'll get used to it upon using it for the first time :-) |
| 03:02 | zkim | hehe |
| 03:34 | cYmen | I have a question about leiningen..sort of |
| 03:34 | cYmen | I want this http://clojars.org/overtone/vimclojure |
| 03:34 | sexpbot | "vimclojure | Clojars" |
| 03:34 | cYmen | but I don't get what it has to do with leiningen I thought that was a build tool |
| 03:35 | mikem | if you add that to your dev-dependencies, it will be placed into your lib/ directory. then you don't have to add its location elsewhere on your system to the nailgun classpath |
| 03:36 | mikem | cYmen: ^ that's for you :) |
| 03:37 | cYmen | aha...so basically I'm changing the project to suite the editor...that seems wrong |
| 03:37 | cYmen | but I don't want to bitch about things I don't half understand so sorry |
| 03:37 | cYmen | Can you instead tell me how to use it? :) |
| 03:37 | mikem | it's a development dependency, but you're right, if someone else who uses emacs runs `lein deps` they'll also pull down vimclojure |
| 03:38 | mikem | cYmen: I'll refer you to this blog post: http://www.deepbluelambda.org/programming/clojure/programming-clojure-with-vim |
| 03:38 | sexpbot | " Programming Clojure with Vim : Deep Blue Lambda" |
| 03:41 | cYmen | mikem: Thanks! |
| 03:49 | zmila | sexpbot |
| 03:52 | Licenser_ | morning |
| 03:57 | LauJensen | Morning all |
| 04:07 | Licenser_ | morning |
| 04:14 | LauJensen | mmmm coffee |
| 04:17 | Licenser_ | mmm tea! |
| 04:25 | LauJensen | Are there any websites that ship some really excellent tea internationally? |
| 04:28 | uberjar | http://www.adagio.com/black/yunnan_gold.html |
| 04:28 | sexpbot | "Yunnan Gold Tea" |
| 04:33 | LauJensen | Thanks - I'll give it a shot |
| 05:03 | hircus | uberjar: ooh, they have several smoky teas, not only Lapsang Souchong! thanks for the link (a bit dubious about their claim that Lapsang is the same as Russian Caravan though). |
| 05:12 | Licenser_ | LauJensen: hmm hmm |
| 05:13 | Licenser_ | LauJensen: I buy my tea at https://www.tee-direkt.com/ |
| 05:13 | sexpbot | "Document Moved" |
| 05:14 | Licenser_ | but I'm not sure if they ship internationally |
| 05:15 | LauJensen | I could probably find the same on a danish site then, since we're so close. I dont |
| 05:16 | LauJensen | know anything about tea, except almost everything I've tasted I disliked, except Silver Pearl Jasmin and something called 'London' which I drank while I was in London and extremely thirsty, so I might have been tricked by my senses :) |
| 05:23 | Licenser_ | LauJensen: I right now drink Dragon Pearl, it's a very nice green tea with jasmin |
| 05:37 | zmila | ... changed topic to clojure tea or tea clojure |
| 05:44 | Licenser_ | Clojure, the Language, the Tea, the live. |
| 05:46 | Borkdude | I prefer coffee, but when it comes to tea I like Minty Morocco, no I idea if something like it is available abroad: http://www.pickwick.nl/MintyMorocco.aspx |
| 05:46 | sexpbot | " Pickwick NL | Assortiment | Variatie | Minty Morocco" |
| 05:46 | LauJensen | Borkdude: I'm 99% a coffee guy, but I have a hunch that tea might be healtier and caffeine does yield addiction |
| 05:47 | hircus | LauJensen: teaism.com is quite good too -- they run some really interesting fusion tea rooms in Washington DC. Only place so far I've seen that sells French verbena |
| 05:48 | Borkdude | LauJensen, I agree, I'm also aware of the addiction... time for my third cup of home brewn espresso now ;-) |
| 05:48 | hircus | scratch that. does not ship overseas |
| 05:48 | LauJensen | Traveling to the US might be a bit extreme for a cup of tea, but if its that good I'm open to it :) |
| 05:48 | Chousuke | tea has caffeine too though. |
| 05:48 | LauJensen | Chousuke: Not all teas, and not in a comparable measure as far as I understood |
| 05:49 | Chousuke | http://coffeetea.about.com/library/blcaffeine.htm is what I found via quick googling |
| 05:49 | sexpbot | "Caffeine Content of Coffee, Tea, Chocolate" |
| 05:50 | LauJensen | white tea is a keeper :) |
| 05:50 | Chousuke | I usually drink black tea or coffee... all without any sugar or milk :P |
| 05:50 | Borkdude | I try to avoid coffee after 7 PM |
| 05:50 | LauJensen | Cow milk is poison anyway, far beyond caffeine :) |
| 05:51 | Borkdude | then I drink tea instead |
| 05:52 | Borkdude | LauJensen, you are from Denmark right? |
| 05:52 | LauJensen | yea |
| 05:52 | Chousuke | when I was a teenager I used to put three teaspoons of sugar in a cup of coffee. :P Now the mere thought of drinking such stuff causes a gag reflex |
| 05:53 | Borkdude | There is a group from Denmark having kind of a hit here in the Netherlands, Alphabeat, it just came by on the radio hehe |
| 05:54 | LauJensen | Ah ok - I dont follow contempory music, or music in general :) |
| 05:54 | LauJensen | (or soccer) |
| 05:55 | esj | i figure, more foam in cup implies less coffee |
| 05:57 | hircus | LauJensen: don't follow soccer much either, and thankfully I've always lived in a city with a lousy local team :) |
| 05:57 | LauJensen | 2) gen-class can add methods, proxy cannot |
| 05:57 | Borkdude | esj, we call café latte koffie verkeerd (coffee wrong, literally) here |
| 05:58 | LauJensen | and modify constructors |
| 05:58 | bsteuber | LauJensen: ah, ok |
| 05:58 | LauJensen | ~source proxy |
| 05:58 | Chousuke | bsteuber: proxy methods just dispatch to clojure functions |
| 05:58 | esj | verkeerd is die verkeerde woord |
| 05:58 | Chousuke | bsteuber: so that they can be dynamically updated |
| 05:58 | esj | ;P |
| 05:58 | LauJensen | and I think re 1) that proxy returns fns, not a literal method - though I dont want to be asked about the difference :) |
| 05:59 | Borkdude | ~source slurp |
| 05:59 | Chousuke | all proxies of a single class are instances of the same proxy class. |
| 06:00 | Borkdude | unable to find... |
| 06:00 | Chousuke | they just have a different function map |
| 06:00 | bsteuber | Chousuke: but gen-class methods can ba altered as well, can't they? |
| 06:01 | bsteuber | *be |
| 06:01 | Chousuke | bsteuber: I think so yes. they dispatch to clojure functions too |
| 06:02 | bsteuber | ah, guess I just confused topics - was reading 'bout proxy's differences with reify, not gen-class :) |
| 06:02 | Chousuke | so I guess I should say that the methods themselves don't change, they just call a clojure function that *can* change |
| 06:03 | bsteuber | mhmm, that makes sense to me - thx to both of you :) |
| 06:04 | LauJensen | Chousuke: Thats right, also how the dynamic capabilities were achieved |
| 06:04 | esj | is there simpler way to wrap a value as a function than (fn [x] value). I often do this in (update-in my-map [my-key] (fn[x] new-value). |
| 06:04 | esj | i tried #(new-value) but it complains about arity |
| 06:06 | Chousuke | (constantly x) |
| 06:07 | Borkdude | esj, you can leave out the x in [x] |
| 06:07 | esj | superb, thanks gents. |
| 06:07 | Chousuke | no, update-in requires a function of one argument |
| 06:07 | Borkdude | really, ok.. |
| 06:07 | Chousuke | but there's also assoc-in :) |
| 06:08 | Borkdude | constantly is a nice thing |
| 06:08 | esj | doh |
| 06:11 | LauJensen | (btw, Ubuntu 10.04 beta is nice) |
| 06:15 | bsteuber | how would I mutate fields in deftype? not that I hope I'll ever want to :) |
| 06:26 | bsteuber | nevermind - should just read the docs :( |
| 06:29 | cemerick | wow, those new keyword args are sooooo nice. |
| 06:31 | Borkdude | cemerick, what are those? |
| 06:31 | cemerick | ,*clojure-version* |
| 06:31 | clojurebot | {:interim true, :major 1, :minor 1, :incremental 0, :qualifier "master"} |
| 06:32 | cemerick | Borkdude: clojurebot's not using 1.2, but if you are, you can specify keyword args using: (fn [a b c & {:keys [d e f]}] [a b c d e f]) |
| 06:33 | bsteuber | what's wrong here? (hope 3 lines are ok to paste directly..) |
| 06:33 | bsteuber | (deftype Bar [#^{:unsynchronized-mutable true} a b c]) |
| 06:33 | bsteuber | (def bar (Bar. 1 2 3)) |
| 06:33 | bsteuber | (set! (. bar a) 42) |
| 06:33 | bsteuber | => No matching field found: a for class user.Bar |
| 06:33 | cemerick | and you can call that with (foo 1 2 3 :d 4 :e 5 :f 6) |
| 06:33 | cemerick | Borkdude: ^^ |
| 06:34 | Borkdude | ah like in common lisp? |
| 06:34 | cemerick | similar, yes |
| 06:35 | bsteuber | oh, overlooked it is only supposed to work in method bodies :) |
| 06:35 | Borkdude | that's useful |
| 06:35 | Borkdude | gtg |
| 06:44 | vu3rdd | LauJensen: did you try the Ubuntu 10.04 beta? |
| 06:50 | AWizzArd | ~max people |
| 06:50 | clojurebot | max people is 274 |
| 06:51 | zmila | (filter #(not (lurking? %)) (max-people)) |
| 06:52 | AWizzArd | or --> (remove lurking? (max-people)) |
| 06:54 | bsteuber | could a deftype expert correct this? http://gist.github.com/376431 |
| 06:58 | cemerick | bsteuber: just use (set! a 42) |
| 06:58 | cemerick | killer error msg there though :-| |
| 06:59 | bsteuber | cemerick: ah, thx |
| 07:01 | bsteuber | in general, unreadable error messages are clojure's weak spot IMO |
| 07:01 | bsteuber | hope CinC will help there, too |
| 07:05 | Licenser_ | hmm is there a lost of core functions? |
| 07:19 | cemerick | bsteuber: of course, the deftype impl is fundamentally hosty, and I'd think not in scope for the CinC effort. But yes, I hope, too. :-) |
| 07:19 | defn | "OTOH, it makes no sense for a datatype that defines a collection like vector to have a default implementation of map, thus deftype is suitable for defining such programming constructs." |
| 07:20 | defn | that line is a bit unclear in the deftype/record documentation |
| 07:21 | bsteuber | defn: I interprete this as "you will want to roll your own map implementation, so we don't give you a default one" |
| 07:21 | defn | ah okay thanks |
| 07:21 | Licenser_ | hi defn |
| 07:21 | defn | Licenser_: heya buddy |
| 07:21 | defn | im actually just about to get some sleep |
| 07:21 | defn | will talk to you later |
| 07:21 | defn | :) |
| 07:21 | Licenser_ | tehn rest well |
| 07:21 | defn | gnight |
| 07:26 | bosie | anyone in here who does NOT use vi/emacs for clojure development? |
| 07:26 | cemerick | netbeans + enclojure here |
| 07:26 | bosie | ok |
| 07:27 | bosie | tried IDEA and the clojure plugin? |
| 07:27 | cemerick | No, not yet. |
| 07:28 | cemerick | We use the netbeans RCP platform for one project, so that keeps us close to netbeans. I do plan on checking out the eclipse and intellij plugins at some point though. |
| 07:28 | nurv | There is a plugin for eclipse too: http://code.google.com/p/counterclockwise/ |
| 07:28 | sexpbot | " counterclockwise - Project Hosting on Google Code" |
| 07:28 | bosie | the intellij plugin is kind of stale |
| 07:28 | cemerick | Yeah, counterclockwise looks pretty slick these days. |
| 07:29 | bosie | high activity on counterclockwise |
| 07:30 | cemerick | bosie: you mean the pace of development? |
| 07:30 | bosie | yes |
| 07:30 | bosie | maybe not pace but at least activity ;) |
| 07:30 | cemerick | I used eclipse for years. It'd be funny if I ended up migrating back there. |
| 07:32 | bosie | anything you dislike about enclojure |
| 07:32 | nurv | Well, for Java code Eclipse is ok. |
| 07:37 | bosie | nurv: meaning it isn't for clojure? |
| 07:39 | cemerick | bosie: The code outline isn't so great, especially compared to the functionality I'm seeing in CC's screenshots. |
| 07:39 | cemerick | The documentation popups with code completion are unreliable. |
| 07:40 | cemerick | And I could live with more code highlighting options. |
| 07:40 | bosie | same problem i have with intellij |
| 07:40 | cemerick | But in general, it's a solid plugin. |
| 07:40 | cemerick | The fact that it has a separate embeddable repl server library is a huge win. |
| 07:42 | nurv | bosie: i didn't try clojure development on it i'll probably do at some point. |
| 07:42 | nurv | Although i really liked the Cusp plugin for Common lisp. |
| 07:43 | bosie | hmm |
| 07:43 | cemerick | heh, cusp was pretty slick |
| 07:43 | bosie | as long as i don't have to learn emacs ;) |
| 07:43 | cemerick | bosie: what are you using these days? |
| 07:44 | bosie | intellij idea |
| 07:44 | nurv | I use vim mostly, but there is nothing similar to slime |
| 07:44 | bosie | mainly because i use it for java development as well |
| 07:44 | nurv | so i fallback to eclipse + cups for CL. |
| 07:44 | nurv | *cusp |
| 07:45 | cemerick | bosie: yeah, it seems that eclipse and netbeans are both better off than intellij w.r.t. clojure support, at least from what I hear. |
| 07:47 | bosie | cemerick: and the gap seems to widen because the development of the clojure plugin for idea is sporadic |
| 07:47 | kzar | What's a good way to turn a list of strings into one string separated by spaces? (apply str string-list) works except it doesn't add the spaces |
| 07:48 | cemerick | ,(apply str (interpose " " ["foo" "bar" "baz"])) |
| 07:48 | clojurebot | "foo bar baz" |
| 07:49 | cemerick | there's also a join fn in contrib... |
| 07:49 | cemerick | ,clojure.contrib.str-utils2/join |
| 07:49 | clojurebot | #<str_utils2$join__7835 clojure.contrib.str_utils2$join__7835@120da23> |
| 07:49 | cemerick | ,(clojure.contrib.str-utils2/join " " ["foo" "bar" "baz"]) |
| 07:49 | clojurebot | "foo bar baz" |
| 07:50 | cemerick | str-utils2 has moved to c.c.string in 1.2 contrib though, FYI |
| 07:50 | bosie | cemerick: wouldnt apply/interpose iterate twice over the same list? |
| 07:50 | cemerick | kzar: ^^ |
| 07:50 | cemerick | bosie: No. Interpose is lazy. |
| 07:51 | bosie | ah right |
| 07:51 | kzar | sweet thanks everyone |
| 07:53 | cemerick | bosie: I don't know that intellij could ever keep up with the other IDEs -- the closed-source heritage means there'll always be a smaller community around it. |
| 07:54 | bosie | cemerick: yea |
| 07:55 | cemerick | I'd love to pay for a super-polished clojure environment. I've got $500 for whoever can make it happen. |
| 07:55 | bosie | cemerick: gimme the 500 bucks... and come back in two years ;) |
| 07:55 | cemerick | heh |
| 07:56 | bosie | cemerick: but yea, depending on your view of 'super polished', that might not happen soon (see the ruby communit) |
| 07:58 | cemerick | bosie: well, NB's ruby support is pretty amazing, given the nature of the language. |
| 07:58 | cemerick | But yeah, I see your point. |
| 07:58 | cemerick | we'll see if anyone rises to the challenge: http://twitter.com/cemerick/statuses/12697662057 :-) |
| 07:58 | bosie | cemerick: amazing isn't the word i would use though |
| 07:59 | cemerick | bosie: really? Given the curve-balls that ruby throws? |
| 07:59 | cemerick | Just writing the grammar for ruby would be a scary undertaking. |
| 08:00 | bosie | hehe yea but i don't care for the curve-balls |
| 08:01 | bosie | if i include a library that extends all classes with specific functions i would like to have them show up in the completion table |
| 08:03 | bosie | i doubt you can write grammar rules for that |
| 08:03 | cemerick | Yeah, that requires a running environment for introspection. |
| 08:04 | bosie | or an understanding of ruby code |
| 08:04 | cemerick | well, building up the understanding necessary to add those fns to the completion table that you added to the string class (or whatever) would require a running environment. |
| 08:05 | cemerick | if monkey-patching were declarative, that might not be the case |
| 08:06 | bosie | cemerick: hmmm why do i need a running environment? you can only add methods with a handful of methods |
| 08:11 | cemerick | bosie: Yeah, you could probably figure out the common cases. If ruby's anything like python though, you can add or replace methods via references to classes, so a static analysis won't catch everything if you're not doing something simple as string.mymethod = .... |
| 08:12 | bosie | cemerick: i gotta go, thanks for the talk |
| 08:17 | zmila | cemerick, what are criterion of "super-polished clj env" |
| 08:18 | cemerick | rhickey: FYI, real usage of kwargs has convinced me of it entirely. Don't know how I lived without it before. :-) |
| 08:18 | rhickey | cemerick: kwargs? |
| 08:18 | cemerick | zmila: I suppose I should formalize my wishlist somewhere. :-) |
| 08:18 | cemerick | rhickey: keyword rest args |
| 08:19 | rhickey | ah, great! |
| 08:23 | borkdude | does anyone here synchronize their .emacs file with git? |
| 08:23 | rfg | borkdude: I've committed mine to memory. |
| 08:25 | fogus | borkdude: Mine is 1-line. ;-) |
| 08:27 | borkdude | fogus, tell me the line ;) |
| 08:28 | fogus | (load-library "~/.emacs.d/init.el") |
| 08:29 | fogus | :p |
| 08:29 | _ato | ls: cannot access /home/ato/.emacs: No such file or directory |
| 08:29 | _ato | borkdude: but to answer your question, yes |
| 08:30 | bsteuber | borkdude: me, too |
| 08:30 | _ato | my whole home directory is a git checkout |
| 08:30 | hircus | _ato: even music files and videos? |
| 08:30 | fogus | _ato: I have a similar error ls: cannot access ~/.vimrc: No such file or directory ;) |
| 08:31 | bsteuber | my .gitignore is very restricted, though :) |
| 08:31 | borkdude | fogus: I was hoping for: (tool-bar-mode -1) |
| 08:31 | SynrG | fogus: how did your system get so broken? |
| 08:31 | hircus | I have several git repos for ~/bin and several other dirs but not the entire home dir |
| 08:32 | _ato | hircus: nah, it's pretty selective, I keep notes, configuration, ~/bin in main home dir git. Some things have seperate repos, like emacs configuration |
| 08:32 | fogus | borkdude: I use Aquamacs |
| 08:33 | rfg | fogus: What version of Aquamacs do you use? |
| 08:33 | _ato | I use a wrapper script "hgit" which sets GIT_DIR so I don't accidentally commit stuff to my home directory git went I meant to commit to a project or something |
| 08:34 | fogus | rfg: 1.9 |
| 08:35 | fogus | I'm not married to Emacs for all of my development though. I use it a lot, but for Java, Scala, and Python work I use other things |
| 08:36 | chouser | _ato: brilliant. I have all that except for the hgit script. |
| 08:45 | _ato | oh and the other bit you need is: git config core.worktree /home/ato |
| 08:46 | _ato | then you can move the .git somewhere else |
| 08:46 | _ato | and the regular git command won't find it unless you explicitly set GIT_DIR at the path you moved it to |
| 08:48 | LauJensen | vu3rdd: Yea I'm on it now |
| 08:48 | LauJensen | (ubuntu 10.4 that is) |
| 08:48 | vu3rdd | LauJensen: Ok |
| 08:49 | vu3rdd | LauJensen: I thought you were on OSX |
| 08:49 | LauJensen | No I cant stand the thing |
| 08:49 | vu3rdd | :) |
| 08:49 | vu3rdd | http://www.flickr.com/photos/jonobacon/4543428023/sizes/l/ |
| 08:49 | sexpbot | "Flickr Photo Download: screenshot" |
| 08:49 | borkdude | LauJensen: I just installed Ubuntu 9.10 on this laptop, any good reasons to upgrade to 10.4 right now? |
| 08:50 | LauJensen | borkdude: No then you might as well wait until it goes out of Beta, but expect something like a 60 - 70% drop in boot time an finer social networking integration |
| 08:51 | borkdude | It looks like my webcam is turned on by default in Ubuntu, are they spying on me? |
| 08:51 | LauJensen | I dont know, are you good looking ? :) |
| 08:51 | LauJensen | I haven't experienced that behavior, though I have a built in web cam |
| 08:52 | borkdude | me2 |
| 08:52 | vu3rdd | borkdude: what do you mean by turned on? |
| 08:53 | borkdude | the led is burning, I think it doesn't do that in windows |
| 08:53 | vu3rdd | ok. |
| 08:54 | vu3rdd | Usually when the driver is loaded, the led turns on. so perhaps that is what you are seeing |
| 08:54 | vu3rdd | sudo lsmod | grep uvcvideo |
| 08:55 | vu3rdd | you can rmmod it if you are concerned |
| 08:56 | borkdude | vu3rdd: lsmod didn't return a line |
| 08:56 | vu3rdd | ok, may be your webcam is not uvc camera |
| 09:12 | mmarczyk | LauJensen: www.whittard.co.uk have good leaf teas and ship them everywhere |
| 09:12 | sexpbot | "Whittard of Chelsea - Tea , Coffee , China , Teapots , Tea Sets" |
| 09:31 | bendlas | I need an informed opinion on servers before learning a specific one: |
| 09:32 | bendlas | I want to write a webservice with comet/long-polling |
| 09:32 | bendlas | which server would you recommend as a technical basis for that? |
| 09:34 | bendlas | w.r.t clojure support, although i don't mind writing some framework of my own |
| 09:35 | bendlas | my first sample was jetty with blocking, which of course, is not very scalable |
| 09:37 | AntonyBlakey | bendlas: have you looked at Netty? |
| 09:37 | AntonyBlakey | I've used it from Clojure |
| 09:38 | bendlas | i'm aware of it's existance, but i don't know how it compares to the alternatives |
| 09:38 | bendlas | is it any good? |
| 09:38 | AntonyBlakey | It seemed so to me. |
| 09:38 | neotyk | bendlas: please check atmosphere project |
| 09:40 | neotyk | it will run comet on all servers, and if server has native api for it or supports servlet 3.0 you'll get native performance |
| 09:40 | neotyk | and we would appreciate a lot clojure support ;-) |
| 09:40 | bendlas | nice, i'll check it out |
| 09:41 | patrkris_ | rhickey: just out of curiosity, are there any planned changes to the STM? |
| 09:41 | bendlas | thanks |
| 09:43 | hamza | does the agents and future objects use the same thread pool? or two seperate pools? |
| 09:43 | cemerick | neotyk: atmosphere looks interesting, thanks for the pointer |
| 09:44 | cemerick | hamza: same, IIRC |
| 09:44 | patrkris_ | hamza: depends on whether you use send or send-off, I guess |
| 09:44 | chouser | futures use the send-off pool |
| 09:44 | patrkris_ | yes |
| 09:44 | neotyk | cemerick: pleasure is mine, just spreading the word of project I contribute to |
| 09:46 | hamza | ohh kk, i was using send pool for some blocking actions and was wondering if futures gets blocked, then i am fine.. |
| 09:47 | bsteuber | neotyk: for the less gifted ones among us, for what exactly can I use atmosphere? |
| 09:49 | bsteuber | is it some sort of high-level web application framework? |
| 09:49 | neotyk | bsteuber: comet applications, broadcasting in http, pub-sub, long polling, and ajax push |
| 09:49 | neotyk | this is framework that provides one API to do comet |
| 09:50 | neotyk | and allows you deploy to 'any' servlet container |
| 09:50 | neotyk | 'any' as it makes sense to deploy to one that has comet api available |
| 09:52 | neotyk | so if you would write comet app for jetty you would not be able to run on grizzly, tomcat, jboss, you name it, by using atmo you can, plus you get higher lever functionality like broadcasting |
| 09:52 | neotyk | does that make sense? |
| 09:53 | bsteuber | neotyk: yes, at least enough to be motivated for further investigation |
| 09:54 | neotyk | cool |
| 09:54 | bsteuber | but it seems quite annotation-heavy - isn't that a problem with clojure? |
| 09:54 | neotyk | you have two ways to work with it: Jersey like and it is annotations, and api like |
| 09:54 | borkdude | it turns out my webcam isn't supported in linux yet I guess: http://linuxlaptopwiki.net/wiki/ALi_Corp_M5602 |
| 09:54 | sexpbot | "ALi Corp M5602 - LinuxLaptopWiki" |
| 09:55 | borkdude | not that i want to use it, I just want to turn that damn led off |
| 09:56 | neotyk | bsteuber: you know java people like annotations a lot |
| 09:57 | neotyk | but we have it used in akka, that is scala application |
| 09:57 | bsteuber | neotyk: ic, nice |
| 09:57 | neotyk | I was thinking of integrating it as middlewere for compojure, but I lack Clojure foo |
| 09:59 | bsteuber | so atmosphere includes some javascript-generation like JWT, too? |
| 09:59 | neotyk | bsteuber: mew release should have JQuery integration, but it is not forced on user |
| 10:01 | bsteuber | mew? |
| 10:01 | neotyk | s/mew/new/ |
| 10:01 | rhickey | patrkris_: I have ideas for STM - knobs for retries/timeouts etc per-transaciton, also some ideas around transaction timestamps |
| 10:01 | bsteuber | ok |
| 10:03 | patrkris_ | rhickey: anything you want to share that we can maybe do some prototyping with? we're doing a little benchmarking on the stm and trying to find out the effects of different changes. |
| 10:03 | rhickey | patrkris_: no code yet |
| 10:03 | patrkris_ | rhickey: ideas would be fine - we don't mind coding a little ourselves :) |
| 10:04 | patrkris_ | rhickey: but if you don't have the time, that's ok - we have some papers we're looking through |
| 10:05 | rhickey | patrkris_: what do you want that it doesn't do? |
| 10:05 | bsteuber | neotyk: JQuery looks nice |
| 10:06 | patrkris_ | rhickey: nothing in particular. We're just looking at the STM litterature and seeing if we can find something we could try out on Clojure's STM. Just to see the effects in a few small benchmarks we have written. Nothing fancy. |
| 10:07 | rhickey | patrkris_: one obvious area is contention-resolution, which is currently hardwired to oldest-transaction-wins |
| 10:07 | patrkris_ | rhickey: cool, noted |
| 10:14 | patrkris_ | rhickey: R. Mark Volkmann's page about Clojure's STM notes that you were inspired by the Robert Ennals article (noted at the section about blockAndBail). Where does he know this from? Did he just ask you, or is it described somewhere? |
| 10:16 | rhickey | patrkris_: I just mentioned it at some point |
| 10:25 | patrkris_ | rhickey: just one more question, and you'll have to excuse me, because I'm a little confused: does Clojure's STM exhibit obstruction freedom or does it not? |
| 10:25 | rhickey | not |
| 10:28 | npoektop | Hi! I have a question about compojure. From flash i do file["postData"] = "sid=..."; file.upload(urlRequest, "image", true); How to get that postData in compojure? |
| 10:31 | AWizzArd | npoektop: the client (be it the browser (html&js) or flash or any other application with network access to your app) must send the data over http. There it can be encoded in the header or body. In Compojure each handler gets a request hashmap. In that you can find all data which the client sent |
| 10:32 | npoektop | AWizzArd, ok, i'll try. thank you |
| 10:33 | hugod | is there a function to return the namespace of a symbol? |
| 10:40 | wooby | i have some functions that take vectors as args |
| 10:40 | dnolen | hugod: namespace if it's a namespaced symbol, otherwise you may have to look at the metadata of the var. |
| 10:40 | wooby | and i'm dispatching based on whether one of the items is a keyword starting with a question mark |
| 10:40 | dnolen | ,^#'defn |
| 10:40 | clojurebot | {:macro true, :ns #<Namespace clojure.core>, :name defn, :file "clojure/core.clj", :line 206, :doc "Same as (def name (fn [params* ] exprs*)) or (def\n name (fn ([params* ] exprs*)+)) with any doc-string or attrs added\n to the var metadata", :arglists ([name doc-string? attr-map? [params*] body] [name doc-string? attr-map? ([params*] body) + attr-map?])} |
| 10:40 | wooby | is this the sort of thing that deftype and all the new stuff are looking to simplify? |
| 10:41 | bsteuber | wooby: no, deftype etc. are for performance mostly |
| 10:41 | hugod | dnolen: thanks, I forgot about metadata |
| 10:42 | wooby | alrighty, thanks bsteuber |
| 10:43 | hugod | dnolen: but that only works if you have a var... |
| 10:43 | dnolen | hugod: then namespace should work right? |
| 10:44 | hugod | on an arbitrary symbol? |
| 10:45 | dnolen | hugod: but where is the symbol coming from? sounds like your doing something fancy with macros? |
| 10:45 | hugod | oh, it does work |
| 10:45 | hugod | dnolen: from a string... |
| 10:58 | ivenkys | gents - simple question - what is the name of the ^ symbol ? (google-fu not working) |
| 10:59 | dnolen | ivenkys: meta |
| 10:59 | ivenkys | i.e. the metadata symbol |
| 11:00 | Chousuke | note, it's deprecated |
| 11:00 | ivenkys | dnolen: thanks |
| 11:00 | Chousuke | instead of ^foo you're now supposed to write (meta foo) |
| 11:00 | ivenkys | Chousuke: meta symbol is deprecated ? |
| 11:01 | dnolen | ivenkys: in 1.2.0 yes |
| 11:01 | Chousuke | yeah, it'll eventually be changed to do what #^ does now. |
| 11:01 | chouser | yes, it's eventually going to become the set-metadata symbol |
| 11:02 | ivenkys | Chousuke: chouser: thanks |
| 11:23 | lessthantristan | ok i have some code that looks something like this: http://gist.github.com/376581 (this is the most basic version i could write that still has the problem). |
| 11:24 | lessthantristan | basically, if the recursive function finds something it doesn't like it'll throw an exception. if the exception is not a ParseException and a :catch-error element is present in the input, it will handle the error otherwise it throws it down to the stack which checks the same thing. |
| 11:24 | lessthantristan | The problem is that the exception gets wrapped in RuntimeExceptions as it goes down the stack so the = class call stops working after the initial throw. anyone got any ideas on how to fix this? |
| 11:34 | raek | I think that when lazy seqs are evaluated, checked exceptions are caught and a runtime exception is thrown |
| 11:35 | raek | if the exception is not checked (i.e. inherits from Error or RuntimeException) it will pass through, I think |
| 11:35 | lessthantristan | hmm it might be something to try (in my real code i am using custom exceptions) |
| 11:37 | chouser | lessthantristan: you probably want to use the root exception rather than the one 'catch' hands you |
| 11:37 | chouser | in your = I mean |
| 11:38 | chouser | clojure.stacktrace/root-cause |
| 11:40 | lessthantristan | ah ok i'll have a look at that too |
| 11:41 | livingston | I'm not sure of the context (I joined in the middle of this conversation), but java Exceptions also have a getCause method that you can chain through |
| 11:41 | lessthantristan | btw. i changed my exceptions to extend Error rather than exception and this makes the code run how i want |
| 11:41 | livingston | it's good practice in java if you catch and re-throw to set the cause to the caught exception |
| 11:42 | livingston | extending Java Error? i don't know about in Clojure, but in Java that's bad practice, you should extend the leaf types, like RuntimeException |
| 11:44 | lessthantristan | sure. it's probably just as bad in clojure :). i'll have a look at chouser's idea. (btw, for context http://gist.github.com/376581 description in the comments) |
| 11:44 | chouser | ,(try (seq (lazy-seq (throw (NoSuchMethodException. "foo")))) (catch Throwable e (printf "Caught %s, root %s\n" (class e) (class (clojure.stacktrace/root-cause e))))) |
| 11:44 | clojurebot | chouser: It's greek to me. |
| 11:45 | chouser | oh, it doesn't let you do try/catch |
| 11:45 | livingston | again this is from Java, but catching Throwable is a really bad idea |
| 11:46 | livingston | That will catch Errors, and Checked and Unchecked Exceptions, (catching Exception is just as bad, because that traps both checked and unchecked) |
| 11:48 | lessthantristan | so i guess if you're making your own exception classes you would extend something like RuntimeException then catch that (if you're interested in just catching all your custom exceptions)? |
| 11:49 | livingston | exactly |
| 11:50 | livingston_ | my stupid office blocks IRC because "only hackers use that" so I have a bad web client... |
| 11:50 | lessthantristan | chouser: that code runs in the repl. maybe clojurebot doesn't have clojure.stacktrace required? |
| 11:51 | livingston_ | I don't know what i missed |
| 11:51 | slyphon | livingston_: wow, that's piss poor |
| 11:51 | slyphon | livingston_: actually, nothing :) |
| 11:51 | mmarczyk | livingston: isn't your office *supposed* to be a hackers' workplace? :-) |
| 11:51 | livingston_ | but if you want to make your own exceptions you should extend Exception or RuntimeException |
| 11:51 | chouser | lessthantristan: clojurebot refuses to run code that includes 'try' |
| 11:51 | lessthantristan | ah ok |
| 11:52 | chouser | I had forgotten |
| 11:52 | livingston_ | mmarczyk: yes, kinda it's hard when there are only a few CS people in a sea of people that know nothing about computers |
| 11:52 | lessthantristan | :) |
| 11:53 | livingston_ | re exceptions, it's also preferred to use the existing ones when they do fit (there are a lot of standard ones) |
| 11:53 | mmarczyk | may I suggest that you exploit your superior knowledge to subvert the IT policy to your advantage? ;-) |
| 11:54 | livingston_ | mmarczyk: it is very draconian here - there are forms to be filed to use skype, because "why wouldn't you use our conference call lines?" (which aren't free by the way) |
| 11:55 | livingston_ | mmarczyk: Monday's mission is get 6667 unblocked |
| 11:55 | mmarczyk | oh, that's rather extreme :-( |
| 11:55 | dakrone | livingston_: tunnel through SSH? |
| 11:56 | mmarczyk | here's hoping you accomplish that |
| 11:56 | livingston_ | dakrone: I can, I would need somewhere that would forward for me though, and I've never gotten around to setting that up |
| 11:57 | mmarczyk | ,(= '(1 2 3) [1 2 3]) |
| 11:57 | clojurebot | true |
| 11:57 | mmarczyk | is this really by design? |
| 11:57 | chouser | mmarczyk: yes |
| 11:57 | replaca | livingston_: I keep a linux machine running at home so I can tunnel from anywhere I am - it's super-convenient |
| 11:57 | chouser | ,(= '(1 2 3) (range 1 4)) |
| 11:57 | clojurebot | true |
| 11:57 | mmarczyk | hm, thanks, good to know |
| 11:57 | chouser | (map class '(1 2 3) (range 1 4)) |
| 11:57 | chouser | ,(map class '(1 2 3) (range 1 4)) |
| 11:57 | clojurebot | java.lang.IllegalArgumentException: Wrong number of args passed to: core$class |
| 11:58 | chouser | ,(map class ['(1 2 3) (range 1 4)]) |
| 11:58 | clojurebot | (clojure.lang.PersistentList clojure.lang.LazySeq) |
| 11:58 | mmarczyk | I don't think I mind |
| 11:58 | dakrone | livingston_: I understand your situation, I have to tunnel IRC through SSH through SSL to get mine working |
| 11:58 | replaca | livingston_: also, I can use it a secure web proxy when I'm on open wireless |
| 11:58 | mmarczyk | but I do wonder about the rationale? |
| 11:58 | livingston_ | replaca: yeah I might resort to that - how do you get a static address? |
| 11:58 | tcrayford | is there a function to drop every other element of a seq? |
| 11:58 | livingston_ | I haven't even set up home internet yet, I just moved |
| 11:59 | mmarczyk | (actually, I seem to be experiencing a moment of enlightenment whereby this starts to make sense) |
| 11:59 | chouser | mmarczyk: clojure tries to avoid relying on concrete types as much as possible. You see that '(...) and (range ...) return different types? |
| 11:59 | mmarczyk | yes |
| 11:59 | mmarczyk | true |
| 11:59 | chouser | mmarczyk: you usually don't care that they're different, even when using = |
| 11:59 | mmarczyk | and then I seem to remember clojure.lang.Cons being used by the reader? |
| 12:00 | mmarczyk | ok, starts to make sense |
| 12:00 | mmarczyk | thanks |
| 12:00 | chouser | mmarczyk: so Clojure partitions collections into three groups for purposes of equality: lists, sets, and maps. |
| 12:00 | chouser | ,(take-nth 2 (range 10)) |
| 12:00 | clojurebot | (0 2 4 6 8) |
| 12:00 | chouser | tcrayford: ^^^ |
| 12:00 | tcrayford | yeah, cheers |
| 12:00 | tcrayford | was doing something horrible with indexed |
| 12:01 | mmarczyk | ,(= {0 0 1 1} [0 1]) |
| 12:01 | clojurebot | false |
| 12:01 | tcrayford | tests still pass, so its good, cheers |
| 12:01 | chouser | mmarczyk: we go to lengths to explain this as best we can in Joy of Clojure. |
| 12:01 | mmarczyk | yup, I'm reading through it |
| 12:02 | mmarczyk | great reading so far, by the way |
| 12:02 | tcrayford | is work on clojure-in-clojure starting after 1.2? |
| 12:02 | chouser | mmarczyk: oh, great. early in chapter 4 then. :-) |
| 12:02 | mmarczyk | :-) |
| 12:03 | chouser | tcrayford: 1.2 *is* work on clojure-in-clojure, to a certain extent. |
| 12:03 | tcrayford | I guess so |
| 12:04 | chouser | I want to start poking at pieces of it as soon as this book's out of the way. |
| 12:04 | tcrayford | heh |
| 12:04 | tcrayford | the book is much better this iteration |
| 12:04 | slyphon | ok, can someone explain why ~foo# in a macro doesn't compile? |
| 12:04 | tcrayford | compared to the first one |
| 12:04 | chouser | tcrayford: ah, good. glad to hear it. |
| 12:04 | livingston_ | so java has the edu.univ.lab.package ... mostly standard naming convention |
| 12:04 | hiredman | slyphon: # gensyms only work inside syntax-quote and ~ is unquote |
| 12:04 | mmarczyk | slyphon: because gensyms created with # are only valid within the syntax-quote their created in |
| 12:05 | livingston_ | is clojure kinda sticking to that? or is it just the wild-west for package names? |
| 12:05 | chouser | livingston_: depends on who you talk to. I'd recommend sticking with Java conventions. |
| 12:05 | mmarczyk | livingston: most Clojure libs I use follow the packagename.core, packagename.foo convention for naming namespaces |
| 12:06 | mmarczyk | oh well :-) |
| 12:06 | livingston_ | chouser: that's what I figured, probably makes java interop a hair better too? |
| 12:06 | mmarczyk | slyphon: so, have you figured out why your macro didn't work as originally written? |
| 12:06 | chouser | mmarczyk: and if someone else also uses packagename, stride out into the street at high noon and have at it. |
| 12:06 | chouser | :-) |
| 12:07 | slyphon | mmarczyk: yeah, but it turns out our version didn't work as expected outside of that ns |
| 12:07 | mmarczyk | chouser: hell yeah, the jerk should have known better ;-) |
| 12:07 | livingston_ | mmarczyk: yeah but then who gets dibs on rdf or sql or whatever library standard names, etc.. |
| 12:07 | lessthantristan | hah. with clj.stacktrace, the final exception becomes a java.lang.reflect.InvocationTargetException (e.g. my solution under http://gist.github.com/376581 below line 25). it doesn't matter if i keep using root-cause but i wonder where that's coming from |
| 12:07 | mmarczyk | slyphon: how come? |
| 12:08 | LauJensen | mmarczyk: thanks! :) |
| 12:08 | mmarczyk | livingston: first come, first to fortify one's positions ;-) |
| 12:08 | mmarczyk | LauJensen: sure thing :-) |
| 12:09 | chouser | bsteuber: yay! :-) |
| 12:09 | mmarczyk | LauJensen: I find the "Orangajuli" (spelling?) Assam to be particularly good, if they still have that |
| 12:09 | livingston_ | lessthantristan: just remember if you catch Exception you will get *all* of them even a lot of runtime ones you might not want to trap |
| 12:09 | s450r1 | tis a very good book, nice sequel to "Programming Clojure" |
| 12:09 | tcrayford | is the only difference between rest and next that next returns nil on empty seqs? |
| 12:10 | tcrayford | ,(rest []) |
| 12:10 | clojurebot | () |
| 12:10 | slyphon | mmarczyk: ok, that seemed to work |
| 12:10 | tcrayford | ,(next []) |
| 12:10 | clojurebot | nil |
| 12:10 | slyphon | mmarczyk: i thought i ran into trouble with it |
| 12:10 | mmarczyk | um, apparently they don't, but http://www.whittard.co.uk/store/catalogue/Tea-P2000/India-TIND/Loose-Harmutty-Gold-Tips-105668.raa is close |
| 12:10 | sexpbot | "Tea > India - Whittard Of Chelsea" |
| 12:11 | mmarczyk | slyphon: so it works now? happy to hear that :-) |
| 12:11 | livingston_ | tcrayford: yeah, I was trying to sort that out too, and what's preferred, i've been seeing different descriptions that have confused me |
| 12:11 | slyphon | mmarczyk: must have been stale repl state last night...or the beer... |
| 12:11 | mmarczyk | :-) |
| 12:13 | slyphon | i think i'm still not really sure what the syntax quoting is doing, i mean, in general. it seems like a lot of macros open with a `(), and then do escaping throughout, but there are others like your solution |
| 12:13 | tcrayford | technomancy: I think there might be a bug with that xref patch I sent you |
| 12:15 | mmarczyk | slyphon: oh bother, I just realised that that macro will fairly often *not* work |
| 12:15 | slyphon | oh? |
| 12:15 | mmarczyk | because it assumes it's being passed a map literal for props-map |
| 12:15 | slyphon | ah! yes! |
| 12:15 | slyphon | that was it |
| 12:15 | mmarczyk | so (update-bean *bs* some-var-holding-a-map) |
| 12:15 | mmarczyk | won't work |
| 12:16 | mmarczyk | right, let's fix that |
| 12:16 | slyphon | why does that happen? |
| 12:16 | technomancy | tcrayford: oh, good thing I've been too busy to apply it then. =) |
| 12:16 | tcrayford | heh |
| 12:16 | tcrayford | technomancy: I think it doesn't work on any project other than swank |
| 12:16 | tcrayford | I THINK |
| 12:16 | tcrayford | I could kinda use some testing though |
| 12:17 | tcrayford | either that or I've been compiling it wrong |
| 12:17 | slyphon | so `() is kind of like "make a form that looks like *this*" and ~blah substitutes the value held by blah into the form? |
| 12:17 | tcrayford | yes |
| 12:18 | slyphon | ok |
| 12:18 | mmarczyk | slyphon, first see http://gist.github.com/376105 |
| 12:18 | mmarczyk | for a proposed fix |
| 12:18 | slyphon | kk |
| 12:18 | tcrayford | technomancy: when I try to compile it, (even after changes), it shows that all namespaces are already compiled |
| 12:18 | slyphon | mmarczyk: ahh, yeah |
| 12:18 | mmarczyk | technomancy: Leiningen seems to be pulling two version each of ant and ant-launcher |
| 12:18 | slyphon | makes sense |
| 12:19 | mmarczyk | is this a known issue (or do I need to check my local maven repo or sth) |
| 12:19 | mmarczyk | ? |
| 12:19 | livingston_ | if that macro isn't taking constants in, you really should probably just be using a regular function - being a macro isn't buying you anything if there is nothing to pre-compute |
| 12:19 | mmarczyk | slyphon: the macro receives its argument "as is" |
| 12:19 | mmarczyk | livingston: you can't use a regular function here |
| 12:20 | slyphon | right right, it's not getting "the value of" |
| 12:20 | mmarczyk | because you need to expand into . forms |
| 12:20 | livingston_ | slyphon: regarding macros in general the syntax quote is nothing special, it's short hand - you can write macros just fine without out. think about this:... |
| 12:20 | mmarczyk | which need to include your custom-generated symbols |
| 12:20 | mmarczyk | the shape of which depends on the map you pass in to the macro |
| 12:21 | technomancy | mmarczyk: there's probably a dev-dependency that is declaring unnecessary deps. |
| 12:21 | tcrayford | technomancy: tell a lie, I hadn't compiled it properly |
| 12:21 | slyphon | livingston_: yeah, i know it's the inverse of the 'form |
| 12:21 | livingston_ | if you have the code (+ foo bar) that is just a list of three symbols if you want a macro to produce that code it's just: (list + foo bar) |
| 12:21 | tcrayford | technomancy: just tested it on all of the clojure projects I use swank on, all of them work |
| 12:21 | mmarczyk | technomancy: guess so, I'll investigate |
| 12:21 | technomancy | mmarczyk: in fact, I think the swank plugin might do that. |
| 12:21 | slyphon | livingston_: *nod* |
| 12:21 | technomancy | mmarczyk: could you submit an issue or patch? |
| 12:21 | mmarczyk | will do |
| 12:22 | technomancy | tcrayford: does your patch need AOT? |
| 12:22 | technomancy | we try to avoid it if possible? |
| 12:22 | technomancy | err--possible. |
| 12:22 | tcrayford | I don't think so, was just putting it as a dependancy for other stuff via lein jar |
| 12:22 | slyphon | argh |
| 12:22 | mmarczyk | incidentally, why would the swank-clojure dev dep ever be possible |
| 12:22 | slyphon | mmarczyk: "Can't eval locals" |
| 12:22 | livingston_ | slyphon: so just start with an example of the code you want to come out and then think about the what you need to cons together to produce that list/tree of symbols. |
| 12:22 | tcrayford | I think I'm just being bad with terminology |
| 12:23 | mmarczyk | I never remember remember about it and yet it always works :-) |
| 12:23 | mmarczyk | slyphon: ouch, one more fix then |
| 12:23 | mmarczyk | just a sec |
| 12:23 | slyphon | sure |
| 12:23 | slyphon | hm |
| 12:24 | tcrayford | technomancy: currently it seems to be bugging out on some symbols. It works fine with defn, but not with if |
| 12:24 | technomancy | tcrayford: defn is a var, but if isn't |
| 12:25 | technomancy | it's a special form |
| 12:25 | tcrayford | ah |
| 12:25 | technomancy | so that's OK |
| 12:25 | tcrayford | that'd explain that one, seeing as I get stuff from vars |
| 12:25 | technomancy | yeah, trying to track down every use of a special form would be pretty hardcore, but we can do without it. =) |
| 12:25 | tcrayford | heh |
| 12:25 | mmarczyk | slyphon: could you test this new version? |
| 12:25 | slyphon | sure |
| 12:26 | slyphon | what's &env ? |
| 12:27 | tcrayford | technomancy: it probably needs proper error messages. Currently it'll mess up if it can't find any references (you get a char-or-stringp error from emacs) |
| 12:27 | mmarczyk | &env is an implicit argument that macro functions receive |
| 12:27 | mmarczyk | holds a map of locals |
| 12:27 | slyphon | ahh |
| 12:28 | mmarczyk | actually, I'll modify the code a little bit yet |
| 12:28 | slyphon | so (&env props-map) is kind of like (a-hash-map :key) ? |
| 12:28 | tcrayford | technomancy: and it only works after each namespace is actually loaded (as far as I can see). |
| 12:28 | mmarczyk | done |
| 12:28 | slyphon | ahhh |
| 12:28 | slyphon | right on |
| 12:29 | mmarczyk | slyphon: exactly, and (get &env props-map) is immune to NPE |
| 12:29 | slyphon | so &env is a hash of local symbols-to-values |
| 12:29 | slyphon | :) |
| 12:29 | mmarczyk | right, but will be nil if there are none |
| 12:30 | mmarczyk | basically this macro makes the assumption that props-map is either a map literal or a symbol naming either a local or a Var |
| 12:30 | mmarczyk | and locals win over Vars, as they should |
| 12:30 | slyphon | wow |
| 12:31 | mmarczyk | great, now I'll have an update-bean macro lying around |
| 12:31 | mmarczyk | for whenever I get the point of beans |
| 12:31 | mmarczyk | :-) |
| 12:31 | slyphon | this was way more involved than i'd originally thought |
| 12:32 | slyphon | mmarczyk: beans are just java's way of adding an unnecessary layer of indirection around objects |
| 12:32 | mmarczyk | sounds like fun :-) |
| 12:32 | slyphon | it's just the convention of getThatThing() setThatThing() |
| 12:32 | slyphon | to change the internal state of an object |
| 12:33 | mmarczyk | right |
| 12:33 | mmarczyk | hm, actually |
| 12:33 | mmarczyk | perhaps this could be a function if we used reflection instead of . |
| 12:33 | slyphon | to be consistent with their total contempt for elegant syntax |
| 12:33 | slyphon | mmarczyk: well, the 'bean' function uses reflection |
| 12:33 | mmarczyk | makes perfect sense ;-) |
| 12:33 | slyphon | but i didn't want to go there |
| 12:34 | slyphon | :) |
| 12:35 | AWizzArd | http://hughw.blogspot.com/2009/01/clojure-vs-javafx-script-only-5x-slower.html |
| 12:35 | sexpbot | "Messages not Models: Clojure vs JavaFX Script: only 5x slower!" |
| 12:36 | livingston_ | AWizzArd: it says "after normalizing to so-and-so's machine speed" - that benchmark is pretty suspect |
| 12:37 | livingston_ | same cpu? same os? same ... ? |
| 12:38 | AWizzArd | well, you can try to check tak in java vs tak in clojure on your own machine |
| 12:38 | Licenser | hmm hmmm |
| 12:38 | chouser | all the code on that page is using boxed math |
| 12:39 | slyphon | what's the function that lets you assoc into a nested map? |
| 12:39 | mmarczyk | assoc-in |
| 12:39 | tcrayford | ,(doc assoc-in) |
| 12:39 | clojurebot | "([m [k & ks] v]); Associates a value in a nested associative structure, where ks is a sequence of keys and v is the new value and returns a new nested structure. If any levels do not exist, hash-maps will be created." |
| 12:39 | slyphon | mmarczyk: thanks |
| 12:40 | slyphon | i thought so, it wasn't in the cheatsheet though :) |
| 12:43 | livingston_ | there was a change made to lein so you can put some dependencies not managed by maven in a directory and they would get on the classpath.. is there docs on that anywhere (I'm having trouble finding it) |
| 12:44 | mmarczyk | livingston: whatever you put in lib/ will be on the classpath |
| 12:44 | mmarczyk | you don't need a patch for that |
| 12:44 | mmarczyk | well, actually any jar you put in lib/ |
| 12:44 | livingston_ | yeah but lein clean will destroy it |
| 12:45 | mmarczyk | hm, right |
| 12:45 | mmarczyk | you could work around that with a script to create some symlinks |
| 12:45 | mmarczyk | not very clean though |
| 12:47 | joshua-choi | ,(doc deftype) |
| 12:47 | clojurebot | "([type-tag constructor-name docstring? attr-map?] [type-tag constructor-name docstring? attr-map? constructor] [type-tag constructor-name docstring? attr-map? constructor deconstructor]); Define a data type by a type tag (a namespace-qualified keyword) and a symbol naming the constructor function. Optionally, a constructor and a deconstructor function can be given as well, the defaults being clojure.core/identity and cloj |
| 12:48 | AWizzArd | how can I use recur in an implementation of a protocol? |
| 12:49 | AWizzArd | I have a (defprotocol Takkable (tak [t])). Now I implement (tak [this] ... (recur (Tak. ...))) |
| 12:49 | AWizzArd | Now I get a: Mismatched argument count to recur, expected: 0 args, got: 1 |
| 12:50 | joshua-choi | I remember reading somewhere that you don't pass on the first argument. |
| 12:50 | AWizzArd | where (deftype Tak [x y z] Takkable (tak [this] ...)) |
| 12:51 | AWizzArd | The first arg is supposed to be an instance of Tak |
| 12:51 | AWizzArd | not deftype but defrecord |
| 12:51 | AWizzArd | (defrecord Tak [x y z] Takkable (tak [this] ...)) |
| 12:51 | AWizzArd | And tak wants to recur, with an updated instance of (Tak. ...) |
| 12:51 | joshua-choi | Ah yes, check defrecord's docs. |
| 12:52 | joshua-choi | "Note also that recur calls to the method head should *not* pass the target object, it will be supplied automatically and can not be substituted." |
| 12:52 | AWizzArd | Yes. |
| 12:53 | AWizzArd | So I must recur to the immutable instance with which the function started? |
| 12:53 | AWizzArd | I can not alter the "this" arg itself then? |
| 12:53 | vu3rdd | technomancy: did you get a chance to look at the swank-clojure patch I sent you? |
| 12:53 | Chousuke | AWizzArd: you'll need another arity for that |
| 12:54 | joshua-choi | Is there a set of naming guidelines for Clojure? |
| 12:54 | joshua-choi | Specifically, for factory functions and protocol methods |
| 12:55 | Chousuke | protocol methods are named just like ordinary funcitons |
| 12:55 | Chousuke | functions* |
| 12:55 | Chousuke | factory functions are either make-foo or create-foo I guess |
| 12:55 | joshua-choi | Yeah, but what do you name them? "make-"? "create-"? |
| 12:55 | joshua-choi | Yeah. |
| 12:55 | joshua-choi | clojure.core uses both. |
| 12:55 | hiredman | fooify |
| 12:55 | joshua-choi | clojure.core also uses "vector", "vec", etc. |
| 12:56 | Chousuke | it depends on what you're constructing I suppose. |
| 12:56 | AWizzArd | make- is closer to the Lisp family's history. |
| 12:56 | joshua-choi | AWizzArd: That's good to know. |
| 12:57 | joshua-choi | Chousuke: Something called a "State". (make-state ...) (create-state ...) (state ...). |
| 12:58 | joshua-choi | Also, what about protocol methods? If I make a "getter" method for an "answer", should I name the method (get-answer ...), (answer ...), or something else? |
| 12:58 | rsenior | hi all |
| 12:58 | joshua-choi | rsenior: Hello hello |
| 12:58 | rsenior | is anyone persisting blobs with clojureql? |
| 12:59 | arohner | didn't someone make a macro that is defn, but it takes a map, to make it easier for macros calling defn? |
| 12:59 | AWizzArd | joshua-choi: do you think you need a getter? |
| 12:59 | Chousuke | joshua-choi: is the answer a property of the object, or something that's actually computed? |
| 12:59 | joshua-choi | AWizzArd: Versus using a keyword directly on a record? |
| 12:59 | AWizzArd | yes |
| 13:00 | joshua-choi | Probably yes, because I have different types of records that implement this protocol. |
| 13:00 | AWizzArd | http://clojure.org/datatypes |
| 13:00 | joshua-choi | For some types of those records, it's not a simple attribute. |
| 13:01 | Borkdude | Has anyone got ClojureCLR working? |
| 13:01 | Chousuke | then maybe compute-answer or just answer |
| 13:01 | Chousuke | get doesn't really convey anything useful |
| 13:01 | AWizzArd | On this site rhickey wrote: "It has always been an unfortunate characteristic of using classes for application domain information that it resulted in information being hidden behind class-specific micro-languages, e.g. even the seemingly harmless employeee.getName() is a custom interface to data." |
| 13:01 | Licenser | odd compairison |
| 13:02 | joshua-choi | AWizzArd: The problem is that some records need to return themselves with this method, while others return an attribute. |
| 13:03 | joshua-choi | Chousuke: The problem with not using "get-" is that it can (and in my case does) conflict with using "answer" as a binding symbol in let forms. |
| 13:03 | Chousuke | what is it an answer to, then? |
| 13:03 | joshua-choi | But I'm not saying I have to; I'm asking if I should change it. :) |
| 13:03 | technomancy | vu3rdd: sorry, been pretty swamped recently. hopefully I can get back to swank next week. |
| 13:03 | joshua-choi | Chousuke: Oh, some parsing thing. Ignore that it's called "answer"; it could be called anything. |
| 13:04 | vu3rdd | technomancy: no problem. |
| 13:05 | Chousuke | joshua-choi: hmmh. in any case, it doesn't sound like a getter |
| 13:05 | Chousuke | joshua-choi: so maybe you can find a real function name for it |
| 13:06 | AWizzArd | joshua-choi: is it for the hound? ;) |
| 13:06 | Chousuke | apply-parser or apply-rules or whatever your object actually represents |
| 13:06 | joshua-choi | AWizzArd: It's for both the Cat and Hound. Actually, it's for the common code between them. |
| 13:06 | AWizzArd | k |
| 13:06 | AWizzArd | Chousuke: would those be methods of the Protocol? |
| 13:07 | Chousuke | AWizzArd: I don't see why not |
| 13:07 | joshua-choi | AWizzArd: I'm actually almost done...after I rewrite find, substitute, and substitute-1, I'm going to freeze the API and enter the beta stage. |
| 13:07 | joshua-choi | After that, just documentation. |
| 13:07 | AWizzArd | Chousuke: good, just wanted to be sure. |
| 13:07 | Chousuke | AWizzArd: protocols are just a collection of functions |
| 13:07 | AWizzArd | ja |
| 13:07 | AWizzArd | joshua-choi: very good, I might become one of your beta testers |
| 13:08 | joshua-choi | I'll let you know |
| 13:08 | AWizzArd | joshua-choi: do you know if the performance to fnparse 1.1 became better? |
| 13:08 | joshua-choi | I don't know for sure. |
| 13:08 | AWizzArd | We'll see. |
| 13:08 | joshua-choi | I've never rigorously tested. |
| 13:08 | joshua-choi | I'm pretty sure though |
| 13:08 | joshua-choi | Cat is a packrat parser. |
| 13:08 | joshua-choi | Hound gets rid of a certain space leak that Parsec's introductory paper talked about. |
| 13:09 | AWizzArd | mhmm :) |
| 13:09 | joshua-choi | Other than being LL(1) by default, Hound is the same as FnParse 2.x. |
| 13:09 | joshua-choi | And a ton more error features. |
| 13:09 | joshua-choi | Actually, the error handing may make Hound sometimes slower than FnParse 2 for short input strings...though I doubt it. |
| 13:09 | vegai | ok, I wanna get Leiningen to work for once. Can you guys help a bit? |
| 13:10 | joshua-choi | vegai: What problem are you running into? |
| 13:10 | etate | vegai: whats the problem?> |
| 13:10 | livingston_ | vegai: once? or continuously? ;) |
| 13:11 | Borkdude | Who also the problem 'The extern alias 'MSC' was not specified in a /reference option' when trying to install ClojureCLR? |
| 13:11 | Borkdude | I put MSC at the Aliases property at Microsoft.Scripting.Core |
| 13:13 | joshua-choi | Chousuke: I guess I could try to find a better name for get-answer...no, I don't think there is one. I have plenty of other examples. |
| 13:14 | joshua-choi | (defprotocol AState (get-remainder [state]) (get-position [state]) (make-another-state [state input context])) |
| 13:14 | joshua-choi | I have two types of AStates, and get-remainder is nontrivial for one of them |
| 13:14 | chouser | if it's just doing a value lookup, you could consider implementing ILookupKeyword |
| 13:15 | chouser | er, ILookup, rather |
| 13:15 | joshua-choi | chouser: get-remainder doesn't do a value lookup for one type of AState; it has to generate a sequence using drop and stuff. |
| 13:15 | chouser | ok |
| 13:15 | joshua-choi | Otherwise, I would have just used :remainder or something. |
| 13:16 | joshua-choi | Is there a better way to name the method other than "get-remainder"? |
| 13:17 | TakeV | Is the CLI version of Clojure as up to date as the Java version? |
| 13:18 | Chousuke | I have never actually looked at it. |
| 13:18 | joshua-choi | What's the CLI version? |
| 13:19 | slyphon | joshua-choi: winders |
| 13:19 | slyphon | joshua-choi: .NET |
| 13:19 | joshua-choi | Ah |
| 13:19 | Borkdude | why isn't that called the CLR version? |
| 13:19 | TakeV | Er, yeah, sorry, misremembered the name. |
| 13:20 | TakeV | Was thinking about doing an XNA game, and Clojure is awesome. |
| 13:20 | Borkdude | TakeV: I'm just trying to get ClojureCLR to install in Visual Studio |
| 13:20 | Borkdude | but I get a little stuck |
| 13:20 | TakeV | Difficult? |
| 13:20 | Borkdude | now it can't find the namespace System.Dynamic |
| 13:21 | Borkdude | TakeV: did you get it to work? |
| 13:22 | TakeV | Borkdude: I haven't tried, most of my work is with the JVM. |
| 13:22 | Borkdude | it must be something stupid, I'll search some more |
| 13:22 | joshua-choi | Is the ClojureCLR under active development? |
| 13:23 | wooby | joshua-choi, there's nu for objective-c lisp |
| 13:23 | wooby | it's cool |
| 13:24 | Borkdude | I have no idea, but I tell everyone doing CLR to take a look at it ;-) |
| 13:24 | joshua-choi | wooby: I'll check that out, thanks. |
| 13:24 | wooby | np |
| 13:24 | TakeV | wooby: Does it work for the iPhone? |
| 13:25 | livingston_ | I though Rich abandoned it? because he was sick of supporting two architectures, but maybe someone picked it up? |
| 13:25 | wooby | TakeV, last i checked |
| 13:25 | TakeV | Excellent. :) |
| 13:25 | wooby | i know there have been the recent shenanigans in that realm |
| 13:25 | wooby | so i'm not sure anymore |
| 13:25 | vegai | joshua-choi, etate, livingston_: thanks. I'll try it one more time by myself first :) |
| 13:26 | vegai | the last time I tried to build my own simple hello world on it, I got exceptions towards java.lang.String for some reason |
| 13:26 | clojurebot | what time is it? |
| 13:27 | livingston_ | vegai: one "problem/feature" with lein is that it will leave jars behind in lib so if you have old clojure jars in there, and call lein deps it will leave them and you will get your jvm confused |
| 13:27 | livingston_ | vegai: leain clean will flush that directory though |
| 13:29 | joshua-choi | Why does clojurebot say weird things sometimes? |
| 13:30 | vegai | livingston_: ah, now I might see my first mistake |
| 13:30 | vegai | in project.clj, I gave :main as a string |
| 13:35 | replaca | Borkdude: you need a version of .Net that supports the DLR extensions), I think this means .Net 4.0, but I'm not sure |
| 13:36 | Licenser | joshua-choi: because he's nuts |
| 13:37 | vegai | ok... |
| 13:38 | replaca | livingston_afk: Rich did stop trying to support both the JVM and CLR early in the process of developing Clojure, the current CLR project is about a year old and led by someone else with Rich's encouragement. I don't know current activity/status. I think it may be waiting on CinC at this point |
| 13:38 | vegai | so my project.clj is (defproject hello "0.0.0" :description "hello" :dependencies [[org.clojure/clojure "1.1.0"]] :main hello) |
| 13:38 | vegai | and src/hello.clj is (ns hello) (defn -main [& args] (println args)) |
| 13:38 | joshua-choi | Licenser: Who created it? |
| 13:38 | vegai | lein deps work fine |
| 13:38 | vegai | lein jar works fine |
| 13:39 | Borkdude | replaca, on the page I read smth about VS2008 |
| 13:39 | Borkdude | +SP1 |
| 13:39 | vegai | is it wrong to try to run the resulting jar simply by saying java -jar hello.jar? |
| 13:39 | Borkdude | I guess that is .NET 3.5 |
| 13:39 | vegai | because then I get Exception in thread "main" java.lang.NoClassDefFoundError: hello |
| 13:40 | chouser | joshua-choi: hiredman wrote clojurebot. he has a bunch of responses to specific keywords, but uses a fuzzy matcher to look them up. he sometimes chimes in with an answer to something not addressed specifically to him. |
| 13:40 | chouser | clojurebot: time |
| 13:40 | clojurebot | what time \is it? is TIME TO GIT BUSY! |
| 13:41 | joshua-choi | clojurebot: time |
| 13:41 | clojurebot | multimethods is what separates the boy from the man. |
| 13:41 | Licenser | what time is it? |
| 13:41 | hiredman | ,(java.util.Date.) |
| 13:41 | clojurebot | #<Date Fri Apr 23 10:44:44 PDT 2010> |
| 13:42 | Raynes | $time |
| 13:42 | sexpbot | Raynes: The time is now 2010-04-23T17:48:32Z |
| 13:42 | chouser | heh. mul-time-thods |
| 13:42 | joshua-choi | There's another bot? |
| 13:42 | joshua-choi | sexpbot: time |
| 13:44 | Raynes | Why do people always try that? |
| 13:44 | Raynes | :\ |
| 13:44 | Raynes | $ <-- This is the prepend. The only prepend. Every single command uses this prepend. :p |
| 13:44 | sexpbot | Command not found. No entiendo lo que estás diciendo. |
| 13:44 | chouser | Raynes: because that's how you address people on IRC. |
| 13:44 | joshua-choi | Raynes: I have no idea that sexpbot existed until two minutes ago. :) |
| 13:45 | technomancy | vegai: single-segment namespaces are unsupported |
| 13:45 | Raynes | chouser: Indeed, but it usually happens after they've seen somebody else use the prepend, which is weird. |
| 13:45 | Raynes | ._. |
| 13:45 | joshua-choi | What does sexpbot do? |
| 13:45 | technomancy | vegai: see the skeleton created by "lein new hello" for a better example |
| 13:45 | technomancy | ~single segment namespaces |
| 13:45 | clojurebot | namespaces are (more or less, Chouser) java packages. they look like foo.bar; and corresponde to a directory foo/ containg a file bar.clj in your classpath. the namespace declaration in bar.clj would like like (ns foo.bar). Do not try to use single segment namespaces. a single segment namespace is a namespace without a period in it |
| 13:45 | Raynes | joshua-choi: He spies on clojurebot. Keeps him in line. |
| 13:45 | Raynes | $dumpcmds |
| 13:45 | sexpbot | http://gist.github.com/376874 |
| 13:45 | joshua-choi | $addfortune |
| 13:45 | sexpbot | An invisible fortune cookie? |
| 13:45 | Raynes | He does all sorts of stuff. He's also in #clojure-casual and #(code) if anyone wants to play with him. |
| 13:46 | technomancy | clojurebot: single-segment namespaces (foo instead of foo.core) are unsupported. they may work in a few circumstances, but you shouldn't rely on them. |
| 13:46 | clojurebot | Foo is not Baz. |
| 13:46 | technomancy | clojurebot: single-segment namespaces are unsupported. (foo instead of foo.core) they may work in a few circumstances, but you shouldn't rely on them. |
| 13:46 | clojurebot | namespaces are (more or less, Chouser) java packages. they look like foo.bar; and corresponde to a directory foo/ containg a file bar.clj in your classpath. the namespace declaration in bar.clj would like like (ns foo.bar). Do not try to use single segment namespaces. a single segment namespace is a namespace without a period in it |
| 13:46 | chouser | technomancy: "is" not "are" :-/ |
| 13:46 | technomancy | clojurebot: single-segment namespaces is unsupported. (foo instead of foo.core) they may work in a few circumstances, but you shouldn't rely on them. |
| 13:46 | clojurebot | Ok. |
| 13:46 | technomancy | I thought he was clever like that |
| 13:46 | technomancy | oh well |
| 13:47 | Raynes | chouser: You shouldn't have used that one. |
| 13:47 | Raynes | :p |
| 13:47 | chouser | eh? |
| 13:48 | vegai | technomancy: ah, thanks. |
| 13:48 | joshua-choi | $what |
| 13:48 | sexpbot | It's AWWWW RIGHT! |
| 13:48 | Raynes | chouser: title* isn't mean to be used. $title is a verbose version of the normal title scraper. |
| 13:49 | Raynes | And the $part and $say commands are admin-only. :> |
| 13:49 | chouser | I don't know what that means, I'm just trying out the list of commands you posted for us. :-) |
| 13:50 | Raynes | More dangerous and annoying commands like say, part, and join are limited to "admins", of sorts. |
| 13:50 | Raynes | A little privilege system. |
| 13:51 | Raynes | I need to update my verbose command list with explanations as to what they actually do. |
| 13:51 | Raynes | I've been focusing on making him useful rather than making him useful to other people. :p |
| 13:52 | chouser | rhickey: blame me |
| 13:52 | rhickey | did they always? |
| 13:52 | chouser | That may be as of chunked support |
| 13:52 | rhickey | or just after chunks? |
| 13:52 | chouser | is there a better way? I wasn't sure an extra closure would be preferred. |
| 13:53 | rhickey | dunno |
| 13:53 | Borkdude | rhickey: there was some discussion here about ClojureCLR - is it still under active development? |
| 13:53 | rhickey | Borkdude: afaik, yes |
| 13:55 | joshua-choi | On the datatypes page, it says, "You should always program to protocols or interfaces." Does this mean that using keywords on datatypes should be minimized in favor of using protocol methods? |
| 13:55 | remleduff | Hi all, this is a fun one. I'm using a JNA library call javaCV, whenever an object of type "IplImage" gets printed by the repl, my whole repl crashes with an error that looks something like "Can't cast java.lang.Object to com.sun.jna.Structure". Obviously a bug in the library, but is there some way I can ask the repl to not print the value of the object, to not even look at the object. It's tedious remembering not to call any f |
| 13:55 | Borkdude | rhickey: tnx |
| 13:56 | remleduff | I've tried something like (defmethod print-method cxcore$IplImage [x writer] (.write writer "Can't print Images")), but it prints that message and then crashes anyway |
| 13:57 | rhickey | joshua-choi: using keywords on datatypes is perfectly fine for: unencapsulated information, and trusted implementation code |
| 13:58 | joshua-choi | rhickey: Thanks. |
| 13:59 | chouser | rhickey: is there any action you'd like me to take on doseq or for? propose an alternate solution? back out chunked seq support? |
| 13:59 | rhickey | chouser: no, just mentioning it, don't want to change them just before new release :) |
| 13:59 | chouser | ok |
| 14:07 | bsteuber | anyone else using paredit on a slime repl? on my emacs, it behaves quite weird there (not in files) with [ oder { |
| 14:08 | joshua-choi | rhickey: Quick followup question: should I inform the user whether attributes of a datatype are "unencapsulated" in the datatype's docstring? |
| 14:08 | fogus | Did someone say "just before the new release"? ;-) |
| 14:08 | rhickey | joshua-choi: if you are using defrecord, I don't see a need personally |
| 14:09 | joshua-choi | Okay. |
| 14:09 | chouser | fogus: heh |
| 14:16 | chouser | rhickey: is 'show' ugly by it's very existence, or is there something I could do to make it prettier? |
| 14:39 | AWizzArd | Hi stuarthalloway |
| 14:44 | technomancy | stuarthalloway: thanks for all your work moving forward with the release. glad to have another committer to help. |
| 14:50 | jweiss | bsteuber: i use paredit on the repl |
| 14:50 | jweiss | yeah, it doesn't work quite right for me either with [ and { |
| 14:50 | jweiss | especially barf/slurp |
| 14:52 | bsteuber | jweiss: ah, good to know I'm not the only one |
| 14:53 | bsteuber | so I'll file a report then - or maybe a request, as maybe repl-use is not one of the promised features |
| 14:53 | jweiss | bsteuber: i am not sure what can be done about it, i would think if anyone knows the solution they're likely to be here in this channel |
| 14:53 | jweiss | bsteuber: i don't think it behaves quite right for me in editing clojure files either |
| 14:53 | bsteuber | maybe the user> prompt confused it |
| 14:54 | bsteuber | jweiss: the newest version does behave nice in files for me |
| 14:54 | jweiss | bsteuber: where did you get the latest, from elpa? |
| 14:55 | bsteuber | jweiss: http://mumble.net/~campbell/emacs/paredit-beta.el |
| 14:55 | bsteuber | this is version 22, I think elpa has 21 |
| 14:56 | jweiss | bsteuber: ah i have version 20 |
| 14:57 | bsteuber | ic |
| 14:58 | remleduff | How hard is it to get whoever maintains ELPA to update a package? Is anything you get through ELPA doomed to obsolescence? |
| 14:58 | jweiss | bsteuber: i tried to install again thru elpa, still got ver 20 |
| 14:58 | bsteuber | ok, then I was wrong regarding 21 |
| 14:58 | jweiss | i'm kind of an emacs newbie, i have no idea |
| 14:59 | jweiss | i know ver 22 says beta so it's probably ver 21 that should be in elpa |
| 14:59 | jweiss | interestingly, ver 20 is 3 years old |
| 15:00 | jweiss | even the 'beta' is almost a year old |
| 15:01 | technomancy | remleduff: in this case it's blocked on the paredit maintainer |
| 15:01 | stuarthalloway | hi technomancy, AWizzard. Sorry silent earlier, was on too many meetings at once |
| 15:03 | AWizzArd | rhickey: when I have a (defrecord Foo [x y z]) then I can have (defn foo [{:keys [x y z]}] [z y x]). But when I have a (defprotocol Foobar (foo [f])) and want to (defrecord Foo [x y z] Foobar (foo [{:keys [x y z]}] [z y x])) then ==> clojure.lang.PersistentArrayMap cannot be cast to clojure.lang.Symbol |
| 15:03 | AWizzArd | stuarthalloway: no problem ^^ |
| 15:04 | rhickey | AWizzArd: no destructuring in methods yet |
| 15:04 | AWizzArd | ok |
| 15:08 | AWizzArd | Anyone has an idea if this can be done with defrecord? http://pastie.org/932033 |
| 15:09 | AWizzArd | Or does this require a deftype for which the fields will be mutated, and then just (recur) is called? |
| 15:11 | rhickey | AWizzArd: you must leave out 'this' on recur in methods, i.e. you can't recur to a different object |
| 15:13 | mmarczyk | stuarthalloway: re: issue #270 on Assembla, I don't think def + fn works correctly, see http://pastie.org/932041 |
| 15:14 | AWizzArd | rhickey: so could this better be done with deftype + mutable fields? Because then we could just (recur) and reuse the existing object. |
| 15:14 | rhickey | AWizzArd: what are you trying to accomplish that the first version doesn't? |
| 15:15 | chouser | primitives |
| 15:15 | AWizzArd | I thought this could get faster when method calls can happen directly, vs. an ordinary function |
| 15:15 | AWizzArd | http://hughw.blogspot.com/2009/01/clojure-vs-javafx-script-only-5x-slower.html |
| 15:16 | chouser | AWizzArd: but your defrecord version creates and retruns a new object each time, while your first one returns only an integer |
| 15:17 | AWizzArd | eventually both versions will return z, which is an int |
| 15:17 | chouser | AWizzArd: you might try definterface to declare a method that takes ints, then implement that in a defrecord or deftype. |
| 15:18 | wooby | has anyone written a repl applet, or otherwise know if it's possible/done? |
| 15:18 | AWizzArd | chouser: could definterfaced methods use recur and still provide the first arg? |
| 15:19 | chouser | wooby: unsigned applets can't use a custom classloader needed to load dynamically-generated bytecode, so they can't do 'eval' |
| 15:20 | wooby | ah |
| 15:20 | chouser | wooby: but you should be able to make a signed applet repl |
| 15:20 | kylesmith | I think I may be experiencing an infinite loop with swank-clojure. The problem seems to be occurring in/around the following lines: (("LockingTransaction.java" 263) ("LockingTransaction.java" 231) ("swank.clj" 29) ("swank.clj" 26)) |
| 15:20 | wooby | chouser, already started :) |
| 15:20 | chouser | wooby: there's bits of swing-repl code around you could use |
| 15:20 | kylesmith | Is this a known problem, or should I keep investigating? |
| 15:21 | wooby | chouser, thanks i'll scrounge |
| 15:22 | rhickey | AWizzArd: http://pastie.org/932058 |
| 15:24 | rhickey | why pastie? no thread? |
| 15:26 | rhickey | AWizzArd: note that removing the unchecked- doesn't hurt perf, please don't use unchecked unless you need truncation |
| 15:26 | AWizzArd | rhickey: oh great, this runs 3x faster. Now with the type declarations this is very much on par with JavaFX. |
| 15:26 | AWizzArd | good, thanks for this hint |
| 15:27 | remleduff | Can you guys copy that to gist by any chance? pastie is blocked for me, "disease vector" |
| 15:28 | jwr7 | I've been reading chouser's "Using binding to mock out even “direct linked” functions in Clojure" (http://blog.n01se.net/?p=134) and I started wondering — he says in Clojure 1.1 most clojure.core Vars are "linked directly" into code, which I assume means avoiding Var lookups, |
| 15:28 | rhickey | remleduff: http://gist.github.com/377040 |
| 15:28 | jwr7 | can I do the same thing for some of my functions? |
| 15:28 | jwr7 | I have code which makes lots of function calls to functions that will not change and spends lots of time looking up Vars |
| 15:28 | jwr7 | (checked with YourKit profiler) |
| 15:29 | AWizzArd | remleduff: this version of rhickey allows faster functions calls. As tak() is mostly a benchmark for funcall speed this had a nice impact. |
| 15:29 | AWizzArd | Interesting to see that Clojure provides tools for doing optimizations if one really needs it. |
| 15:31 | remleduff | Nice, I really like the way deftype and defrecord code "looks", now if only it was ^int instead of #^int everywhere ;) |
| 15:31 | chouser | jwr7: first, it's worth nothing that apparently profilers prevent Var from doing some of the performance tricks it does in real life. So it may *look* worse than it really is. |
| 15:31 | AWizzArd | remleduff: maybe soon Emacs users will have a visible/invisible switch for type hints (and possibly other stuff, such as hiding meta data, etc) |
| 15:32 | jwr7 | chouser: even sampling profilers? |
| 15:32 | jwr7 | (I use YourKit in sampling mode, which I assume does not redefine functions) |
| 15:33 | chouser | jwr7: as for doig direct linking yourself, there's no supported way to do that yet |
| 15:33 | chouser | but if you namespace starts with "clojure" and you don't have :dynamic true in your var's metadata, you'll get direct linking. Abuse at your own risk. :-) |
| 15:33 | livingston | my research is taking me in a direction where I need to interface with very large back-end triple-stores for RDF and OWL etc. (like AllegroGraph)... |
| 15:33 | jwr7 | chouser: ok. I've been using macros for some of the most critical stuff for now, but that seems like a hack, and I can't use them with map and the like. |
| 15:34 | jwr7 | chouser: speaking of hacks :-) |
| 15:34 | jwr7 | chouser: thanks, I'll try that out. |
| 15:34 | chouser | jwr7: you can also use local functions (via let or letfn) to get faster function lookups, at the cost of unfavorable code reorganization |
| 15:34 | livingston | the most direct way to talk to RDF back-ends through java/clojure seems to be Jena, but that's a holy mess. any one have any experience or have done anything with it? |
| 15:35 | jwr7 | chouser: I thought of that and actually used it in some places. |
| 15:35 | chouser | livingston: http://github.com/richhickey/rdfm |
| 15:36 | arohner | I'm thinking of putting this in contrib. Does anyone see value in it? http://gist.github.com/377054 |
| 15:36 | chouser | livingston: I don't know that that's actually "maintained", but it might be interesting. |
| 15:37 | hiredman | http://github.com/hiredman/clojure/blob/readerII/src/clj/clojure/reader.clj re: letfn |
| 15:38 | hiredman | arohner: that is useful |
| 15:38 | hiredman | maybe in macro-utils |
| 15:39 | arohner | hiredman: thanks. The process for contrib is the same as core? write a patch, file an assembla ticket? |
| 15:39 | livingston | chouser: thanks - that has some utilities that are definitely of use |
| 15:40 | jwr7 | I wish I had a (binding) that wouldn't be thread-local — that would propagate to other threads started by, say, pmap. |
| 15:40 | livingston | although as far as I can tell that library is mostly for serializing and deserializing clojure data to/from an rdf store |
| 15:40 | livingston | but I can build on it to get more general reasoning... |
| 15:40 | hiredman | arohner: I believe so, I think might want to bounce it off the mailing list before filing a ticket |
| 15:42 | livingston | since rdf uri's are namespace + resource this seems like they should just be mapped to clojure packages + symbols |
| 15:43 | hiredman | namespaces |
| 15:44 | livingston | I meant clojure namespaces - thank you |
| 15:46 | livingston | one threat of such an approach is after running through a lot of data there will be a ton of symbols hanging out in the symbol table that are no longer needed - generating memory issues |
| 15:47 | livingston | (when I did this in common lisp, I didn't actually have a real problem from that, but I'm looking at dealing with orders of magnitude more data now) |
| 15:49 | jwr7 | livingston: I hit a similar problem when doing genetic programming in CL: generated random constants were interned symbols and caused performance problems. Not even because of memory consumption, but because of namespace lookup times. |
| 15:49 | hiredman | interned java strings in utf-16 |
| 15:50 | livingston | jwr7: I never had a problem with that but I was using ACL and they make a very good compiler. you could also keep the symbols out of the symbol table too. |
| 15:51 | AWizzArd | hiredman: if i would like to display U+1D11E - how would I do this then? |
| 15:52 | AWizzArd | or some chinese chars, such as U+024B62 |
| 15:52 | jwr7 | livingston: I was using SBCL. Amusingly enough, mostly because ACL's compiler had a bug that my code triggered (and that was too difficult to report properly to Franz). |
| 15:53 | livingston | hiredman: the thing is when working with this kind of stuff, it's *really* nice to be able to drop into the representation language while you are coding and just cons up some expressions using lisp and rdf (or whatever) so if it's all symbols it's nice and clean, instead of these string everywhere, like you get when manipulating things like sql (yuck). |
| 15:53 | livingston | jwr7: that's a shame. they are very responsive about stuff like that, generally |
| 15:55 | hiredman | AWizzArd: I dunno, google up some java unicode docs |
| 15:55 | jwr7 | livingston: oh, they WERE responsive. Franz has the best support I've ever dealt with. It's just that if they can't reproduce a problem, it might sometimes be too much work for you to narrow it down and produce an example. |
| 15:56 | livingston | jwr7: ah, that's a shame |
| 15:57 | Chousuke | jwr7: I think you can simulate the non-thread-local binding by using alter-var-root |
| 15:57 | hiredman | AWizzArd: you might checkout the javadoc on Character since it goes into more detail |
| 15:57 | hiredman | Chousuke: :( |
| 15:57 | hiredman | jwr7: don't alter vars |
| 15:57 | arohner | how do you combine ~@ and foo#? |
| 15:58 | Chousuke | don't. use an explicit gensym |
| 15:59 | remleduff | Can someone help me understand how lazy-seq works? I'm feeling kind of silly but it's stumping me |
| 15:59 | arohner | Chousuke: how do I use that in a let? |
| 16:00 | Chousuke | (defmacro ... (let [foo (gensym)] `(let [~foo (somestuff)] ...))) |
| 16:00 | mmarczyk | arohner: what would you want to use it for, anyway? |
| 16:00 | mmarczyk | ~@ splices in a seq and foo# is a symbol, not a seq |
| 16:00 | clojurebot | 'Sea, mhuise. |
| 16:00 | Licenser | meep |
| 16:01 | Chousuke | ~@ |
| 16:01 | mmarczyk | sorry to disturb you, clojurebot |
| 16:01 | clojurebot | @ , {a b c] |
| 16:01 | Chousuke | uh |
| 16:01 | Chousuke | ~@ |
| 16:01 | clojurebot | @ is splicing unquote |
| 16:01 | Chousuke | ~@ |
| 16:01 | clojurebot | @ , {a b c] |
| 16:01 | Chousuke | looks like someone else got some garbage there too :) |
| 16:03 | jwr7 | Chousuke, hiredman: just to explain — I don't want to alter vars, but I do have legitimate uses for (binding). And I just fell into a trap, because I thought I can switch any map to pmap and have it work, which is not the case. |
| 16:03 | arohner | Chousuke: thanks |
| 16:04 | hiredman | ,(doc bound-fn) |
| 16:04 | clojurebot | It's greek to me. |
| 16:04 | hiredman | bah |
| 16:04 | mmarczyk | jwr7: see bound-fn |
| 16:04 | mmarczyk | and bound-fn* |
| 16:05 | mmarczyk | actually the latter may be more useful when you've already go a regular function |
| 16:05 | mmarczyk | and you want to transform it into one which captures bindings |
| 16:05 | hiredman | right, since clojurebot is being run from a lein repl it has been bitten by the using the wrong version of clojure bug |
| 16:05 | jwr7 | mmarczyk: ahh, cool, thanks! |
| 16:05 | hiredman | since map is lazy you can have trouble with it and binding even without going multithreaded |
| 16:05 | hiredman | best not to use binding |
| 16:07 | mmarczyk | ,(binding [inc dec] (map inc (range 3))) |
| 16:07 | clojurebot | (-1 0 1) |
| 16:08 | remleduff | ,*print-limit* |
| 16:08 | clojurebot | java.lang.Exception: Unable to resolve symbol: *print-limit* in this context |
| 16:08 | mmarczyk | ,(binding [inc dec] (map #(inc %) (range 3))) |
| 16:08 | clojurebot | (1 2 3) |
| 16:08 | mmarczyk | I mean |
| 16:08 | chouser | ~stuartsierra has come to the conclusion that dynamic scope is a bug. |
| 16:08 | remleduff | ,*print-lenth* |
| 16:08 | clojurebot | java.lang.Exception: Unable to resolve symbol: *print-lenth* in this context |
| 16:08 | clojurebot | Roger. |
| 16:09 | remleduff | ,*print-length* |
| 16:09 | clojurebot | nil |
| 16:09 | hiredman | haha |
| 16:09 | remleduff | Man, I cannot type |
| 16:09 | mmarczyk | there is certainly some merit to that opinion :-) |
| 16:09 | hiredman | clojurebot: stuartsierra |has come| to the conclusion that dynamic scope is a bug. |
| 16:09 | clojurebot | You don't have to tell me twice. |
| 16:10 | hiredman | clojurebot: stuartsierra? |
| 16:10 | clojurebot | stuartsierra is awesome |
| 16:10 | hiredman | clojurebot: stuartsierra? |
| 16:10 | clojurebot | stuartsierra is retiring |
| 16:10 | hiredman | clojurebot: stuartsierra? |
| 16:10 | clojurebot | stuartsierra is retiring |
| 16:10 | hiredman | bah |
| 16:10 | chouser | clojurebot: dynamic scope |
| 16:10 | clojurebot | stuartsierra has come to the conclusion that dynamic scope is a bug. |
| 16:10 | StartsWithK | in art of the interpreter there is a sentance that says dynamic scope is a bug :) |
| 16:11 | hiredman | makes sense to me |
| 16:12 | livingston | in the right contexts it's hugely valuable, if you need to go through layers of some other api to get to something low that needs tweaked, binding makes sense to me |
| 16:12 | hiredman | I think the main use should be the ability to simmulate multiple returns, not resource management |
| 16:13 | hiredman | (with-database ...) sort of stuff is horrible |
| 16:14 | livingston | hiredman: why? the alternative is to have parameters to pass all over the place |
| 16:14 | jwr7 | Oh, there is another use case. Say you walk a webapp tree and need to keep track of which uri-tokens are consumed and which remain (the URI path gets split into 'tokens'). Dynamic variables do half of the work for you. |
| 16:14 | hiredman | livingston: parameter passing? in functional programming? horrible! |
| 16:14 | livingston | actually usually I would have the parameters anyway with defaults, and then things like (with-foo would over-ride the defaults |
| 16:16 | livingston | it is when the parameter is some kind of state holding mess like these things are usually used for, then all kinds of state and parameters start leaking all over in your code |
| 16:16 | hiredman | leaking? |
| 16:17 | livingston | the best examples are when you have your app, talking to some library that has something else you plugged into it under the hood. now you want to change that thing under the hood, you either need to rewrite the whole library to allow that (assuming it's even your library to rewrite) or you can reach down into the thing under the hood and tweak it |
| 16:18 | mmarczyk | jwr7: or you could put an atom in a local and use a zipper to walk the tree with a function which accepts an atom arg |
| 16:18 | hiredman | livingston: I don't see how the one follows the other |
| 16:19 | remleduff | ,(binding [*print-length* 3] [1 2 3 4 5 6 7 8]) |
| 16:19 | clojurebot | [1 2 3 4 5 6 7 8] |
| 16:19 | StartsWithK | i don't know, i find it a mess to type (with-open [x bla] (with-out-str [y x] (fn-with-implicit-out-str))) |
| 16:19 | mmarczyk | ,(binding [*print-length* 3] (print-str [1 2 3 4 5 6 7 8])) |
| 16:19 | clojurebot | "[1 2 3 ...]" |
| 16:19 | StartsWithK | when i could just pass out-str as first argument or in options map |
| 16:19 | jwr7 | jwr7: amusingly enough, I actually use this technique with a zipped tree :-) I didn't think of your solution, I thought of passing more things around when walking the zipper. But I didn't want to manage popping things when moving up the tree myself — and a dynamic variable fit right in. |
| 16:20 | hiredman | if you have an api, and the api has an init state function that returns a state cookie the only things that should be directly manipulating that state cookie are the other functions in that api |
| 16:20 | remleduff | mmarczyk: Thanks |
| 16:21 | hiredman | so a change to the state cookie may require a refactor of parts of the api, but users of the api would not be effected, since the state cookie is "opaque" to them |
| 16:21 | mmarczyk | jwr7: I'd rather use an atom for that :-) |
| 16:21 | mmarczyk | in fact, I can imagine walking subtrees of a single tree in separate threads |
| 16:22 | hiredman | have I mentioned monads yet? |
| 16:22 | mmarczyk | in which case maybe a ref |
| 16:22 | mmarczyk | would do best |
| 16:22 | livingston | sometimes you can't refactor because your not calling it, for example |
| 16:22 | livingston | or not controlling the thing that is doing the calling |
| 16:22 | hiredman | livingston: that sounds like a tangled mess |
| 16:22 | mmarczyk | hiredman: no, but this conversation does make one think about them |
| 16:23 | mmarczyk | it's a fact of life, though, that monadic style is very different from the usual present-day Clojure style |
| 16:24 | jwr7 | FWIW, my zipper tree walking smells of monads, but I couldn't understand them well enough to actually use the ones in clojure-contrib. |
| 16:26 | sattvik | rhickey: /who |
| 16:26 | mmarczyk | hi sattvik :-) |
| 16:26 | livingston | hiredman: frequently it can be used to overcome something done bad, but there are many legitimate uses, look at specials / defspecial in common lisp |
| 16:27 | hiredman | livingston: I'd rather not look at common lisp |
| 16:27 | sattvik | mmarczyk: Hello. |
| 16:28 | sattvik | rhickey: Does it make sense for a Vec to be comparable against a non-IPersistentVector, such as a Sequential? |
| 16:28 | Luyt | ,(doc *print-length*) |
| 16:28 | clojurebot | "; *print-length* controls how many items of each collection the printer will print. If it is bound to logical false, there is no limit. Otherwise, it must be bound to an integer indicating the maximum number of items of each collection to print. If a collection contains more items, the printer will print items up to the limit followed by '...' to represent the remaining items. The root binding is nil indicating no limit." |
| 16:29 | rhickey | sattvik: yes |
| 16:30 | rhickey | sattvik: collection equality is divided into sequentials, sets, and maps |
| 16:32 | sattvik | rhickey: OK, thank you. I will implement it that way. Although it will be somewhat different than vectors, then. |
| 16:32 | sattvik | ,(compare [1 2] (range 1 2)) |
| 16:32 | clojurebot | java.lang.ClassCastException: clojure.lang.LazySeq cannot be cast to clojure.lang.IPersistentVector |
| 16:33 | rhickey | sattvik: sorry, not comparable, just equality |
| 16:33 | rhickey | Vec should mimic vectors |
| 16:34 | sattvik | rhickey: Ah, OK. No problem. So, Vec should only be comparable against other IPersistentVectors, correct? |
| 16:35 | rhickey | sattvik: yes |
| 16:36 | sattvik | rhickey: Thank you. |
| 16:36 | hiredman | rhickey: ooo |
| 16:37 | mmarczyk | rhickey: wow :-) |
| 16:37 | Borkdude | Hmm, I have installed VS2008 SP1 now for sure, upgraded to .NET Framework 4.0 but still I keep getting this err msg |
| 16:38 | Borkdude | The Namespace Dynamic does not exist in the namespace System |
| 16:38 | sattvik | So annotations are coming to Clojure? I did some simple-class level annotations on an Clojure/EJB library, but I never tried field or method annotations. |
| 16:38 | Borkdude | and I do have references to the dlls described on the ClojureCLR page |
| 16:39 | technomancy | every time I hear about annotations, it's for use with netty; what other kinds of things are they useful for? |
| 16:40 | StartsWithK | jpa, jax-rs.. |
| 16:40 | sattvik | technomancy: Most of the Java EE stuff uses annotations these days to replace XML. |
| 16:40 | StartsWithK | for jpa you would also need inner classes |
| 16:40 | livingston | technomancy: in a language without real macros you can get some macro-like things out of them |
| 16:40 | Borkdude | I have come across annotations in JUnit and GWT |
| 16:40 | Borkdude | this week |
| 16:40 | technomancy | so for various three-letter acronyms then? |
| 16:40 | technomancy | =) |
| 16:40 | rhickey | livingston: more like metadata than macros |
| 16:41 | mattrepl | Guice is another |
| 16:41 | Borkdude | so maybe for ClojureGWT ;-) |
| 16:43 | hiredman | you can put metadataish stuff on other stuff, and a processor can read the metadata and do codegen stuff |
| 16:43 | livingston | rhickey: mostly yes, but I've seen some crazy things done with them in java, for example: in a system called UIMA you build plug-in modules for text processing, when UIMA calls your module you can query it for a bunch of parameters, and there is a lot of boilerplate for that... |
| 16:44 | rhickey | livingston: that has to do with their interpretation by frameworks, the language facility is just metadata-like |
| 16:44 | livingston | .. so the thing I saw was something like @parameter String Foo or something, and it would manage all the boiler plate for requesting the foo paramater and getting it typed if it was there etc. |
| 16:45 | Borkdude | Hmm, this week someone gave me a JDO demo, it used a lot of annotations, it looked useful to me |
| 16:45 | livingston | personally I think that seems like a bit of an abomination, and they seem to make most sense as metadata |
| 16:47 | cemerick | rhickey: the protocol docs are wrong in showing parens around overloaded method signatures. |
| 16:47 | cemerick | in assembla, that is |
| 16:48 | rhickey | the assembla docs are over |
| 16:48 | Borkdude | but the same thing could be done with metadata in clojure probably |
| 16:49 | sattvik | I am guessing that if Clojure did support annotations, that might help some of the EE crowd adopt it. It would make it easier to plug into an existing system. |
| 16:49 | cemerick | rhickey: sorry, didn't notice the header |
| 16:49 | hiredman | Borkdude: it all ready sort of is, like with type hints, etc |
| 16:49 | hiredman | the main things annotation support is nice for are interop |
| 16:50 | Borkdude | Can someone help me build ClojureCLR and get this annoying msg out of the way? |
| 16:50 | rhickey | (deftype #^{Deprecated true Retention RetentionPolicy/RUNTIME} Bar []) |
| 16:50 | rhickey | ^^ works on my machine |
| 16:50 | Borkdude | The type or namespace name 'Dynamic' does not exist in the namespace 'System' |
| 16:50 | livingston | I stand corrected, that code apparently mines the annotations to do the work that I thought just placing the annotation was doing (i thought they could behave like templates), but that's not the case at all |
| 16:50 | remleduff | rhickey: If you consider the annotation processing framework part of "annotations" it ends up being somewhat similar to a macro facility for java in some of the ways it's used, no? |
| 16:51 | rhickey | remleduff: I personally would never equate the two |
| 16:52 | remleduff | I've got a few places where there is no concrete class definition, just an interface with some methods marked up with annotations, at compile time a class is generated based on that markup |
| 16:52 | cemerick | rhickey: is destructuring going to eventually be allowed in deftype/defrecord method arg vectors? |
| 16:53 | rhickey | cemerick: maybe |
| 16:53 | rhickey | it's on an ever lengthening list |
| 16:53 | stuarthalloway | rhickey: java.util.Map for defrecord is DONE, with no Java changes :-) |
| 16:54 | stuarthalloway | https://www.assembla.com/spaces/clojure/tickets/313-add-java-util-map-support-to-defrecord |
| 16:54 | stuarthalloway | turns out there is enough clojure-in-clojure in defrecord to do it all as one-liners |
| 17:01 | technomancy | anyone who's contributed to swank-clojure but may not be on the mailing list should weigh in on this relicensing thread: http://groups.google.com/group/swank-clojure/browse_thread/thread/3ae8f2c2ad46bbc5 |
| 17:03 | remleduff | stuarthalloway: Since you're using java interop calls (.count) in your ijavamap, should the IPersistentMap switch to doing it the same way? It seems odd to me that the implementations would be different, but I'm probably not understanding something. |
| 17:04 | stuarthalloway | remleduff: I am counting on this, while it looks like IPM is counting on other things |
| 17:12 | kzar | When I try and use the lower-case function in str-utils it says the function isn't public. What am I doing wrong? |
| 17:19 | remleduff | ,(clojure.contrib.str-utils2/lower-case "ABC") |
| 17:19 | clojurebot | "abc" |
| 17:20 | remleduff | Is there a function somewhere in swank-clojure that will given a class-name, give you a list of possible imports for that class (found by searching your classpath)? |
| 17:20 | kzar | Oh I got it working, I just did (.toLowerCase "Whatever") instead |
| 17:31 | rhickey | annotation syntax: http://gist.github.com/377213 |
| 17:31 | rhickey | make sense? |
| 17:34 | mefesto | rhickey: i like it :) |
| 17:35 | mefesto | im guessing exactly the same at the method definition level? |
| 17:35 | sattvik | rhickey: So it's just like the standard meta map, just with Class keys? |
| 17:35 | sattvik | rhickey: How about nested annotations? |
| 17:36 | rhickey | sattvik: theoretically supported, do you know of one in standard Java 6? |
| 17:36 | mefesto | i think jpa has nested annotations (named query?) |
| 17:36 | remleduff | How do you mix annotations and type hints? |
| 17:37 | sattvik | rhickey: I know of some for EJBs... It will take a moment to look them up. I am not sure aboute Java SE. |
| 17:37 | rhickey | will look like {BlahAnnotation {:anested (NestedAnnotation {:its property})}} |
| 17:38 | rhickey | remleduff: just put both in the metadata |
| 17:38 | rhickey | remleduff: {:tag String AnnotationType blah} |
| 17:38 | carkh | \o/ annotations ! |
| 17:39 | remleduff | Are you respecting default property values too? |
| 17:39 | rhickey | remleduff: yup |
| 17:40 | remleduff | Neat ;) |
| 17:40 | mefesto | looks like there are some nested annotations in the javax.xml.ws package. (ex. WebServiceRefs) |
| 17:40 | carkh | too bad i approached the jvm from clojure so i don't know anything about these.... are there annotations for methods as well ? |
| 17:41 | remleduff | carkh: There are annotations on nearly everything: on types, methods, parameters |
| 17:42 | carkh | looks like i'll spend the evebning reading about all that |
| 17:42 | remleduff | rhickey: Will the clojure or java compiler spit out a message now if you use a type's method marked Deprecated? |
| 17:42 | rhickey | remleduff: no |
| 17:44 | arohner | Chousuke: I can't get your gensym trick from earlier to work: http://gist.github.com/377226 |
| 17:47 | rhickey | remleduff: thanks - nested looks like this: http://gist.github.com/377213 |
| 17:47 | rhickey | sorry, sattvik - nested ^^ |
| 17:48 | Chousuke | arohner: um, only lists can be spliced |
| 17:49 | arohner | Chousuke: what do I have there? |
| 17:49 | Borkdude | rhickey: what version of the DLR was used with the latest clojure-clr sources? |
| 17:49 | Chousuke | arohner: a symbol |
| 17:49 | remleduff | What is (WebServiceRef {:name "fred"}), a function invocation? |
| 17:49 | Chousuke | arohner: ~@foo makes no sense unless foo is a list or a vector |
| 17:49 | rhickey | Borkdude: you'll have to ask the ClojureCLR folks |
| 17:50 | rhickey | remleduff: a nested annotation |
| 17:50 | Borkdude | rhickey: where are they hanging out usually |
| 17:50 | Borkdude | ? |
| 17:50 | arohner | Chousuke: isn't foo a symbol that resolves to a list? |
| 17:51 | rhickey | Borkdude: you could ask on ggroup |
| 17:51 | Chousuke | arohner: no. |
| 17:51 | Borkdude | k |
| 17:51 | remleduff | Just looks a little inconsistent to me, why isn't it #^{(Deprecated true) (Retention RetentionPolicy/RUNTIME)} if they're going to use lists when nested? |
| 17:52 | Chousuke | arohner: what you're doing there is generating a symbol first, binding it to the name foo, then generating code that binds the *generated* symbol to a list |
| 17:53 | sattvik | rhickey: Looks good. Although a map-like syntax may be slightly more natural for people coming from Java. |
| 17:53 | arohner | Chousuke: ok. So then how would I splice the generated symbol? |
| 17:53 | Chousuke | arohner: but the list is not available to you when you're actually generating the code to make the list. (think about it) ... so you can't splice it in |
| 17:53 | arohner | ah |
| 17:54 | remleduff | rhickey: I don't think it makes a big difference though, I haven't seen nested annotations enough to worry about so consider that retracted. I like it a lot :) |
| 17:54 | sattvik | rhickey: An example of nested annotations in Java: @Resources ({@Resource(name="jdbc/AdventureDB" type=javax.sql.DataSource), |
| 17:55 | Chousuke | arohner: what you can do is generate code that does something to the list; but you can't actually put the list in the generated code because that would be circular :P |
| 17:55 | sattvik | Though, in the end, exactly how it looks is rather trivial. |
| 17:56 | arohner | Chousuke: ok, thanks. I'll need to re-think this |
| 17:56 | Chousuke | arohner: though your example isn't probably the clearest about this because the list is basically a constant |
| 17:56 | arohner | one sec, I'll paste what I actually want |
| 17:57 | Chousuke | arohner: if you can think of a macro as function of its parameters, producing clojure code, that will help |
| 17:57 | Chousuke | what ` is doing is nothing more than building a list, with some templating support |
| 17:57 | arohner | http://gist.github.com/377232 |
| 17:58 | licoresse | flip flop |
| 17:58 | Chousuke | you could do it entirely without using ` or ~ or ~@ |
| 17:59 | Chousuke | arohner: why do you want to evaluate the args like that? |
| 17:59 | Chousuke | hmm |
| 17:59 | arohner | Chousuke: in case the input is a function call |
| 17:59 | Chousuke | what input? the 'args'? hm. |
| 18:00 | remleduff | Is there any way to make this work? (map #(import %) [java.util.zip.ZipFile]) |
| 18:00 | Chousuke | what you want is probably not possible without eval |
| 18:00 | Chousuke | at least not the way you're trying to do it |
| 18:01 | Chousuke | arohner: but the important mistake here is that you're trying to splice things that are part of the *generated code* into the generated code itself. |
| 18:01 | Chousuke | no, wait. you're trying to splice *results* of evaluating the generated code into the generated code. |
| 18:03 | arohner | Chousuke: seems like I need another eval step |
| 18:03 | arohner | Chousuke: is this a case for eval? |
| 18:04 | Chousuke | now you can do something like (defmacro foo [args] (let [a (if (fn-form? args) (eval args) args)] `(defn ~@args ...))) |
| 18:04 | Chousuke | honestly, probably not. |
| 18:04 | Chousuke | it will fail if you try to pass anything but a literal fn form |
| 18:04 | Chousuke | hmhm |
| 18:05 | Chousuke | what kind of code are you aspiring to write using this macro? |
| 18:05 | Chousuke | also, should be ~@a in the example |
| 18:06 | arohner | (defmacro defn-map |
| 18:06 | arohner | "generates a defn expression, but arguments are a map, to make it |
| 18:06 | arohner | easier on macro writers. Valid keys: name, doc-string, attr-map, |
| 18:06 | arohner | params, body. If params is nil, then body is a multi-arity |
| 18:06 | arohner | expression, ([params] body)+ " |
| 18:06 | arohner | this seems to work well with eval |
| 18:06 | Chousuke | should be no need for eval for that |
| 18:07 | Chousuke | unless you want to accept non-literal maps as well |
| 18:07 | Chousuke | which would be rather evil |
| 18:08 | arohner | well I also have |
| 18:08 | arohner | (defmacro decompose-defn-args |
| 18:08 | arohner | "interprets args the way defn would, returns a map that can be consumed by defn-map" |
| 18:08 | arohner | so yes, I want to support non-literal maps |
| 18:08 | Chousuke | hmmh :/ |
| 18:11 | Chousuke | I really don't think that's a very good idea. |
| 18:12 | Chousuke | you might just as well make it a function that constructs and evals a defn form then |
| 18:12 | Chousuke | no need for macros |
| 18:14 | arohner | Chousuke: why don't you think it's a good idea? |
| 18:16 | Chousuke | arohner: I guess I just don't see what that is useful for |
| 18:16 | arohner | Chousuke: it makes it significantly easier to write macros that call defn, and want to support all the extra features of defn |
| 18:17 | Chousuke | arohner: I can see explicitly naming each defn parameter being useful, but why must it work for non-literal maps? |
| 18:17 | arohner | so I can do things like |
| 18:18 | arohner | (let [arg-map (update-in (destructure-args input-args) [:attr-map] merge ...)] (defn-map) |
| 18:18 | arohner | I want to update-in whatever the user passed in |
| 18:20 | Chousuke | hmh |
| 18:21 | Chousuke | I still don't see it. you can write a parser for defn args -> map and map -> defn-args and that would be very useful for macro writers, but there would be no need for eval or any "runtime" maps as far as I can tell |
| 18:22 | fyuryu | Borkdude: I managed to get ClojureCLR to compile under VS 2008 a month or two ago. Haven't looked at it since. |
| 18:22 | cemerick | holy crap, annotations?!? |
| 18:23 | fyuryu | Borkdude: I couldn't get it to compile under VS 2010, though. Don't remember what the error was |
| 18:24 | Chousuke | arohner: I mean, if you write a (defn mydefn [argvec] ...) you can update the argvec in any way you want |
| 18:24 | Chousuke | arohner: it's still just a vector |
| 18:25 | arohner | Chousuke: yes, but defn has to support doc-string? attr-map? |
| 18:25 | arohner | I don't know which position is the attr-map unless I destructure first |
| 18:25 | arohner | or write a macro as long as defn |
| 18:25 | Chousuke | destructure? |
| 18:26 | Chousuke | well you can distill all the weird logic in defn into your defn-args -> map function |
| 18:27 | Chousuke | and when you are done manipulating the map, do the reverse and then just `(defn ~@(map-to-defn themap)) |
| 18:27 | Chousuke | that way, there's no need for eval |
| 18:28 | Chousuke | your map-to-defn just needs to produce a sequence that, when spliced in, result in a valid defn form. |
| 18:29 | Chousuke | results* |
| 18:29 | MadWombat | Hello |
| 18:29 | arohner | ,(doc defn) |
| 18:29 | arohner | Chousuke: inspect the args, and figure out whether there is a doc string, and whether there is a metadata map |
| 18:29 | clojurebot | "([name doc-string? attr-map? [params*] body] [name doc-string? attr-map? ([params*] body) + attr-map?]); Same as (def name (fn [params* ] exprs*)) or (def name (fn ([params* ] exprs*)+)) with any doc-string or attrs added to the var metadata" |
| 18:30 | MadWombat | I have a rather silly question. One of my files has been growing large, so I split it and used (:use [com.wombat.web util datastore]) to import the functions back into the main namespace. But now I get an error that the defun I defined in util is not available. Any obvious thing to check? |
| 18:30 | Chousuke | arohner: right? |
| 18:31 | mmarczyk | arohner: you could just lift the code from defn |
| 18:31 | Chousuke | arohner: you need a parser of defn-args -> map and vice versa |
| 18:31 | mmarczyk | leave the bindings vector in the huge let form intact |
| 18:31 | Chousuke | arohner: but that's a one-time thing |
| 18:31 | arohner | I already have the parser |
| 18:31 | arohner | that was easy :-) |
| 18:31 | mmarczyk | but instead of producing a def form, return a map of stuff extracted from "defn-like args" |
| 18:31 | mmarczyk | make that a function |
| 18:32 | mmarczyk | use in any macro which needs to provide similar functionality |
| 18:32 | arohner | Chousuke: mmarczyk : I think I understand. thanks |
| 18:32 | arohner | Chousuke: thanks for your help. I have to run |
| 18:33 | mmarczyk | MadWombat: see if util depends on sth in datastore or the other way around |
| 18:33 | Chousuke | right, so now you have a function that you can use in any macro... (defmacro foo [& args] (let [parsed (parse args)] `(defn ~(:name parsed) ...))) |
| 18:34 | mmarczyk | MadWombat: actually the other way around would be more likely given your description |
| 18:42 | MadWombat | mmarczyk: hmm... no, separately util and datastore compile fine |
| 18:45 | livingston | what's the function to change the root value of a def (I know this is dangerous - I'm debugging in the repl) |
| 18:45 | mmarczyk | MadWombat: does the error arise somewhere where use use or require the com.wombat.web namespace? |
| 18:45 | mmarczyk | ^ where you use or require |
| 18:46 | mmarczyk | livingston: you mean a Var? use the .bindRoot method |
| 18:46 | mmarczyk | or alter-var-root |
| 18:46 | mmarczyk | which is like alter / swap! / send |
| 18:46 | livingston | yeah, I guess so, whatever def produces which is a var, right? so yeah alter-var-root sounds good |
| 18:47 | mmarczyk | if you're just going to type it at the repl, you can of course just use def again |
| 18:48 | livingston | good point |
| 18:51 | MadWombat | mmarczyk: I think I made a mistake in the question, to make things clear, I have 3 namespaces all starting with com.wombat.web, main, util and datastore. When I use the util from main and try to call a function it is not recognized |
| 18:52 | MadWombat | mmarczyk: figured it out, I had all functions defined with (defn-, so once they moved away from the original namespace they went inaccessible. Thought it was something silly. Thanks for the help, funny, how you answer most of my clojure questions everywhere I post them :) |
| 18:54 | mmarczyk | do I? happy to help :-) |
| 18:55 | mmarczyk | good this one is sorted out |
| 18:55 | slyphon | mmarczyk: oh, i found another bug |
| 18:55 | slyphon | (this is hard) |
| 18:55 | mmarczyk | slyphon: I was kind of thinking there might be one |
| 18:55 | slyphon | :) |
| 18:55 | mmarczyk | let's see if you've got the same one |
| 18:55 | mmarczyk | :-) |
| 18:56 | slyphon | well, &env isn't defined in some contexts |
| 18:56 | slyphon | like, when initially compiling |
| 18:56 | mmarczyk | um |
| 18:56 | slyphon | i think |
| 18:56 | slyphon | lemme try |
| 18:56 | mmarczyk | do you have a not-working example? |
| 18:56 | slyphon | make sure |
| 18:56 | slyphon | heh |
| 18:56 | slyphon | one sec |
| 18:57 | mmarczyk | incidentally, I realised that an unmention part of the contract for the last version |
| 18:57 | mmarczyk | is that if a map literal is passed in, then all the keys must be literal keywords or symbols |
| 18:58 | slyphon | hrm |
| 18:58 | mmarczyk | if symbols, they'll be treated just like keywords, meaning their names will be used |
| 18:58 | slyphon | oh, heh |
| 18:58 | slyphon | well |
| 18:58 | mmarczyk | is this a problem? |
| 18:58 | slyphon | i'm kind of willing to risk that |
| 18:58 | slyphon | ;) |
| 18:58 | slyphon | nah, shouldn't be |
| 18:58 | slyphon | Caused by: java.lang.RuntimeException: java.lang.Exception: Unable to resolve symbol: &env in this context (utils.clj:254) |
| 18:58 | mmarczyk | good :-) |
| 18:58 | mmarczyk | hm, interesting |
| 18:58 | mmarczyk | could you paste the code which causes this somewhere? |
| 18:58 | slyphon | sure |
| 18:59 | slyphon | one sec |
| 19:02 | Borkdude | fyuryu: ah |
| 19:02 | Borkdude | I'm still wrestling with it, but can't get it to work |
| 19:02 | Borkdude | I'm almost giving up... |
| 19:03 | Borkdude | Visual Studio is so annoying: it gives hints to add a using System.Dynamic; when I remove it, and when it has added it, says: I don't know where it is |
| 19:05 | livingston | so if I have java code that gives me an Iterator, what's the easiest way to get it to be a seq in clojure? iterator-seq ?? |
| 19:05 | carkh | ,(doc iterator-seq) |
| 19:05 | clojurebot | "([iter]); Returns a seq on a java.util.Iterator. Note that most collections providing iterators implement Iterable and thus support seq directly." |
| 19:06 | mmarczyk | do I understand correctly that java.util.Iterator doesn't implement Iterable? |
| 19:06 | livingston | collections implement iterable |
| 19:06 | mmarczyk | so an ArrayList is Iterable, whereas an Iterator isn't? |
| 19:07 | mmarczyk | I find this somewhat contrary to my initial naive expectations :-) |
| 19:10 | rhickey | fuller annotation syntax example: http://gist.github.com/377213 |
| 19:10 | livingston | mmarczyk: yes |
| 19:11 | Borkdude | hmm, I did (read-line) on the repl |
| 19:12 | Borkdude | how do I end the input to it?? |
| 19:12 | mmarczyk | Borkdude: would that be the SLIME repl? |
| 19:12 | Borkdude | yes |
| 19:12 | mmarczyk | then read & Co. won't work :-( |
| 19:12 | mmarczyk | with current swank-clojure |
| 19:13 | Borkdude | it is reading |
| 19:13 | Borkdude | supposedl |
| 19:13 | Borkdude | but I don't know how to say: this is it |
| 19:13 | chessguy | is 'eval' pretty expensive to call in clojure? |
| 19:14 | slyphon | mmarczyk: http://github.com/slyphon/sly-utils |
| 19:14 | slyphon | probably doesn't warrant a proper repository, but i mean, wth |
| 19:14 | slyphon | lein repl, (require '[com.slyphon.utils [update-bean :as ub]]) will cause the barfage |
| 19:14 | slyphon | mmarczyk: if you have an account, i'll add you as a contributor |
| 19:16 | mmarczyk | I do, michalmarczyk |
| 19:16 | slyphon | mmarczyk: are you polish, perchance? |
| 19:17 | mmarczyk | yes |
| 19:17 | slyphon | ok, you're a "contributor" |
| 19:17 | mmarczyk | right |
| 19:17 | slyphon | my best friend from high school is polish, that's why i asked |
| 19:17 | mmarczyk | :-) |
| 19:18 | livingston | slyphon: the vowel to consonant ratio didn't tip you off |
| 19:18 | mmarczyk | livingston: hm? should it? |
| 19:19 | mmarczyk | slyphon: right, but do you have an actual breaking example? |
| 19:19 | slyphon | livingston: hah |
| 19:19 | livingston | mmarczyk: well that and the "czyk" |
| 19:19 | slyphon | oh |
| 19:19 | slyphon | mmarczyk: it won't even load that |
| 19:20 | mmarczyk | slyphon: oh, ok; let me see then |
| 19:20 | slyphon | http://github.com/slyphon/sly-utils/blob/master/src/com/slyphon/utils/update_bean.clj |
| 19:20 | clojurebot | () invokes the form inside, but there is an implied str call. The semantics are different inside the interpolated string, necessarily so. |
| 19:20 | slyphon | clojurebot: huh? |
| 19:20 | clojurebot | excusez-moi |
| 19:20 | slyphon | :D |
| 19:21 | mmarczyk | rhickey: so any metadata entry with a class for a key would be made accessible to Java code in the form of an annotation? |
| 19:21 | mmarczyk | wherever possible, right? |
| 19:21 | mmarczyk | livingston: guess you're right :-) |
| 19:21 | rhickey | mmarczyk: the class has to derive from Annotation |
| 19:21 | rhickey | i.e. be an annotation |
| 19:21 | mmarczyk | rhickey: oh, ok |
| 19:22 | slyphon | mmarczyk: hey, you gonna be around for a bit? |
| 19:23 | slyphon | mmarczyk: food just got here |
| 19:23 | mmarczyk | so a separate annotations collection in the metadata under a :annotations key wouldn't make much sense, because an Annotation derivee isn't likely to be used for any other purpose, so no need to wrap them |
| 19:23 | mmarczyk | slyphon: probably |
| 19:23 | slyphon | :) |
| 19:24 | slyphon | cool, i'll bbiab |
| 19:25 | Chousuke | clojurebot: forget () |
| 19:25 | clojurebot | forget latest is 1382 |
| 19:25 | Chousuke | duh. :P |
| 19:27 | scottj | I've started writing a smalltalk style method finder where you give it an example of how you'd use the method (inputs and result) and it tells you what clojure functions or Java methods in the system fit the bill. Before I get too far though I wanted to check, has anyone written this already? |
| 19:28 | Chousuke | possibly for java, but probably not for clojure |
| 19:29 | chessguy | a hoogle for clojure? |
| 19:30 | dnolen | scottj: no, that sounds pretty cool. |
| 19:31 | mmarczyk | scottj: not that I know of, and I can tell you I'd definitely want to use it :-) |
| 19:34 | mmarczyk | slyphon: I pushed a fix |
| 19:34 | chessguy | is 'eval' pretty expensive to call in clojure? e.g., i know it's discouraged in javascript. i'm just not sure if lisp is similar |
| 19:35 | scottj | chessguy: never seen hoogle, from its docs about type signatures, does it not support giving true as result and "goof" and "oo" and getting back .contains ? that's more specific than str -> str |
| 19:35 | mmarczyk | slyphon: the problem was in that you're using Clojure 1.1 and &env was added more recently |
| 19:36 | joshua-choi | Question: how should I refer to a protocol in another namespace? Both org.me/AProtocol and org.me.Protocol are defined, but one is a map and one is a class (or interface?). |
| 19:36 | mmarczyk | scottj: so would you actually go ahead and call each candidate method / fn to see if the result matches? |
| 19:36 | scottj | dnolen: I want to take the smalltalk method finder to the next level and have it come up with common combinations of functions/methods (tell you to use filter w/ a certain predicate) |
| 19:37 | mmarczyk | chessguy: not that expensive in those places where it's actually appropriate to use it |
| 19:37 | scottj | mmarczyk: that's what I'm doing right now. I made a list of functions that are dangerous to do that with :) |
| 19:38 | chessguy | mmarczyk, an appropriately vague answer for a vague question :) |
| 19:38 | mmarczyk | chessguy: see http://stackoverflow.com/questions/2571401/why-exactly-is-eval-evil |
| 19:38 | livingston | how do I quote a static function in a java class so that I can apply it? this works (Triple/create a b c) but (apply Triple/create (list a b c)) doesn't |
| 19:40 | rhickey | joshua-choi: use org.me/AProtocol to refer to the protocol object |
| 19:40 | _rata_ | hi |
| 19:40 | rhickey | joshua-choi: the interface is just for Java |
| 19:40 | _rata_ | is there a quick starting guide for people that comes from other Lisp? |
| 19:40 | sattvik | livingston: Create an anonymous function #(. obj fn args) |
| 19:41 | sattvik | ,(map #(. %1 charAt 0) ["hi" "there"]) |
| 19:41 | clojurebot | (\h \t) |
| 19:41 | sattvik | Eh, that's not a static function, but should work more or less the same. |
| 19:41 | scottj | _rata_: I think wikibook clojure programming used to have a table that detailed some diffs, and rhickey gave a clojure for lisp preso that's on clojure.blip.tv |
| 19:42 | scottj | I saw a big table that compared a lot of things in emacslisp, common lisp, scheme, and clojure. It was really big, did anyone bookmark that? |
| 19:42 | livingston | that's ugly/unfortunate, but ok |
| 19:42 | livingston | scottj: http://hyperpolyglot.wikidot.com/lisp |
| 19:43 | scottj | livingston: thanks |
| 19:43 | dnolen | _rata_: I assume you already looked over http://clojure.org/lisps |
| 19:43 | livingston | I happend to have it open - i don't think it's totally great, but it'll give you a few quick pointers |
| 19:43 | sattvik | ,(map #(. Integer parseInt %1) ["1" "2"]) |
| 19:43 | clojurebot | (1 2) |
| 19:43 | _rata_ | thank you all :) |
| 19:43 | uberjar | http://www.lisperati.com/clojure-spels/casting.html |
| 19:44 | _rata_ | I have a lot to read now :) |
| 19:44 | uberjar | thats clojure's poigant guide |
| 19:45 | mmarczyk | scottj: you could still do some initial filtering based on argument & result types |
| 19:46 | scottj | mmarczyk: for java methods yeah, for clojure functions though, other than obvious arity things? |
| 19:47 | mmarczyk | you could check if there's any type hints |
| 19:47 | rhickey | initial annotation support is up! |
| 19:47 | rhickey | bulk of the work is 50 lines of Clojure - http://github.com/richhickey/clojure/commit/fa899d22dceb531d9f5af833ac6af0d956e6bdc7 |
| 19:47 | mmarczyk | cool :-) |
| 19:47 | mmarczyk | rhickey: is it possible to get at the type hints on a function's arguments? |
| 19:48 | joshua-choi | rhickey: Thanks. However, you cannot refer to a type by org.me/Type. Is this by design? |
| 19:49 | scottj | other than looking at the source :) |
| 19:49 | mmarczyk | oh, ok |
| 19:49 | mmarczyk | I found out myself |
| 19:49 | slyphon | mmarczyk: hey, did you have a chance to take a look? |
| 19:49 | mmarczyk | (defn #^String foo [#^String s] (count s)) |
| 19:50 | mmarczyk | (meta (first (first (:arglists (meta #'foo))))) |
| 19:50 | mmarczyk | slyphon: yes, I committed a fix |
| 19:50 | slyphon | w00t! |
| 19:50 | slyphon | ty |
| 19:50 | rhickey | joshua-choi: I don't understand. In order to use the protocol you need to refer to the protocol object, not the type |
| 19:50 | scottj | mmarczyk: cool |
| 19:50 | mmarczyk | scottj: of course not that many things are hinted... but still |
| 19:50 | slyphon | mmarczyk: hah! nice |
| 19:51 | slyphon | thanks |
| 19:51 | mmarczyk | slyphon: btw, I also thought about how this is fundamentally broken :-) |
| 19:51 | joshua-choi | rhickey: Yes, sorry; never mind. |
| 19:51 | slyphon | hahah |
| 19:51 | slyphon | mmarczyk: oh yeah? |
| 19:51 | mmarczyk | cool, no? |
| 19:51 | mmarczyk | yeah |
| 19:51 | rhickey | joshua-choi: in any case ,no, foo.bar/baz is always a ns member or static member |
| 19:51 | mmarczyk | but just to make sure |
| 19:52 | joshua-choi | rhickey: And datatypes are no longer members of namespaces, right? |
| 19:52 | mmarczyk | what would be a simple bean I could work with...? |
| 19:52 | mmarczyk | I mean is there something in java standard libs I could test this with? |
| 19:52 | rhickey | joshua-choi: datatypes are named types, and no longer create factory fns in a ns, right |
| 19:53 | slyphon | mmarczyk: hang on, i'll check in that class i was using |
| 19:53 | joshua-choi | rhickey: Okay. It's a tad annoying, since I must now import constructors with import instead of require, but I can just create factory functions, so it's okay. |
| 19:53 | mmarczyk | slyphon: ok, I'll run a little experiment of my own in the meantime |
| 19:53 | slyphon | kk |
| 19:54 | rhickey | full example of annotations http://gist.github.com/377213 |
| 19:55 | rhickey | joshua-choi: right, a factory fn in your control lets you process args, have defaults etc |
| 19:56 | mmarczyk | slyphon: right, so this will break in the following way |
| 19:56 | mmarczyk | say you want to have a Var named params holding some params to use with update-bean |
| 19:57 | joshua-choi | rhickey: In any case, though, we should probably indicate in our datatypes' docstrings the intended way to create the datatype: by constructor or a factor method, right? |
| 19:57 | mmarczyk | then you compile a function which uses update-bean and give it the symbol params as the second argument |
| 19:57 | scottj | 50 lines? what happened to one line for new features? you're slipping. Didn't someone say if you can write an annotation in one line you should be able to implement annotations in one line? </sarcasm> |
| 19:57 | slyphon | symbol capture |
| 19:57 | mmarczyk | this will work just fine, BUT |
| 19:57 | slyphon | ? |
| 19:57 | mmarczyk | if you then go and redefine params to something else |
| 19:57 | mmarczyk | your function will never notice |
| 19:57 | clojurebot | http://jackcoughonsoftware.blogspot.com/2009/05/teaching-functional-programming-to-kids.html |
| 19:57 | slyphon | oy |
| 19:57 | mmarczyk | and the update-bean bit will use the previous value of params |
| 19:58 | slyphon | hmm |
| 19:58 | slyphon | so this probably needs to use gensyms? |
| 19:58 | mmarczyk | obviously, since it's determined at macro expansion time |
| 19:58 | mmarczyk | um, no, that won't do |
| 19:58 | mmarczyk | actually, at this point, I'm inclined to say that this is a perfect use case for eval |
| 19:59 | slyphon | hah |
| 19:59 | slyphon | rhickey: http://github.com/slyphon/sly-utils/blob/master/src/com/slyphon/utils/update_bean.clj |
| 19:59 | slyphon | rhickey: if you have a moment |
| 19:59 | mmarczyk | though it'll still need to be a macro |
| 19:59 | slyphon | rhickey: this has presented a bit of a poser |
| 19:59 | mmarczyk | since there might be locals involved |
| 20:00 | mmarczyk | hm, actually the fundamental question to ask ourselves is |
| 20:00 | slyphon | rhickey: the use case is to update a bean, generating the method names based off of keys of a hash passed in |
| 20:00 | mmarczyk | whether this is a problem :-) |
| 20:00 | slyphon | hah |
| 20:00 | mmarczyk | or maybe reflection is fine after all |
| 20:00 | mmarczyk | with a nice bit of reflection-fu, this can be a proper function |
| 20:00 | slyphon | so it's going to change the value of a local variable behind the function's back? |
| 20:01 | mmarczyk | hm? not sure I understand |
| 20:01 | slyphon | hah |
| 20:01 | slyphon | well, i don't quite understand what would break |
| 20:01 | mmarczyk | well |
| 20:01 | rhickey | slyphon: you've looked at bean, in core_proxy.clj? |
| 20:01 | mmarczyk | notice how, when given a symbol as the second arg, update-bean calls eval |
| 20:01 | slyphon | rhickey: yes, it scared me |
| 20:01 | slyphon | i thought bean was read-only |
| 20:02 | mmarczyk | rhickey: doesn't bean return a read-only object? |
| 20:02 | rhickey | yes, it's read only, but a very similar job |
| 20:02 | slyphon | rhickey: i don't quite know how to phrase this, but what is it about '.' that makes this so challenging? |
| 20:04 | mmarczyk | rhickey: could bean be rewritten using reify, IPersistentMap and support assoc as a property-setting operation? |
| 20:04 | mmarczyk | to be used like transients, i.e. in a highly localised fashion |
| 20:07 | mmarczyk | slyphon: continuing about eval in update-bean, it only gets called once -- when the macro is expanded |
| 20:07 | mmarczyk | then that hypothetical update-bean-using function gets compiled with the result of the expansion becoming a part of its code |
| 20:07 | slyphon | ohhhhh |
| 20:07 | mmarczyk | that is, with the map hard-wired inside it |
| 20:07 | MadWombat | was defservice replaced by something else in compojure 0.4.0? |
| 20:07 | mmarczyk | by value |
| 20:08 | slyphon | mmarczyk: that's bad |
| 20:08 | slyphon | mmarczyk: do you have a CL or Scheme background? |
| 20:08 | mmarczyk | MadWombat: likely moved off to some other project, see http://formpluslogic.blogspot.com/2010/04/migrating-from-compojure-032-to-040-and_01.html |
| 20:08 | mmarczyk | slyphon: Scheme |
| 20:08 | slyphon | ahh |
| 20:09 | mmarczyk | MadWombat: it doesn't mention defservice in particular, but perhaps the dependencies list will give you a hint |
| 20:10 | slyphon | i've been thinking about looking into scheme, i tried CL a few years ago, but it was really ....overwhelming |
| 20:12 | mmarczyk | I like reading Lisp books :-) |
| 20:13 | slyphon | mmarczyk: is there a scheme book in particular you'd recommend? |
| 20:13 | mmarczyk | well, I taught myself to programme with SICP |
| 20:13 | slyphon | hah |
| 20:13 | mmarczyk | and I honestly believe it's the very best technical book I ever read |
| 20:14 | MadWombat | mmarczyk: I guess it is up to jetty to provide a way to run compojure as a war |
| 20:15 | mmarczyk | MadWombat: couldn't say with any certainty |
| 20:15 | mmarczyk | I don't know much about Java Web deployment schemes |
| 20:15 | mmarczyk | (I suppose I'd like to change that) |
| 20:16 | joshua-choi | Question. A method called clojure.lang.RT.set is raising a "java.lang.IllegalArgumentException: Duplicate key: true", and I don't know why. |
| 20:16 | mmarczyk | but I'd probably look inside ring-servlet |
| 20:16 | joshua-choi | But I do know it has something to do with the preconditions in a function. |
| 20:16 | mmarczyk | slyphon: then there's EOPL and PAIP |
| 20:16 | slyphon | mmarczyk: i have an example of programmatically setting up a servlet container w/ jetty |
| 20:16 | mmarczyk | PAIP is more a "reading list" item now, but the bits I've read so far are fantastic |
| 20:17 | slyphon | ahh |
| 20:17 | slyphon | ok, these are the clasics |
| 20:17 | mmarczyk | so they are :-) |
| 20:17 | mmarczyk | I rather think the status is well deserved :-) |
| 20:17 | slyphon | hah |
| 20:17 | slyphon | well, i'll have a go then |
| 20:18 | mmarczyk | :-) |
| 20:18 | slyphon | i read ANSI Common Lisp and that free one online |
| 20:19 | mmarczyk | slyphon: I'd like to get some initial picture of what the Java Web stack looks like |
| 20:19 | mmarczyk | for starters |
| 20:19 | mmarczyk | right now I seem to be bumping into new acronymes all the time :-) |
| 20:19 | slyphon | mmarczyk: ah, well, you take what you think about "web serving" and you hit it with a hammer, then you take all those little shards and you make them into Classes and Frameworks seemingly at random |
| 20:20 | mmarczyk | Practical Common Lisp, I guess? |
| 20:20 | slyphon | mmarczyk: that's the one |
| 20:20 | nurv | mmarczyk: Maybe you'll enjoy "Lisp in small pieces" |
| 20:20 | slyphon | i find clojure is much easier to digest |
| 20:20 | slyphon | and *WAY* more fun than scala |
| 20:20 | mmarczyk | nurv: I think I would, I've skimmed it a couple of times and even the short bits I read were quite enlightening |
| 20:21 | nurv | mmarczyk: Very technical sometimes but it's worth it. |
| 20:21 | mmarczyk | slyphon: totally with you on that :-) |
| 20:21 | slyphon | :) |
| 20:21 | nurv | Some discussions on different object systems and environments are pretty "aha!" moments. |
| 20:23 | mmarczyk | nurv: well, that's definitely on my list |
| 20:23 | mmarczyk | and pretty high up :-) |
| 20:25 | nurv | EOPL has a new edition, but i didn't read it. |
| 20:25 | nurv | At least the source code works on PLT Scheme and new implementations. |
| 20:25 | slyphon | woah |
| 20:25 | mmarczyk | slyphon: my hopes of getting a clear picture of said Classes and Frameworks and how they fit together are already wrapped up in lots of duct tape after having fallen apart on a number of occasions |
| 20:25 | slyphon | :) |
| 20:26 | slyphon | i went from zero to deploying a couple of core pieces of the infrastructure of motionbox.com with jruby and jetty |
| 20:26 | slyphon | it takes a lot of reading and futzing, until you know what's safe to ignore |
| 20:26 | mmarczyk | nurv: eopl3 is a bit different from 2 |
| 20:26 | slyphon | b/c a lot of that javaee stuff is just over-complicated |
| 20:26 | mmarczyk | the most striking difference, to me |
| 20:27 | mmarczyk | is that it's not self-contained |
| 20:27 | mmarczyk | in that you have to get the define-datatype stuff |
| 20:27 | mmarczyk | as well as a lexer/parser |
| 20:27 | mmarczyk | somewhere |
| 20:27 | mmarczyk | and they don't help you with that at all :-) |
| 20:27 | nurv | Uhm, i remember downloading the sources and running some chapters without requiring anything else. |
| 20:27 | nurv | Mind you i've probably only tested the first ones. |
| 20:28 | mmarczyk | hm, really? |
| 20:28 | mmarczyk | well maybe I've got it mixed up with something else then, it's been a while back |
| 20:29 | scottj | sounds like you have the right thing: http://www.cs.indiana.edu/eopl/MLblurb.html |
| 20:29 | nurv | The only problem with EOPL is that the interpreters are quite inefficient for the sake of clarity. |
| 20:29 | clojurebot | Clarity of mind means clarity of passion, too; this is why a great and clear mind loves ardently and sees distinctly what it loves. -- Pascal |
| 20:29 | nurv | Heh. |
| 20:30 | nurv | But i suposse that's what LiSP and other books are for. |
| 20:30 | mmarczyk | slyphon: (-> over-complicated (#(apply @(ns-resolve 'clojure-core 'inc) %))) |
| 20:30 | slyphon | hah |
| 20:30 | nurv | Anyway, good night, going bed. |
| 20:30 | mmarczyk | nurv: there's a possible EOPL -> LiSP progression :-) |
| 20:31 | mmarczyk | see you! |
| 20:31 | nurv | mmarczyk: yes |
| 20:31 | nurv | That's mostly what i did. |
| 20:31 | nurv | SICP -> EOPL -> LiSP. |
| 20:31 | mmarczyk | nurv: well, I'm a bit past the middle of that road :-) |
| 20:31 | mmarczyk | nurv: can't wait to join you at the end :-) |
| 21:09 | remleduff | Is loading ~/.clojure/user.clj a clojure.main thing or does every repl implementation have to source that itself (if it does)? |
| 21:13 | hiredman | remleduff: I believe it's clojure.main |
| 21:27 | slyphon | uh, multimethods can have multiple arities, right? |
| 21:28 | carkh | (defmulti belh (fn [target & args] (:type target))) |
| 21:28 | slyphon | ok, thought so |
| 21:29 | carkh | (defmethod belh :type1 [a-type-1 arg1 arg2] ...) |
| 21:29 | mmarczyk | slyphon: I pushed a new branch |
| 21:29 | slyphon | mmarczyk: hah! |
| 21:29 | mmarczyk | with a proposed eval-based fix |
| 21:29 | slyphon | awesome |
| 21:29 | hiredman | they can have multiple arities, but your dispatch function needs to be able to handle every arity |
| 21:30 | mmarczyk | the previous version is still in there, commented out |
| 21:30 | slyphon | how about your methods? |
| 21:30 | slyphon | mmarczyk: ok :) |
| 21:30 | hiredman | doesn't matter |
| 21:30 | slyphon | ok, cool |
| 21:30 | mmarczyk | the methods need to handle every arity which makes sense for the given dispatch value |
| 21:31 | slyphon | that's what i thought, just wanted to make sure that was what the reality actually was |
| 21:33 | mmarczyk | slyphon: oh bother, I think I'm getting a bit tired here |
| 21:33 | mmarczyk | forgot to commit before pushing |
| 21:33 | slyphon | hah |
| 21:33 | slyphon | i have quite a few commit messages at work "doh! helps to add the file" |
| 21:34 | slyphon | (and i'm not the only one) |
| 21:34 | mmarczyk | :-) |
| 21:34 | mmarczyk | done now |
| 21:34 | slyphon | k |
| 21:36 | mmarczyk | and if you have it return doto# instead of (eval doto#), you'll get a more digestible view of what would happen with eval than with macroexpand |
| 21:38 | slyphon | uh |
| 21:38 | slyphon | what's #_ ? |
| 21:38 | slyphon | comment? |
| 21:39 | remleduff | Yeah, completely hides the following form, as opposed to (comment) which returns nil |
| 21:40 | hiredman | in both case the stuff commented out needs to be readable |
| 21:40 | slyphon | interesting |
| 21:41 | remleduff | I've been using swank-clojure-project and am trying to switch to lein swank, but I don't seem to have any M-x slime-connect available (I do have slime-repl) installed. Any ideas? |
| 21:41 | slyphon | that's kind of odd |
| 21:42 | slyphon | mmarczyk: wait, you're nesting `() ? |
| 21:42 | slyphon | that's why the gensyms work in the inner form? |
| 21:43 | mmarczyk | remleduff: can you check if M-x slime-connect becomes available after you launch a repl with swank-clojure-project? |
| 21:43 | mmarczyk | slyphon: the autogensyms work at the same nesting level, I believe |
| 21:43 | slyphon | hrm, you're using k# on line 34 |
| 21:43 | remleduff | mmarczyk: Yeah, a bunch of slime functions become available after swank-clojure-project |
| 21:44 | slyphon | remleduff: (require 'slime) ? |
| 21:45 | remleduff | slyphon: Yep, thanks |
| 21:45 | mmarczyk | slyphon: just checked and so it is |
| 21:46 | mmarczyk | http://pastie.org/932493 |
| 21:46 | mmarczyk | note how the k# occurs within an unquoted form |
| 21:47 | mmarczyk | it's still syntax-quoted, but just one level, while the . is at level 2 |
| 21:47 | slyphon | wow |
| 21:48 | slyphon | ok, i need to go "back to the woodshed" and study some of this stuff |
| 21:48 | hiredman | you don't need macros to use ` |
| 21:48 | hiredman | ,`x# |
| 21:48 | clojurebot | x__11270__auto__ |
| 21:48 | mmarczyk | it could be useful to test it :-) |
| 21:48 | slyphon | ah, ok |
| 21:48 | slyphon | :) |
| 21:49 | hiredman | ,(let [x '(1 2 3)] `(~@x)) |
| 21:49 | clojurebot | (1 2 3) |
| 21:49 | slyphon | the macro only affects when the parameters are evaluated? |
| 21:50 | slyphon | that's the "macroness"? |
| 21:50 | hiredman | right |
| 21:50 | mmarczyk | or you could say |
| 21:51 | mmarczyk | a macro function operates on the form to be compiled |
| 21:51 | hiredman | ,(:macro (meta #'defn)) |
| 21:51 | clojurebot | true |
| 21:51 | hiredman | ,(:macro (meta #'+)) |
| 21:51 | clojurebot | nil |
| 21:51 | hiredman | that is the difference |
| 21:51 | mmarczyk | as opposed to runtime parameter values operated upon by regular functions |
| 21:52 | mmarczyk | so, a macro is a perfectly regular function, but it gets called when the code is compiled |
| 21:52 | slyphon | when i first started learning unix, someone told me "Everything is a file". It took me about 5 years until i *really* understood the implications of that |
| 21:52 | slyphon | i have a feeling this is something similar :) |
| 21:52 | mmarczyk | :-) |
| 21:53 | slyphon | mmarczyk: that makes sense |
| 21:53 | slyphon | and i kind of grok that, i think i just haven't had enough practice thinking about the code in that way |
| 21:54 | slyphon | the "code is data, data is code" thing that drives people mad |
| 21:54 | mmarczyk | have you ever used Scheme? |
| 21:55 | slyphon | no, but i feel that i should |
| 21:55 | mmarczyk | syntax-rules macros are cool :-) |
| 21:55 | slyphon | hah |
| 21:55 | mmarczyk | http://www.xs4all.nl/~hipster/lib/scheme/gauche/define-syntax-primer.txt |
| 21:56 | mmarczyk | there's nothing whatsoever strange about CL-style macros when you compare it with that :-) |
| 21:56 | mmarczyk | on the surface, that is, semantically I kinda feel the reverse is true |
| 21:57 | slyphon | "I have noticed that it is easy to |
| 21:57 | slyphon | find both trivial examples and extraordinarily complex examples, but |
| 21:57 | slyphon | there seem to be no intermediate ones." |
| 21:58 | slyphon | sorry, i thought that'd be one line |
| 21:58 | hiredman | mmarczyk: you could port syntax-rules to clojure |
| 21:58 | slyphon | but that's very astute |
| 21:59 | mmarczyk | hiredman: actually I was thinking of doing that |
| 21:59 | slyphon | mmarczyk: these differ from regular macros in what way? |
| 22:00 | mmarczyk | slyphon: scroll down and have a look at some of the examples :-) |
| 22:00 | mmarczyk | there's a completely different syntax |
| 22:00 | mmarczyk | that's the superficial part |
| 22:00 | mmarczyk | then they are hygienic |
| 22:00 | mmarczyk | meaning that they prevent variable capture and the like |
| 22:01 | gregh | somewhere I saw a port of syntax-rules to CL |
| 22:01 | hiredman | clojure does make it a pain to capture symbols |
| 22:02 | gregh | it'd still probably need significant work to port it again to clojure |
| 22:02 | mmarczyk | consider (defmacro aif ([pred then] (aif pred then else)) ([pred then else] (list 'let ['it pred] (list 'if then else)))) |
| 22:02 | slyphon | there's an example of how to do it in the Programming Clojure book |
| 22:02 | slyphon | (symbol capture, that is) |
| 22:02 | hiredman | ~'foo |
| 22:02 | clojurebot | Huh? |
| 22:02 | hiredman | I mean, it's not that much of a pain |
| 22:02 | hiredman | ,`~'foo |
| 22:02 | clojurebot | foo |
| 22:02 | mmarczyk | gregh: I might google around for it then |
| 22:03 | mmarczyk | I was thinking of stealing ideas from PLT sources |
| 22:03 | slyphon | are there multiple schemes? |
| 22:03 | hiredman | yes |
| 22:03 | slyphon | like the plethora of CL implementations? |
| 22:03 | mmarczyk | slyphon: loads |
| 22:03 | hiredman | scheme is legion |
| 22:03 | slyphon | uh |
| 22:03 | slyphon | hiredman: hah! |
| 22:03 | slyphon | which one would you guys recommend? |
| 22:03 | slyphon | for someone just learning |
| 22:03 | hiredman | *shrug* I prefer clojure |
| 22:04 | mmarczyk | slyphon: more than one per Schemer |
| 22:04 | mmarczyk | :-) |
| 22:04 | slyphon | hah |
| 22:04 | hiredman | I think someone was writing a scheme interpreter in clojure |
| 22:04 | gregh | mmarczyk: http://www.ccs.neu.edu/home/dorai/mbe/mbe-lsp.html |
| 22:04 | sexpbot | "Scheme Macros for Common Lisp" |
| 22:04 | mmarczyk | MIT Scheme makes it easy to go along with SICP and the classical mechanics book |
| 22:04 | mmarczyk | Structure and Interpretation of Classical Mechanics |
| 22:04 | hiredman | ~google clojure scheme |
| 22:04 | clojurebot | First, out of 22400 results is: |
| 22:04 | clojurebot | Clojure Programming/Tutorials and Tips - Wikibooks, collection of ... |
| 22:04 | clojurebot | http://en.wikibooks.org/wiki/Clojure_Programming/Tutorials_and_Tips |
| 22:04 | hiredman | bah |
| 22:05 | hiredman | ~google scheme in clojure |
| 22:05 | clojurebot | First, out of 23200 results is: |
| 22:05 | clojurebot | Clojure Programming/Tutorials and Tips - Wikibooks, collection of ... |
| 22:05 | mmarczyk | gregh: thanks a bunch! |
| 22:05 | clojurebot | http://en.wikibooks.org/wiki/Clojure_Programming/Tutorials_and_Tips |
| 22:05 | mmarczyk | I'll be taking a close look at that |
| 22:05 | hiredman | ttp://clojure.wikidot.com/scheme-interpreter-in-clojure is the real url |
| 22:05 | hiredman | with an h |
| 22:06 | slyphon | hah "Scheme 9 From Empty Space" |
| 22:06 | mmarczyk | slyphon: there's a so-called "language level" -- a customised version of Scheme -- for EOPL in PLT Scheme |
| 22:06 | mmarczyk | um, ouch |
| 22:06 | mmarczyk | I mean Racket |
| 22:06 | slyphon | still not as good as the "run plan 9 as a regular program" project "Plan 9 from Userspace" |
| 22:07 | mmarczyk | I use Petite Chez Scheme for Project Euler |
| 22:07 | mmarczyk | PLT for other stuff |
| 22:09 | hiredman | seems like a port of syntax-rule to clojure should take advantage of clojure's destructuring |
| 22:11 | hiredman | (defsyntax-rule {(foo [first & rest]) (conj (vec rest) first)}) |
| 22:11 | hiredman | right needs a name |
| 22:12 | hiredman | (defsyntax-rule first->last {(foo [first & rest]) (conj (vec rest) first)}) |
| 22:13 | hiredman | (first->last (list 1 2 3)) => (let [[first_12 & rest_85] (list 1 2 3)] (conj (vec rest_85) first_12)) |
| 22:13 | mmarczyk | apparently there's no licence on that code |
| 22:13 | slyphon | it's free! |
| 22:15 | mmarczyk | ah, LGPL actually |
| 22:16 | slyphon | oof |
| 22:16 | slyphon | Can't embed object in code, maybe print-dup not defined: atomikos MessageProducer proxy for HornetQRAMessageProducer->org.hornetq.core.client.impl.ClientProducerImpl@75896415 |
| 22:16 | slyphon | weird |
| 22:18 | hiredman | oooo |
| 22:18 | hiredman | you doing stuff with hornetq? |
| 22:18 | slyphon | yup |
| 22:18 | slyphon | *way* more stable than AMQ |
| 22:19 | slyphon | hah |
| 22:19 | hiredman | clojurebot was sticking messages on the queue and my laptop was picking them up over openvpn |
| 22:19 | slyphon | nice |
| 22:19 | hiredman | very enterprise |
| 22:20 | slyphon | yeah, just gotta slap a web front-end on it and you can start charging for support |
| 22:23 | _rata_ | what do I have to do to make swank-clojure works? |
| 22:24 | _rata_ | I've followed the instructions here http://www.assembla.com/wiki/show/clojure/Getting_Started_with_Emacs |
| 22:24 | sexpbot | "Getting Started with Emacs | Clojure | Assembla" |
| 22:24 | _rata_ | but it doesn't work yet |
| 22:24 | _rata_ | it says: (progn (load "/usr/share/emacs/site-lisp/slime/swank-loader.lisp" :verbose t) (funcall ... |
| 22:24 | _rata_ | in the first line of the REPL |
| 22:24 | _rata_ | and then: java.lang.Exception: Unable to resolve symbol: progn in this context (NO_SOURCE_FILE:1) |
| 22:25 | hiredman | haha |
| 22:25 | slyphon | http://technomancy.us/126 |
| 22:25 | sexpbot | "in which are found tricks of the trade concerning clojure authorship - Technomancy" |
| 22:25 | slyphon | i found that guide to be quite useful |
| 22:25 | hiredman | _rata_: what exactly are you doing |
| 22:26 | hiredman | that exception says you are trying to evaluate elisp as clojure |
| 22:26 | _rata_ | first I did install package.el |
| 22:26 | hiredman | woa |
| 22:26 | _rata_ | then I do M-x package-list-packages and install clojure-mode, slime, slime-repl and swank-clojure |
| 22:26 | hiredman | wait |
| 22:27 | hiredman | you did (progn (load "/usr/share/emacs/site-lis... at a clojure repl? |
| 22:27 | _rata_ | no |
| 22:27 | _rata_ | that was what emacs did |
| 22:27 | _rata_ | when I put M-x slime |
| 22:28 | hiredman | _rata_: pretty sure you don't want to install slime and slime-repl |
| 22:28 | _rata_ | why? |
| 22:28 | clojurebot | why not? |
| 22:28 | hiredman | swank-clojure or clojure-mode pull in the clojure parts of slime |
| 22:29 | _rata_ | ahh ok |
| 22:29 | hiredman | the slime stuff listed in epl is most likely the common lisp slime stuff |
| 22:29 | _rata_ | and how do I remove them? |
| 22:29 | hiredman | darned if I know |
| 22:29 | mmarczyk | actually I thought that elpa users are expected to install slime separately |
| 22:30 | mmarczyk | but I wouldn't really know, I'm using my own checkout |
| 22:30 | _rata_ | do I need paredit? |
| 22:30 | hiredman | yes |
| 22:30 | _rata_ | ok |
| 22:30 | hiredman | last I heard clojure slime and upstream slime did not play well together |
| 22:31 | mmarczyk | _rata_: maybe not strictly need it, but you should definitely want it :-) |
| 22:31 | mmarczyk | hiredman: in some ways |
| 22:31 | mmarczyk | but elpa is behind upstream |
| 22:31 | hiredman | if you aren't already an emacs user I recommend you get the starter kit |
| 22:31 | mmarczyk | possibly partly for this reason |
| 22:32 | mmarczyk | as a side note, SLIME HEAD works perfectly fine for me |
| 22:32 | mmarczyk | I trust people who say that slime-autodoc doesn't work |
| 22:32 | _rata_ | and do I need to set the inferior-lisp-program in .emacs? |
| 22:32 | mmarczyk | and not load it, that's all |
| 22:33 | _ato | you shouldn't normally need anything slime/swank related in .emacs when using swank-clojure |
| 22:34 | mmarczyk | oh? where does elpa put its autoloads etc. then? |
| 22:35 | hiredman | ~google emacs starter kit |
| 22:35 | clojurebot | First, out of 2680 results is: |
| 22:35 | clojurebot | technomancy's emacs-starter-kit at master - GitHub |
| 22:35 | clojurebot | http://github.com/technomancy/emacs-starter-kit |
| 22:36 | hiredman | it's good stuff |
| 22:36 | hiredman | the only real problem is the starter kit is setup to make parens a faint gray |
| 22:37 | _rata_ | I unistalled everything removing .emacs.d/elpa |
| 22:37 | hiredman | _rata_: get the starter-kit, it will make your life easier |
| 22:37 | _ato | mmarczyk: if I remember correctly elpa just activates everything that's installed (ie everything that's in ~/.emacs/elpa) |
| 22:37 | _rata_ | but when I install swank-clojure again, it also installed slime and slime-repl :( |
| 22:37 | hiredman | I believe it comes with clojure-mode at least, and maybe swank-clojure as well |
| 22:37 | _ato | err ~/.emacs.d/elpa I mean |
| 22:38 | mmarczyk | _ato: I see, thanks |
| 22:39 | mmarczyk | if that means pulling everything in at startup time... oh dear |
| 22:39 | _ato | mmarczyk: activate == install autoloads, not fully load everything |
| 22:40 | mmarczyk | oh ok |
| 22:44 | _rata_ | mmmm... I don't get it |
| 22:44 | _rata_ | I removed my .emacs file and removed .emacs.d/elpa |
| 22:45 | _rata_ | installed the starter-kit |
| 22:45 | _rata_ | and now I have my emacs as it was the first day I installed it |
| 22:45 | _rata_ | I don't even have the M-x package-list-packages |
| 22:46 | _rata_ | thing |
| 22:46 | hiredman | _rata_: are you sure you installed starter-kit correctly? |
| 22:47 | _rata_ | cd ~/.emacs.d && git clone http://github.com/technomancy/emacs-starter-kit.git |
| 22:47 | _ato | ah |
| 22:47 | hiredman | :| |
| 22:47 | _ato | you've got in a subdirectory then |
| 22:47 | _rata_ | yes... that says the README |
| 22:48 | _ato | do: mv ~/.emacs.d/emacs-starter-kit ~ && rmdir ~/.emacs.d && mv ~/emacs-starter-kit ~/.emacs.d |
| 22:48 | _rata_ | "Move the directory containing this file to ~/.emacs.d" |
| 22:48 | _rata_ | ok |
| 22:48 | hiredman | right, not ~/.emacs.d/ |
| 22:50 | _rata_ | well, it's working now :) |
| 22:50 | _rata_ | there were a lot of errors/warnings while compiling though |
| 22:50 | hiredman | now you just need autocomplete and rainbow parens |
| 22:51 | hiredman | thats normal, don't worry about it |
| 22:51 | _rata_ | ok |
| 22:51 | _rata_ | hiredman: what's autocomplete and rainbow parens? |
| 22:52 | _rata_ | that sounds interesting |
| 22:52 | hiredman | http://www.emacswiki.org/emacs/AutoComplete |
| 22:52 | sexpbot | "EmacsWiki: Auto Complete" |
| 22:53 | _rata_ | (now, I did M-x package-list-packages, selected clojure-mode and swank-clojure from the list, and again slime and slime-repl got installed) |
| 22:53 | hiredman | *shrug* |
| 22:53 | hiredman | M-x slime |
| 22:53 | _ato | it's normal for slime and slime-repl to be installed |
| 22:53 | _ato | as dependencies |
| 22:54 | _ato | I have them at least anyway |
| 22:54 | _rata_ | is autocomplete better than company? |
| 22:54 | hiredman | http://dishevelled.net/elisp/rainbow-parens.el |
| 22:54 | hiredman | company? |
| 22:55 | hiredman | I have nod idea |
| 22:55 | _rata_ | ok |
| 22:55 | slyphon | i use autocomplete |
| 22:55 | slyphon | it's a'ight |
| 22:56 | hiredman | the company mode wiki page has some discussion of company vs. ac as does the ac wikipage |
| 22:57 | _rata_ | what does rainbow-parens do? |
| 22:58 | _rata_ | well, slime seems to be working now... how do I say to swank-clojure how to execute clojure? (it says clojure is not installed, but it is) |
| 22:58 | _ato | rainbow-parens is designed to burn out your eyes ;-) |
| 22:59 | slyphon | haha |
| 22:59 | hiredman | http://tinypic.com/view.php?pic=2urqmgl&s=6 |
| 23:00 | sexpbot | "emacs rainbow-parens Pictures, emacs rainbow-parens Images, emacs rainbow-parens Photos, emacs rainbow-parens Videos - Image - TinyPic - Free Image Hosting, Photo Sharing & Video Hosting" |
| 23:00 | hiredman | it changes the color of parens based on nesting level |
| 23:00 | hiredman | very handy |
| 23:01 | slyphon | wow, mit-scheme takes a *long* time to compile |
| 23:07 | mmarczyk | I prefer highlight-parentheses |
| 23:07 | mmarczyk | but guess it does the same ultimately |
| 23:08 | slyphon | well, one is on-demand |
| 23:11 | slyphon | jeez |
| 23:11 | slyphon | that's not meant to be a come-on |
| 23:12 | _rata_ | hahahahahaha |
| 23:13 | mmarczyk | slyphon: no precompiled package for your OS? |
| 23:13 | slyphon | well |
| 23:13 | slyphon | i'm using macports |
| 23:16 | mmarczyk | http://www.gnu.org/software/mit-scheme/ |
| 23:16 | sexpbot | "MIT/GNU Scheme - GNU Project - Free Software Foundation (FSF)" |
| 23:16 | mmarczyk | they've got MacOS X binaries |
| 23:16 | danlarkin | that really is annoying |
| 23:17 | slyphon | mmarczyk: well, i'll use that if ti goes from a first-degree to second-degree burn |
| 23:18 | mmarczyk | :-) |
| 23:32 | _rata_ | mmmm.. there are some annoying things with the emacs starter kit... how do I get rid of that green line over the current line? |
| 23:33 | hiredman | that is most likely hl-line-mode |
| 23:34 | _rata_ | hiredman: thanks :) |
| 23:34 | slyphon | oh, i always thought that was part of cedet |
| 23:34 | slyphon | oh, that's above each method decl |
| 23:40 | slyphon | wow |
| 23:40 | slyphon | that took almost an hour |
| 23:43 | _rata_ | how do I inform swank-clojure where do I have clojure installed? |
| 23:44 | mmarczyk | hm, rainbow-paren has very clean sources apparently |
| 23:45 | _rata_ | I couldn't make rainbow-parens work :( |
| 23:45 | mmarczyk | did it complain about not being able to find paredit or sth? |
| 23:46 | Raynes | Ew @ hl-line-mode |
| 23:46 | mmarczyk | if so, highlight-parentheses is self-contained, so you could use that instead |
| 23:46 | mmarczyk | so as to avoid the hassle of fixing things and yet have highlighted parens... |
| 23:46 | remleduff | If I quit emacs and choose to "kill the active connection and then exit", I can't M-x slime-connect after restarting emacs. Is that my fault for quitting the wrong way? |
| 23:46 | mmarczyk | but r-p's code is in fact so clean that I might be able to write a cool advice for it |
| 23:46 | slyphon | remleduff: that's odd |
| 23:47 | remleduff | It says "connection refused" |
| 23:47 | slyphon | oh, you have to restart the clojure process |
| 23:49 | Raynes | It looks like one of my dependencies is turning *warn-on-reflection* on, and I'm getting reflection warnings everywhere. Is there a way to force it to stay off? |
| 23:49 | remleduff | Yeah, I was thinking the whole point of lein swank was that it would survive emacs restarts |
| 23:50 | slyphon | nah, it's more that you can specify the command-line args more easily (i found) |
| 23:50 | slyphon | customize them per-project |
| 23:54 | _rata_ | mmarczyk: it doesn't say anything |
| 23:54 | _rata_ | but the parens are the same as before when I do (require 'rainbow-parens) |
| 23:56 | hiredman | (rainbox-parens-mode 1) |
| 23:57 | hiredman | rainbow |
| 23:57 | hiredman | (rainbow-paren-mode t) is what is in my hiredman.el |
| 23:58 | _rata_ | :) thanks again |
| 23:58 | slyphon | o/` Just a box of rain, or a ribbon for your hair... o/` |