2010-06-13
| 00:54 | scottj | Did the compojure switch to strings for keywords on form-params etc mess up anyone else's apps that use congomongo or other things that use keywords for keywords on maps? There's no destructing that handles either :keys or :strs is there? |
| 00:55 | KirinDave | http://queue.acm.org/detail.cfm?id=1814327 |
| 00:55 | KirinDave | Really interestng. |
| 02:13 | Blackfoot | can i use drop-while to find the number in a sequence such that it the sum of the preceding numbers is above N |
| 09:09 | bkpattison | Is it possible to change the directory that clojure looks for .clj files? Instead of "src" I would like for it to look in a path that I specify. |
| 09:13 | hoeck | bkpattison: only by setting the classpath |
| 09:16 | bkpattison | hoeck: okay, thanks. i was hope for something programmatic (set-path ...) |
| 09:17 | hoeck | bkpattison: yeah, thats what the jvm requires, but ideally your IDE or dependency tool should take care of managing the classpath |
| 09:21 | bkpattison | hoeck: make sense, i'll just have make sure i have all my needed directories on the classpath prior starting java instead of trying to do it programmatically after the fact |
| 09:26 | hoeck | bkpattison: there is also add-classpath, but its marked as deprecated and its use is strongly discouraged |
| 09:27 | bkpattison | hoeck: ah. i'll avoid that. i just need to be smarter about how i invoke cloure with appropriate classpath |
| 11:49 | quotemstr | Why is Clojure under the Eclipse license of all things? Is the GPL incompatibility deliberate? |
| 11:52 | LauJensen | quotemstr: I dont think so. The EPL was chosen for maximum freedom and to avoid clashes with other licenses |
| 11:52 | quotemstr | Wouldn't the BSD/X11 license have been the appropriate choice in that csae? |
| 11:52 | Chousuke | with the constraint of reciprocality, so BSD-style licences were out |
| 11:53 | LauJensen | Chousuke: Could you elaborate on that please |
| 11:53 | quotemstr | Chousuke: So the Clojure people *did* want a copyleft license --- why not the LGPL? |
| 11:54 | Chousuke | quotemstr: I don't know. I think it has some trouble with macros etc. |
| 11:54 | quotemstr | I don't suppose there's any chance Clojure would be dual-licensed under the LGPL as well then. |
| 11:55 | Chousuke | Well it's technically possible but you'd have to convince rhickey, not me :) |
| 11:57 | datka | are any of you using lazytest in a 1.2 project? If so, what branch are you using? I tried the v4 branch, but am getting the error that it can't find the 'it' macro |
| 12:02 | Chousuke | LauJensen: Hm, I think the idea behind choosing EPL is to disallow people from making their own version of Clojure and not sharing the changes with the community |
| 12:03 | Chousuke | you can embed clojure itself in a closed-source offering but if you make any modifications, those need to be distributed. |
| 12:13 | OForero | hi |
| 12:13 | OForero | is there a name convention for protocols? |
| 12:14 | Licenser | coookies |
| 12:14 | Chousuke | hmm |
| 12:14 | OForero | IMyProtocol ? |
| 12:14 | Chousuke | not I |
| 12:14 | Chousuke | I is for interfaces |
| 12:14 | OForero | but the I looks not great |
| 12:14 | Chousuke | I think they're usually without a prefix at all |
| 12:15 | OForero | but there are no Interfaces in clj |
| 12:15 | Chousuke | just Sequential or Foo or whatever. |
| 12:15 | OForero | ok |
| 12:15 | Chousuke | OForero: there's definterface :) |
| 12:15 | Chousuke | but it's java interop, of course |
| 12:15 | OForero | and if a protocol and a record have kind of the same name |
| 12:15 | Chousuke | I think generally they shouldn't |
| 12:17 | OForero | definterface? |
| 12:17 | Chousuke | yeah |
| 12:17 | Chousuke | generates a java interface |
| 12:17 | OForero | where is it? |
| 12:17 | OForero | is not in core is it? |
| 12:18 | OForero | if it is I probably need a pause and an spresso |
| 12:22 | OForero | mmh is probably new in 1.2 ... is not even in the GH docu from RH |
| 12:27 | OForero | what would be the difference between a protocol and an interface? |
| 12:27 | datka | protocols are cooler |
| 12:29 | datka | if I remember right, you can add new protocols in a way that you can't do with interfaces |
| 12:41 | chouser | datka: right |
| 12:42 | chouser | OForero: that's the main difference -- you can create a new protocol and extend it to an existing class, even a final class. |
| 12:43 | chouser | also, protocol functions are namespaced independently of the class you extend them to, unlike monkey patching. |
| 12:43 | OForero | thanks |
| 13:01 | dsantiago | chouser: How exactly does that extending work? |
| 13:04 | chouser | dsantiago: the protocol functions are regular Clojure functions, but they know which protocol they belong to |
| 13:05 | chouser | the protocol itself keeps track of the classes it's extending |
| 13:05 | datka | doesn't it work similar to a multimethod, but faster |
| 13:05 | dsantiago | Ah. So is that still done with the same performance as if the functions are defined in the deftype? |
| 13:06 | chouser | Last I checked it was still somewhat faster to define the methods inside the deftype or defrecord form |
| 13:07 | chouser | but extending is still quite fast compared to other options, like doing something similar yourself without clojure compiler support, or using multimethods. |
| 13:07 | dsantiago | OK, thanks. |
| 13:07 | dsantiago | Been wondering that. |
| 13:09 | mebaran151 | if I was wondering |
| 13:10 | mebaran151 | *I was wondering if extend was AOT compiled |
| 13:10 | mebaran151 | I'm thinking about doing some android experiments, and I would like to try to strip out all the compiler stuff that won't work anyway |
| 13:14 | LauJensen | Chousuke: Okay, thanks for educating |
| 13:21 | anonymouse89 | is it possible to define default values for keys in defstruct? |
| 13:34 | LauJensen | anonymouse89: Not sure if there's a way already, but if not a macro with a wrapping 'binding' should do the trick |
| 13:45 | anonymouse89 | LauJensen: thanks for the tip, that makes sense. |
| 13:56 | anonymouse89 | is there a range fn that returns a list of floats instead of integers? |
| 13:57 | LauJensen | (defn frange [x] (map float (range x))) ? |
| 13:58 | defn | :) |
| 13:59 | defn | LauJensen: do you need to edit the arity of frange to make range work in all cases? |
| 13:59 | LauJensen | yes |
| 14:01 | anonymouse89 | LauJensen: okay, sorry for the silly questions, I just never know if those kind of things are already built-in or not |
| 14:01 | LauJensen | np thats what we're here for |
| 14:02 | anonymouse89 | LauJensen: do most clojurians (?) save all these little fns and macros in a toolbox(.clj)? |
| 14:02 | defn | anonymouse89: you can have a user.clj |
| 14:02 | anonymouse89 | or is that kind of looked down on for decreasing readability |
| 14:02 | LauJensen | anonymouse89: I dont think so. Most of it goes into contrib eventually, and eventually the really useful stuff makes it into core |
| 14:02 | LauJensen | I dont think user.clj is the best way to handle it |
| 14:03 | defn | i agree it's not the best way, but it's not "bad", IMO |
| 14:03 | defn | you just need to be careful you're not using something home-baked which may be done much better in contrib |
| 14:03 | anonymouse89 | is there some sort of magic that happens by naming it "user.clj" specifically or is that just convention? |
| 14:03 | defn | anonymouse89: if it's on your classpath it will be autoloaded |
| 14:04 | defn | 'user.clj' that is |
| 14:04 | anonymouse89 | defn: right, I don't mean anything too crazy or even with that much logic, just convenience functions |
| 14:04 | anonymouse89 | ok |
| 14:06 | LauJensen | anonymouse89: I dont think Ive never needed anything like frange, and the project you're working on might be the last one in 6 months for you as well :) However, if you're the first guy to come up with 'partition' or 'take-while', then you should try to get it in Contrib :) |
| 14:06 | anonymouse89 | actually I'm trying to do this: |
| 14:06 | defn | LauJensen: i've never used the user.clj thing myself, but i do often end up opening other projects ive started to take a look at a function i wrote |
| 14:06 | anonymouse89 | '(take 10 (cycle '(0))) |
| 14:07 | anonymouse89 | ,(take 10 (cycle '(0))) |
| 14:07 | clojurebot | (0 0 0 0 0 0 0 0 0 0) |
| 14:07 | defn | ive also seen stuart halloway has a "code pad" in his emacs where he keeps snippets |
| 14:07 | anonymouse89 | is there a better way? |
| 14:07 | LauJensen | defn: you mean *scratch* ? :) |
| 14:07 | defn | as long as user.clj is confined in a namespace i dont see any issue |
| 14:07 | defn | LauJensen: well, yeah :) |
| 14:07 | anonymouse89 | defn: that's a good idea |
| 14:07 | LauJensen | $(take 10 (repeat 0)) |
| 14:07 | sexpbot | => (0 0 0 0 0 0 0 0 0 0) |
| 14:07 | anonymouse89 | ah, repeat |
| 14:08 | defn | anonymouse89: there is also repeatedly, but that's more heavy lifting than you need |
| 14:08 | anonymouse89 | $(take 10 (repeat 0.0)) |
| 14:08 | sexpbot | => (0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0) |
| 14:09 | LauJensen | $(take 10 (repeatedly (fn [] 0.0))) |
| 14:09 | sexpbot | => (0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0) |
| 14:09 | LauJensen | one is for values, the other for fns |
| 14:09 | anonymouse89 | just looked at the api entry for repeatedly, seems cool |
| 14:10 | anonymouse89 | so I could 'take' from a repeatedly? |
| 14:11 | LauJensen | I just did |
| 14:11 | defn | :) |
| 14:11 | anonymouse89 | right, I should just be learning by doing |
| 14:12 | defn | $(take 10 (iterate + 0.0)) |
| 14:12 | sexpbot | java.lang.ClassNotFoundException: clojure.core$iterate$fn__3752 |
| 14:12 | LauJensen | anonymouse89: no you should just read what im writing :) |
| 14:13 | LauJensen | $(take 10 (iterate (partial + 0.1) 0)) |
| 14:13 | sexpbot | java.lang.NoClassDefFoundError: clojure/core$iterate$fn__3752 |
| 14:13 | LauJensen | ,(take 10 (iterate (partial + 0.1) 0)) |
| 14:13 | clojurebot | (0 0.1 0.2 0.30000000000000004 0.4 0.5 0.6 0.7 0.7999999999999999 0.8999999999999999) |
| 14:14 | defn | $(take 10 (iterate #(+ %) 0.0)) ;;? |
| 14:14 | sexpbot | java.lang.NoClassDefFoundError: clojure/core$iterate$fn__3752 |
| 14:14 | LauJensen | defn: sexpbot doesnt have iterate for some reason |
| 14:14 | defn | ah |
| 14:14 | defn | ,(take 10 (iterate + 0.0)) |
| 14:14 | clojurebot | (0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0) |
| 14:19 | defn | ooo, even better.. |
| 14:19 | defn | $(repeat 10 0.0) |
| 14:19 | sexpbot | => (0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0) |
| 14:26 | Licenser | lies! |
| 14:27 | LauJensen | well, the simplest way is still |
| 14:27 | LauJensen | ,(-> 9 inc (repeat 0.0)) |
| 14:27 | clojurebot | (0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0) |
| 14:27 | tomoj | :D |
| 14:28 | LauJensen | sorry, no, I overcomplicated |
| 14:28 | LauJensen | ,(-> \tab int inc (repeat 0.0)) |
| 14:28 | clojurebot | (0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0) |
| 14:44 | anonymouse89 | defn: nice, I'll be using (repeat 10 0.0) |
| 15:02 | LauJensen | $mail Raynes Your bot does not support 'iterate' |
| 15:02 | sexpbot | Message saved. |
| 15:02 | anonymouse89 | would logbitp ever be something that would make it into contrib? |
| 15:07 | Twey | ,(let [is (iterate #(+ 1 %) 0)] (take 5 is)) |
| 15:07 | clojurebot | (0 1 2 3 4) |
| 15:07 | Twey | ,(iterate #(+ 1 %) 0) |
| 15:07 | Twey | ,(let [is (iterate #(+ 1 %) 0)] (take 5 is)) |
| 15:07 | clojurebot | (0 1 2 3 4) |
| 15:08 | clojurebot | Execution Timed Out |
| 15:08 | Twey | Huh. |
| 15:14 | anonymouse89 | iterate returns a lazy sequence (i think?) |
| 15:14 | LauJensen | yep |
| 15:16 | anonymouse89 | is there any way to override functional style and have mutable structs? |
| 15:17 | LauJensen | anonymouse89: There are a few ways, but are you sure you dont want to be functional ? |
| 15:17 | anonymouse89 | no I'm not sure |
| 15:17 | LauJensen | Whats the challenge? |
| 15:17 | anonymouse89 | but at the moment I'm translating a lisp program that uses the CLOS to clojure |
| 15:18 | qbg | You could wrap the mutable items in an atom or ref, but eww... |
| 15:18 | tomoj | why bother unless you're going to make it functional? |
| 15:18 | anonymouse89 | so it'd be easiest to do a more "direct" translation (if that makes sense) and then convert to functional later |
| 15:18 | LauJensen | anonymouse89: Not necessarily - If I were you I would try to grasp the functional concepts and apply them directly |
| 15:18 | LauJensen | In most cases you can make it 99.9% functional without any headaches |
| 15:19 | qbg | Instead of fighting the language and then doing some nasty refactoring, just do it right the first time. |
| 15:20 | datka | does anyone know what happened with the latest rc of leiningen that made it so that lein-run is no longer working? |
| 15:20 | anonymouse89 | qbg: thanks, I know that's the right thing to do, just needed to have someone else confirm |
| 15:22 | anonymouse89 | on a related note, is there a way to return a struct with all values the same except one? |
| 15:22 | qbg | You should be able to use assoc |
| 15:22 | LauJensen | 'dissoc' you mean |
| 15:22 | dakrone | yep, use assoc |
| 15:22 | LauJensen | ,(dissoc :two {:one 1 :two 2 :three 3}) |
| 15:22 | clojurebot | java.lang.ClassCastException: clojure.lang.Keyword cannot be cast to clojure.lang.IPersistentMap |
| 15:23 | LauJensen | ,(dissoc {:one 1 :two 2 :three 3} :two) |
| 15:23 | clojurebot | {:one 1, :three 3} |
| 15:23 | dakrone | anonymouse89: did you mean leaving 1 value out, or changing just 1 value? |
| 15:24 | anonymouse89 | dakrone: changing just 1 value (or however many) |
| 15:24 | dakrone | use assoc then |
| 15:24 | dakrone | ,(assoc {:name "foo" :age 10} :age 20) |
| 15:24 | clojurebot | {:name "foo", :age 20} |
| 15:26 | anonymouse89 | dakrone: perfect, thanks! |
| 15:26 | dakrone | anonymouse89: you're welcome, good luck with the translation |
| 15:26 | dnolen | ,(update-in {:name "foo" :age 10} [:age] #(+ % 10)) |
| 15:26 | clojurebot | {:name "foo", :age 20} |
| 15:28 | anonymouse89 | dnolen: not helpful in my case, but good to know |
| 15:33 | tomoj | I sometimes wonder why we have assoc/assoc-in but not update/update-in |
| 15:34 | qbg | update would only save you two characters... |
| 15:38 | tomoj | I guess the variadic case for update would be uncommon |
| 16:03 | silveen | can anyone help me figure out what(doseq [entity @collection :when |
| 16:04 | silveen | what's wrong with my* (doseq [entity @collection :when (contains? (entity :key) avalue)] ? |
| 16:05 | naeu | hey there, I have a Java question if anyone's interested in helping out: what does the ... signify in lines such as: static public IPersistentVector createOwning(Object... items){ |
| 16:05 | silveen | naeu: it means you can send a variable number of arguments |
| 16:05 | naeu | silveen: wow, Java has that feature? |
| 16:05 | silveen | like createOwning( a, b, c) |
| 16:05 | silveen | yes |
| 16:05 | silveen | you get it as an array and can loop thru them like normal |
| 16:05 | naeu | nice |
| 16:06 | naeu | silveen: thanks |
| 16:06 | silveen | be sure to check for lengt > 0 (as passing zero arguments is pefectly valid) |
| 16:06 | silveen | naeu: you're welcome :) |
| 16:07 | naeu | silveen: I'll not be checking anything right now, I'm currently just reading the Clojure source |
| 16:07 | naeu | and treating it as immutable ;-) |
| 16:07 | silveen | aah |
| 16:18 | tomoj | silveen: what do you think contains? does? |
| 16:18 | silveen | it check if the first argument, which is a list, contains the second argument |
| 16:18 | silveen | it worked before, but I can't figure out what's diffrent |
| 16:19 | tomoj | ,(contains? '[foo bar baz] 1) |
| 16:19 | clojurebot | true |
| 16:19 | tomoj | ,(contains? '[foo bar baz] 'bar) |
| 16:19 | clojurebot | false |
| 16:19 | silveen | ,(contains? ([15 2] [15 3]) [15 2]) |
| 16:19 | clojurebot | java.lang.IllegalArgumentException: Key must be integer |
| 16:19 | tomoj | maybe you're looking for (doseq [entity @collection :when (some #{avalue} (:key entity))] ...) ? |
| 16:20 | tomoj | ,(doc contains?) |
| 16:20 | clojurebot | "([coll key]); Returns true if key is present in the given collection, otherwise returns false. Note that for numerically indexed collections like vectors and Java arrays, this tests if the numeric key is within the range of indexes. 'contains?' operates constant or logarithmic time; it will not perform a linear search for a value. See also 'some'." |
| 16:22 | silveen | hmm, yeah that works if I do it like ... (entity :key) |
| 16:22 | silveen | ,(contains? [foo bar] 1) |
| 16:22 | clojurebot | java.lang.Exception: Unable to resolve symbol: foo in this context |
| 16:23 | silveen | ,(contains? [10 20] 1) |
| 16:23 | clojurebot | true |
| 16:23 | silveen | ,(contains? [10 20] 3) |
| 16:23 | clojurebot | false |
| 16:23 | silveen | hmm, now I see how that works |
| 16:24 | tomoj | silveen: (entity :key) works but (:key entity) doesn't? |
| 16:24 | tomoj | what kind of thing is entity? |
| 16:24 | silveen | yupp |
| 16:24 | silveen | it's a struct |
| 16:25 | silveen | or, whatever it's called (only been doing clojure, or "lisp" for about a week) |
| 16:25 | tomoj | ,(:foo (struct (create-struct :foo) 3)) |
| 16:25 | clojurebot | 3 |
| 16:25 | tomoj | ,((struct (create-struct :foo) 3) :foo) |
| 16:25 | clojurebot | 3 |
| 16:26 | tomoj | (:key struct) is the idiomatic way |
| 16:27 | silveen | ,(some? #{3} (struct (create-struct :foo) [1 2 3] :foo)) |
| 16:27 | clojurebot | java.lang.Exception: Unable to resolve symbol: some? in this context |
| 16:27 | silveen | ,(some #{3} (struct (create-struct :foo) [1 2 3] :foo)) |
| 16:27 | clojurebot | java.lang.IllegalArgumentException: Too many arguments to struct constructor |
| 16:28 | tomoj | ,(some #{3} (:foo (struct (create-struct :foo) [1 2 3]))) |
| 16:28 | clojurebot | 3 |
| 16:28 | silveen | baah, really is it? I've never done it like that, I think because it didn't work out for me in the begining |
| 16:28 | tomoj | (:key foo) when foo is something like an object (e.g. structs) |
| 16:29 | tomoj | (foo :key) when foo is a collection |
| 16:29 | tomoj | as in, not a fixed set of keys |
| 16:30 | silveen | okey, kinda confusing but okey |
| 16:32 | tomoj | (:key foo) is also faster on certain kinds of things, and won't blow up if foo is nil |
| 16:33 | silveen | hmm'kay, will try to think of that from now on : |
| 16:34 | silveen | but it's really strange that it doens't work here |
| 16:36 | silveen | ah, because it was a ref |
| 16:36 | silveen | (:key @entity) works |
| 16:37 | silveen | that might explain why that way of typing didn't work for me earlier |
| 16:37 | Twey | .ue coi .tomoj. |
| 16:38 | silveen | thanks tomoj |
| 16:41 | tomoj | coi .tuein. |
| 16:41 | Twey | ba ma do pilno la .klojyr. |
| 16:57 | Lajla | ,(+) |
| 16:57 | clojurebot | 0 |
| 16:57 | Lajla | ,(/) |
| 16:57 | clojurebot | java.lang.IllegalArgumentException: Wrong number of args passed to: core$-SLASH- |
| 16:57 | Lajla | ,(/ 1 2 3 4 5) |
| 16:57 | clojurebot | 1/120 |
| 16:58 | rhall | hi all |
| 16:58 | rhall | anyone up for a newbie question? :) |
| 16:58 | qbg | Sure |
| 16:59 | rhall | thx... I'm playing around with counterclockwise |
| 16:59 | Lajla | rhall, yes, but if I can't answer it, I will assasinate you. |
| 16:59 | rhall | earlier I could run things like "(show show)" |
| 16:59 | rhall | Lajla: I work best under pressure |
| 17:00 | rhall | but now in response to (show show)... I get... 1:11 user=> (show show) |
| 17:00 | rhall | java.lang.Exception: Unable to resolve symbol: show in this context (repl-1:11) |
| 17:01 | rhall | is "show" part of clojure core, or do I need to load something else? I don't remember doing anything earlier |
| 17:01 | rhall | it just worked |
| 17:02 | qbg | You need to use clojure.contrib.repl-utils |
| 17:02 | qbg | (use 'clojure.contrib.repl-utils) |
| 17:02 | rhall | qbg: thx... I suspected something like that... wonder if I screwed up my eclipse launcher somehow and knocked that out |
| 17:03 | rhall | hmm... no go... |
| 17:03 | rhall | 1:12 user=> (use 'clojure.contrib.repl-utils) |
| 17:03 | rhall | java.lang.IllegalStateException: source already refers to: #'clojure.repl/source in namespace: user (repl-1:12) |
| 17:03 | rhall | 1:13 user=> (show show) |
| 17:03 | rhall | 1:14 user=> java.lang.Exception: Unable to resolve symbol: show in this context (repl-1:13) |
| 17:04 | qbg | I would just do (require '[clojure.contrib.repl-utils :as repl]) |
| 17:04 | qbg | and then you can do (repl/show repl/show) |
| 17:06 | rhall | that works |
| 17:06 | rhall | so I guess my namespace is polluted somehow? |
| 17:06 | rhall | but then restarting should fix it, I'd assume |
| 17:06 | qbg | Yes, clojure.repl defines source and so does clojure.contrib.repl-utils, so they conflict |
| 17:07 | rhall | ah, ok, I see |
| 17:07 | rhall | thx for that |
| 18:15 | dnolen | rhickey: another prim bug? http://gist.github.com/437046 |
| 18:16 | rhickey_ | dnolen: no, limitation, right now static can't be protocol call sites |
| 18:55 | vin | why does this give a nullpointerexception, i dont see it... http://sprunge.us/ZPYa |
| 18:57 | qbg | vin: Instead of ((print ...) ...) you want (do (print ...) ...) |
| 18:58 | vin | (do you have a link that explains) why |
| 18:58 | Ankou | hi, I think I found a bug in dgraph but maybe someone who actually used this library can tell me if it I missunderstand something and if it behaves like it should. Here are some lines I entered in the the REPL: http://ankou.pastebin.com/gRHjgCUg |
| 18:58 | qbg | Because (print ...) will return nil, and you are trying to call nil |
| 19:00 | qbg | Also, do to your use of recursion, the code will fail on long input |
| 19:00 | qbg | *due |
| 19:02 | qbg | I think a solution using doseq would be better. |
| 19:03 | Twey | Has Clojure tail recursion optimisation? |
| 19:03 | quotemstr | Twey: No. |
| 19:03 | quotemstr | But it does have RECUR. |
| 19:03 | Twey | Damn :-\ |
| 19:03 | Twey | Oh? |
| 19:03 | qbg | You also have trampoline |
| 19:06 | Twey | Hm |
| 19:06 | qbg | Blame java |
| 20:26 | vIkSiT | hmm quick lein question. |
| 20:26 | vIkSiT | in project.clj - the :main option - does that refer to the filename, or the namespace? |
| 20:28 | tomoj | namespace |
| 20:28 | vIkSiT | for instance, I've got project.clj with :main myproject.core, and my src dir looks like src/myproject/core.clj, with the ns as myproject.core |
| 20:28 | vIkSiT | now, this doesn't work. |
| 20:29 | vIkSiT | oh. maybe gen-class. |
| 20:31 | vIkSiT | ah taht was the problem |
| 20:31 | vIkSiT | tomoj, do you connect to a lein swank instance through slime? |
| 20:31 | tomoj | no, I use maven |
| 20:32 | vIkSiT | ah |
| 20:32 | vIkSiT | but that brings up a swank instance that you connect to through slime? |
| 20:33 | tomoj | yep |
| 20:33 | vIkSiT | my issue was - when I connect to a swank instance, how do I "load" all the code into that session? |
| 20:33 | tomoj | C-c C-k a file |
| 20:33 | vIkSiT | oh i see. there's no way to load all the files in in one go? |
| 20:33 | tomoj | I don't know of a way to load all the files, no |
| 20:33 | tomoj | but it's not really necessary imo |
| 20:33 | vIkSiT | hmm |
| 20:33 | tomoj | when you C-c C-k a file, all the files it depends on will be loaded |
| 20:34 | vIkSiT | ah gotcha. so I can always use a :require or something in the main file |
| 20:34 | tomoj | yep |
| 20:35 | vIkSiT | so, how is it different from just firing up a normal slime instance and then doing stuff manually? |
| 20:35 | vIkSiT | I figured that doing it from within a project dir would atleast load all the ns's that exist within the project |
| 20:36 | tomoj | it's different just because lein is creating the swank server instead of emacs |
| 20:39 | vIkSiT | ah i see |
| 20:40 | vIkSiT | oh brilliant. |
| 20:41 | vIkSiT | looks like swank-clojure from ELPA isn't compatible with slime201004 |
| 20:41 | vIkSiT | aaargh. |
| 20:41 | vIkSiT | this is like red hat's dependency hell from 1996 |
| 20:45 | tomoj | you use other lisps? |
| 20:46 | vIkSiT | sbcl for some stuff |
| 20:47 | vIkSiT | lein swank is increasingly looking like a good option |
| 20:47 | vIkSiT | all i need is slime-connect on the emacs side |
| 21:52 | defn | lein swank was deprecated in favor of swank-clojure i thought |
| 21:52 | defn | you can use swank-clojure-project, or lein swank in the project dir + slime-connect |
| 21:54 | tomoj | swank-clojure provides lein swank, doesn't it? |
| 22:10 | defn | yes |
| 22:10 | defn | it does now |
| 22:10 | defn | as of 1.2.1 |
| 22:20 | TimMc | A curiosity: |
| 22:20 | TimMc | ,((fn [&] 4)) |
| 22:20 | clojurebot | 4 |
| 22:21 | TimMc | .((fn [&] 4) 5 6 7) |
| 22:22 | TimMc | ,((fn [&] 4) 5 6 7) |
| 22:22 | clojurebot | java.lang.IllegalArgumentException: Wrong number of args passed to: sandbox$eval--9669$fn |
| 22:26 | tomoj | would you expect it to be variadic but ignore its arguments? |
| 22:39 | jrp | is there a particularly good clojure introduction that people here would recommend? |
| 22:45 | TimMc | tomoj: I wasn't sure what to expect, really. :-P |
| 22:46 | TimMc | jrp: I have really been enjoying Stuart Halloway's book "Programing Clojure" -- I pirated it, then bought it. :-) |
| 22:46 | bmason | this is a good page: http://en.wikibooks.org/wiki/Clojure_Programming/Tutorials_and_Tips |
| 22:46 | TimMc | You can buy the eBook online in an open format. |
| 22:47 | jrp | cool, thank you |
| 22:53 | mabes | jrp: this is another good overview of clojure: http://java.ociweb.com/mark/clojure/article.html |
| 22:54 | mabes | oh, I guess that is linked to on the wiki page. :) nm |
| 22:54 | jrp | will these cover the function programming aspect? Ive been programming for 10 years more or less, but mostly in C style languages |
| 22:58 | mabes | jrp: yeah, most of the articles assume you're coming from a java-like background.. so you should be okay. |
| 22:58 | jrp | fantastic, thanks. This channel is quite helpful |
| 23:22 | TimMc | tomoj: What do you make of it? Syntactic corner-case, or potentially meaningful form? |
| 23:27 | tomoj | isn't it equivalent to the shorter and less curious (fn [] ..)? |
| 23:28 | TimMc | Presumably. |
| 23:28 | TimMc | I can't think of any way it could differ in behavior. |
| 23:29 | tomoj | so.. why use it? :) |
| 23:32 | TimMc | Ah, the compiler treats them the say way: |
| 23:32 | TimMc | ,(fn ([] 4) ([&] 5)) |
| 23:32 | clojurebot | java.lang.Exception: Can't have 2 overloads with same arity |
| 23:32 | TimMc | *same |
| 23:32 | TimMc | I suppose it would only be good for Obfuscated Clojure contests. :-P |
| 23:34 | tomoj | I wonder why assert-args in core.clj isn't public, it seems like it would be useful |
| 23:35 | quotemstr | TimMc: Wouldn't Obfuscated $LISP_DIALECT contests be too easy? :-) |
| 23:35 | tomoj | I imagine submitting a 200 line -> form or something |
| 23:36 | quotemstr | tomoj: Use the Y combinator. For everything. |
| 23:36 | quotemstr | tomoj: You can write unlambda is any functional language. :-) |
| 23:38 | rbarraud | , |
| 23:38 | clojurebot | EOF while reading |
| 23:38 | rbarraud | , |
| 23:38 | clojurebot | EOF while reading |
| 23:38 | rbarraud | foo |
| 23:38 | TeXnomancy | doto with non-java-interop forms is always a nice obfuscation technique |
| 23:38 | quotemstr | ,(+ 1 2) |
| 23:38 | clojurebot | 3 |
| 23:39 | TeXnomancy | defn: lein swank + slime-connect is actually the recommended way to go now. |
| 23:39 | TeXnomancy | oh, lein-swank the dependency got merged into swank-clojure, if that's what you meant. |
| 23:41 | quotemstr | ,(macroexpand '(-> (a) (b) (c))) |
| 23:41 | clojurebot | (c (clojure.core/-> (a) (b))) |
| 23:41 | quotemstr | ,macroexpand-all |
| 23:41 | clojurebot | #<walk$macroexpand_all__6949 clojure.walk$macroexpand_all__6949@1636d54> |
| 23:41 | quotemstr | ,(macroexpand-all '(-> (a) (b) (c))) |
| 23:41 | clojurebot | (c (b (a))) |
| 23:41 | quotemstr | Ah. |
| 23:54 | LuminousMonkey | Anyone know if it's possible to step through two sequences at once? For example, you have something like (cycle [1 2]) as one sequence, and just a normal finite sequence, and they step together? |
| 23:55 | rdsr | luminousMonkey: a map won't do? |
| 23:56 | TeXnomancy | ,(map identity [1 2 3] [:a :b :c]) |
| 23:56 | clojurebot | java.lang.IllegalArgumentException: Wrong number of args passed to: core$identity |
| 23:57 | TeXnomancy | ,(map + [1 2 3] [4 5 6]) |
| 23:57 | clojurebot | (5 7 9) |
| 23:57 | LuminousMonkey | I'm doing some PDF work, and making a PDF table. I've written up a function to process the tables, and I pass the info like ([{:name "Header 1" :align :left} {:name "Header 2" :align :right}] ["Data1" "Data2"] ["Data3" "Data4"]) |
| 23:58 | LuminousMonkey | I need to get the correct :align for the column, so I know if I need to set the alignment for the cell. |