2010-07-13
| 00:07 | cais2002 | is there a built-in or easy way to do transposing of matrix ? (transpose [ [1 2] [3 4] [5 6] ] ) => [ [1 3 5] [2 4 6] ] |
| 00:08 | qbg | ,(apply map vector [[1 2] [3 4] [5 6]]) |
| 00:08 | clojurebot | ([1 3 5] [2 4 6]) |
| 01:54 | TimMc | Man, debugging Clojure code *stinks*. |
| 01:54 | TimMc | I suspect this is mainly due to poor error messages. |
| 01:55 | TimMc | (on the part of library authors) |
| 01:57 | technomancy | TimMc: clj-stacktrace is a huge help for that |
| 01:57 | technomancy | highly recommended |
| 02:00 | TimMc | clojure.contrib.shell-out/sh assumes all arguments are strings. My code passed in an argument that was supposed to be a string, but turned out to be an int. The result? "ava.lang.IllegalArgumentException: array element type mismatch" |
| 02:01 | TimMc | The joys of dynamic type. |
| 02:05 | TimMc | So, in the case of clojure.contrib.shell-out, where does responsibility lie for ensuring all args are strings? http://github.com/richhickey/clojure-contrib/blob/master/src/main/clojure/clojure/contrib/shell_out.clj |
| 04:12 | esj | (map greetings #clojure) |
| 04:25 | mikem | is it possible to add metadata to functions? at the point of definition (with defn)? |
| 04:39 | esj | mikem: try (defn ^{:doc "foo" :bar "baz"} mfoo [] :foo-bar) |
| 04:40 | esj | then (:bar (meta mfoo)) gives you "baz" |
| 04:41 | mikem | ok, it's working :) |
| 04:41 | mikem | esj: thanks |
| 04:41 | esj | np dude. |
| 04:45 | ponzao____ | esj, is the meta call somehow cached. I created the function and tried (meta mfoo) -> {:ns #<Namespace user>, :name mfoo} |
| 04:45 | ponzao____ | and when I redefined the function it gave me {:ns #<Namespace user>, :name mfoo, :file "NO_SOURCE_PATH", :line 1, :arglists ([]), :doc "foo", :bar "baz"} |
| 04:45 | mikem | yeah, also there's a difference in the results of (meta mfoo) and (meta #'mfoo) |
| 04:47 | ponzao____ | (meta #'mfoo) seems to give up-to-date information |
| 04:47 | Chousuke | note that metadata on functions is new in 1.2 |
| 04:48 | Chousuke | docstrings etc. are metadata on the *var*, not the function |
| 04:48 | mikem | Chousuke: ah, ok, so that's the difference between (meta mfoo) and (meta #'mfoo)? |
| 04:49 | mikem | the former is metadata of the function, while the latter is metadata of the var? |
| 04:49 | Chousuke | mikem: the latter is (meta (var foo)) |
| 04:49 | Chousuke | mfoo* |
| 04:50 | Chousuke | mikem: so yes |
| 04:50 | Chousuke | mikem: the former is new stuff; it means you can now add metadata to functions you store in data structures |
| 04:50 | Chousuke | mikem: which wasn't possible previously |
| 04:51 | mikem | Chousuke: so is this the correct way to add this metadata to the function? (defn ^{:custom-metadata "stuff"} mfoo "docstring" [& args] (...)) ? |
| 04:52 | Chousuke | mikem: with defn, yes. |
| 04:52 | esj | whew ! |
| 04:53 | Chousuke | mikem: for anonymous functions I think you need to use either with-meta or (fn ^{:metadata 'here} [] ...) but I'm not sure about the latter. |
| 04:53 | mikem | what happens when you call defn twice? I notice that the metadata of the function is not updated. Does this mean the var is updated, but the function object (IFn instance?) is not? |
| 04:53 | Chousuke | the function object is immutable |
| 04:53 | Chousuke | so it can't be updated |
| 04:54 | mikem | hehe of course :) hm... |
| 04:54 | Chousuke | what happens when you redefine a function is simply that the var gets a new value |
| 04:54 | mikem | so in that case, is the function object only created once, and reused in future calls to defn with the same name? that doesn't sound right |
| 04:55 | Chousuke | no, a new function object is created |
| 04:55 | Chousuke | with the same name |
| 04:55 | Chousuke | the old one is then garbage-collected if you haven't stored it anywhere |
| 04:56 | Chousuke | just like any other value |
| 04:57 | Chousuke | at least, that should happen :P |
| 04:57 | Chousuke | if it's not actually happening then something weird is going on. |
| 05:00 | mikem | it doesn't seem to be working quite as advertised: http://paste.lisp.org/display/112420 |
| 05:06 | Chousuke | that looks like a bug to me |
| 05:11 | mikem | doesn't look like I'm able to create new tickets in assembla |
| 05:21 | mikem | can someone here file that as a bug? otherwise I could post it to the mailing list |
| 05:31 | bsteuber | in a mixed clojure/java project, how can I have dependencies in both directions without too much headache? |
| 05:39 | Chousuke | bsteuber: probably, as long as they're not circular |
| 05:40 | bsteuber | Chousuke: they're not, but I'm not sure how to correctly setup maven |
| 05:40 | bsteuber | I thought I read a post about this issue once - but I can't find it anymore |
| 05:42 | tomoj | are the java and clojure parts separate modules? |
| 05:42 | tomoj | I'm not asking because I think I can help you, just because I'm curious :) |
| 05:43 | neotyk | bsteuber: have you considered lein? http://github.com/neotyk/lein-javac |
| 05:44 | neotyk | bsteuber: you could try doing something like |
| 05:44 | neotyk | *** |
| 05:44 | neotyk | http://github.com/neotyk/lein-javac/blob/hook/src/leiningen/hooks/javac.clj |
| 05:44 | neotyk | as long as you use lein 1.2-RC2 |
| 05:45 | bsteuber | neotyk: interesting - I once made the choice for maven, but if this issue is easier using lein, I might switch over again |
| 05:47 | djpowell | i have mixed clojure/java stuff. i 'solved' it by making a base subproject of java interfaces, then clojure that compiles against them, then the main java project compiles against the clojure |
| 05:47 | djpowell | not entirely happy with that tho - doesn't seem very scalable |
| 05:48 | djpowell | seems like lots of admin if you need to change things around |
| 05:48 | neotyk | bsteuber: I've been have maven user for long time, lein takes all |
| 05:48 | neotyk | *** good parts of maven, and improves rest |
| 05:48 | djpowell | i use ant btw |
| 05:49 | neotyk | djpowell: you know that ant creator have said he is sorry for |
| 05:49 | neotyk | *** creating ant? |
| 05:49 | bsteuber | I think most use cases will be calling java from clojure from java |
| 05:49 | djpowell | i heard that, he must be more polite than the maven creator |
| 05:49 | bsteuber | so once back and forth |
| 05:50 | djpowell | yeah ant does seem vaguely ridiculous - but if you are doing basic stuff, and you have a project to copy and paste from, it isn't too bad |
| 05:50 | neotyk | djpowell: that takes some guts to admit, true |
| 05:51 | djpowell | at least I don't have to write a 'module' or whatever maven calls them to do any kind of custom task, and start writing jar files and manifests. |
| 05:51 | neotyk | bsteuber: you could create your own plugin for lein it is as |
| 05:51 | neotyk | *** simple as putting thinkgs in proper packages |
| 05:52 | neotyk | bsteuber: so you would like to build first-part-java, clojure |
| 05:52 | neotyk | *** aot, second-part-java? |
| 05:52 | bsteuber | but no matter which tool I use, I guess I have to give it the right compilation order, right? |
| 05:52 | bsteuber | so compile standalone java classes, then clojure stuff, then dependent java classes |
| 05:53 | neotyk | bsteuber: my usecase for lein-java was simple wrapper in java |
| 05:53 | neotyk | *** that clj depended upon |
| 05:53 | neotyk | I was thinking of it |
| 05:53 | bsteuber | would be nice to have an automatic resolution of this |
| 05:54 | djpowell | at the moment, my interfaces are defined in java, and the gen-classed clojure is implementation. with clojure 1.2, and protocols, interfaces are more likely to be defined in clojure, so things might need a rethink |
| 05:54 | neotyk | that should be no biggie to do with lein-javac |
| 05:54 | neotyk | bsteuber: automatic resolution is asking a lot :P |
| 05:54 | neotyk | but agree, it would be very nice |
| 05:55 | djpowell | it would be handy if you could compile gen-classed stuff in a mode that creates the java linkage classes, but doesn't worry about compiling anything else in there |
| 05:55 | bsteuber | sure, always asking for much :) |
| 05:55 | djpowell | spose that would work for gen-class, but not for deftype tho |
| 05:56 | bsteuber | how about trying to parse import statements from all clj and java files, building a dependency graph and then doint the compilation? |
| 05:56 | bsteuber | this could even resolve cyclic deps by inserting dummy methods at first |
| 05:56 | neotyk | in java there I ways to include w/o including |
| 05:56 | neotyk | Class.forName and alike |
| 05:56 | bsteuber | hrmpf |
| 05:57 | djpowell | neotyk: that wouldn't matter tho would it |
| 05:57 | djpowell | neotyk: if it isn't a compile-time dependency, then you don't need to compile it first |
| 05:57 | neotyk | djpowell: true, true |
| 05:57 | djpowell | but it isn't just include - explicitly qualified references in code too |
| 05:59 | djpowell | easiest way might be to get clojure to compile some stub classes for gen-class, deftype etc, that didn't contain implementation. then compile the java, then either recompile the clojure |
| 05:59 | bsteuber | so I guess automatic dependency resolution will never work then, right? |
| 05:59 | bsteuber | djpowell: I like that |
| 06:00 | bsteuber | would that always work? |
| 06:00 | djpowell | no idea |
| 06:01 | bsteuber | so how would I implement this, say as a lein plugin |
| 06:02 | bsteuber | I guess I'd have to macroexpand the clj files completely to make sure I'll get all gen-class etc. |
| 06:03 | bsteuber | and then replace it by dummy defs |
| 06:04 | djpowell | I suspect it would be hard |
| 06:04 | djpowell | What if the classes corresponding to the parameter types are in the java? |
| 06:05 | djpowell | was only a vague idea - probably not practical without some hacking of the compiler, and even then, I haven't thought it through |
| 06:06 | bsteuber | djpowell: I agree, too bad |
| 06:06 | bsteuber | so I'll have to give the order by hand |
| 06:07 | djpowell | would it be practical to avoid using gen-class for linkage and dynamically look up the function from java using RT |
| 06:13 | bsteuber | djpowell: maybe, I'll think that over |
| 06:17 | robtp | ?paste |
| 06:17 | robtp | hi - can anyone tell me why http://gist.github.com/473695 |
| 06:18 | robtp | results in clojure.lang.PersistentArrayMap cannot be cast to java.lang.String |
| 06:20 | robtp | okay - then my problem actually is that clojure-http.resourcefully/get is somehow being referred in the namespace |
| 06:20 | robtp | which i don't want, and i thought i had worked my way around |
| 06:23 | esj | robtp: if that's the case then an :exclude clause in the (ns ...) should work around ? |
| 06:24 | robtp | esj: but i'm referreing resourcefully as :res, so why does it still trample on clojure.core/get? |
| 06:25 | esj | robtp: i haven't a clue :) |
| 06:25 | robtp | i can (:refer-clojure :exclude [get]), and then use clojure.core/get |
| 06:25 | robtp | i was also wondering why i variously see :use and use, :require and require |
| 06:27 | esj | robtp: I might have this wrong but I think its to do with (ns ...) being a macro and (use ...) etc being functions. |
| 06:38 | robtp | when does one use binding vs let? |
| 06:41 | esj | binding is for dynamic binding, let for lexical |
| 06:41 | Chousuke | robtp: they both do binding, but the semantics are very different. |
| 06:41 | robtp | if i were to let *connect-timeout* 10, and then call a fn that checks *connect-timeout*, would that not have an effect, where binding would? |
| 06:42 | Chousuke | right. |
| 06:42 | esj | yup |
| 06:42 | Chousuke | lexical means code that's "textually" within the scope |
| 06:43 | Chousuke | dynamic affects code that's executed within the scope at runtime. |
| 06:43 | Chousuke | though note that binding only establishes thread-local dynamic bindings. |
| 06:43 | robtp | Chousuke, esj: thanks |
| 06:44 | robtp | Chousuke: i think that's all i'm looking for |
| 06:44 | Chousuke | also laziness can bite you if you're not careful :) |
| 06:44 | Chousuke | altogether dynamic binding can be useful sometimes but it's easy to make mistakes :P |
| 06:45 | robtp | hmmm, http://gist.github.com/473714 is not right then |
| 06:45 | robtp | *connect-timeout* is used in res/post |
| 06:46 | robtp | but i get an error complaining "cannot resolve var ... in this context" |
| 06:46 | robtp | and then my second question is why referring resourcefully as res still causes its get to trample on clojure.core/get |
| 06:46 | Chousuke | *connect-timeout* is in the res-namespace isn't it? |
| 06:46 | Chousuke | without the - |
| 06:46 | Chousuke | so you need to do (binding [res/*connect-timeout*] ...) |
| 06:47 | Chousuke | robtp: because of :use. you want :require |
| 06:47 | Chousuke | robtp: the ns macro is kind of confusing :P |
| 06:48 | robtp | why can i write both :use and use, :require and reuqire? |
| 06:48 | Chousuke | the :keywords are part of ns structure, use and require are the macros/functions it actually uses to do the work |
| 06:48 | robtp | which is preferable to use? |
| 06:49 | robtp | hmm (:require [clojure-http.resourcefully :as res] still results in an error? |
| 06:49 | Chousuke | It shouldn't. :/ |
| 06:49 | Chousuke | are you sure you properly re-evaluated everything? |
| 06:49 | robtp | no |
| 06:49 | Chousuke | if you're in a repl maybe the old stuff is still there |
| 06:50 | Chousuke | happens often with slime |
| 07:13 | r2q2 | Can I generate xml with hiccup? |
| 07:21 | robtp | i have a lazy sequence of strings, what's the generally-accepted clean way to force evalutaion - i need to join that sequence - but (str-join "," body-seq) gives me c,l,o,j ... ie the class name |
| 07:33 | Chousuke | robtp: call seq on body-seq |
| 07:37 | Chousuke | robtp: btw, your annotate function has weird use of assoc |
| 07:37 | robtp | what ought i do? |
| 07:37 | robtp | this code is probably very un-idiomatic :) |
| 07:38 | Chousuke | you're doing (do (assoc options :ontologiesToExpand ontologies) (assoc options :ontologiesToKeepInResult ontologies)) |
| 07:38 | Chousuke | which doesn't even work |
| 07:38 | Chousuke | options never changes. |
| 07:38 | Chousuke | it's immutable |
| 07:39 | robtp | how can i accomplish that which i'm trying? |
| 07:39 | Chousuke | I'm not sure what your intention is |
| 07:40 | robtp | set default values |
| 07:40 | robtp | so i should probably just merge another map, huh? |
| 07:40 | Chousuke | hm |
| 07:41 | robtp | wait, no, sorry, i misspoke |
| 07:41 | Chousuke | you need to restructure the code first so that you actually capture the new options map |
| 07:41 | robtp | if an :ontologies option is given, i want to set those two keys :ontologiesToExpand, ... in options |
| 07:41 | Chousuke | right. options is immutable so the way you're doing it does exactly nothing :) |
| 07:42 | Chousuke | what you need to do is (let [new-options (assoc options :ontologiesToExpand ontologies, :ontologiesToKeepInResult ontologies)] ...) |
| 07:42 | robtp | so if :ontologies is in the options map, i want to set those two keys, otherwise continue as normal |
| 07:43 | Chousuke | "set" is kind of imperative terminology |
| 07:43 | Chousuke | what you mean is you want a new map with those keys |
| 07:43 | robtp | exactly |
| 07:44 | Chousuke | the key names are pretty unidiomatic btw. Camelcase is generally avoided. |
| 07:45 | robtp | not my choice on that :) |
| 07:45 | Chousuke | I'd make a new function for dealing with the defaults |
| 07:46 | Chousuke | something like (defn ensure-defaults [options] (if whatever (assoc options :key 'default) options)) |
| 07:47 | Chousuke | then you can just skip the when-let in annotate and do (let [parameters (select-keys (ensure-defaults options) ...)] ...) |
| 07:49 | Chousuke | also your uri, timeout, parse-xml let can be made more idiomatic by using destructuring: (let [{:keys [uri timeout parsexml] :or {:uri default-uri :timeout default-timeout}} options] ...) :) |
| 07:52 | robtp | so the doseq part is also ineffective, right? |
| 07:52 | Chousuke | ah, yeah |
| 07:52 | robtp | the idea there is to join a sequence by commas (this is a web service, some params are comma-delimited lists) |
| 07:53 | robtp | i really need to be going, but i'd appreciate if you could leave a suggestion :) |
| 07:53 | robtp | thanks for all of your help |
| 07:54 | Chousuke | you want (into {} (map (fn [[k v]] (if (vector? v) ...) [k (str-join ...)]) parameters)) |
| 07:54 | robtp | cool - thanks again |
| 07:54 | robtp | this is on tomorrow's todo list... |
| 07:54 | Chousuke | ie. for all key-value pairs in the map, return a new key-value pair, and stuff those into an empty map |
| 07:55 | Chousuke | remember, maps can be treated as a sequence of [k v] vectors |
| 07:55 | robtp | right, i vaguely recalled reading that |
| 07:55 | robtp | i'm outta here |
| 07:56 | robtp | thanks! |
| 07:56 | Chousuke | you're welcome |
| 07:56 | Chousuke | it takes a while to get used to doing things the functional way, but you'll get there :P |
| 08:42 | kib2 | Hi. I have a problem with a macro: http://paste.lisp.org/display/112423 |
| 09:01 | dnolen | kib2: hard to know what you are trying todo. but remember macros aren't functions. Looks like you want html-region to work like a function. Might make sense to create an fn like html-region* that explicitly takes a symbol for its first parameter. Then the macro html-region will just use that. |
| 09:19 | bsteuber | kib2: use another macro! (defmacro html-regions [[names] ...] `(do ,@(for [name names] ... |
| 09:21 | kib2 | In fact I've translated this article to Clojure: http://cybertiggyr.com/lh/ |
| 10:19 | AWizzArd | How can set! operate on *warn-on-reflection* on toplevel? |
| 10:19 | AWizzArd | Is *warn-on-reflection* not an ordinary Var? |
| 10:33 | Chousuke | AWizzArd: in a repl? |
| 10:34 | AWizzArd | Chousuke: yes, in a repl or file. |
| 10:34 | Chousuke | AWizzArd: *warn-on-reflection* is dynamically bound to false by the repl function before the main loop |
| 10:34 | AWizzArd | (I typically always set this to true.) |
| 10:48 | AWizzArd | Chousuke: thanks for the tip, makes sense. |
| 10:54 | Lajla | Chousuke, olet matelijanen |
| 12:00 | mattrepl | anyone ever implement a pack/unpack capability for Clojure similar to Python's `struct` module? |
| 12:04 | rbxbx | mattrepl: http://snipplr.com/view/13559/serializing-clojure-data-structures/ perhaps? |
| 12:05 | mattrepl | rbxbx: thanks, I should've been more specific. I'd like to be able to (de)serialize between byte streams and primitive types |
| 12:07 | cschreiner | I'm want a list of n (random-color) Doing (repeat 10 (random-color)) gives me the same color repeatedly. How can I create a list of n length with different (random-color)'s? |
| 12:09 | rbxbx | mattrepl: it looks like patches have been proposed a few times, but I'm not sure if there's anything natively available in clojure to do what you'd like. Google and good luck, or maybe someone who knows what's up will chime in :) |
| 12:09 | rbxbx | cschreiner: how is random-color implemented? |
| 12:09 | mattrepl | yeah, I recall it being mentioned. think I have an opportunity to scratch the itch. =) |
| 12:10 | rbxbx | mattrepl: good on you :) |
| 12:10 | wlangstroth | cschreiner: what format are the colors taking? |
| 12:10 | cschreiner | rbxbx: (defn random-color [] (Color. (n! 255) (n! 255) (n! 255))) and (defn n! [x] (. rnd nextInt x)) |
| 12:11 | cschreiner | (def rnd (new java.util.Random) |
| 12:11 | cschreiner | Color is the java.awt.Color |
| 12:12 | rbxbx | hm |
| 12:13 | mattrepl | you want repeatedly |
| 12:13 | mattrepl | (repeatedly 10 random-color) |
| 12:13 | mattrepl | repeat just returns a value n times |
| 12:13 | cschreiner | mattrepl: indeed I do, thanks |
| 13:58 | robtp | Chousuke: hey, if you're still there question re your suggestion yesterday |
| 13:58 | Chousuke | robtp: sure. |
| 13:58 | robtp | ; also your uri, timeout, parse-xml let can be made more idiomatic by using destructuring: (let [{:keys [uri timeout parsexml] :or {:uri default-uri :timeout default-timeout}} options] ...) |
| 13:59 | robtp | i don't understand what that does? the first element of the vector does not even have a name? |
| 14:00 | Chousuke | it's map destructuring |
| 14:01 | Chousuke | the :keys [keys here] part is a shortcut for {keys :keys here :here} which means "from the map, bind keys to the value of :keys, and here to the value of :here" |
| 14:01 | Chousuke | and the :or supplies a "defaults" map that is merged with the actual map that is destructured |
| 14:01 | Chousuke | so if a key isn't specified, it's taken from the defaults |
| 14:02 | dsantiago | How does one import or typehint nested Java classes? |
| 14:02 | lancepantz | dsantiago: you import them like java.lang.Class$Inner |
| 14:02 | dsantiago | Ah, OK, thanks. |
| 14:02 | Chousuke | ,(let [{:keys [foo bar] :or {:foo 1}} {:bar 5}] [foo bar]) like this |
| 14:02 | clojurebot | [nil 5] |
| 14:03 | Chousuke | hmm, wait. |
| 14:03 | duncanm | dum de dum |
| 14:03 | Chousuke | oh, damn, :or is only used if the map is not specified at all it seems :( |
| 14:04 | robtp | oh wowo, i missed all of that |
| 14:06 | robtp | Chousuke: so :keys is a special reserved keyword in destructuring maps? |
| 14:06 | Chousuke | robtp: yeah |
| 14:06 | robtp | Chousuke: i can just merge the defaults first |
| 14:06 | Chousuke | robtp: there's a similar keyword for :syms and :strs |
| 14:06 | robtp | to address the :or doesn't work problem |
| 14:06 | Chousuke | yep |
| 14:07 | qbg | ,(let [{:keys [foo bar] :or {foo 1}} {:bar 5}] [foo bar]) |
| 14:07 | clojurebot | [1 5] |
| 14:07 | dpritchett | thanks for the tip on registering, Chousuke |
| 14:07 | Chousuke | huh |
| 14:07 | Chousuke | oh! I just remembered wrong how the thing works. |
| 14:08 | Chousuke | dpritchett: I suppose it should be more prominent in the topic |
| 14:08 | Chousuke | or a chanserv notice or something maybe |
| 14:12 | robtp | Chousuke: are there docs for :keys :syms :strs anywhere? |
| 14:12 | qbg | http://clojure.org/special_forms#Special%20Forms--%28let%20[bindings*%20]%20exprs*%29 |
| 14:13 | robtp | qbg: just found that, thanks |
| 14:13 | robtp | should've been obvious? |
| 14:30 | dpritchett | I realize this is a simple one but could someone critique my first code sample on clojuredocs.org? I'd like to make sure my style is consistent http://clojuredocs.org/v/1553 |
| 14:31 | qbg | You have a trailing ) |
| 14:32 | qbg | And with the cond forms being that small, I would put matching pairs on the same line |
| 14:33 | qbg | Indentation for the contents of defn is also larger than normal |
| 14:35 | dpritchett | i'm wrestling with some auto-indenting in vim |
| 14:35 | dpritchett | i don't remember where i got it |
| 14:35 | dpritchett | thanks for the tips! |
| 14:40 | robtp | Chousuke: in the :or part of the form, i have to use symbols, and not keywords, as the keys |
| 14:40 | robtp | meaning i can't define that default-options map earlier |
| 14:43 | Chousuke | right. So just use merge? |
| 14:44 | robtp | Chousuke: did so, but could i do it the other way? |
| 14:45 | Chousuke | if you want to separately define the defaults, then no |
| 15:08 | dpritchett | bhenry: Is it normal to remove the test output from clojuredoc exampels? I think it's instructive to see exactly what the repl spits out... |
| 15:08 | dpritchett | ^examples |
| 15:09 | bhenry | i agree? did i accidentally remove something of yours? |
| 15:10 | bhenry | i don't know why i agree questionably... |
| 15:10 | dpritchett | Whoops - looks like I accidentally removed it myself and then you edited something else. |
| 15:10 | dpritchett | My bad, thanks for improving the example I posted. |
| 15:11 | bhenry | yes i like your style of posting the user=> stuff. i just displayed my output in a comment in the code sample. |
| 15:28 | bhenry | dpritchett your example for bound? isn't a good example of how you'd use it http://clojuredocs.org/v/1947 |
| 15:29 | dpritchett | I am an FP neophyte, feel free to replace it with something better |
| 15:29 | dpritchett | I'm just stubbing out some of the functions I don't know very well by testing them at the REPL |
| 15:30 | bhenry | i just lost my terminal and it seems as though only a restart will bring it back. i will try it in a bit. |
| 15:32 | Raynes | Why does clojure.java.shell/sh print out "{:out UTF-8, :dir nil, :env nil}" every time it'se called? |
| 15:32 | Raynes | it's* |
| 15:33 | technomancy | Raynes: bugzors |
| 15:33 | technomancy | clojurebot: ticket #398 |
| 15:33 | Raynes | clojure.java.anything seems to be buggy. :\ |
| 15:33 | clojurebot | {:url http://tinyurl.com/2c4paol, :summary "Stray println snuck into clojure.java.shell/sh", :status :fixed, :priority :normal, :created-on "2010-07-08T17:28:57-07:00"} |
| 15:34 | Raynes | raek: Did you ever create an issue for that bug you found in clojure.java.io? |
| 15:34 | Raynes | Whoa, there is a clojure.string now? :o! |
| 15:44 | TimMc | Raynes: Link? |
| 15:45 | ataggart | clojure.string shows up in clojuredocs but not the official api docs |
| 15:47 | Raynes | TimMc: Link to what? |
| 15:47 | TimMc | Raynes: clojure.string |
| 15:49 | Raynes | http://github.com/clojure/clojure/blob/master/src/clj/clojure/string.clj |
| 15:49 | dpritchett | Just finished adding simple explanations to all of the boolean functions I could find on clojuredocs.org |
| 15:50 | dpritchett | the ones ending in ? anyway |
| 15:50 | TimMc | Raynes: Ah, much obliged. |
| 15:53 | TimMc | Man, how come I never heard of this site? |
| 15:53 | TimMc | (Clojuredocs) |
| 15:53 | rbxbx | It's about 3 days old, for starters ;) |
| 15:53 | Raynes | Because it came out about 3 days ago. |
| 15:53 | ataggart | impressive for being so new |
| 15:54 | dpritchett | Warning: built with Rails ;) |
| 15:54 | technomancy | that's a shame; it means they can't use the reader to verify that the examples are syntactically correct. |
| 15:55 | jkkramer | there's also http://clojure-examples.appspot.com/ written in clojure ;) |
| 15:56 | jkkramer | not as featureful though |
| 16:05 | pjstadig | maybe if it's run on jruby there's a chance to clojurify |
| 16:12 | rbxbx | Does anyone have Conjure up and running on mysql with 0.7(RC1 or RC2) ? |
| 16:19 | eevar_ | random question: if you wander off the beaten path and use clojure; why stick with mysql as your rdbms? |
| 16:20 | qbg | Why not? |
| 16:20 | rbxbx | agreed. |
| 16:20 | rbxbx | perhaps for relational data? ;) |
| 16:20 | lpetit | eevar_: maybe because mysql is not your current rdbms :-p |
| 16:21 | rbxbx | ah |
| 16:21 | eevar_ | because it's a crappy non-standard toy-db retrofitted to something nearly-acid-compliant? |
| 16:21 | rbxbx | touche. the default one conjure uses is h2, and I don't want to use their heinous web interface for database management |
| 16:22 | rbxbx | and I was being lazy because it offers support for mysql out of the box (or at least it does in theory) |
| 16:23 | bozhidar | rbxbx: you don't have to use the web interface |
| 16:23 | rbxbx | ha! I wonder who dirtmcgirt is, anyone that likes FP and ODB is a friend of mine. |
| 16:23 | bozhidar | I use H2 heavily |
| 16:23 | bozhidar | and love it |
| 16:23 | rbxbx | no? |
| 16:23 | rbxbx | hm |
| 16:23 | bozhidar | but hate the interface also |
| 16:23 | bozhidar | so I use it from my IDE |
| 16:23 | rbxbx | I did a cursory glance of the docs and didn't see connecting via other means. |
| 16:23 | bozhidar | (insert here Eclipse/NetBeans/IntelliJ) |
| 16:24 | bozhidar | everything that has jdbc support |
| 16:24 | rbxbx | ah. is there a cli client? |
| 16:24 | bozhidar | can be used to work with h2 |
| 16:24 | rbxbx | I don't use an ide :\ |
| 16:24 | bozhidar | you can use http://squirrel-sql.sourceforge.net/ I guess |
| 16:24 | bozhidar | I use Emacs most of the time |
| 16:25 | bozhidar | but for Java development I find myself forced to use an IDE |
| 16:26 | rbxbx | perhaps I'll give an IDE another chance, have heard that eclipse has decent support for Vi bindings :\ |
| 16:26 | bozhidar | I wish every language had some good mode like slime, cperl, ccmode, but unfortunately that is not the case... |
| 16:26 | rbxbx | or learn emacs ;_; |
| 16:26 | bozhidar | IntelliJ has decent support as well |
| 16:27 | bozhidar | and an open source edition |
| 16:27 | rbxbx | fantastic :) |
| 16:27 | bozhidar | since several months |
| 16:27 | rbxbx | sorry for the newbish questions, the java ecosystem is still very o_O to me though. |
| 16:27 | bozhidar | and Emacs has viper-mode for hardcore vi users ;-) |
| 16:27 | rbxbx | and google just doesn't cut it sometimes. |
| 16:27 | rbxbx | I've tried emacs in viper-mode |
| 16:27 | rbxbx | it went OK-ish. |
| 16:28 | bozhidar | nothing can replace the human interaction :-) |
| 16:28 | rbxbx | :D |
| 16:29 | rbxbx | perhaps the better clojure tooling is worth taking another stab though, last time I had no real reason for trying it. |
| 16:31 | nickik | I used eclipse but the startuptime and some otherthings where bad. So I went headfirst into emacs .... |
| 16:31 | nickik | still hard |
| 16:32 | nickik | have to trie that viper-mode so I don't have to learn to mutch new stuff at once :) |
| 16:32 | rbxbx | aye. |
| 16:32 | rbxbx | I've even started learning some java in support of this clojure addiction :( |
| 16:33 | mattrepl | nickik: have you read yegge's bit on emacs? http://sites.google.com/site/steveyegge2/effective-emacs |
| 16:36 | nickik | @mattrepl "The tips in this little document are geared towards Emacs power-users" |
| 16:37 | mattrepl | nickik: heh, I never noticed that. it was one of the articles that convinced me to learn emacs |
| 16:37 | nickik | but thx I will read if as soon i have some basics. I can't even copy or cut stuff jet |
| 16:39 | rbxbx | that's actually what caused me to pursue emacs the first time (now clojure) |
| 16:39 | nickik | Can you help me with that? What are these shortcuts <cut> <copy> |
| 16:39 | mattrepl | nickik: have you become famliiar with EmacsWiki? http://www.emacswiki.com.org |
| 16:40 | mattrepl | nickik: sure |
| 16:40 | rbxbx | alt+d and ctrl+y aye? |
| 16:41 | rbxbx | er. |
| 16:41 | mattrepl | C-w (ctrl + w) is kill-region. this is roughly equivalent to "cut" |
| 16:42 | mattrepl | M-w (meta + w) is kill-ring-save which is sort of like "copy". there's more going on behind the scene, just search emacswiki for kill ring to learn more about the implementation |
| 16:43 | mattrepl | if you want to paste, C-y |
| 16:43 | nickik | mattrepl: Didn't look in any wikis so far. I spend to mutch time on tools stuff. Atm I just want to keep reading Joy of Clojure. |
| 16:44 | nickik | But I going to do the tutorial stuff that is in emacs eventully |
| 16:44 | mattrepl | and, to cut/copy a region you'll want to be able to define that reigion. Move your cursor to where you want the region to begin, hit C-Space, then jump to the end of the region. |
| 16:45 | mattrepl | yeah, that's a lot to learn at once. Lisp does seem to bring many to Emacs |
| 16:47 | nickik | I never liked the IDE stuff to mutch |
| 16:48 | nickik | Not to mention swank, paredit, slime .... |
| 16:55 | dpritchett | I'm playing in emacs with clojure-mode and viper-mode |
| 16:56 | dpritchett | I dunno if that's going to confuse me more than it helps but I feel like I'm making progress moreso than I would with vi or vanilla emacs |
| 17:20 | TimMc | Can clojure.core/for do filtering? I see :when, but I can't get it to affect anything. |
| 17:21 | kotarak | ,(for [x [:Tim :Mc] :when (not= x :Mc)] x) |
| 17:21 | clojurebot | (:Tim) |
| 17:21 | qbg | ,(for [x (range 3) :when (even? x) y (range 3)] [x y]) |
| 17:21 | clojurebot | ([0 0] [0 1] [0 2] [2 0] [2 1] [2 2]) |
| 17:23 | alexyk | how do I find out teh number of CPUs avaiable for the JVM? |
| 17:23 | TimMc | Oh, so :when takes a test, not a function. |
| 17:23 | qbg | (.. Runtime getRuntime availableProcessors) |
| 17:23 | TimMc | I was using a function, which of course was always "true". :-P |
| 17:24 | alexyk | qbg: thx |
| 17:25 | qbg | (stole that from the source of pmap) |
| 17:31 | anonymouse89 | anyone a vimclojure user? I'm trying to install and am confused by gradle/clojuresque etc. |
| 17:33 | dpritchett | I've tried vimclojure a few times but didn't get too far. It |
| 17:33 | dpritchett | 's worth noting the stable release is nearly a year old |
| 17:44 | dakrone | anonymouse89: are you installing from a zip, or from source/hgclone? |
| 17:46 | anonymouse89 | dakrone: source seems very old so I was trying source/hg but was running into trouble with clojuresque/gradle |
| 17:46 | anonymouse89 | sorry zip seems old |
| 17:47 | dakrone | anonymouse89: I'd recommend trying the snapshots, they're very recent: http://groups.google.com/group/vimclojure/msg/ce3fe24b57372799 |
| 17:48 | dakrone | that way you don't have to mess with gradle |
| 17:55 | anonymouse89 | dakrone: that's perfect. he should update his site. |
| 17:56 | dakrone | yea, that build is an RC, so hopefully we'll see the actual release on the site soon. |
| 17:56 | anonymouse89 | ah, so he just picked up work on it again (?) |
| 17:57 | dakrone | yea, check out the mailing list if you have any problems or questions |
| 18:12 | neotyk | Hi * |
| 18:13 | neotyk | do you know if aleph can be used to stream? |
| 18:29 | alexyk | I'm doing social networking research and am wondering how many folks here have a github account, and whether you guys use the same nick here and there? |
| 18:29 | alexyk | also, on twitter? |
| 18:34 | TimMc | alexyk: I do. No Twitter. I'd guess the channel as a whole is a mix, and there are a lot of people in here. |
| 18:35 | alexyk | TimMc: so far I found many who have the whole three. Which makes me ponder various data mining schemes. |
| 18:36 | TimMc | I tend to use TimMc/timmc for more professional accounts (code publishing, e.g.) and phyzome for personal stuff. |
| 18:36 | TimMc | However, both are public nicks. |
| 18:37 | alexyk | TimMc: ok |
| 18:37 | alexyk | TimMc: why no twitter yet? :) |
| 18:37 | TimMc | Technically, I have one, but don't use it. I find it utterly useless. |
| 18:38 | Raynes | alexyk: I has a github account. |
| 18:38 | Raynes | And a Twitter account. |
| 18:38 | Raynes | Github account is the same as my nick here. |
| 18:38 | Raynes | IORaynes on Twitter, because Raynes is taken. |
| 18:38 | alexyk | Raynes: as a Haskell man, you're a superior being and are not to be overunderestimated |
| 18:39 | Raynes | o.o |
| 18:39 | TimMc | alexyk: You should grab the /who list and check it against GitHub and Twitter. |
| 18:39 | TimMc | Perhaps you could even use clojure for that... ;-) |
| 18:40 | alexyk | TimMc: I found many programming language people are using twitter with a language tag to publish their own stuff or retweet others' cool ones, say with #clojure |
| 18:40 | alexyk | TimMc: yeah, clojure is good for this kind of stuff |
| 18:40 | TimMc | That will make your program even easier to write. :-) |
| 18:42 | Raynes | alexyk: You could use gotmilk to look for accounts. ;) $#google gotmilk github#$ |
| 18:42 | sexpbot | First out of 11 results is: jfkw's Profile - GitHub |
| 18:42 | sexpbot | http://github.com/jfkw |
| 18:42 | Raynes | Aw. |
| 18:42 | Raynes | I figured it would be the first result. |
| 18:42 | Raynes | alexyk: http://github.com/Raynes/gotmilk |
| 18:42 | Raynes | :p |
| 18:43 | alexyk | see, he got milk first or what |
| 18:43 | alexyk | Raynes: is it a repo for facialized ads or what? |
| 18:44 | alexyk | ...ah, more boring stuff :) |
| 18:44 | Raynes | Huh? O.o |
| 18:44 | alexyk | got milk ads, mind you! but, command line is very cool too |
| 18:44 | Raynes | Haha. |
| 18:45 | alexyk | dnolen: are you a contributor for Incanter? |
| 18:46 | alexyk | Raynes: so you suggest to google github nicks by repo name? |
| 18:46 | dnolen | alexyk: no |
| 18:46 | alexyk | Raynes: cool |
| 18:46 | Raynes | alexyk: gotmilk is a tool for doing github stuff without going to the github website. Such as searching for users, getting info about users and such. I was implying you could use it for that. |
| 18:47 | lancepantz | alexyk: i believe rapleaf's service does something along the lines of what you are suggesting |
| 18:47 | lancepantz | not even sure if those guys are still around |
| 18:48 | lancepantz | i use this nick for github, irc, twitter, reddit, digg, facebook, xbox live, psn |
| 18:50 | Raynes | Way to be inconsistent, Github. |
| 18:50 | Raynes | If searching repos, it returns "username" rather than "owner" which it uses for pretty much everything else repo-related. |
| 18:51 | alexyk | Raynes: very very cool. |
| 18:52 | Raynes | :D |
| 19:51 | TimMc | Ooh, I think I found a bug in clojure.contrib.sql -- how do I check if one has already been filed? |
| 19:52 | TeXnomancy | clojurebot: assembla? |
| 19:52 | clojurebot | assembla is http://www.assembla.com/spaces/clojure |
| 19:52 | TeXnomancy | clojurebot: botsnack |
| 19:52 | clojurebot | thanks; that was delicious. (nom nom nom) |
| 19:55 | TimMc | Ah! |
| 19:55 | TimMc | I did a web search for Clojure bugs and nothing came up. |
| 19:56 | defn | lancepantz: get your jruby + rails + clojure bridge code online yet? :X |
| 19:56 | lancepantz | haha |
| 19:56 | lancepantz | saw your message last week, tried to get back, you were gone |
| 19:56 | defn | ah, sorry |
| 19:56 | lancepantz | but it's actually rails + clojure, not jrails |
| 19:57 | lancepantz | goes through a compojure api |
| 19:59 | TimMc | http://github.com/richhickey/clojure-contrib/blob/master/src/main/clojure/clojure/contrib/sql.clj#L137 <- Column names are not wrapped in backticks, so MySQL is choking on table names like "foo-bar". |
| 20:01 | TimMc | Looks like a bug, yeah? Or is there some JDBC/MySQL/etc. nonsense that I'm not aware of? |
| 20:43 | map_reduce | ,(range 10) |
| 20:43 | clojurebot | (0 1 2 3 4 5 6 7 8 9) |
| 20:44 | map_reduce | hey, i was reading through the src code for lazy-seq and I noticed a reference to fn*, but I can't find the definition for fn* or reader macro. Can someone explain wheat the fn* means? |
| 20:50 | tomoj | ,(contains? clojure.lang.Compiler/specials 'fn*) |
| 20:50 | clojurebot | true |
| 20:52 | map_reduce | ah, thanks :) |
| 20:52 | tomoj | it's just a primitive special form, you'd never use it I think |
| 20:54 | tomoj | not sure why lazy-seq uses it when fn is available |
| 20:54 | map_reduce | fair nuff, i'm just trying to learn by going through the source code |
| 20:54 | tomoj | I believe you should be safe pretending that the fn* there is fn, as far as understanding lazy-seq |
| 20:54 | tomoj | ,((fn* [x] x) 3) |
| 20:54 | clojurebot | 3 |
| 20:54 | tomoj | just missing some features of fn I guess |
| 20:55 | map_reduce | gotcha, cool |
| 20:57 | tomoj | I wonder what that ^{:once true} stuff is |
| 20:58 | TeXnomancy | it's for futures and delays IIRC |
| 20:58 | TeXnomancy | kind of a low-level memoization |
| 21:00 | tomoj | ,(meta (first (nth (macroexpand-1 '(lazy-seq nil)) 2))) |
| 21:00 | clojurebot | {:once true} |
| 21:00 | tomoj | ,(first (nth (macroexpand-1 '(lazy-seq nil)) 2)) |
| 21:00 | clojurebot | fn* |
| 21:04 | map_reduce | hmph, fn* is a Symbol, weird |
| 21:06 | tomoj | weird why? |
| 21:09 | map_reduce | I would have expected to see someting like clojure.core$fn* |
| 21:09 | map_reduce | with my limited 2 week experience of clojure.... :) |
| 21:15 | TimMc | map_reduce: I am also a beginner, but... |
| 21:15 | TimMc | fn* is a "special form", meaning it is defined by the compiler, not by calls to other Clojure code. |
| 21:17 | map_reduce | I gather so, tomoj just introduced me to clojure.core.Compiler so I'm largely talking out of my a** right now... |
| 21:17 | TimMc | Unlike "when" and "repeatedly" and such, it is one of the true primitives of the language. |
| 21:17 | map_reduce | sorry, clojure.lang.Compiler |
| 21:18 | map_reduce | still, I expected to see an underlying Java class other than Symbol but I'm sure all this will make more sense as I keep learning |
| 21:20 | TimMc | What I'm gathering is that all "names" are symbols, just that some are at the compile-time level and others at run-time. |
| 21:20 | TimMc | (Experts, please jump in to correct my educated wild-ass guesses.) |
| 21:23 | map_reduce | crud, i had to run, but I'll check the logs later to see if an expert clears this up:) thanks for the help everyone! |
| 21:24 | TimMc | Each symbol has a name and a namespace. |
| 21:25 | tomoj | hmm |
| 21:26 | tomoj | I wonder if map_reduce would have also been surprised that + is a symbol, given: |
| 21:26 | tomoj | ,+ |
| 21:26 | clojurebot | #<core$_PLUS_ clojure.core$_PLUS_@1643de1> |
| 21:26 | TimMc | Hah. |
| 21:26 | stuarthalloway | ,(.getNamespace 'plain-symbol) |
| 21:26 | clojurebot | nil |
| 21:27 | stuarthalloway | ,(.getNamespace 'org.clojure/foo) |
| 21:27 | clojurebot | "org.clojure" |
| 21:27 | TimMc | Hrm. |
| 21:27 | TimMc | So, fully-qualified symbols have a namespace. |
| 21:28 | stuarthalloway | what was the original question? |
| 21:28 | TimMc | "Why is fn* a Symbol in clojure.lang.Compiler?" |
| 21:29 | stuarthalloway | implementation detail |
| 21:30 | stuarthalloway | no deep conceptual significance |
| 21:30 | TimMc | I had claimed that it was a compiler primitive, instead of being definable in terms of further Clojure. |
| 21:31 | TimMc | ...but I'm a newb with just enough compiler education to confuse other newbs. :-P |
| 21:34 | tomoj | oh, he meant FN? |
| 21:35 | TimMc | tomoj: I believe so. |
| 21:35 | alexyk | is there a "flip" function to splice ->> / -> arguments into front or back as needed? |
| 21:36 | clojay | Guys, I need some help. I'm switching from procedural and OO programming to functional programming. In particular I'm interested in Lisp dialects (especially Clojure). I'm looking for books that will help me learn how to think as a functional programmer, and how to write idiomatic Lisp/Clojure code. I'm a good programmer but I would probably struggle to write a compiler, a simple computer algebra system, or even a well written html parser. |
| 21:36 | clojay | budget is somewhat limited ($100) but I'd like to get a couple of good books that will blow my mind and help me become a better functional programmer. There are countless books out there and it's hard to pick something within my budget. What are your suggestions? I already own the available Clojure books. |
| 21:36 | alexyk | (-> "x" (apply flip get mymap)) |
| 21:36 | defn | there's one that's escaping my brain right now clojay |
| 21:36 | alexyk | or something |
| 21:36 | defn | it's a book on FP algorithms IIRC |
| 21:37 | clojay | defn: purely functional data structures? |
| 21:37 | defn | yes! |
| 21:37 | defn | definitely worth a buy |
| 21:37 | alexyk | clojay: Real World Haskell |
| 21:37 | TimMc | clojay: I learned Scheme with HTDP: http://htdp.org/ |
| 21:37 | tomoj | alexyk: it wouldn't work anyway |
| 21:37 | alexyk | tomoj: well how 'bout a macro? |
| 21:38 | tomoj | (-> "x" (apply flip get mymap)) is (apply "x" flip get mymap) |
| 21:38 | alexyk | tomoj true |
| 21:38 | clojay | alexyk: I'm afraid Real World Haskell would be a little too far from Clojure |
| 21:38 | tomoj | alexyk: don't ask for a macro that generalizes -> and ->> :P |
| 21:38 | alexyk | clojay: well if you want FP, than it's FP |
| 21:38 | TimMc | clojay: HtDP helps you think in terms of algebraic data structures. I suspect SICP does that too, but I haven't read it. |
| 21:39 | alexyk | tomoj: all I ask is to move the damn arg into front dammit! :) |
| 21:39 | TimMc | HDP is free to read online, though. :-P |
| 21:39 | clojay | TimMc: so is SICP |
| 21:39 | TimMc | Yay! |
| 21:39 | alexyk | clojay: and RWH too :) |
| 21:39 | clojay | TimMc: but yes, SICP and HDTP are two possible candidates |
| 21:40 | TimMc | PLT Scheme was very friendly to learn. |
| 21:40 | alexyk | clojay: skip it all and get TheJoyofClojure.com by our very own Chouser-san |
| 21:40 | TimMc | That's what they use in the freshman Fundamentals of Computer Science course at my university. |
| 21:40 | mikem | anyone mentioned Practical Common Lisp? http://gigamonkeys.com/book/ |
| 21:40 | tomoj | really? |
| 21:41 | clojay | mikem: apparently CL is not very functional |
| 21:41 | tomoj | oh, I had missed that idiomatic lisp was also part of the question |
| 21:41 | clojay | alexyk: I'm planning to get The Joy of Clojure when it's finished |
| 21:42 | alexyk | clojay: or you can get the MEAP PDF and read it on screen or kindle |
| 21:42 | mikem | yeah, i sense some dislike towards PCL in this channel :) i dono, it helped me grok the Lisp approach. as well as The Little Schemer |
| 21:42 | qbg | PCL is good for CL; not so much for Clojure |
| 21:43 | clojay | I guess my bigger question is, am I mostly wasting time by reading books that are written for Scheme and CL, when I'm trying to become a kick butt Clojure programmer? |
| 21:43 | alexyk | so, a macro to move an arg to the front, going 1... |
| 21:44 | TimMc | clojay: I think the answer will partly depend on whether existing Clojure books assume you are already familiar with FP. |
| 21:45 | tomoj | I think reading scheme books is an excellent idea |
| 21:45 | alexyk | the little schemer |
| 21:45 | chouser | On Lisp is great |
| 21:45 | alexyk | or lisper |
| 21:46 | qbg | The SICP lecture videos are classics |
| 21:46 | alexyk | PCL makes for good toilet reading, pardon my French |
| 21:46 | chouser | You might not want to dig too deep into CL-specific stuff -- that's a very deep vein, but the deeper you go the less it has to do with Clojure, I suspect. |
| 21:47 | alexyk | in about 53 sittings you can finish PCL, and it's what it deserves as it's not very fun. |
| 21:47 | clojay | chouser: How about this progression? Programming Clojure + Little Schemer + SICP + The Joy of Clojure? |
| 21:48 | chouser | Haven't read the middle two, but from what I know that doesn't sound too bad. |
| 21:48 | stuarthalloway | and if you get tired before you are done at least you started well :-) |
| 21:48 | alexyk | clojay: just cut from PC to TJoC! :) |
| 21:49 | clojay | stuarthalloway: haha |
| 21:49 | stuarthalloway | clojar: I liked Little Schemer, but it will be redundant with the others |
| 21:49 | alexyk | stuarthalloway: when's the 1.2 edition? |
| 21:49 | stuarthalloway | alexyk: of what? |
| 21:49 | alexyk | stuarthalloway: of your one! :) |
| 21:50 | stuarthalloway | I am working on this 1.2 edition: http://clojure.org/downloads |
| 21:50 | TimMc | stuarthalloway: I found what I believe is a bug in clojure.contrib.sql. Do I simply file a ticket on Assembla? |
| 21:50 | stuarthalloway | TimMc: please discuss on mailing list first |
| 21:50 | TimMc | Clojure-dev? |
| 21:50 | clojurebot | clojure-dev is the eclipse plugin http://code.google.com/p/clojure-dev/ |
| 21:50 | alexyk | stuarthalloway: I'll buy the 1.2-synced book of yours in 2 copies at once, paper and kindle! |
| 21:51 | stuarthalloway | TimMc: main list is fine |
| 21:51 | TimMc | Ah, OK. |
| 21:51 | stuarthalloway | main list can help rally support, if others are also feeling the pain |
| 21:51 | alexyk | stuarthalloway: specifically would like to see a concise explication of the new 1.2 features. Given there's a settled subset of those, you can start a MEAP/PragProg draft! I'll buy that right away too. |
| 21:52 | clojay | stuarthalloway: when will the new edition of your book be released? |
| 21:52 | alexyk | (even before prims are settled) |
| 21:52 | stuarthalloway | well, gosh |
| 21:52 | TimMc | stuarthalloway: The Clojure-dev page said scary things about Contributor Agreements. :-P |
| 21:52 | chouser | stuarthalloway: how can you say no? |
| 21:52 | stuarthalloway | there is no new edition in the works |
| 21:52 | clojay | stuarthalloway: oh, sorry |
| 21:52 | alexyk | stuarthalloway: until now! :) clojay: don't weaken your flank |
| 21:52 | stuarthalloway | but I have done extensive slide decks (free!) and a video |
| 21:53 | stuarthalloway | Most of the 1.2 stuff is covered at http://github.com/stuarthalloway/clojure-presentations/downloads |
| 21:53 | clojay | stuarthalloway: can you tell me how your book differs from Practical Clojure (the Apress one) |
| 21:53 | stuarthalloway | and protocols are at http://vimeo.com/11236603 |
| 21:53 | alexyk | ok! cool. Still printed book feels like The Truth. |
| 21:54 | stuarthalloway | clojay: I sit next to the author of PracCloj, but I haven't read it yet :-) |
| 21:54 | clojay | stuarthalloway: Is it a parallel universe where all Clojure saints are sent to? |
| 21:55 | stuarthalloway | clojay: kind of :-) http://clojure.com/about.html |
| 21:56 | tomoj | data encapsulation is folly, huh |
| 21:57 | alexyk | how do we diff two maps? |
| 21:57 | alexyk | subtract |
| 21:57 | clojay | has anyone tried The Joy of Clojure on Kindle? Does it look good? |
| 21:58 | alexyk | clojay: reasonable |
| 21:58 | alexyk | (on teh old DX) |
| 21:58 | tomoj | alexyk: you mean take two maps, throw out the keys they share (and the associated values), and merge the rest? |
| 21:59 | alexyk | tomoj: even simpler, throw out the keys from m2 whihc are in m2 |
| 21:59 | alexyk | dissoc I guess |
| 21:59 | clojay | alexyk: i may go for the ebook version then |
| 21:59 | tomoj | throw out the keys from m1 which are in m2, you mean? |
| 21:59 | alexyk | tomoj: yeah |
| 22:00 | alexyk | clojay: you'll enjoy it |
| 22:00 | clojay | If I get this right, Scheme is closer to Clojure than Common Lisp is. And Clojure is purely functional, unlike both Scheme and CL which are multi-paradigm. Scheme less so, but still is. Right? |
| 22:00 | stuarthalloway | qbg: let me know if you have questions |
| 22:02 | stuarthalloway | if anybody wants to download the 1.2 beta and tell me if they see any problems, that would be great |
| 22:02 | qbg | stuarthalloway: It says the docs are at http://richhickey.github.com/clojure/ |
| 22:02 | qbg | Given the move of the repos, shouldn't that be updated? |
| 22:03 | stuarthalloway | yeah |
| 22:03 | alexyk | stuarthalloway: how are the prims settled then? |
| 22:03 | stuarthalloway | alexyk: Release.next |
| 22:04 | mikem | stuarthalloway: I had some issues with adding metadata to functions: http://groups.google.com/group/clojure/browse_thread/thread/f2594a96860f4f91# |
| 22:04 | alexyk | ok |
| 22:04 | mikem | maybe I was doing it wrong? |
| 22:05 | stuarthalloway | ,(let [f ^{:awesome true} (fn [])] (meta f)) |
| 22:05 | clojurebot | {:awesome true} |
| 22:05 | qbg | stuarthalloway: get is listed twice at the end |
| 22:05 | qbg | (section 4) |
| 22:05 | stuarthalloway | thanks, fixed |
| 22:05 | qbg | So is count |
| 22:05 | stuarthalloway | mikem: that was a trivial example of doing it right |
| 22:06 | mikem | stuarthalloway: i'm not sure how to translate that properly when using defn |
| 22:06 | stuarthalloway | mikem: and yes, there are issues with fn metadata. Consider it alpha |
| 22:07 | mikem | stuarthalloway: ah, noted :) at least it's coming |
| 22:08 | clojay | How oudated is programming clojure now that 1.2 is coming out? |
| 22:09 | clojay | oudated -> outdated |
| 22:11 | stuarthalloway | clojay: almost nothing is *wrong* |
| 22:11 | stuarthalloway | but more could now be said |
| 22:11 | clojay | stuarthalloway: got it |
| 22:12 | stuarthalloway | the only significant chance since the book is the metadata reader macro, formerly #^ and now ^ |
| 22:16 | alexyk | stuarthalloway: were you in Philly before and in Durham now? |
| 22:16 | stuarthalloway | alexyk: for some values of before :-) |
| 22:16 | stuarthalloway | but i have not lived in Philly |
| 22:16 | alexyk | stuarthalloway: I thought you were there for some reason |
| 22:17 | alexyk | (I used to live there) |
| 22:17 | alexyk | so Durham is far from anything, I bet you guys move to SF in 1 year |
| 22:17 | stuarthalloway | alexyk; not likely :-) |
| 22:17 | alexyk | stuarthalloway: Seattle then :) |
| 22:19 | alexyk | or, let's say you'll have to open an office in the Bay Area. Just a bet. |
| 22:20 | clojay | ok, I'll ask one last stupid question, and then I'll go back to my Clojure reading. Will there be Kindle editions of the Manning books about Clojure? |
| 22:22 | alexyk | clojay: I think so; but I'd buy from Manning directly as you'd get upgrades. PragProg gives you mobi and epub and PDF, and so does O'Reilly. I'd buy ebook from teh publishers since Amazon doesn't have an upgrade path. |
| 22:23 | alexyk | (and treats ebook just as a paper book for now in terms of one-off-ness) |
| 22:23 | clojay | alexyk: I thought Amazon would give you a significantly better version though (when read on a Kindle dx) |
| 22:24 | alexyk | clojay: I bought some very crappy PDF versions for DX. They get them from publishers anyways |
| 22:24 | clojay | (in terms of layout, etc) |
| 22:24 | alexyk | clojay: the best is mobi converted by publisher |
| 22:24 | alexyk | i.e. from PragProg, .mobi is better than PDF on the Kindle |
| 22:24 | alexyk | PDF is for the computer and search |
| 22:26 | clojay | alexyk: too bad Manning doesn't offer a .mobi |
| 22:26 | alexyk | clojay: they were talking about offering it somewhere/at some point IIRC |
| 22:26 | alexyk | and/or we can bug them |
| 22:30 | robtp | what does the "*" denote: ([f args* argseq])? |
| 22:33 | robtp | ahh, okay, varargs |
| 22:34 | robtp | so & name is end-defn varargs, name* is middle of defn? or is that completely wrong? |
| 22:34 | rhudson | Where are you seeing arg* ? |
| 22:35 | robtp | ,(doc apply) |
| 22:35 | clojurebot | "([f args* argseq]); Applies fn f to the argument list formed by prepending args to argseq." |
| 22:36 | clojay | how do I "unpack" a list? If my-list is '(1 2 3) (max my-list) returns my-list. I'd like to unpack it so that I get something like (max 1 2 3). |
| 22:36 | rhudson | OK, that's notation for the usual 0-or-more meaning of * . It's not part of Clojure syntax per se. |
| 22:36 | robtp | clojay: that's what apply is for |
| 22:36 | robtp | rhudson: ahh, got it |
| 22:36 | robtp | clojay: which is exactly what i was just looking at |
| 22:37 | clojay | robtp: oh we had a similar problem then |
| 22:37 | robtp | rhudson: so the definition of apply is actually like (defn apply [fn & more]), and the seq is taken as the last element of more? |
| 22:37 | robtp | and the args are any remaining elements |
| 22:38 | clojay | (apply max my-list) |
| 22:38 | robtp | clojay: looks right to me? |
| 22:38 | clojay | robtp: it works |
| 22:38 | Raynes | apply is a macro. |
| 22:38 | rhudson | (apply f a b [c d e f]) is equivalent to (f a b c d e f) |
| 22:39 | tomoj | ,apply |
| 22:39 | clojurebot | #<core$apply clojure.core$apply@1b55ca5> |
| 22:39 | Raynes | Isn't it? |
| 22:39 | Raynes | Oh. It isn't. |
| 22:41 | rhudson | ,(apply map + [[1 2 3], [10 20 30]]) |
| 22:41 | clojurebot | (11 22 33) |
| 22:43 | robtp | rhudson: whoa, i thought map took one fn argument, *args, and an argseq |
| 22:43 | robtp | how is having that + in there legit? |
| 22:44 | tomoj | *args can be [+] |
| 22:44 | rhudson | map takes 1 or more seq arguments, and applies the function to elements in the same position until the shortest seq is exhausted |
| 22:44 | rhudson | (map + [1 2 3] [10 20 30]) |
| 22:46 | clojay | so apply basically removes one set of parenthesis? |
| 22:46 | rhudson | (map vector [:a :b :c] [1 2 3] [4 5]) |
| 22:46 | rhudson | That's one way to think of it. |
| 22:47 | rhudson | ,(apply max [3 1 4 1 5 9]) |
| 22:47 | clojurebot | 9 |
| 22:47 | cemerick | clojay: that sort of shorthand is going to trip you up eventually |
| 22:48 | robtp | rhudson: that (apply map + double-vec) is still freaky |
| 22:48 | cemerick | apply invokes the provided fn with the provided arguments |
| 22:49 | clojay | cemerick: ok, but that doesn't explain this one: (apply map + [[1 2 3] [10 20 30]]) So apply invokes map to the provided arguments which are? |
| 22:50 | robtp | rhudson: so behind the scenes, what does (apply map + [[etc] [etc2]]) look like |
| 22:50 | robtp | clojay: the provided arguments are + and [[vec] [vec2]] |
| 22:50 | tomoj | no, +, [1 2 3], and [10 20 30] |
| 22:50 | cemerick | clojay: that's functionally equivalent to (map + [1 2 3] [10 20 30]) |
| 22:51 | robtp | which i think becomes (+ (1 2 3) (10 20 30)) |
| 22:51 | tomoj | eh? |
| 22:51 | robtp | tomoj: apply doesn't seem to give any special treatment to a + in that pesition |
| 22:51 | tomoj | there is no special treatment indeed |
| 22:51 | tomoj | + is just passed to map the same way apply passes args to any function |
| 22:51 | cemerick | The point is, the fn *and* the arguments are data that do not need to be coincident with the apply usage. |
| 22:51 | robtp | tomoj: oh, i think we agree, i read "no, +, [1 2 3] and [10 20 30]" wrong |
| 22:52 | robtp | cool, thanks all |
| 22:53 | cemerick | e.g.: |
| 22:53 | cemerick | ,(let [some-data [(range 10) (range 30 50)]] (apply map + some-data)) |
| 22:53 | clojurebot | (30 32 34 36 38 40 42 44 46 48) |
| 22:54 | robtp | cemerick: so (range a b) attempts to match the other given range? |
| 22:54 | cemerick | ,(doc range) |
| 22:54 | clojurebot | "([] [end] [start end] [start end step]); Returns a lazy seq of nums from start (inclusive) to end (exclusive), by step, where start defaults to 0, step to 1, and end to infinity." |
| 22:54 | robtp | wait, nevermind |
| 22:54 | cemerick | ,(range 5 10) |
| 22:54 | robtp | math issues |
| 22:54 | clojurebot | (5 6 7 8 9) |
| 22:56 | rhudson | Note that the first range has 10 elements, the second 20, and the result (using map) has 10 |
| 22:56 | robtp | yeah, i got that now. math is tough! |
| 22:56 | cemerick | This might help, insofar as it is very clear about the args going into apply having nothing to do with literals: |
| 22:57 | cemerick | ,(apply + (take 10 (repeatedly rand))) |
| 22:57 | clojurebot | 4.596899040906102 |
| 22:59 | clojay | wtf... we have a repeatedly function? |
| 22:59 | cemerick | remarkably useful |
| 22:59 | clojay | fantastic |
| 22:59 | scgilardi | oh yes, it's very nice |
| 23:00 | cemerick | scgilardi: hi Stephen, long time no chat :-) |
| 23:00 | scgilardi | heya chas. good to see you too. |
| 23:00 | cemerick | what are you up to these days? |
| 23:01 | scgilardi | working on fun stuff at Sonian... (avengers and all that) |
| 23:01 | clojay | I know it's a Lisp but to be honest Clojure looks a bit like Haskell to me |
| 23:02 | cemerick | right, right; forgot you were there, sorry. You're the quiet one. ;-) |
| 23:02 | defn | Then you don't know Haskell ;) |
| 23:02 | scgilardi | fell behind on mailing list and chat, but trying to catch up |
| 23:02 | danlarkin | it's impossible |
| 23:02 | danlarkin | there's too much |
| 23:03 | scgilardi | 6000 message backlogs are daunting |
| 23:03 | cemerick | clojay: there's lots of influences |
| 23:03 | defn | you could probably finish it all in a few days |
| 23:03 | cemerick | I manage to keep up for a while, fall behind for around 5K, and then just dump and start over. |
| 23:03 | defn | lots of it you wont care to read anyway |
| 23:03 | danlarkin | my clojure ML backlog is 22445 :) |
| 23:03 | scgilardi | dan wins again! |
| 23:04 | danlarkin | lazy execution wins again! |
| 23:06 | wdouglas | Is there an idiomatic way of getting for with two seqs to return a dot product instead of all combinations of the seqs? |
| 23:08 | qbg | If it doesn't need to be in for, you could use map |
| 23:08 | clojay | by the way thoughts on Clojure in Action? (it looks like it will be completed in 2011 but the MEAP give us access to a bunch of chapters already) |
| 23:08 | wdouglas | I was having a tough time making map work for my case |
| 23:09 | rhudson | wdouglas: (map dot seq1 seq2) didn't do it for you? |
| 23:09 | wdouglas | I think I can do it but goodness it'd be really easy with for |
| 23:09 | qbg | ,(for [x (map vector [:a :b :c] [:do :re :mi])] x) |
| 23:09 | clojurebot | ([:a :do] [:b :re] [:c :mi]) |
| 23:10 | wdouglas | qbg: oh |
| 23:10 | cemerick | clojay: Joy of Clojure is more my style, but YMMV. |
| 23:10 | wdouglas | qbg: Very nice |
| 23:11 | clojay | cemerick: I was thinking AND more than OR |
| 23:11 | cemerick | *shrug* :-) |
| 23:12 | clojay | cemerick: got it |
| 23:12 | tomoj | just use (map vector ..) unless you need the for for some other reason |
| 23:47 | Bahman | Hi all! |
| 23:47 | qbg | Hello Bahman |
| 23:47 | Bahman | Hi qbg! |
| 23:52 | miltondsilva | ok... so I want to disprove the whole "the right tool for the job" thing with some empirical evidence... but before I make a proposal(on clojure group), I would like to discuse some ideas... anyone up for this? maybe several people? |
| 23:53 | tomoj | what is the whole "the right tool for the right job" thing? |
| 23:53 | jhawk28 | use a hammer when you need a hammer or a screwdriver when you need a screwdriver |
| 23:53 | jhawk28 | makes you more productive |
| 23:54 | tomoj | so miltondsilva wants to prove that you would be more productive using a screwdriver when you need a hammer? |
| 23:54 | tomoj | seems unlikely.. |
| 23:54 | miltondsilva | hmmm... |
| 23:55 | miltondsilva | ok so... I think that there is a better programming language... something like a silver bullet |
| 23:55 | miltondsilva | yes yes.. ridicule |
| 23:55 | miltondsilva | but |
| 23:55 | miltondsilva | the think is.. I can't find any paper.. study or something like that... that studies this |
| 23:56 | miltondsilva | the thing* |
| 23:56 | technomancy | you don't need a study to tell you that you can't use a language with a 2MB runtime for embedded work. |
| 23:56 | technomancy | nor a language that relies on persistent data structures in an environment without a good GC |
| 23:57 | jhawk28 | sometimes its a good sales technique to get your management to let you use a bunch of different tools |
| 23:57 | miltondsilva | but why can't you use a common descriptor to express your ideas? and have it compile to whatever you want? |
| 23:59 | jhawk28 | different dynamics of languages produce vastly different results |
| 23:59 | jhawk28 | and everyone has their opinion about each one |
| 23:59 | jhawk28 | after all, text editors all to the same thing, but try convince someone that emacs is better than vim or vice versa |
| 23:59 | miltondsilva | yes! it's all about opinion.. so I would like to get some facts... |