2010-12-20
| 00:00 | tonyl | not that i know of |
| 00:01 | mister_roboto1 | ok thanks |
| 00:03 | lopex | there's positions in seq-utils |
| 00:05 | amalloy | &(count (take-while (complement #{:b}) [:a :b :c])) |
| 00:05 | sexpbot | ⟹ 1 |
| 00:06 | amalloy | mister_roboto1: ^^ won't work for maps, but for seqs and vectors... |
| 00:07 | mister_roboto1 | thx, lopex and amalloy. i think i like that positions function better :) |
| 00:21 | mister_roboto1 | &(count (take-while (complement #{:x}) [:a :b :c])) |
| 00:21 | sexpbot | ⟹ 3 |
| 00:21 | amalloy | well, that too :P |
| 00:22 | mister_roboto1 | hehe |
| 04:44 | bartj | what is the best way to rename keys in a hash-map |
| 04:44 | bartj | instead of doing a dissoc and then an assoc |
| 04:45 | raek | bartj: clojure.set/rename-keys |
| 04:48 | bartj | raek, cool, thanks! |
| 05:21 | octe | 12 |
| 07:39 | naeu | I'm trying to plot an array of floats on a graph in Incanter |
| 07:39 | naeu | is this a sane idea? |
| 07:44 | edoloughlin | Can someone tell me what's the difference between 'x' and '(val x)'? |
| 07:45 | AWizzArd | edoloughlin: val is a Clojure fn which is pretty much just doing this: http://download.oracle.com/javase/6/docs/api/java/util/Map.Entry.html#getValue%28%29 |
| 07:45 | cemerick | &(val (first {:a :b})) |
| 07:45 | sexpbot | ⟹ :b |
| 07:46 | raek | ,(first {:a 1}) |
| 07:46 | clojurebot | [:a 1] |
| 07:46 | raek | ,(val (first {:a 1})) |
| 07:46 | clojurebot | 1 |
| 07:46 | AWizzArd | edoloughlin: raeks example returned [:a 1] which looks like a Vector. But this is not a vector. |
| 07:47 | AWizzArd | Clojure just prints it visually in the same way. But those examples above return a MapEntry object. |
| 07:47 | raek | ,(class (conj (first {:a 1}) :x)) |
| 07:47 | cemerick | AWizzArd: of course it's a vector |
| 07:47 | clojurebot | clojure.lang.PersistentVector |
| 07:47 | raek | a special kind of vector that only has two slots |
| 07:47 | raek | but you get an ordinary vector if you "change" it |
| 07:48 | raek | naeu: I don't see why not. (seq some-vector) gives you an ordinary clojure sequence of values |
| 07:49 | raek | chances are that you don't even have to call seq |
| 07:49 | edoloughlin | Thanks all. Saw it in some sample code and was just confused by it in context. |
| 07:50 | raek | the most common way of getting a map entry is when viewing a map as a sequence, I think |
| 07:50 | AWizzArd | ,(class (first {:a 1})) |
| 07:50 | clojurebot | clojure.lang.MapEntry |
| 07:50 | raek | find can also be used |
| 07:50 | naeu | raek: it doesn't work if i don't call seq, and now i have it seems to be churning all the cpu ;-) I got it to work by just taking enough vals to see the patterns I was looking for though |
| 07:50 | cemerick | &(vector? (first {:a 1})) |
| 07:50 | sexpbot | ⟹ true |
| 07:50 | raek | ,(find {:a nil} :a) |
| 07:50 | clojurebot | [:a nil] |
| 07:50 | raek | ,(find {:a nil} :b) |
| 07:50 | clojurebot | nil |
| 07:50 | AWizzArd | ,(instance? clojure.lang.PersistentVector (first {:a 1})) |
| 07:50 | cemerick | &(-> {:a 1} class supers) |
| 07:50 | clojurebot | false |
| 07:50 | sexpbot | ⟹ #{java.io.Serializable java.lang.Object java.util.concurrent.Callable clojure.lang.AFn clojure.lang.APersistentMap clojure.lang.Seqable clojure.lang.MapEquivalence clojure.lang.IObj java.util.Map clojure.lang.IPersistentMap java.lang.Runnable clojure.lang.ILookup clo... http://gist.github.com/748347 |
| 07:51 | cemerick | whoops |
| 07:51 | cemerick | &(-> {:a 1} first class supers) |
| 07:51 | sexpbot | ⟹ #{java.util.RandomAccess java.util.Map$Entry java.io.Serializable java.lang.Object java.util.concurrent.Callable clojure.lang.AFn clojure.lang.IMapEntry java.util.Collection clojure.lang.Seqable clojure.lang.IPersistentStack clojure.lang.Sequential clojure.lang.APers... http://gist.github.com/748348 |
| 07:52 | raek | naeu: is it a very large array? |
| 07:52 | naeu | raek: jup :-) |
| 07:52 | naeu | raek: it plotted eventually though |
| 07:53 | raek | you could always do something like (take 100 the-array) |
| 07:54 | naeu | raek: that's what i ended up doing :-) |
| 07:54 | naeu | raek: I now have a beautiful plot of a saw-wave |
| 07:57 | AWizzArd | So, a MapEntry is not a PersistentVector. |
| 07:57 | AWizzArd | I could have been more precise. |
| 07:58 | AWizzArd | For me: Vector = clojure.lang.PersistentVector. |
| 07:58 | cemerick | AWizzArd: Shouldn't be. There are lots of IPersistentVector impls. |
| 07:59 | raek | heh, I guess my idea was: x is a vector <=> (vector? x) |
| 07:59 | raek | i.e. instance of IPersistentVector |
| 07:59 | AWizzArd | Okay, this makes more sense, I agree. |
| 08:17 | raek | what is your favorite way of representing a closed set of "typed" values that can contain different number of sub-values depending on the type? |
| 08:17 | raek | something like haskell's 'data' |
| 08:17 | raek | [:unary value-a] [:binary value-a value-b]? |
| 08:18 | raek | {:type :unary, :a value-a} {:type :binary, :a value-a, :b value-b}? |
| 08:18 | raek | [:unary [value-a]] [:binary [value-a value-b]]? |
| 08:27 | Licenser | morning |
| 08:28 | chouser | raek: ^{:type ::unary} [value-a], ^{:type ::binary} [value-a value-b] ? |
| 08:28 | raek | a good option |
| 08:28 | chouser | raek: (defrecord Unary [a]) (defrecord Binary [a b]) |
| 08:29 | raek | even better |
| 08:30 | raek | that avoids the problem of not being able to put metadata on e.g. numbers |
| 08:30 | chouser | yes, but is a wrapper in that case, as is the metadata-on-vector |
| 08:33 | raek | another question: do protocol method implementations that are introduced with exend become real java methods? |
| 08:35 | chouser | no |
| 08:36 | raek | I guess what I am wondering is: should I care about whether I put the methods in a extend or in the defrecords? |
| 08:36 | chouser | raek: http://kotka.de/blog/2010/08/Static_vs_Dynamic.html |
| 08:37 | raek | *reading* |
| 08:41 | raek | chouser: thanks for the input. it feels so obvious now... :) |
| 08:42 | chouser | :-) |
| 10:39 | AWizzArd | I have a namespace N1 in which I define a macro A and a macro B which expands into A. Now I am in namespace N2 and required N1. I call n1/B in my N2 file and get an error "Can't refer to qualified var that doesn't exist". In the expansion A shows up not being qualified as n1/A, but simply as A. Is there an idomatic way to solve this? |
| 10:41 | chouser | can you paste the macro, example usage, and expansion? |
| 10:41 | chouser | or at least the macro |
| 10:41 | opqdonut | yeah, that sounds like your definition is off |
| 10:41 | dsop | is there a better way than doing (if-let [f body] f (something else)) so a shortcut (my-if body (something-else)) ? |
| 10:41 | opqdonut | dsop: (or (body) (something-else)) |
| 10:42 | dsop | ah yeah, for sure |
| 10:42 | dsop | thanks |
| 10:45 | charliekilo | AWizzArd: Wonder if I has to do with ` vs. ' ... as far as I remember, ` expands to fully qualified var, while ' does not ... but thats my guess and chouser is a lot more qualified to answer that one. |
| 10:46 | chouser | charliekilo: you're likely right, but ' instead of ` is a rookie mistake and since AWizzArd is asking, I'm wondering if it's something more subtle |
| 10:48 | AWizzArd | It was something else. It was the reset *warn-on-reflection* thing we talked about the other day. |
| 10:48 | chouser | AWizzArd: you solved it? |
| 10:49 | AWizzArd | Emacs was hiding the namespaces for me, so at a first glance I thought it was about NS qualification. But now I macroexpand-1'ed it and saw that the *old-wor* was not properly introduced. So yes, solved. |
| 11:01 | AWizzArd | (do (def wor# *warn-on-reflection*) (set! *warn-on-reflection* false) (defrecord ...) (set! *warn-on-reflection* wor#) (ns-unmap *ns* 'wor#)) |
| 11:24 | AWizzArd | Maybe it is possible to type-hint this warning about .contains away. Though currently I don't see where the implementation is coming from. In core_deftype.clj I find no .contains call. |
| 11:30 | jcromartie | leiningen has some problems for me on cygwin |
| 11:30 | jcromartie | I'm running 1.4.0 and doing a self-install right now |
| 11:30 | jcromartie | but this is what I get: https://gist.github.com/5622148f4ca0c0b2e36f |
| 11:34 | jcromartie | hmmm |
| 11:34 | jcromartie | part of what lein tries to run ... -Dleiningen.original.pwd=C:\Documents and Settings\ ... |
| 11:34 | jcromartie | unquoted |
| 11:36 | jcromartie | ah, looks to be fixed in https://github.com/technomancy/leiningen/blob/master/bin/lein |
| 11:47 | raek | I'm writing a function called 'available?' that checks whether a sequence is at least 'n' elements long (without forcing more than n elements). have I overlooked something like this in core? |
| 11:49 | fliebel | raek: (= 3 (count (take 3 seq))) |
| 11:49 | AWizzArd | (def available? #(= %2 (count (take %2 %1)))) |
| 11:50 | Clinteger | what editor do you guys use for clojure? :< |
| 11:50 | fliebel | But I don't know anything in core, which is what you asked. |
| 11:50 | raek | fliebel: AWizzArd: thanks |
| 11:50 | fliebel | (also, yay, I wasn't to slow this time) |
| 11:51 | raek | Clinteger: emacs |
| 11:51 | fliebel | Clinteger: vim |
| 11:51 | raek | I was about to implement it with a manual loop |
| 11:51 | Clinteger | fliebel do you have rainbow parens? D: |
| 11:51 | AWizzArd | raek: that would be probably most efficient. |
| 11:51 | raek | but piggybacking on take seems more simple |
| 11:51 | fliebel | yes |
| 11:52 | AWizzArd | raek: if you need a highspeed available? then loop is good. |
| 11:52 | raek | well, the manual loop isn't exactly hard to read |
| 11:52 | raek | a cond with zero? pos? and neg?... |
| 11:52 | raek | it will be called a lot (I'm making a class file parser) |
| 11:53 | fliebel | AWizzArd: Why is the loop faster, and is this still the case with 1.3? |
| 11:55 | AWizzArd | fliebel: take constructs a new seq and thus more garbage. A loop would not need to collect the elments, just count. |
| 12:01 | AWizzArd | I just compared those: (time (available? x 999888)) => "Elapsed time: 222.466157 msecs" for the count+take version vs. (time (foo x 999888)) ==> "Elapsed time: 44.764726 msecs" for the loop |
| 12:01 | ohpauleez | just about all the people you dunk on while playing rec basketball |
| 12:26 | amalloy | Clinteger: having a problem with rainbow parens or something? |
| 12:31 | Clinteger | amalloy it seems kinda buggy, i think thats all lol |
| 12:33 | amalloy | Clinteger: well, you'll never get it figured out if "buggy" is the best you can do. and the source is simple enough; i changed the colors to fit my color scheme, and made it work on []{} as well as just () |
| 12:33 | Clinteger | amalloy no it just doesn't seem to always work o.O |
| 12:33 | Clinteger | but when it does its fine |
| 13:16 | fliebel | What would be the functional equivalent of an ORM? |
| 13:19 | ohpauleez | fliebel: ClojureQL |
| 13:20 | ohpauleez | fliebel: You typically only use relational functions, and call representations of data |
| 13:20 | ohpauleez | relational algebra functions* |
| 13:21 | ohpauleez | but I don't know of any special name, since mapping data is always happening (I tend to use vectors and hashmaps to represent most things) |
| 14:14 | amalloy | i'm having some trouble with (i think) nested backticks. my goal is to take some code from the user, insert a defmacro in front of it that they can use in that context, and then eval it. https://gist.github.com/3738c7ddac879aa790b1 is a simplified version of what i'm trying to do |
| 14:17 | amalloy | this may not be the best way to accomplish my goal, but i don't understand how (macroexpand '(blah)) can expand to (+ 5 10), and (blah) in the same context result in an error |
| 14:18 | chouser | the auto-gensym is probably causing problems |
| 14:18 | chouser | they're only the same when used within the exact same back-tick |
| 14:19 | Raynes | chouser: Ooh. That's bit me in the ass with fury before. |
| 14:20 | amalloy | chouser: but they are, right? both use-foo are within the outer `, and not the inner one. are you talking about foo# instead? |
| 14:20 | chouser | you have foo# and x# in the outer one, and then again in the inner one |
| 14:20 | Raynes | chouser: Oh, by the way. Is there any particular reason that you opted for using a finite state machine to demonstrate mutual recursion rather than the classic odd? even? example? In JoC, of course. |
| 14:21 | chouser | Raynes: I think you'd have to ask fogus on that one |
| 14:21 | amalloy | chouser: right. but i'm unquoting them to try and make them resolve properly, and it /seems/ to be working, since my first example with the macroexpand resolves them right |
| 14:21 | chouser | amalloy: hm... |
| 14:22 | chouser | amalloy: fascinating. you appear to be correct on that. |
| 14:23 | amalloy | chouser: i try to only provide you with interesting problems :) |
| 14:23 | ohpauleez | Raynes: Did you want me to push the new clj-github to clojars on my account, or did you want to push to yours |
| 14:23 | chouser | amalloy: :-) |
| 14:23 | Raynes | ohpauleez: Oh! I totally forgot to push the new version. Sorry. I'll do that immediately. |
| 14:24 | ohpauleez | awesome, thanks man, I'm using it in a new project now |
| 14:24 | ohpauleez | ping me when it's up there :) |
| 14:24 | Raynes | Sure thing. |
| 14:24 | chouser | amalloy: your second example just has an extra (eval ` ) that you don't need |
| 14:26 | amalloy | chouser: i need use-foo to have a gensymmed name |
| 14:26 | chouser | doesn't it/ |
| 14:26 | chouser | ? |
| 14:27 | amalloy | not if i take out the outer ` :P |
| 14:28 | Raynes | ohpauleez: Pushed. |
| 14:28 | amalloy | ie, i can't change it to (let [foo 10] (defmacro use-foo)) |
| 14:28 | ohpauleez | Raynes: You're the man now dog |
| 14:28 | ohpauleez | thanks! |
| 14:29 | chouser | ah |
| 14:29 | chouser | right-o |
| 14:30 | ohpauleez | Does anyone know the process stu uses for signing off on tickets? |
| 14:30 | ohpauleez | besides the process seen at /patches |
| 14:30 | chouser | amalloy: note that foo# gets its unique name generated at read time, so if you do this in a function or macro and call it from multiple places, they'll all use the same name for use-foo |
| 14:31 | amalloy | chouser: aw man, really? |
| 14:31 | amalloy | in that case you're right - the eval ` is meaningless |
| 14:32 | chouser | just use a manual gensym in your function instead |
| 14:33 | amalloy | chouser: so like...(let [name (gensym)] (eval `(defmacro ~name))), right? |
| 14:33 | chouser | yes |
| 14:35 | amalloy | chouser: interestingly, this seems to have fixed the problem |
| 14:35 | Raynes | amalloy: You're defining macros in macros? |
| 14:36 | chouser | hm |
| 14:37 | amalloy | chouser: gist updated (for convenience: https://gist.github.com/3738c7ddac879aa790b1) |
| 14:37 | chouser | the exception you were getting suggests an attempt to call a macro as a function |
| 14:39 | amalloy | hm |
| 14:39 | chouser | the problem was the let, fixed by changing it to a do |
| 14:39 | chouser | a let is compiled as a single top-level form |
| 14:39 | amalloy | chouser: buh? |
| 14:40 | chouser | so use-foo# was not yet a var when (use-foo# 5) was compiled |
| 14:40 | chouser | so it was compiled as a function call |
| 14:40 | chouser | hm. I think. |
| 14:40 | chouser | and then fun as a function call, causing the error. |
| 14:40 | chouser | s/fun/run/ |
| 14:40 | sexpbot | <chouser> and then run as a runction call, causing the error. |
| 14:40 | Raynes | chouser: Do you buy that braininess at some store? I'd like to see about purchasing some for myself. |
| 14:41 | chouser | a runction call. exactly. |
| 14:41 | amalloy | lol |
| 14:41 | pdk | we're takin lessons from scooby doo here |
| 14:41 | chouser | anyway, 'do' is special-cased in the compiler |
| 14:41 | chouser | each form in a do is compiled and run in turn, as if each were a separate top-level form |
| 14:42 | chouser | so that by the time (~fname 5) is compiled, Clojure knows it's a macro call |
| 14:42 | chouser | (let [] (defmacro foo []) (foo)) ; same error |
| 14:42 | amalloy | crazy |
| 14:42 | amalloy | chouser: ooc is that the case even when the do/let aren't at the top level? |
| 14:43 | chouser | no |
| 14:49 | Raynes | Let's all give amalloy a round of applause for making a very strong-willed attempt to fix ##(for [x ["a" "b" "c"]] (.length x)) :> |
| 14:49 | sexpbot | java.lang.IllegalStateException: Var clojail.core/tester is unbound. |
| 14:49 | Raynes | I'm rooting for you, my friend. |
| 14:50 | Raynes | amalloy has ambitions to create his very own organization dedicated to fixing my bugs and cleaning my messes up. |
| 14:51 | amalloy | lol |
| 15:22 | fogus` | Raynes: Because the even? odd? example is uninspiring. :-) |
| 15:48 | clizzin_ | i have a situation where i'd like a function foo to return a lazy seq over the lines of a file, which another function will then read from. the problem is that it seems the reader is being closed after foo exist. i'm using with-open within foo to open the file and create the lazy seq over the lines. how can i achieve the behaviour i'm looking for? |
| 15:52 | amalloy | clizzin_: do you care about retaining laziness? |
| 15:52 | mduerksen | clizzin: with-open ensures that the file is closed properly after its body is evaluated. you would have to process the files contents inside the with-open, or you can't use with-open, but then you will have to take care of the "cleaning" yourself |
| 15:53 | alpheus | Or open/close on successive accesses. |
| 15:54 | clizzin_ | amalloy: yes |
| 15:54 | amalloy | then mduerksen and alpheus have the answers for you: either manage the file yourself, or put the with-open in a context that includes both the reading and the processing |
| 15:55 | clizzin_ | mduerksen: i see. is there a standard solution to this, or is it just wrapping it in a try with a finally to close the reader? |
| 15:56 | clizzin_ | alpheus: i thought that if i close a reader and then reopen it, it would read from the beginning again. is that not the case? |
| 15:56 | amalloy | clizzin_: fyi, your foo function already exists: ##(doc line-seq) |
| 15:56 | sexpbot | ⟹ "([rdr]); Returns the lines of text from rdr as a lazy sequence of strings. rdr must implement java.io.BufferedReader." |
| 15:58 | clizzin_ | amalloy: yeah, i actually wanted to do some additional processing on the lines into a custom record format as they were read from the file, hence my use of "foo." but you're right, the behaviour is just like line-seq. |
| 15:59 | alpheus | clizzin: yes, you'd have to manage your own state with regard to previously read offset etc. I can't give you specifics because I don't know clojure well enought. |
| 15:59 | amalloy | clizzin_: the solution that "feels" most natural to me is to modify foo to accept a continuation function argument: (defn foo [file process] (with-open [stream file] (process (line-seq stream)))) |
| 16:00 | amalloy | that way you're still within the dynamic scope of foo, so the file is still open |
| 16:00 | clizzin_ | amalloy: that actually makes the most sense. nice one. thank you! |
| 16:00 | amalloy | but that may be a clojure monstrosity, a hold-over from my C days. i'm not sure |
| 16:01 | clizzin_ | thank you also, alpheus and mduerksen |
| 16:02 | clizzin_ | amalloy: well, i'll write it, and we'll see if it results in something monstrous... |
| 16:03 | amalloy | clizzin_: you'll have to realize the sequence at some point, so you'll need to make sure that all happens within the with-open's dynamic scope |
| 16:03 | amalloy | otherwise you're just delaying the problem |
| 16:18 | alpheus | Didn't the need for laziness disappear with the continuation function argument solution? |
| 16:19 | clizzin_ | alpheus: no, because the process function is still consuming the sequence lazily. |
| 16:21 | alpheus | I don't see how. How much of the stream does "process" consume when invoked? |
| 16:23 | amalloy | alpheus: if it consumes the sequence lazily, none |
| 16:24 | amalloy | for example, (defn process [lines] (map #(str "line: " %) lines)) |
| 16:26 | amalloy | would be no good: it returns a lazy seq, and when you force the first element, you find that lines can't be read because the file is closed |
| 16:26 | alpheus | I was just about to type that. |
| 16:27 | brehaut | (inc lpetit) |
| 16:27 | sexpbot | ⟹ 1 |
| 16:28 | jcromartie | I like the bit in the try block, it's like a mini-dsl for only this function https://gist.github.com/e79f096508ef51b20459 |
| 16:29 | lpetit | hello. Maybe I'll look like a moron, but what does (inc lpetit) mean, really ? :) |
| 16:29 | brehaut | lpetit: sexpbot's karma tracker |
| 16:30 | jcromartie | (repeatedly #(inc jcromartie)) |
| 16:30 | jcromartie | :( |
| 16:30 | brehaut | (inc jcromartie) |
| 16:30 | sexpbot | ⟹ 1 |
| 16:30 | brehaut | jcromartie: thats inspite of me nearly sneezing coffee over my new computer |
| 16:30 | lpetit | brehaut: than |
| 16:30 | lpetit | arhg |
| 16:30 | jcromartie | I want a reader macro for a special kind of left and right paren that are :( and :) respectively. |
| 16:31 | lpetit | brehaut: my karma's thanking you. What did I do to deserve it ? |
| 16:31 | jcromartie | sexpricons |
| 16:31 | brehaut | lpetit: for services toward rational discussion on the mailing list |
| 16:31 | amalloy | jcromartie: oh my god what a name |
| 16:31 | jcromartie | sounds like a B-movie race of alien sex robots |
| 16:32 | lpetit | brehaut: oh, ok. It's hard to both, at the same time, try to be adult and concise, without being just "more noise" :) |
| 16:32 | brehaut | lpetit: yeah :( |
| 16:32 | chewbran1a | anyone seen this error before? "Anonymous modules have no name to be referenced by" http://pastie.org/1393291 |
| 16:32 | chewbran1a | bah |
| 16:32 | chewbran1a | sorry wrong window |
| 16:33 | amalloy | jcromartie: add a v to the emoticon and they look kinda like unicorns...sexpricorns? |
| 16:33 | lpetit | chewbran1a: yeah, I wish clojure already had modules :) |
| 16:33 | chewbran1a | lpetit: haha |
| 16:34 | lpetit | amalloy slowly leaning towards adult content ... ;) |
| 16:35 | jcromartie | CURSE YOU SQL SERVER TEXT TYPE! |
| 16:36 | lpetit | bed time in France, cu later guys |
| 16:36 | brehaut | lpetit: later |
| 16:41 | alpheus | I'm going on a 53 hour train ride. I want to read some Clojure source on the way. Any recommendations? |
| 16:44 | amalloy | alpheus: sexpbot? |
| 16:44 | Raynes | amalloy: I think he wants to read some good Clojure source code. |
| 16:44 | brehaut | alpheus: have you read enlive ? |
| 16:44 | Raynes | Not that sexpbot wouldn't keep him busy for 53 hours. |
| 16:45 | amalloy | alpheus: and sexpbot has a brand-new quick-start guide to go with the source: http://is.gd/j6an1 |
| 16:45 | alpheus | enlive, no, but I respect it. good idea |
| 16:46 | brehaut | alpheus: i learnt a bunch from the code. it covers a huge range of the language in a very small space |
| 16:46 | brehaut | alpheus: im planning to dig into logos over the holidays |
| 16:47 | brehaut | alpheus: https://github.com/swannodette/logos its a miniKanren implementation; an embeded logical language basically |
| 16:48 | Raynes | alpheus: With 53 hours of train ride, you should have plenty of time to traverse the code of several projects. |
| 16:49 | brehaut | alpheus: may i also suggest ring? its got lots of bite sized pieces |
| 16:49 | jcromartie | is there already an indent-level macro? |
| 16:51 | alpheus | I like all those suggestions. I wanted to have a bunch of code loaded on my laptop before I lost net access. |
| 16:51 | bobo_ | Raynes: has i understood try-clojure and clojail correct, al the security stuff and so on is in clojail? so if i want to make my own try-clojure i can just use clojail? nothing "important" in try-clojure? |
| 16:52 | Raynes | bobo_: Right. try-clojure is mostly a wrapper around clojail. |
| 16:52 | bobo_ | awesome! |
| 16:52 | Raynes | bobo_: tryclojure adds a little stuff to allow def safely, however. |
| 16:52 | Raynes | You looking to make your own try-clojure? :p |
| 16:52 | brehaut | alpheus: also for mind expanding but not strictly useful, grab the monads lib in clojure.contrib and a bunch of texts from the web ;) |
| 16:52 | bobo_ | i want 2 terminals in the same window =) |
| 16:52 | bobo_ | so i can write test in one and code in one |
| 16:53 | bobo_ | and i noticed you used hiccup, so... il start from scratch :-p |
| 16:54 | bobo_ | as everything i do, il probably get boored before im done but still |
| 16:54 | Raynes | :p |
| 16:54 | jcromartie | here is my contribution to the Clojure community, an indentation level macro that rebinds println |
| 16:54 | jcromartie | https://gist.github.com/749062 |
| 16:55 | jcromartie | finally, I can sleep |
| 16:55 | jcromartie | no, I can die |
| 16:56 | amalloy | jcromartie: ((fnil inc 0) *indent*) might be cleaner? i dunno |
| 16:57 | jcromartie | I just realized something silly |
| 16:57 | jcromartie | there, updated https://gist.github.com/gists/749062/edit |
| 16:57 | jcromartie | the first (with-indent ...) should start indenting |
| 16:57 | jcromartie | not start at zero |
| 16:58 | amalloy | jcromartie: that's what my little fnil friend does |
| 16:58 | jcromartie | right, but I just bind *indent* to 0 at the root |
| 16:58 | jcromartie | that's all it needs |
| 16:59 | amalloy | that's true |
| 16:59 | jcromartie | should work across threads too |
| 17:12 | jcromartie | durr, nobody needs an edit link... https://gist.github.com/749062 |
| 17:33 | alpheus | Raynes: you're in the "most forked this month" on github |
| 17:34 | Raynes | alpheus: Really? :o |
| 17:34 | alpheus | at least in the Clojure language category |
| 17:35 | Raynes | Neato. |
| 17:35 | Raynes | amalloy: We're in the "Most Forked This Month" category! :D |
| 17:36 | amalloy | ! |
| 17:36 | amalloy | linky? |
| 17:36 | brehaut | amalloy: https://github.com/languages/Clojure |
| 17:36 | Raynes | https://github.com/languages/clojure |
| 17:37 | kotarak | People fork *richhickey*/clojure-contrib? o.O |
| 17:38 | brehaut | kotarak: but only this month, this week and today clojure/clojure-contrib is ahead |
| 17:38 | amalloy | kotarak: google still turns that up first |
| 17:38 | ohpauleez | Scala is the 17th most popular language on github, clojure... the 18th |
| 17:39 | brehaut | ls |
| 17:40 | Raynes | brehaut: I've tried to join channels by using /cd |
| 17:41 | brehaut | Raynes: hah awesome |
| 17:48 | raek | ,(clojure-version) |
| 17:48 | clojurebot | "1.2.0" |
| 17:48 | raek | &(clojure-version) |
| 17:48 | sexpbot | ⟹ "1.2.0" |
| 17:52 | Clinteger | hmph. writing clojure on windows is a pita :| |
| 17:53 | kotarak | Clinteger: I don't notice much difference to my mac setup: everything works fine on Windows too. |
| 17:54 | Clinteger | kotarak what editor do you use? |
| 17:54 | kotarak | Vim |
| 18:07 | Raynes | Clinteger: Emacs and Vim both work fine in Windows. |
| 18:07 | Raynes | I mean, last time I used them on Windows. |
| 18:07 | Raynes | Quite a while ago. |
| 18:07 | Raynes | There is always Eclipse+Counterclockwise. |
| 18:08 | Raynes | I hear the Intellij support is pretty good as well. |
| 18:24 | Clinteger | Raynes emacs forkbombs me :( |
| 18:24 | Raynes | Clinteger: Install Ubuntu. :> |
| 19:13 | zemariamm | Hello everyone |
| 19:29 | jweiss | shouldn't surrounding for or map with doall force the evaluation of all the items? |
| 19:30 | jweiss | whether they're consumed by something lower in the stack or not? |
| 19:30 | qbg | It should |
| 19:31 | zemariamm | has anyone successfully used compojure on appengine ? |
| 19:32 | ossareh | 'lo |
| 19:34 | ossareh | technomancy: your emacs starter kit rocks out, though the clojure function fnil falls foul of the pretty-lambdas hook. I'm unfamiliar with elisp, is there a quick fix for that? |
| 20:02 | dsop | is there a short way for (((foo :bar) :baz) :blub) ? |
| 20:05 | qbg | ,(doc get-in) |
| 20:05 | clojurebot | "([m ks] [m ks not-found]); Returns the value in a nested associative structure, where ks is a sequence of ke(ys. Returns nil if the key is not present, or the not-found value if supplied." |
| 20:06 | hiredman | (-> foo :bar :baz :blub) |
| 20:06 | dsop | qbg: thx |
| 20:10 | KirinDave | hiredman: Call me crazy, but I like yours better. |
| 20:10 | KirinDave | I am a sucker for thrush, tho. |
| 20:11 | qbg | -> is more general, but get-in may convey the intent better |
| 20:18 | brehaut | dsop: if you need to pass it in to another fn, you might find (comp :blub :baz :bar) useful too |
| 20:21 | dsop | brehaut: hmm interesting that I can comp those |
| 20:21 | dsop | I'm quite new to lisp and clojure so it's kind of hart to find the right fn everytime. |
| 20:21 | brehaut | dsop: its the exact same trick as hiredman's -> namely that keywords implement the function interface |
| 20:24 | brehaut | dsop: have a play with fn? and ifn? in a repl |
| 20:24 | brehaut | ,(fn? :keyword) |
| 20:24 | dsop | brehaut: i figure it's the best way to do use this, so (:foo map) is better than (map :foo) as (nil :foo) will cause an illegal argument |
| 20:24 | clojurebot | false |
| 20:24 | dsop | brehaut: yeah, palying around in slime with it :) |
| 20:24 | brehaut | ,(ifn? :keyword) |
| 20:24 | clojurebot | true |
| 20:24 | brehaut | dsop i believe the answer to that depends on the usage of the map |
| 20:25 | brehaut | dsop: if its being used as a record, then (:key map) is prefered |
| 20:26 | brehaut | dsop: and thats usually the case if you have keyword keys |
| 20:28 | dsop | yes I mainly use json-parse and therefore maps that are records |
| 20:30 | brehaut | dsop: sure. keyword first then :) |
| 20:31 | brehaut | dsop: at some point you should also check out the clojure.zip namespace |
| 20:33 | brehaut | dsop: its a generic library for walking tree shaped things |
| 20:34 | dsop | I've seen this while I searched for what zip is in haskell |
| 20:34 | brehaut | zip in haskell is different; it takes two lists and returns a list of pairs |
| 20:34 | brehaut | the clojure equivalent is map |
| 20:34 | dsop | exactly, I searched for that |
| 20:34 | dsop | but yeah |
| 20:56 | krumholt | hi |
| 23:38 | Derander | What is the function that returns a function that is the result of applying both functions? |
| 23:38 | brehaut | Derander: juxt ? |
| 23:38 | Derander | yes! |
| 23:45 | hiredman | ,(doc case) |
| 23:45 | clojurebot | "([e & clauses]); Takes an expression, and a set of clauses. Each clause can take the form of either: test-constant result-expr (test-constant1 ... test-constantN) result-expr The test-constants are ... |
| 23:45 | amalloy | &(doc case) |
| 23:45 | sexpbot | ⟹ "Macro ([e & clauses]); Takes an expression, and a set of clauses. Each clause can take the form of either: test-constant result-expr (test-constant1 ... test-constantN) result-expr The test-constants are not evaluated. They must be compile-time literals, and need no... http://gist.github.com/749506 |
| 23:46 | amalloy | oh haha, sorry hiredman, didn't notice it was you looking up case. i was just giving whoever it was a gist |
| 23:47 | Raynes | I just wrote a subsubsection on case. |
| 23:47 | hiredman | *shrug* |
| 23:47 | Raynes | But that's still a secret. |