2012-08-16
| 00:31 | jlewis | amalloy: lo and behold, the guy who wrote clj-ds rewrote PersistentHashMap.iterator to make it iterative instead of recursive... and broke it! |
| 00:31 | jlewis | can't reproduce the problem with the original iterator |
| 00:31 | jlewis | really scary... it like *mostly* works, until you have hundreds of megabytes in your map, and suddenly it barfs |
| 00:40 | wmealing_1 | sounds like fun |
| 01:52 | tomoj | anyone seen errors like this in cljs on node? https://www.refheap.com/paste/55b6635602282be89a3013d59 |
| 01:52 | tomoj | goog.global.goog.debug is set |
| 01:53 | tomoj | (by goog.provide('goog.debug.Error')) |
| 01:53 | tomoj | but 'goog' does not refer to the same thing as 'goog.global.goog' |
| 01:53 | tomoj | so goog.debug.Error = ... fails |
| 01:53 | tomoj | in whitespace mode |
| 01:54 | tomoj | I have clojurescript head on a source-path |
| 01:55 | tomoj | oh |
| 01:55 | tomoj | http://dev.clojure.org/jira/browse/CLJS-101 |
| 01:56 | tomoj | ..first result for the obvious thing to google |
| 02:18 | ro_st | so, what do we all use for logging? :-) |
| 02:29 | zeromodulus | oy, I really want to use clojure, but I run into so many problems it's discouraging. :( |
| 02:31 | zeromodulus | can't figure out how to install tagsoup with leiningen |
| 02:33 | zeromodulus | I don't want to use ruby, but looks like I'll have to. v.v |
| 02:33 | ro_st | what do you want to do with tagsoup? |
| 02:34 | tomoj | http://search.maven.org/#search%7Cga%7C1%7Ctagsoup |
| 02:34 | tomoj | [org.ccil.cowan.tagsoup/tagsoup 1.2.1] |
| 02:35 | tomoj | er |
| 02:35 | Cr8 | I really like Jsoup, which is in central, so you can pull it in with just [org.jsoup/jsoup "1.6.3"] |
| 02:35 | tomoj | [org.ccil.cowan.tagsoup/tagsoup "1.2.1"] |
| 02:40 | Cr8 | (map #(.attr % "title") (.select (.get (org.jsoup.Jsoup/connect "http://en.wikipedia.org/")) "#mp-itn b a")) ; List of titles of wp news headlines |
| 02:42 | ro_st | ah, there's also enlive |
| 02:43 | Cr8 | https://github.com/cgrand/enlive/ yes |
| 02:44 | ro_st | googling for clojure logging is giving me plenty of old hits (contrib comes up often). |
| 02:44 | ro_st | anyone know of a newer clojurey approach to logging that's as awesome as the rest of the ecosystem? |
| 02:45 | ro_st | found this, so far |
| 02:45 | ro_st | https://github.com/malcolmsparks/clj-logging-config |
| 02:46 | Cr8 | I think I saw this on the list recently: https://github.com/ptaoussanis/timbre |
| 02:46 | ro_st | ahh there we go |
| 02:48 | ro_st | thanks Cr8! |
| 02:48 | Cr8 | np :) |
| 02:55 | magopian | do you know any (very cool) company that uses clojure and who might recruit? |
| 02:55 | magopian | i'm thinking something like github for rails |
| 02:58 | hyPiRion | http://thinkrelevance.com/jobs |
| 03:00 | alexey | magopian: I work for such company; we are not recruiting at the moment but probably will be later in the autumn. |
| 03:00 | magopian | thanks hyPiRion |
| 03:00 | magopian | alexey: what's the name? |
| 03:00 | alexey | magopian: to avoid advertising, sent as private message |
| 03:00 | magopian | oh ok sure ;) |
| 03:02 | hyPiRion | alexey: That's a strange policy for a company. |
| 03:02 | hyPiRion | "We do not like advertising!" |
| 03:02 | alexey | Nah, it's not the policy of the company |
| 03:02 | ro_st | he's respecting irc etiquette |
| 03:02 | alexey | I didn't want to spam the channel :) |
| 03:03 | wmealing_1 | respect |
| 03:03 | wmealing_1 | which country ? |
| 03:03 | alexey | Finland |
| 03:07 | ro_st | South Africa, here |
| 03:07 | ro_st | we just hired a guy |
| 03:08 | ro_st | can't say we're like github, though. he's programmer #3 :-) |
| 03:12 | magopian | ro_st: it's not the number i was comparing to (the number of employees) |
| 03:13 | magopian | but more the "feeling" |
| 03:21 | ro_st | right |
| 03:24 | magopian | ro_st: proof: in 5 years, _none_ of the employees at github have left |
| 03:24 | magopian | that must mean something, right? |
| 03:24 | ro_st | i know |
| 03:25 | ro_st | i saw Zach speak at scaleconf, and i spoke with at the github sponsored beers after the conf as well |
| 03:25 | ro_st | we're trying to set ourselves up the same way |
| 03:27 | magopian | ro_st: excellent ;) |
| 03:59 | ro_st | how do i pprint to a string instead of to *out* ? |
| 04:00 | magopian | ro_st: there's a pr-str command |
| 04:00 | magopian | wait |
| 04:00 | ro_st | aha! with-out-str |
| 04:01 | magopian | http://clojuredocs.org/clojure_core/clojure.core/pr-str |
| 04:01 | magopian | there's quite a few different options actually ;) |
| 04:02 | ro_st | i'm after pretty printing at the moment |
| 04:02 | ro_st | a content format we have is moving from xml to plain clojure |
| 04:07 | blackdog | trying to benchmark my noir hello-world app for sanity, and i'm getting apr_socket_recv: Connection reset by peer after 3-10 requests. any ideas what i might have wrong? |
| 05:04 | clgv | lpetit: ping? |
| 05:34 | noidi | what's a nice way to check if a collection contains every item in another collection? |
| 05:35 | noidi | (xxx [:foo :bar] [:foo :bar :baz]) => true, (xxx [:foo :bar] [:foo :baz]) => false |
| 05:36 | babilen | noidi: Convert both to sets and compare those comes to mind ... Or should do you want (not= [:a :a :b] [:a :b]) => true ? |
| 05:37 | babilen | s/not=/xxx/ :) |
| 05:38 | ro_st | ,(doc some) |
| 05:38 | clojurebot | "([pred coll]); Returns the first logical true value of (pred x) for any x in coll, else nil. One common idiom is to use a set as pred, for example this will return :fred if :fred is in the sequence, otherwise nil: (some #{:fred} coll)" |
| 05:38 | noidi | babilen, yeah, maybe sets could do for this case |
| 05:39 | noidi | some returns true if, well, _some_ of the needles are found in the haystack. i want to know if _all_ needles were found :) |
| 05:39 | babilen | noidi: Bad approach though performance wise and you could terminate as soon as you find one element that is not in the other collection ... |
| 05:41 | mduerksen_ | noidi: there is a clojure.set/subset? function for your use-case, but only if its ok that (clojure.set/subset? (set [1 2]) (set [1 2])) => true. this means that you have to turn your collections into sets, so you will have to decide if thats okay for you performancewise |
| 05:41 | babilen | ,(every? #{:a :b} [:a :b]) |
| 05:41 | clojurebot | true |
| 05:42 | babilen | noidi: That ^^ still requires that you convert one coll into a set, but should be idiomatic. |
| 05:42 | noidi | huh? that works! :) |
| 05:42 | noidi | now I have to think for a bit WHY it works :) |
| 05:42 | noidi | thanks! |
| 05:43 | noidi | ah, that reads exactly how it needs to work |
| 05:44 | noidi | for every item that I'm looking for, make sure it's found in the given collection |
| 05:46 | babilen | ,(list (#{:a :b :c} :x) (#{:a :b :c} :c)) |
| 05:46 | clojurebot | (nil :c) |
| 05:46 | babilen | noidi: That might help when you want to understand it ^^^ -- Another common idiom is &(#{:a :b :c} [:a :b :x :y :x]) |
| 05:46 | DrPheltRight | cr |
| 05:46 | babilen | noidi: Err, make that % (remove #{:a :b :c} [:a :b :x :y :x]) |
| 05:47 | noidi | yeah, I'm use (some #{...} ...) often |
| 05:47 | noidi | but it didn't occur to me to use every? that way :) |
| 05:48 | noidi | it's probably because I'm so used to using `some` that way |
| 05:49 | noidi | so it didn't occur to me to place the things that I'm looking for last, as a seq, and the collection in which to look first, as a set |
| 05:50 | noidi | babilen, thanks again, that's a useful trick to know! |
| 06:04 | hyPiRion | Another neat trick is the some-fn |
| 06:04 | hyPiRion | ,(filter (some-fn integer? string?) [1 2 :foo 2.0 "string"]) |
| 06:05 | clojurebot | (1 2 "string") |
| 06:10 | hyPiRion | hm. ##(filter #(<= 0 (.indexOf [1 5 "foo"] %)) [1 2 "foo" 3 4 5 "bar" "baz"]) |
| 06:10 | lazybot | ⇒ (1 "foo" 5) |
| 06:16 | nbeloglazov | &(doc int?) |
| 06:16 | lazybot | java.lang.RuntimeException: Unable to resolve var: int? in this context |
| 06:16 | hyPiRion | integer |
| 06:16 | hyPiRion | &(doc integer?) |
| 06:16 | lazybot | ⇒ "([n]); Returns true if n is an integer" |
| 06:16 | nbeloglazov | Just checked |
| 06:20 | nbeloglazov | $(source integer?) |
| 06:20 | nbeloglazov | &(source ingeter?) |
| 06:20 | lazybot | java.lang.RuntimeException: Unable to resolve symbol: source in this context |
| 06:20 | nbeloglazov | &source integer? |
| 06:20 | lazybot | java.lang.RuntimeException: Unable to resolve symbol: source in this context |
| 06:20 | nbeloglazov | :( |
| 06:21 | hyPiRion | ,(source integer?) |
| 06:21 | clojurebot | Source not found |
| 06:21 | hyPiRion | I think it's clojailed. |
| 06:21 | hyPiRion | Either that, or jar'd, so that it's unavailable. |
| 06:23 | clgv | $source integer? |
| 06:23 | lazybot | integer? is http://is.gd/BopmnQ |
| 06:24 | clgv | but that task needs an update |
| 06:38 | clgv | is there already an equivalent for clojure.contrib.repl-utils/show? last time I checked there was not... :( |
| 06:43 | hyPiRion | clgv: What did it do? |
| 06:43 | clgv | hyPiRion: print all methods of a given object/class |
| 06:43 | clgv | with argument infos etc |
| 06:47 | clgv | well, I guess I port it to one of my tool libs |
| 06:47 | hyPiRion | Yeah, the source's available, so why not. |
| 07:24 | clgv | needs a bit of rework though. there is some weird code in there ;) |
| 07:48 | ludston | Is there a setting to kill the *SLIME Compilation* buffer after an errorless compile? |
| 07:49 | hyPiRion | C-b "*Sl" TAB C-x k RET ? |
| 07:49 | ludston | Good one. |
| 07:49 | ludston | lol |
| 07:50 | hyPiRion | You could probably just make a binding yourself, it seems easier. |
| 07:50 | ludston | I'll try that then |
| 07:51 | hyPiRion | It doesn't seem like the most standard way of working with Slime though. Is there any reason why you would like that feature? |
| 07:53 | ludston | Because it jumps up and takes over my repl if I have errors, and then doesn't go away again when I don't need it any more |
| 07:54 | ludston | s/repl/buffer |
| 07:54 | hyPiRion | oh |
| 08:01 | ivaraasen | anyone here read "Effective Java" by Joshua Bloch? |
| 08:05 | antifuchs | hugod: I'm just peeking at ritz again, and I notice you've changed the RPC code structure (: |
| 08:05 | nbeloglazov | ivaraasen: I have. What is the question? |
| 08:05 | antifuchs | hugod: is rpc.clj responsible for both swank and nrepl now? |
| 08:44 | ivaraasen | nbeloglazov: would you recommend the book to a CS student? I've only skimmed through a couple of chapters. seems to promote a semi-functional style, at least immutability. |
| 09:05 | Cheiron | Hi, I have a clojure application that uses Hector Cassandra library. I decided to extract Hector code into its own lein project. Clojure code still require subproject code but to make it possible? |
| 09:07 | nbeloglazov | ivaraasen: Yes, I would recommend it. Of course if you're using java. It has many nice advices and tricks |
| 09:09 | hugod | antifuchs: I haven't really changed rpc.clj at all - it is solely for the swank protocol |
| 09:09 | antifuchs | ah, great then (: |
| 09:09 | hugod | nrepl is handled by pulling in the nrepl lib |
| 09:09 | antifuchs | I'm currently hacking on the swank-clojure rpc, but should be straightforward to port anyway |
| 09:10 | hugod | they are essentially the same |
| 09:11 | hugod | antifuchs: ritz.nrepl provides a nrepl server that can run a debugger |
| 09:11 | antifuchs | cool |
| 09:23 | antifuchs | so, um. is there anything re. object identity I'm missing when my tests fail with: |
| 09:23 | antifuchs | actual: (not (= (:keyword "string") (:keyword "string"))) |
| 09:23 | antifuchs | that looks the same to me, and the REPL returns false when I try to eval this (quoted) |
| 09:26 | @Chouser | ,(= (:keyword "string") (:keyword "string")) |
| 09:26 | clojurebot | true |
| 09:26 | @Chouser | what do you mean, "(quoted)"? |
| 09:27 | @Chouser | ,(:keyword "string") |
| 09:27 | clojurebot | nil |
| 09:27 | @Chouser | ,'(:keyword "string") |
| 09:27 | clojurebot | (:keyword "string") |
| 09:28 | hyPiRion | The result should be false, no? |
| 09:28 | hyPiRion | ,(not (= (:keyword "string") (:keyword "string"))) |
| 09:28 | clojurebot | false |
| 09:29 | hyPiRion | ,(not (= nil nil)) |
| 09:29 | clojurebot | false |
| 09:31 | magopian | ,(not= nil nil) |
| 09:31 | clojurebot | false |
| 09:34 | ludston | ,(def who-is-awesome 'ludston) |
| 09:34 | clojurebot | #<Exception java.lang.Exception: SANBOX DENIED> |
| 09:34 | ludston | Sadface. |
| 09:34 | Sweden_jack | Ouch |
| 09:37 | augustl | got a Java object with a .getCount() and .getItemAtIndex() type API that I want to list in a clojure vector. What are good ways to do that? |
| 09:37 | augustl | I'm thinking something like making a lazy sequence that is capped at .getCount() and then map that lazy sequence |
| 09:39 | ro_st | you know you work for the right people when they love Rich Hickey's talks just as much as you do |
| 09:41 | augustl | (map fn... (range n)) seems good |
| 09:45 | hyPiRion | augustl: Could you use iterator-seq or enumerator-seq? |
| 09:48 | ludston | ,(loop [damn-your-insulting-ways true] (recur damn-your-insulting-ways)) |
| 09:48 | clojurebot | Execution Timed Out |
| 09:48 | ludston | Mwhahahaha |
| 09:48 | hcastro | does anyone know how to prevent the return value of -main from printing to stdout? |
| 09:48 | hyPiRion | I can make you more awesome, ludston |
| 09:48 | hyPiRion | (inc ludston) |
| 09:48 | lazybot | ⇒ 1 |
| 09:49 | ludston | (def imnotsureibelieveyoubutokletstrythiscouldgetburnedbutwatchoutbois true) |
| 09:49 | ludston | ,(def imnotsureibelieveyoubutokletstrythiscouldgetburnedbutwatchoutbois true) |
| 09:49 | clojurebot | #<Exception java.lang.Exception: SANBOX DENIED> |
| 09:50 | ludston | (inc ludston) |
| 09:50 | lazybot | You can't adjust your own karma. |
| 09:50 | ludston | Awwww |
| 09:50 | hyPiRion | &'(inc ludston) |
| 09:50 | lazybot | ⇒ (inc ludston) |
| 09:50 | hyPiRion | ,'(inc ludston) |
| 09:50 | clojurebot | (inc ludston) |
| 09:50 | lazybot | ⇒ 2 |
| 09:50 | hyPiRion | loophole |
| 09:50 | ludston | This is the best day ever. |
| 09:50 | ludston | ,'(inc ludston) |
| 09:50 | clojurebot | (inc ludston) |
| 09:50 | lazybot | ⇒ 3 |
| 09:52 | Fossi | yeah |
| 09:52 | Fossi | the bots should ignore each other |
| 09:53 | Fossi | i think one of them does |
| 09:53 | Fossi | so you can't pingpong |
| 09:53 | hyPiRion | heh |
| 09:53 | ludston | It's probably impossible to get lazybot to put a comma down |
| 09:53 | Fossi | ah, lazybot also "escapes" by printing the arrow first |
| 09:54 | hyPiRion | &(prn "foo") |
| 09:54 | lazybot | ⇒ "foo" nil |
| 09:54 | ro_st | i want to sort a map by its keys. i have the keys in order in a vector. how would i do this? |
| 09:54 | ludston | ,(print ",(print 'blah')") |
| 09:54 | clojurebot | ,(print 'blah') |
| 09:54 | @Chouser | &(prn (symbol ",") '(inc chouser)) |
| 09:54 | lazybot | ⇒ , (inc chouser) nil |
| 09:55 | hyPiRion | heh. |
| 09:55 | nbeloglazov | ,(sort-by first {:b 1 :c 2 :a 3}) |
| 09:55 | Fossi | foo ,(+ 1 1) |
| 09:55 | clojurebot | ([:a 3] [:b 1] [:c 2]) |
| 09:55 | ludston | ,(print "&(print 'blah')") |
| 09:55 | clojurebot | &(print 'blah') |
| 09:55 | lazybot | ⇒ blah'nil |
| 09:56 | gfredericks | is it bad form for a library to (defmethod print-method <some common type> ...)? |
| 09:56 | hyPiRion | ro_st: You could do ##(sort-by #(.indexOf [:b :a :c] %) {:a 1 :b 5 :c 6}) |
| 09:56 | lazybot | ⇒ ([:a 1] [:c 6] [:b 5]) |
| 09:56 | ro_st | ahh indexOf |
| 09:56 | ro_st | didn't realise i had to use a java call |
| 09:56 | ro_st | thanks hyPiRion |
| 09:57 | trptcolin | :w |
| 09:57 | trptcolin | oops. sorry :) |
| 09:57 | hyPiRion | ,(println "&(prn :foo)") |
| 09:57 | clojurebot | &(prn :foo) |
| 09:57 | lazybot | ⇒ :foo nil |
| 09:57 | @Chouser | that's going to search the vector many many times |
| 09:58 | hyPiRion | Yeah, it's O(n²) |
| 09:58 | hyPiRion | multiplied by a log |
| 09:58 | @Chouser | (map {:a 1 :b 5 :c 6} [:b :a :c]) |
| 09:59 | @Chouser | You want vals or key/val pairs? |
| 09:59 | magopian | maybe you could build a new map |
| 09:59 | ludston | &(print (str '##' '(print "boo")') |
| 09:59 | lazybot | ⇒ (quote (print "boo")) |
| 09:59 | magopian | like Chouser said |
| 09:59 | gfredericks | ,(into {} (map-indexed list [:b :a :c])) |
| 09:59 | clojurebot | #<ClassCastException java.lang.ClassCastException: java.lang.Long cannot be cast to java.util.Map$Entry> |
| 09:59 | magopian | well, nearly like he said ;) |
| 09:59 | ludston | &(print (str "##" '(print "boo")') |
| 09:59 | lazybot | java.lang.RuntimeException: Unmatched delimiter: ) |
| 09:59 | @Chouser | ,(map #(find {:a 1 :b 5 :c 6} %) [:b :a :c]) |
| 09:59 | clojurebot | ([:b 5] [:a 1] [:c 6]) |
| 10:00 | hyPiRion | Yeah, that's faster. |
| 10:00 | nbeloglazov | ,(doc find) |
| 10:00 | clojurebot | "([map key]); Returns the map entry for key, or nil if key not present." |
| 10:00 | @Chouser | n log n instead of n^2 log n |
| 10:00 | magopian | nice ;) |
| 10:00 | hyPiRion | It would be better with keep though |
| 10:01 | hyPiRion | ,(keep (partial find {:a 1 :b 5 :c 6}) [1 2 :b :a :c]) |
| 10:01 | clojurebot | ([:b 5] [:a 1] [:c 6]) |
| 10:01 | hyPiRion | ,(map (partial find {:a 1 :b 5 :c 6}) [1 2 :b :a :c]) |
| 10:01 | clojurebot | (nil nil [:b 5] [:a 1] [:c 6]) |
| 10:02 | @Chouser | I guess it depends on whether or not you want to know about bad keys in your vector |
| 10:02 | gfredericks | ,(map-indexed (comp vec reverse list) [:b :a :c]) |
| 10:02 | clojurebot | ([:b 0] [:a 1] [:c 2]) |
| 10:02 | ro_st | not all keys in the vector are in the map |
| 10:02 | gfredericks | ,(into {} (map-indexed (comp vec reverse list) [:b :a :c])) |
| 10:02 | clojurebot | {:b 0, :a 1, :c 2} |
| 10:02 | ro_st | i just want the keys that _are_ in the map to be in the proscribed order |
| 10:02 | gfredericks | ,(zipmap [:b :a :c] (range)) |
| 10:02 | clojurebot | {:c 2, :a 1, :b 0} |
| 10:02 | @Chouser | ah, then hyPiRion's got it exactly right |
| 10:03 | cshell | sorted map? |
| 10:08 | @Chouser | cshell: interesting idea. |
| 10:08 | robermann | In order to use the last ccw Eclipse plugin do I need to intall lein2 too, or lein1 is enough? |
| 10:08 | @Chouser | ,(let [vec-order (zipmap [:b :a :c] (range))] (into (sorted-map-by #(< (vec-order %1) (vec-order %2))) {:a 1 :b 5 :c 6})) |
| 10:08 | clojurebot | {:b 5, :a 1, :c 6} |
| 10:09 | hyPiRion | It really depends on the vector and the map though. |
| 10:10 | hyPiRion | Then again, all of these solutions are. |
| 10:13 | ro_st | if i have ([:a 1] [:b 2]) and i want {:a 1 :b 2}, it's (apply hash-map seq) right? |
| 10:13 | ro_st | but that'll probably tear the sort up again |
| 10:13 | hyPiRion | try out the ordered-map |
| 10:13 | ro_st | will do |
| 10:13 | hyPiRion | It's not in core though. |
| 10:14 | @Chouser | ro_st: not apply hash-map. You'd want (into {} the-seq), but yes that will lose any order you gave it. |
| 10:14 | ro_st | sorted-map-by? it is |
| 10:14 | ro_st | trying that.. |
| 10:14 | @Chouser | apply hash-map is for when you have interleaved key/vals like [:a 1 :b 2] |
| 10:15 | hyPiRion | Oh, the anonymous fn is kind of bothersome. |
| 10:15 | @Chouser | then name it? :-) |
| 10:15 | hyPiRion | ,(let [vec-order (zipmap [:b :a :c] (range))] (into (sorted-map-by (comparator vec-order)) {:a 1 :b 5 :c 6})) |
| 10:15 | clojurebot | {:b 5, :c 6, :a 1} |
| 10:16 | @Chouser | hyperboreean: ah, nice. |
| 10:16 | @Chouser | wait, that's not what I thought comparator did |
| 10:17 | hyPiRion | $source comparator |
| 10:17 | lazybot | comparator is http://is.gd/dalGK8 |
| 10:18 | @Chouser | pred is called with two args |
| 10:18 | @Chouser | to compare |
| 10:18 | hyPiRion | It's more or less your anonymous function. |
| 10:18 | @Chouser | you're supplying vec-order as the pred, but vec-order doesn't compare two args |
| 10:19 | @Chouser | but the return value of your example looks right. I'm trying to figure out why |
| 10:19 | hyPiRion | Oh, I see |
| 10:20 | ro_st | i'm trying to use [:a :b :c] as my vec-order |
| 10:20 | hyPiRion | ({:a 1 :b 5} 1 :b} |
| 10:20 | hyPiRion | It's the optional argument at work. |
| 10:20 | ro_st | ah i need to zipmap |
| 10:21 | @Chouser | at work hiding the mistake, yes. |
| 10:21 | @Chouser | ,(let [vec-order (zipmap [:b :c :a] (range))] (into (sorted-map-by (comparator vec-order)) {:a 1 :b 5 :c 6})) |
| 10:21 | clojurebot | {:b 5, :c 6, :a 1} |
| 10:22 | @Chouser | wait, that still looks right |
| 10:22 | hyPiRion | try with [:c :a :b] |
| 10:23 | @Chouser | oh, actually you original example returned the wrong order but I didn't catch it. *sigh* |
| 10:23 | @Chouser | [:b :a :c] returned {:b 5, :c 6, :a 1} |
| 10:23 | @Chouser | ok, so comparator isn't quite what is wanted here |
| 10:24 | hyPiRion | to put it mildly |
| 10:24 | @Chouser | in fact I think comparator is never needed because fns do that automatically |
| 10:24 | TimMc | &(map (comp :added meta) [#'*' #'*]) |
| 10:24 | lazybot | ⇒ ("1.0" "1.2") |
| 10:25 | antifuchs | yayy, almost got the most recent slime to connect |
| 10:25 | hyPiRion | Chouser: Oh, I think it's needed for java interop |
| 10:25 | @Chouser | ,(.compare (fn [a b] (> a b)) 2 1) |
| 10:26 | clojurebot | -1 |
| 10:26 | hyPiRion | ,(.compare > 2 1) |
| 10:26 | clojurebot | -1 |
| 10:26 | hyPiRion | even |
| 10:27 | ro_st | so that works (sorted-map-by #(< (vec-order %1) (vec-order %2))) |
| 10:27 | @Chouser | fn's implement java.util.Comparator and do something sensible when the fn returns boolean. |
| 10:27 | fbru02 | i have a datomic question, simple one, let's say you got 2 peers and one value , peer one updates the value and keeps that cached in the machine, how does peer2 know that the value changed ?? is there a notification kinda thing ? |
| 10:27 | ro_st | now i'm trying to walk a nested graph of maps |
| 10:27 | ro_st | (clojure.walk/prewalk (fn [x] (if (map? x) (sorter x) x)) mm) |
| 10:28 | ro_st | would using sorted-map-by cause complications in doing this? |
| 10:28 | ro_st | if i don't use the sorter fn in the postwalk (not a prewalk) it comes out just fine |
| 10:29 | hyPiRion | Chouser: So comparator isn't needed at all anymore, then? |
| 10:29 | ro_st | but as soon as i use sorter, i get Evaluation aborted. which is super helpful |
| 10:30 | ro_st | fbru02: i believe the transactor is notified and the value only actually becomes available to everyone (including the source) process once the transactor commits |
| 10:30 | ro_st | don't quote me on that, though :-) |
| 10:31 | fbru02 | ro_st: oh i see , interesting that the source has to "wait" on the transactor , I guess that the transactor also has a list on which peers to notify on an update |
| 10:32 | @Chouser | hyPiRion: I can't think why it would be, but maybe I'm missing something. |
| 10:32 | ro_st | i could be dead wrong. but based on my understanding of the talks and reading i've seen and done, the transactor is the only thing that does writes |
| 10:32 | ro_st | which means that the only way to see new values is for the transactor to write it first |
| 10:33 | @Chouser | hyPiRion: But it's been this way a long time: https://github.com/clojure/clojure/commit/67975cdedfa8a2f7780062cb67182aff32e7679e |
| 10:33 | ro_st | i don't think the transactor notifies peers; i think your app would write and forget about it, or continue to use the value it already has a reference to post-write, or write, and then requery, causing the data to be retrieved again |
| 10:34 | ro_st | do visit #datomic, anyhow |
| 10:36 | robermann | any counterclockwise user here? I followed the installation instructions but the leiningen project created by the plugin is empty (no src folder). Is it correct? |
| 10:37 | fbru02 | ro_st: thanks ! |
| 10:39 | antifuchs | ok, so I have some local changes to swank-clojure that I want to try out. "lein run" doesn't work, and "lein swank" loads the mainline swank clj jar. how can I run my locally patched copy? |
| 10:41 | hyPiRion | Chouser: Well, thank you for clearing up what it does. I always though it was implemented as (fn [f] (fn [x y] (.compare (f x) (f y)))) |
| 10:43 | dnolen | once again Yegge reveals that he never actually bothered to learn anything about Clojure ... |
| 10:43 | ro_st | dnolen: oh that is SOOOOOooo 24 hours ago -grin- |
| 10:43 | @Chouser | hyPiRion: That would be a useful function, but I don't think it's in core. |
| 10:44 | zerokarmaleft | dnolen: again? what was the first time? |
| 10:44 | dnolen | ro_st: ? you mean 7 hours ago right. |
| 10:45 | ro_st | oh, has something new happened? |
| 10:46 | ro_st | chouser and cemerick discussed it in the podcast, and they definitely didn't record and release it less than 7 hrs ago :-) |
| 10:46 | ivaraasen | dnolen: have you seen the survey based on part 1 of Yegge's essay? |
| 10:46 | dnolen | ivaraasen: yes |
| 10:46 | dnolen | ro_st: https://plus.google.com/u/0/110981030061712822816/posts |
| 10:49 | ro_st | so he doesn't want to ask for 'permission'. i guess he should be using windows 98 then, where any app can use any app's memory |
| 10:50 | dnolen | ro_st: Clojure has atoms - his point makes no sense. |
| 10:50 | magopian | is yegge saying anything bad about clojure? |
| 10:50 | dnolen | ro_st: it even has unsynchronized mutables |
| 10:50 | magopian | sorry, i missed the beginning of the discussion (or the context ;) |
| 10:51 | dnolen | magopian: no he's not saying anything bad - he's just not saying anything that makes any sense. |
| 10:51 | magopian | haha ;) |
| 10:51 | wmealing_1 | going senile ? |
| 10:51 | magopian | i like his talk on "how to market yourself" or something like that |
| 10:51 | magopian | s/like/liked |
| 10:51 | hyPiRion | dnolen: I thought his argument was that the language was liberal, but the community was not. |
| 10:52 | dnolen | hyPiRion: in some alternative universe where his points make sense ... maybe. |
| 10:52 | magopian | i still didn't find time to watch rich's last video |
| 10:53 | hyPiRion | dnolen: Yeah, it's a pretty confusing line of arguments. |
| 10:53 | ro_st | magopian: watch it. it's great |
| 10:55 | magopian | ro_st: i will, definitely |
| 10:55 | magopian | just need to carve out some time :/ |
| 10:55 | ro_st | can do it audio-only |
| 10:55 | clojurebot | excusez-moi |
| 10:55 | magopian | hey, clojurebot is french speaking, nice :) |
| 11:00 | @Chouser | Ah, here's where comparator was introduced, almost a year before AFn gained the ability itself: https://github.com/clojure/clojure/commit/ad7a155a4950c93dfdc8c7168b77e8f73dba7e1e |
| 11:04 | ro_st | hyPiRion, Chouser: thanks for the sort advice. i got it going with postwalk - the error was that the map had keys not in the sort vector |
| 11:05 | @Chouser | ah! yeah, that could do it. |
| 11:06 | ro_st | clojure amazes me every day |
| 11:06 | ro_st | i wonder what on earth i would have done with out it |
| 11:06 | ro_st | and i don't understand why everyone isn't using it :-) |
| 11:07 | borkdude | ro_st enjoy a walk outside? reading a newspaper? |
| 11:07 | @Chouser | borkdude: no, probably coding in Java. |
| 11:07 | ro_st | news? |
| 11:07 | @Chouser | :-P |
| 11:07 | ro_st | ruby, probably. we were going to use rails for the backend but i just couldn't bring my self to 'rails new' |
| 11:08 | scriptor | borkdude: just implement your news reader in clojure |
| 11:08 | ro_st | then clojurebook came out and that was that #relief |
| 11:09 | Wild_Cat | Rails isn't so bad, from what I've seen. |
| 11:09 | Wild_Cat | (and on the Python side, Pyramid rocks) |
| 11:09 | blackdog | Wild_Cat: it very much depends on where you're standing:) |
| 11:10 | ro_st | too much magic. not composable. |
| 11:10 | Wild_Cat | I can't say much, though, I've never used Rails myself. |
| 11:10 | scriptor | I definitely got into django much faster than I did with rails |
| 11:10 | Wild_Cat | I suppose it has the same flaws as Django, though |
| 11:10 | blackdog | ro_st: also, not enough immutability. or types. |
| 11:10 | Wild_Cat | (seeing that Django started as a Rails clone) |
| 11:10 | scriptor | wasn't a fan of every tutorial starting with scaffolding |
| 11:10 | ro_st | blackdog: or any immutability :-) |
| 11:11 | scriptor | Wild_Cat: it did? they're very different |
| 11:11 | blackdog | ro_st: alter your type structure at runtime? Yessir, you're the boss... |
| 11:11 | ro_st | -grin- |
| 11:11 | Wild_Cat | scriptor: my history is kinda fuzzy, but I think so, yeah. Both are tightly-integrated and couple frameworks, heavily optimized for the use case of SQL-backed CRUD webapps |
| 11:12 | Wild_Cat | ...and both get more painful the more you deviate from that use case. |
| 11:12 | scriptor | Wild_Cat: true, but that also describes a lot of frameworks |
| 11:12 | Wild_Cat | fair enough :p |
| 11:13 | Wild_Cat | that's the thing I really like about Pyramid, to be fair: you can change the templating engine or the ORM with no effort. |
| 11:13 | ivaraasen | I went from Django to Flask myself. far more pleasant |
| 11:13 | blackdog | there is a real benefit to imposed standards, though |
| 11:13 | blackdog | even if a particular approach is not the best thing from a technical perspective, it means that everyone's working the same vein |
| 11:13 | Wild_Cat | blackdog: oh, sure. And the important part is, Pyramid *does* provide sensible defaults that work out of the box. |
| 11:14 | Wild_Cat | but since I don't use a SQL database (I use DynamoDB with a custom mapper; another project here uses Mongo), I'm extremely glad I'm not forced into those defaults. |
| 11:15 | blackdog | sure, you need a variety of frameworks |
| 11:16 | Wild_Cat | I suppose my point is, sensible defaults are essential, but locking the user into them even when it makes sense is bad. |
| 11:17 | Wild_Cat | which, apparently, is also the approach taken by Noir, which is why I need to try it soon. |
| 11:18 | @Chouser | Haha! The survey mentioned in the comments to Yegge's last post has a "favorite language" question, but Clojure is not an option. |
| 11:18 | clojurebot | Ack. Ack. |
| 11:18 | blackdog | really depends on what you're trying to do. you could make Rails general enough to handle the Mars rover, but it would probably not be a net win |
| 11:18 | blackdog | Chouser: that post was almost uniquely annoying |
| 11:21 | magopian | nice to see there's also quite a few python coders around here ;) |
| 11:21 | ivaraasen | Chouser: notice how Yegge's supposed "liberal programmers" dominate every age group in the survey, with no linear relationship |
| 11:21 | magopian | blackdog: you were talking about the mars rover, do you mean it's programmed using clojure? |
| 11:21 | clojurebot | package.el is part of Emacs now: http://repo.or.cz/w/emacs.git/blob_plain/HEAD:/lisp/emacs-lisp/package.el |
| 11:22 | blackdog | magopian: nah, making a more general point about frameworks :) |
| 11:22 | magopian | ok ;) |
| 11:22 | magopian | i wonder what it's programmed with |
| 11:22 | blackdog | mars rover is all C |
| 11:22 | magopian | oh ok |
| 11:22 | blackdog | in a particularly punishing dialect |
| 11:22 | magopian | rootz ;) |
| 11:23 | jcromartie | ivaraasen: where's the survey? |
| 11:23 | weavejester | Are any Clojar admins around? |
| 11:23 | blackdog | magopian: there's a fascinating document on the style they programmed it in - it looks a lot like a simple messaging system like erlang, but without dynamic memory allocation |
| 11:23 | blackdog | http://lars-lab.jpl.nasa.gov/JPL_Coding_Standard_C.pdf |
| 11:23 | magopian | well, i can see why there would be no dynamic memory allocation ;) |
| 11:24 | magopian | thanks for the link |
| 11:24 | blackdog | really embarrassing to get an out-of-memory exception on mars:) |
| 11:24 | ivaraasen | jcromartie: http://sweaxis.org/ |
| 11:24 | @Chouser | ivaraasen: hm, sure enough. |
| 11:24 | ivaraasen | summary of the survey: http://sweaxis.org/stats/age |
| 11:28 | ivaraasen | applying American political metaphors to software engineering sounds like a horrible idea right from the get-go |
| 11:28 | blackdog | ivaraasen: it's massively oversimplified |
| 11:29 | blackdog | as is the political spectrum, which i suppose means it's quite a good analogy |
| 11:29 | antifuchs | yayyyyy, got a connection with latest slime from quicklisp and swank-clojure (: |
| 11:29 | scriptor | ivaraasen: how many people is that survey based on? |
| 11:29 | antifuchs | ivaraasen: applying them to anything including american politics is a horrible idea (: |
| 11:30 | ivaraasen | scriptor: based on 750 data points a couple of hours ago I think |
| 11:30 | scriptor | they don't completley fit american politics either |
| 11:33 | zerokarmaleft | http://lars-lab.jpl.nasa.gov/JPL_Coding_Standard_C.pdf <= good grief, no malloc |
| 11:34 | blackdog | zerokarmaleft: a good idea, if you're restricted in ram and the cost of failure is high... :) |
| 11:35 | zerokarmaleft | blackdog: true, fascinating link |
| 11:35 | ivaraasen | zerokarmaleft: can't you just declare buffer sizes at compile time? |
| 11:35 | @Chouser | maybe NASA didn't think of that. :-) |
| 11:35 | blackdog | ivaraasen: yes. they separate initialisation and runloop phases. |
| 11:35 | ivaraasen | interesting |
| 11:36 | blackdog | but for that, you don't need malloc anyway - if you know it statically, you can declare it as a stack variable |
| 11:36 | scriptor | I heard a lot of the C was generated as well |
| 11:36 | magopian | has anybody done the problem 82 on 4clojure ? it's a tough one, i believe i'm nearly there \o/ |
| 11:36 | scriptor | anyone know with what? |
| 11:37 | ivaraasen | scriptor: Python I've heard |
| 11:37 | ivaraasen | probably just a rumour though |
| 11:38 | @Chouser | magopian: that's a relatively tough one. I enjoyed it. |
| 11:45 | magopian | Chouser: i am enjoyng it ;) |
| 11:46 | magopian | i'm just missing the "find all possible combinations of words" now ;) (and i know how to program it, just need to ;) |
| 11:46 | magopian | Chouser: did you solve all the problems? |
| 11:46 | @Chouser | on 4clojure? Yes, but then they added more. |
| 11:46 | magopian | 147 it seems, out of the 151, excellent ;) |
| 11:47 | magopian | 82 is my 131'th |
| 11:47 | magopian | still some work left :) |
| 11:48 | gtrak | anyone ever fixed a XSS issue with compojure? I have a jetty servlet cross-origin-filter, but the browser is choking because an OPTIONS request (part of the XSS handshake) returns 404. |
| 11:52 | TimMc | "XSS handshake"? |
| 11:52 | TimMc | You're trying to enable CORS? |
| 11:54 | clojure-newcomer | hi guys… is it possible/easy to dispatch on regular expression matching with multimethods ? currently dispatch on string value, but would like more flexibility |
| 11:54 | gtrak | TimMc: yes |
| 11:54 | llasram | clojure-newcomer: With multimethods, you can dispatch on anything computationally possible :-) |
| 11:55 | gtrak | TimMc: it's really only for development at the moment... server running in a VM, JS on the windows host |
| 11:55 | clojure-newcomer | llasram: col |
| 11:55 | clojure-newcomer | llasram: *cool even |
| 11:58 | zerokarmaleft | blackdog: someone needs to add Rule 32. Enjoy the Little Things to that document :D |
| 11:58 | dnolen | clojure-newcomer: that is not possible in a nice way. |
| 11:59 | dnolen | clojure-newcomer: multimethods lets you match on values generated by the dispatch fns, but you can't really do any kind of general predicate matching. |
| 12:00 | llasram | dnolen, clojure-newcomer: Oh yeah, I may have misunderstood the question. I was envisioning the dispatch function applying a regex to the arguments and then using the match to emit a concrete dispatch value |
| 12:02 | clojure-newcomer | hmmm…. ok, will have to think of a way round this |
| 12:03 | llasram | clojure-newcomer: What are you trying to do? |
| 12:04 | clojure-newcomer | llasram: I'm dispatching originally based on a function passed in, but then switched to a request uri |
| 12:04 | clojure-newcomer | llasram: wondering, can I get the symbolic name of a function as a string ? |
| 12:04 | clojure-newcomer | llasram: then I will not need regular expressions etc |
| 12:04 | nelson- | hi, Anyone here using emacs-prelude with ac-slime? |
| 12:05 | nelson- | I cannot get them to work properly, some completions throw Class not found exception |
| 12:06 | llasram | clojure-newcomer: Can you provide a concrete example? I'm not quite following :-) |
| 12:06 | clojure-newcomer | llasram: just wondering whether I can get the name of a function (or multi method) as a string ? |
| 12:07 | clojure-newcomer | llasram: using meta or something |
| 12:07 | llasram | clojure-newcomer: Kind of, but it's almost certainly a bad idea |
| 12:07 | clojure-newcomer | llasram: oh… why ? |
| 12:08 | gtrak | looks like compojure isn't responding to OPTIONS requests, and there's no OPTIONS macro... so my 404 handler is catching it |
| 12:09 | llasram | clojure-newcomer: Makes your code harder to reason about while winding implementation-naming details together with external interface. There's cleaner ways of getting similar effects |
| 12:09 | llasram | At a higher level, do you have a concrete example of what you're trying to do? |
| 12:10 | clojure-newcomer | llasram: I see, increases complexity |
| 12:10 | clojure-newcomer | llasram: I'm dispatching to negotiate API version, and content-type of response based on 'accept' |
| 12:13 | llasram | Accept defines a strict preference-priority, doesn't it? Is there a reason not to just have a map of content-type to response-function, then dispatch to the highest-priority type present in the map? |
| 12:14 | clojure-newcomer | llasram: yes, although I will need to ensure the version is correct for the response type I choose |
| 12:15 | llasram | Ok, so a map per API version, which just has the allowed types in it? |
| 12:15 | gtrak | .... how do I make compojure handle OPTIONS? |
| 12:16 | clojure-newcomer | llasram: I see… simplify down to simpler building blocks |
| 12:17 | llasram | clojure-newcomer: Yeah, hopefully :-). multimethods are very powerful, but not necessarily the best fit for all dispatch problems |
| 12:39 | antifuchs | is there a built-in thing in 1.2.1 that splits strings at a particular delimiter? I'd love to use clojure.string/split, but that name doesn't exist in 1.2.1 ): |
| 12:40 | technomancy | antifuchs: it was added in 1.2.0 |
| 12:40 | antifuchs | odd! |
| 12:40 | antifuchs | I think I may have to experiment further |
| 12:47 | antifuchs | sooo, Caused by: java.lang.ClassNotFoundException: clojure.string |
| 12:47 | antifuchs | what does that mean? Do I have to include something special in project.clj? |
| 12:48 | raek_ | antifuchs: I think you are doing something like (require clojure.string) instead of (require 'clojure.string) |
| 12:48 | antifuchs | ooh, it's not on the require list |
| 12:48 | raek_ | unlike 'ns', 'require' is a function and not a macro |
| 12:49 | antifuchs | hanging it on the ns declaration did it. |
| 12:49 | antifuchs | thanks, raek ((: |
| 13:03 | rplevy | is anyone else getting an error when lein goes to fetch dependencies right now? |
| 13:04 | rplevy | "Caused by: org.sonatype.aether.resolution.VersionRangeResolutionException: No versions available for org.clojure:clojure:jar:[1.2.1,1.3.0] within specified range" |
| 13:05 | llasram | rplevy: I saw on the mailing list that some maven central metadata seems to have gotten b0rked again |
| 13:06 | rplevy | booo |
| 13:06 | technomancy | huh, looks fine here |
| 13:06 | technomancy | maybe a problem with a local mirror? |
| 13:07 | technomancy | also: maybe it's time to host Clojure on clojars, because this is starting to become a regular occurrence. =\ |
| 13:08 | technomancy | rplevy: maybe it's been fixed and your cache has the busted metadata? can you try `lein -U deps`? |
| 13:12 | rplevy | hrrmm lein -U deps doesn't seem to help |
| 13:14 | technomancy | huh, just ran it on a fresh m2 here; works fine |
| 13:14 | technomancy | does http://repo.maven.apache.org/maven2/org/clojure/clojure/maven-metadata.xml list all the correct versions for you? |
| 13:14 | technomancy | (to rule out geographic mirror issues) |
| 13:15 | TimMc | gtrak: I think I remember someone asking about this in the past. Check the logs. |
| 13:15 | rplevy | I deleted my .m2 too... |
| 13:15 | gtrak | ok |
| 13:15 | gtrak | I'm currently trying to hack it |
| 13:16 | gtrak | but I don't quite understand how clout works, it's choking on the :options method |
| 13:16 | rplevy | technomancy: that file only lists version 1.2 |
| 13:17 | technomancy | rplevy: looks like others on the mailing list are seeing it |
| 13:18 | technomancy | rplevy: can you paste traceroute to repo.maven.apache.org along with a curl of the affected page? |
| 13:20 | redinger | We had a problem this morning with lein2 (not in lein1). Had to add sonatype back into our project.clj |
| 13:20 | technomancy | I'm going to publish it to clojars |
| 13:20 | technomancy | this is just silly |
| 13:25 | rplevy | technomancy: https://gist.github.com/3371828 |
| 13:25 | technomancy | http://clojars.org/repo/org/clojure/clojure/ |
| 13:25 | rplevy | awesome |
| 13:26 | gtrak | TimMc: OK, got it, turns out you can put regular functions in under defroutes... and compojure calls 'some' to find the first one that returns a truthy response, so, just a standard ring-handler does the trick |
| 13:35 | technomancy | so I don't feel like following through with Central now that the workaround is on clojars, but if someone else wants to follow up you can do so here: https://issues.sonatype.org/browse/MVNCENTRAL |
| 13:36 | redinger | technomancy: great! Any chance you want to put alphas out there as well? :) |
| 13:37 | technomancy | redinger: ok |
| 13:38 | redinger | I'm more than happy to push them up when released if that would help |
| 13:38 | technomancy | actually I don't have them on my box, just the poms |
| 13:38 | technomancy | I can pull them in via a dummy project |
| 13:39 | rplevy | I wonder what the root cause of this mvn central screwiness is |
| 13:39 | rplevy | since it happened before too |
| 13:41 | TimMc | gtrak: Yay for composability! |
| 13:41 | rplevy | I guess that's for them to figure out, hence the issue being created. |
| 13:42 | technomancy | redinger: ok, 1.5 alphas are up |
| 13:42 | redinger | technomancy: Thanks! |
| 13:43 | technomancy | redinger: is it usually stuart sierra who handles the releases? would it make sense to add him to the clojars group? |
| 13:43 | redinger | Yeah, he's been doing the 1.5 releases |
| 13:44 | technomancy | hm; if he has a clojars account, it's not obvious what it is |
| 13:44 | technomancy | I'll wait to see if he responds to the mailing list thread I guess |
| 14:06 | jweiss | https://www.refheap.com/paste/4415 <- what if i sometimes run on eclipse and swank isn't loaded? is there a way to write this middleware so it will always compile and just do nothing if swank isn't there? |
| 14:07 | jweiss | i'm not sure how to call binding with a symbol it might not be able to resolve. |
| 14:07 | jweiss | maybe i should just let it fail, and catch the error. |
| 14:09 | jweiss | nah i can't do that because it won't even compile. |
| 14:09 | technomancy | you could look at how binding is implemented and make a version that works with dynamically-resolved vars |
| 14:09 | S11001001 | progv supremacy :) |
| 14:09 | technomancy | if you don't mind being hugely sketchy |
| 14:10 | jweiss | it's probably better to just add swank as a dep. even though eclipse won't use it. |
| 14:10 | jweiss | a dev dep |
| 14:11 | S11001001 | jweiss: if you're loading from source you could just have a macro expand differently depending on whether swank is present |
| 14:15 | jweiss | S11001001: i'll try that thanks |
| 14:16 | dnolen | even Groovy gets to have the fun! http://blog.bloidonia.com/post/29552846202/using-clojure-and-core-logic-from-groovy |
| 14:18 | nz- | gtrak: compojure has OPTIONS macro, so it should work just like with other http methods. |
| 14:19 | gtrak | huh... |
| 14:19 | gtrak | maybe my version just doesn't |
| 14:19 | gtrak | 1.0.4 |
| 14:20 | gtrak | yep... |
| 14:20 | gtrak | well, at least I learned something by digging :-) |
| 14:20 | nz- | latest is 1.1.1 |
| 14:21 | nz- | https://github.com/weavejester/compojure/blob/master/src/compojure/core.clj#L140 |
| 14:21 | gtrak | yea... I only wasted a couple hours on that ;-), thanks for letting me know though |
| 14:21 | nz- | and it works at least in 1.1.0 |
| 14:24 | nz- | gtrak: it seems to be one of the latest additions to compojure |
| 14:25 | gtrak | the *one* time I forget to pull the latest version for something :-) |
| 14:27 | SegFault1X|work2 | I really enjoy Rich Hickey's tech talks. He's a really entertaining and informative speaker. |
| 14:28 | Iceland_jack | SegFault1X|work2: Definitely |
| 14:28 | SegFault1X|work2 | Whether or not I agree with some of his conclusions, I consistently enjoy watching them. |
| 14:28 | nz- | is it possible some how to manipulate compojure routes as data |
| 14:29 | nz- | Basically I'd like to automatically generate api documentation from the routes |
| 14:29 | gtrak | nz-: you can learn from what I just figured out :-)... compojure macros generate ring handlers, then it runs the 'some' function to select the first that matches |
| 14:29 | SegFault1X|work2 | gtrak: That's surprisingly straight forward. |
| 14:30 | gtrak | if you wanted to generate more detailed api documentation, you could possibly wrap the macros |
| 14:32 | gtrak | this is how I reinvented OPTIONS actually: https://gist.github.com/3372429 |
| 14:33 | SegFault1X|work2 | It would be neat if you could just incorporate metadata into the routes, then generate the documentation from the route metadata. |
| 14:33 | gtrak | note I used a function instead of a macro |
| 14:34 | SegFault1X|work2 | That way the documentation still lives in code, but it's not necessarily tied to the route structure. |
| 14:35 | _fogus_ | self-quotation is the only way to fly |
| 14:36 | emezeske | _fogus_: Is that something you said yourself? |
| 14:36 | _fogus_ | "Self-quotation is the only way to fly" --me |
| 14:37 | SegFault1X|work2 | I like recursive quotes. :) |
| 14:37 | _fogus_ | (Me 2012) |
| 14:37 | emezeske | ""Self-quotation is the only way to fly" --me" --fogus |
| 14:38 | gtrak | let's all start speaking in quines please |
| 14:38 | emezeske | haha |
| 14:38 | SegFault1X|work2 | Oh you mean turn #clojure into reddit? Got it. :) |
| 14:38 | nz- | http://jng.imagine27.com/index.php/2009-09-18-203946_clojure_quine.html |
| 14:38 | gtrak | ha |
| 14:40 | SegFault1X|work2 | I have no idea how that works. |
| 14:42 | scriptor | huh, it's actually pretty simple |
| 14:44 | scriptor | SegFault1X|work2: it creates an anonymous function and calls it with the second half of that expression |
| 14:44 | scriptor | if you replace it with '2' or something like that |
| 14:44 | nz- | rather verbose way to do it |
| 14:44 | scriptor | ,((fn [x] (list x (list (quote quote) x))) 2) |
| 14:44 | clojurebot | (2 (quote 2)) |
| 14:45 | Gnosis- | when working with a vector or array, does drop do any processing per element skipped, like it would with a list, or is it a constant time operation? |
| 14:45 | scriptor | so if instead of 2 you feed it the anonymous function, you get ((fn …) (quote (fn …))) |
| 14:45 | hiredman | ,(doc drop) |
| 14:45 | clojurebot | "([n coll]); Returns a lazy sequence of all but the first n items in coll." |
| 14:46 | SegFault1X|work2 | scriptor: Yup, I'm playing with it now. |
| 14:46 | SegFault1X|work2 | scriptor: You're right, it is pretty easy. |
| 14:46 | scriptor | SegFault1X|work2: yea, sorry if I just stated the obvious, just wanted to explain it to make sure I got it myself |
| 14:46 | joly | scriptor: that's a whole lot nicer than the character-based quines I've seen for other languages |
| 14:47 | Gnosis- | hiredman: how does it skip those first n items, though? does it get them and throw them away, even for collections that support random addressing? |
| 14:48 | Gnosis- | random access* |
| 14:48 | nz- | http://asiajin.com/blog/2009/09/22/uroboros-programming-with-11-programming-languages/ |
| 14:48 | scriptor | Gnosis-: I think it does |
| 14:48 | Gnosis- | oh |
| 14:50 | scriptor | Gnosis-: essentially, it keeps a counter and calls rest until the counter reaches 0 |
| 14:50 | SegFault1X|work2 | Gnosis-: Clojuredocs.org has the source if you want to see what's /actually/ happening. |
| 14:51 | SegFault1X|work2 | Gnosis-: http://clojuredocs.org/clojure_core/clojure.core/drop just scroll to the bottom and click Source |
| 14:51 | Gnosis- | okay, thanks |
| 14:56 | aaelony | struggling to get in incremental counter i using for. How can I get i to increment in something like the following? (for [x [:x1 :x2 :x3 :x4 :x5 :x6] :let [i 0] ] (assoc {} x (inc i))) => ({:x1 1} {:x2 1} {:x3 1} {:x4 1} {:x5 1} {:x6 1}) ... I'd like to see ({:x1 1} {:x2 2} {:x3 3} {:x4 4} {:x5 5} {:x6 6}) |
| 14:58 | emezeske | ,(into {} (map vector [:x1 :x2 :x3 :x4 :x5 :x6] (range))) |
| 14:58 | clojurebot | {:x1 0, :x2 1, :x3 2, :x4 3, :x5 4, ...} |
| 14:59 | emezeske | ,(into {} (map vector [:x1 :x2 :x3 :x4 :x5 :x6] (range 1))) |
| 14:59 | clojurebot | {:x1 0} |
| 14:59 | aaelony | is it possible using for ? |
| 14:59 | Bronsa | ,(into {} (map vector [:x1 :x2 :x3 :x4 :x5 :x6] (rest (range)))) |
| 14:59 | clojurebot | {:x1 1, :x2 2, :x3 3, :x4 4, :x5 5, ...} |
| 14:59 | emezeske | Bronsa: hah, thanks :) |
| 14:59 | Bronsa | :) |
| 14:59 | raek | aaelony: for assumes you want to calculate each value independently from the others |
| 15:00 | emezeske | aaelony: In your "for", "i" is not a variable, it is just the value 0 being bound to the name "i" |
| 15:00 | emezeske | aaelony: So on each iteration of the for body, "i" evaluates to 0 again |
| 15:01 | emezeske | aaelony: If you really want a mutable variable, you'll need to use an atom or something like that |
| 15:02 | emezeske | ,(let [i 0] [(inc i) (inc i) (inc i) (inc i)]) |
| 15:02 | clojurebot | [1 1 1 1] |
| 15:02 | emezeske | aaelony: ^ i is always zero, it is not ever modified. |
| 15:02 | aaelony | maybe I'm going about this wrongly. I have a for statement that is doing a lot of things, mostly creating an aggregate output mapping. I want to keep track of what's contributing to the aggregates, so I'd like an iteration i that I can stuff into a vector that goes into the map. is there a better way? |
| 15:02 | aaelony | perhaps an atom or var is the way to go... |
| 15:03 | emezeske | aaelony: I would do something like (for [[x i] (map vector xs (range))] ...) |
| 15:03 | aaelony | emezeske: that looks good, thanks! |
| 15:04 | emezeske | aaelony: Yep! For the record, an atom would definitely work, but something like the above is just more idiomatic (it's more in the functional style) |
| 15:05 | gfredericks | yegge doesn't know about atoms does he? |
| 15:05 | aaelony | emezeske: that's exactly what I was after! :) |
| 15:06 | Gnosis- | what's a good way to profile? |
| 15:12 | ivaraasen | Gnosis-: I mostly use the time function. jvisualvm is nice too |
| 15:16 | hiredman | profiling and benchmarking are different |
| 15:16 | hiredman | jvisualvm is good for profiling, criterium is a neat benchmarking library |
| 15:28 | Gnosis- | ah, those are some good ideas. thanks! |
| 15:34 | michaelr525 | hello |
| 15:36 | jmolet | test |
| 15:46 | muhoo_ | hmm, lein preview8 doesn't include nrepl anymore |
| 15:48 | hiredman | muhoo: seems unlikely |
| 15:48 | muhoo | https://www.refheap.com/paste/4418 |
| 15:48 | muhoo | that's with preview8. |
| 15:48 | muhoo | with preview7, works just fine |
| 15:50 | muhoo | lein deps :tree are identical for both. |
| 15:51 | DanBell | anyone want to explain to me why (re-find #"[a-z][0-9]" "a1b2c3") returns a match but (re-match #"[a-z][0-9]" "a1b2c3") doesn't? |
| 15:52 | Chousuke | DanBell: re-find finds a substring that matches the regexp, and re-match tests if the whole string matches the regexp? |
| 15:53 | Chousuke | DanBell: first one should find "a1", but the regexp won't match the whole thing |
| 15:53 | DanBell | oh, so "matches" is a verb in the singular, not a plural noun? |
| 15:53 | DanBell | it *seemed* to have duplicate functionality with re-sew, ha |
| 15:54 | DanBell | *re-seq |
| 15:55 | muhoo | hiredman: it's something in my profiles.clj causing grief, apparently. |
| 15:55 | DanBell | ty houser |
| 15:57 | muhoo | hiredman: hmm, apparently not. with no profiles.clj at all, still happens. FileNotFoundException, for clojure/tools/nrepl/server.clj |
| 16:05 | muhoo | only in trampoline mode, works without trampoline |
| 16:15 | technomancy | muhoo: huh, trampoline repl works here |
| 16:16 | technomancy | can you repro on a fresh project? |
| 16:17 | xeqi | technomancy: I can repoduce on a fresh project |
| 16:17 | technomancy | I do see that it's using reply beta6 for some reason |
| 16:18 | xeqi | https://www.refheap.com/paste/4421 |
| 16:18 | technomancy | oh never mind, I was using a snapshot |
| 16:22 | technomancy | ok, this is the same problem as https://github.com/technomancy/leiningen/issues/695 |
| 16:24 | muhoo | technomancy: thanks, makes sense. |
| 16:25 | muhoo | is there a workaround? |
| 16:25 | technomancy | for the time being, probably just an explicit nrepl dependency in defproject =\ |
| 16:25 | technomancy | profiles are getting ignored by the trampoline task |
| 16:25 | muhoo | i tried that, but then it complained about not being able to find complete/core.clj |
| 16:25 | muhoo | and i wondered how deep that rabbit hole went |
| 16:26 | i_s | if I have to make a change to a library, and then want to use that changed library in my project, whats the best way to do it? |
| 16:26 | technomancy | muhoo: ok, this should do it: [reply "0.1.0-beta10" :exclusions [org.clojure/clojure]] |
| 16:26 | muhoo | trying now |
| 16:27 | muhoo | technomancy: works, thanks! |
| 16:29 | scriptor | hmm, playing with time, it looks like (map (partial * 2) (range 1000)) can be anywhere from 3-4 times as fast as the equivalent with an anonymous function |
| 16:31 | S11001001 | scriptor: did you dorun? |
| 16:31 | scriptor | S11001001: nope |
| 16:32 | scriptor | probably should? |
| 16:32 | S11001001 | (fn ...) implies the first-time construction of a newly created class |
| 16:32 | hugod | antifuchs: how is rpc.clj hacking going? |
| 16:32 | muhoo | (do (dorun run run) (do (dorun run)) |
| 16:32 | S11001001 | if you want to time function call time, calls to the relevant function must overwhelm that consing |
| 16:33 | scriptor | ah |
| 16:33 | S11001001 | this is one of the very, very, very few times I would encourage use of loop :) |
| 16:34 | dnolen | scriptor: partial is nearly always slower - you need to pick a larger n and force w/ doall or dorun to see. |
| 16:35 | rplevy | also, if you have a nested structure, the forcing of evaluation is not automatically recursive, you need to make sure you force the laziness in those sub structures |
| 16:36 | scriptor | yep, after binding the function before calling map and calling dorun the partial one is slower |
| 16:39 | muhoo | i_s: the easiest i've found is to use the checkouts dir in the project |
| 16:40 | muhoo | i_s: i.e. if i'm working on foo, and also a library bar, then "cd foo; mkdir checkouts; ln -s ../bar checkouts/bar" |
| 16:42 | i_s | ill try that muhoo, thanks! |
| 16:45 | jml | I feel a bit silly for not being able to figure this out from the docs, but say I have a clojure program (e.g '(println "foo")'), how do I turn that into something I can run from the command-line |
| 16:46 | hyPiRion | jml: What kind of operative system do you use? |
| 16:46 | jml | hyPiRion: linux |
| 16:47 | nz- | jml: make a main method (defn -main [] <code goes here> ) |
| 16:47 | technomancy | running Clojure from the command line is currently kinda crap compared to most non-java languages |
| 16:47 | muhoo | jml: "lein new foo", then have a look at foo/src/foo/core.clj -main. |
| 16:47 | nz- | jml: then lein run -m name-of-your-namespace |
| 16:48 | hyPiRion | If you want to have some scripting-like way of executing it, you can do "clojure filename" |
| 16:50 | jml | thanks all |
| 16:50 | hyPiRion | And if you want to omit the "clojure" part, you can add a "#!/usr/bin/clojure" on top of the file, then make it executable |
| 16:51 | jml | lein seems pretty important. |
| 16:52 | technomancy | I wonder if you can do a shebang with lein |
| 16:53 | jml | so packages are often shipped as binaries |
| 16:53 | hyPiRion | hm |
| 16:53 | jml | as scripts, rather? |
| 16:55 | hyPiRion | Clojure starts up pretty slow, so scripts aren't that widespread, I suppose. |
| 16:56 | hyPiRion | In addition, Clojure is simple, not easy. Usually you would sacrifice for simplicity for some easiness in small programs. |
| 16:56 | dnolen | jml: by packages do you mean libraries? |
| 16:56 | jml | dnolen: I mean things like Debian packages |
| 16:57 | technomancy | jml: libraries for dependency management are nearly always shipped as source, inside jar files |
| 16:59 | jml | what about client-side programs? |
| 16:59 | dnolen | jml: no convention as far as I know because platforms differ greatly |
| 17:00 | S11001001 | I would ship an uberjar and hope everyone can figure out how to run them :) |
| 17:00 | hyPiRion | I would uberjar leiningen projects if I would ship client-side though. |
| 17:00 | jml | ah hah, I see. |
| 17:00 | technomancy | jml: `lein help tutorial` covers some of the common distribution methods |
| 17:00 | technomancy | near the end |
| 17:01 | nz- | jml: with uberjar you can just execute the thing like this: java -jar my-uber.jar |
| 17:01 | S11001001 | double-click works pretty often |
| 17:04 | Cr8 | for scripty type things, just for personal use, I've used nailgun |
| 17:09 | nz- | http://www.martiansoftware.com/nailgun/ |
| 17:09 | nz- | that? |
| 17:10 | Cr8 | yes |
| 17:11 | Cr8 | i'd have a nail in my misc namespace that would do dispatch |
| 17:11 | technomancy | muhoo: I think your issue is fixed in master; can you confirm the patch works for you? |
| 17:14 | antifuchs | hugod: great! I started hacking on swank-clojure, and am currently able to connect with this month's quicklisp's slime |
| 17:15 | antifuchs | the P and L parts of slime-repl don't work currently |
| 17:15 | antifuchs | but it's coming together - reading and evaling works (; |
| 17:18 | l1x | hey guys what is the datatype if is see #<some strings> when I println the variable? I thought it is a vector |
| 17:19 | scriptor | what variable and what does it contain? |
| 17:19 | S11001001 | l1x: you can tell based on what's in those strings |
| 17:20 | l1x | it is coming from the JMX library and it looks like this #<ObjectName hadoop:service=DataNode,name=DataNodeInfo> |
| 17:20 | antifuchs | hugod: I think it should be pretty trivial to port over to ritz; also, my stuff seems to clean up&simplify a lot of things (: |
| 17:21 | nDuff | l1x: Easiest way to tell the type is to look at (type your-variable). That said, in this context, it would presumably be a javax.management.ObjectName |
| 17:22 | l1x | nDuff: amazing! this is what i was looking for! |
| 17:31 | hugod | antifuchs: so you're porting swank-clojure to a recent slime? ritz was working against a more recent slime than swank-clojure. Are you finding many changes required in swank-clojure? |
| 17:31 | antifuchs | just stuff to support the updated net code, and then a few arglists that changed, so far |
| 17:32 | hugod | one thing was the support for swank::%cursor-marker% |
| 17:32 | jml | are there API / reference docs for clojure.test |
| 17:32 | antifuchs | I'm not really done yet - there's some confusion with how returned values are formatted, so can't really judge how much work is left (: |
| 17:32 | hugod | slime changed the net encoding recently? |
| 17:34 | jml | oh hey, google is great. |
| 17:34 | symuyn | Getting frustrated at partition: hey, what's a good way to turn (0 1 2 3 4 5) into ((0 1 2) (1 2 3) (2 3 4) (3 4 5) (4 5) (5))? |
| 17:34 | symuyn | Which partition can't do, as far as I can tell, heh |
| 17:34 | antifuchs | hugod: not really recently |
| 17:34 | antifuchs | it was 1.5 years ago |
| 17:35 | antifuchs | just, both ritz and swank-clojure still require a 2010 slime (: |
| 17:35 | metellus | ,(partition 3 1 '(0 1 2 3 4 5)) |
| 17:35 | clojurebot | ((0 1 2) (1 2 3) (2 3 4) (3 4 5)) |
| 17:35 | metellus | ,(partition-all 3 1 '(0 1 2 3 4 5)) |
| 17:35 | clojurebot | ((0 1 2) (1 2 3) (2 3 4) (3 4 5) (4 5) ...) |
| 17:35 | symuyn | Oh, wow |
| 17:35 | i_s | muhoo: i'm getting a FileNotFoundException with the checkouts directory approach. Is there something special I have to do if the project name is multipart? In this case, the directory is called "friend", and the artifact (or whatever its called) is com.cemerick/friend |
| 17:35 | hugod | antifuchs: you have a pointer to the change? |
| 17:35 | symuyn | Thanks a lot |
| 17:35 | antifuchs | hugod: I think you participated in the discussion of that announcement |
| 17:36 | antifuchs | that was when Helmut introduced binary prefixes |
| 17:36 | hugod | antifuchs: the last I heard Helmut decided not to go ahead with it |
| 17:36 | antifuchs | but that seems to have changed to 6 hex digits counting chars |
| 17:36 | technomancy | i_s: that shouldn't matter for checkouts. do you have it in project.clj though? |
| 17:36 | antifuchs | erm |
| 17:36 | antifuchs | I meant, 6 hex digits indicating number of bytes to read |
| 17:37 | antifuchs | and I believe it mandates utf-8 now |
| 17:37 | antifuchs | which is just such a huge relief, I can't even tell you (: |
| 17:37 | i_s | technomancy: i took it out of project.clj |
| 17:37 | hugod | I think utf-8 is the only change - it was always a six hex digit length encoding iirc |
| 17:37 | technomancy | i_s: why? |
| 17:38 | antifuchs | hugod: anyway, that's what rpc.lisp does now, and also what rpc.clj does (: |
| 17:38 | antifuchs | it used to indicate number of chars though, and it's bytes now |
| 17:38 | antifuchs | subtle change, and imperceptible if you operate on ascii only |
| 17:38 | i_s | technomancy: someone on the internet told me to. but I will see what happens if i include it. |
| 17:38 | hugod | ah, gotcha |
| 17:38 | technomancy | i_s: go smack 'em for me =) |
| 17:39 | i_s | haha |
| 17:39 | antifuchs | but it makes everything way easier to handle, I think |
| 17:39 | technomancy | for some reason that's a widespread misconception |
| 17:40 | antifuchs | oh crap |
| 17:40 | antifuchs | I hadn't reloaded emacs, and it had broken state it seems. |
| 17:41 | antifuchs | just restarted, and the REPL works now, connected to swank-clojure. |
| 17:41 | antifuchs | <3 <3 <3 |
| 17:41 | hugod | yeah! |
| 17:41 | antifuchs | backtraces in the debugger, check |
| 17:41 | antifuchs | ah, restarts seem to not like getting invoked |
| 17:42 | hugod | is that using cdt? |
| 17:42 | antifuchs | not sure! I think it might be |
| 17:42 | antifuchs | well, it's the emacs side beeping |
| 17:42 | antifuchs | must be some argument list that changed |
| 17:42 | hugod | if it has frame locals, then it's cdt |
| 17:44 | antifuchs | [No Locals] |
| 17:44 | antifuchs | so, probably not cdt |
| 17:45 | antifuchs | interesting! "java.lang.Integer cannot be cast to clojure.lang.IFn" |
| 17:46 | scriptor | what code are you running? |
| 17:48 | antifuchs | (nth (keys *sldb-restarts*) n) (with n being an integer, and *sldb-restarts* a map |
| 17:49 | i_s | technomancy: just tried that, but now i get the old and busted version. running lein classpath also doesn't show the one that i'd expect from checkouts. any tips? |
| 18:02 | antifuchs | amazing, just passing back the Throwable as a string makes the abort restart work, too |
| 18:02 | antifuchs | so nice. |
| 18:04 | michaelr525 | hello |
| 18:04 | technomancy | i_s: `lein classpath` should show both, with the src/ dir of the checkout version before the jar |
| 18:11 | l1x | is there a way to add the output of this (which is strings) to a hash? in ruby I would ().each {|a| target_hash <<a } |
| 18:11 | l1x | (doseq [s (jmx/mbean-names "hadoop:*")] (prn (. s getCanonicalName))) |
| 18:14 | aperiodic | l1x: check out 'with-out-str' |
| 18:18 | l1x | cool, i dont get it :) |
| 18:19 | antifuchs | hugod: https://github.com/antifuchs/swank-clojure/tree/quicklisp-swank has my changes - it's not a ton of stuff that needed updating! (: |
| 18:21 | emezeske | l1x: What are they keys and what are the values in this hash? |
| 18:21 | gtrak | l1x: (into {} (for [[k] (jmx/mbean-names "hadoop:*")] [k (.getCanonicalName k)])) ? |
| 18:22 | emezeske | l1x: In Ruby it doesn't even seem like the << operator is defined for Hash |
| 18:22 | l1x | emezeske: rite i was thinking about an array :) |
| 18:22 | l1x | gtrak: thx! |
| 18:23 | emezeske | l1x: Oh, if you want an array, just do (for [s (jmx/mbean-names "hadoop:*")] (. s getCanonicalName)) |
| 18:23 | emezeske | l1x: "for" returns a lazy seq of its the results, unlike doseq which returns nil |
| 18:23 | gtrak | or you can just use map at that point |
| 18:23 | amalloy | (map (memfn getCanonicalName) (whatever))? |
| 18:24 | emezeske | amalloy: Wow, memfn sure beats #(. x y), I didn't know about that |
| 18:24 | gtrak | huh |
| 18:25 | l1x | ok, thanks guys i try to work out the details based on these ^^ ( #second_day_with_clojure ) |
| 18:25 | antifuchs | oh my. sooo nice. <3 |
| 18:25 | gtrak | l1x: have more days! |
| 18:26 | l1x | :)) |
| 18:26 | amalloy | emezeske: well, memfn's actually kinda limited as it is |
| 18:26 | amalloy | eg, you can't typehint it |
| 18:27 | amalloy | http://dev.clojure.org/jira/browse/CLJ-910 would be nice |
| 18:28 | emezeske | amalloy: Ah, it still looks handy for those quick use cases |
| 18:28 | emezeske | Seems like a no-brainer change to add that! |
| 18:29 | amalloy | nothing is ever a no-brainer on jira |
| 18:29 | emezeske | There is waay too much truth to that statement. :( |
| 18:30 | technomancy | I had to resist from chiming in on the "what about people who fix multiple bugs in a single issue" thread |
| 18:30 | amalloy | although the past week has been unusually productive in terms of accepting patches, so i should bridle my venom |
| 18:30 | technomancy | I really wanted to say "maybe if jira didn't suck so much, people wouldn't mind opening a separate issue for it" |
| 18:30 | michaelr525 | why would (count (macro-with-binding (doall (lazy-seq-func)))) behave differently from (count (doall (macro-with-binding (lazy-seq-func))))? |
| 18:31 | Raynes | technomancy: That's all a little ridiculous anyways. |
| 18:31 | amalloy | technomancy: a couple days ago rich asked me to take my patch from may and split it up into about five different jira tickets |
| 18:31 | Raynes | It isn't as black and white as they're making it out to be. |
| 18:31 | Raynes | I wouldn't have the patience to do that. I'd just give up and deal with it. :\ |
| 18:32 | amalloy | Raynes: to do what? |
| 18:32 | amalloy | (or, deal with what?) |
| 18:33 | Raynes | Split up a patch like that. I mean, if it was all completely unrelated than it shouldn't have been the same patch anyways, but if it was all related to one problem... |
| 18:42 | michaelr525 | jkhdkjgdh |
| 18:43 | jml | The tutorial at <http://java.ociweb.com/mark/clojure/article.html> says 'To create a new _application_ project, do "lein new app my-app"'. What's an application project and how is it different from a non-application project? |
| 18:43 | technomancy | jml: an application is just something that's not a library |
| 18:44 | michaelr525 | jml: what is a non-application project? :) |
| 18:44 | jml | michaelr525: I don't know! |
| 18:45 | jml | technomancy: In which case, I don't get the significance of the two arguments to 'lein new'. |
| 18:46 | technomancy | jml: does `lein help new` make it clearer? |
| 18:47 | jml | technomancy: if I hadn't read that comment in the tutorial, it would seem very clear. |
| 18:47 | hyPiRion | Unread the comment. |
| 18:48 | Raynes | technomancy: Told you that differentiating would be confusing and annoying. |
| 18:48 | nDuff | jml: Non-application projects are things like leiningen plugins |
| 18:48 | Raynes | No. |
| 18:48 | nDuff | jml: ...ie. based on a different, special-purpose template |
| 18:49 | nDuff | No? |
| 18:49 | Raynes | There is a template for that too. |
| 18:49 | technomancy | if you have a :main, you're an application |
| 18:49 | jml | technomancy: if I read 'lein help new', I would interpret it as "make a project, but put it under a differently named directory to the default" |
| 18:49 | technomancy | if you push to clojars, you're a library |
| 18:49 | Raynes | There are built in templates for 'apps', libraries, plugins, and templates. |
| 18:50 | jml | but to go from that to whether something is an application or not seems a stretch |
| 18:51 | Raynes | I have no idea what you just said. |
| 18:51 | technomancy | part of the problem is that we had to put the optional argument first for compatibility's sake |
| 18:51 | jml | Raynes: sorry. I'm confused. That makes it harder to make sense. |
| 18:52 | Raynes | It seems like you might be overthinking things. |
| 18:52 | Raynes | Slightly. |
| 18:53 | Raynes | technomancy: We should really rewrite things so that a name argument isn't required and all args (save for :show, I guessed) are passed directly to templates. |
| 18:54 | jml | OK. Seems most sensible to pretend that that particular instruction in the tutorial is wrong. |
| 18:54 | Raynes | And by we I mean me at some point. |
| 19:00 | gtrak | anyone have an IOFactory implementation for hadoop they'd like to share xD |
| 19:00 | antifuchs | heh, funny that I added a :main to swank-clojure then (: |
| 19:00 | technomancy | antifuchs: not at all; swank-clojure is end-user-facing |
| 19:00 | antifuchs | cool cool (: |
| 19:01 | antifuchs | technomancy: btw, set up a branch for latest quicklisp compat at https://github.com/antifuchs/swank-clojure/tree/quicklisp-swank |
| 19:01 | technomancy | antifuchs: are you planning on getting it into ritz? |
| 19:01 | antifuchs | might be interesting soon, once I figure out instructions to install quicklisped slime |
| 19:02 | antifuchs | yes, definitely |
| 19:02 | antifuchs | that's tomorrow's hack project |
| 19:02 | technomancy | ok, I would rather point people there rather than to swank |
| 19:02 | antifuchs | understandable |
| 19:03 | gtrak | or rather I guess I need to add a URL-handler for the hdfs-prefix |
| 19:08 | haspaker | I have made two solutions for the 4clojure problem 106 |
| 19:08 | haspaker | http://pastebin.com/eE9rHUgM |
| 19:08 | haspaker | One in Python and one in Clojure, and both of them use the exact same method |
| 19:08 | haspaker | But I like pastebin! |
| 19:09 | nDuff | haspaker: it's full of ads and basically featureless compared to its competitors. |
| 19:09 | haspaker | Anyway, the Clojure version is extremely slow compared to the python one |
| 19:09 | nDuff | haspaker: If you were using gist, for instance, you could have the two files as separate pastes, each syntax-highlighted accordingly, and we could check it out and run it using git if we wanted to. |
| 19:09 | nDuff | (separate pastes within the same gist, that is) |
| 19:10 | nDuff | ...and we could fork the gist, and have revision-controlled history |
| 19:10 | jml | figured out the confusion |
| 19:10 | jml | lein 1.x vs lein 2 |
| 19:10 | haspaker | Hmm |
| 19:10 | haspaker | I'll look into it, nDuff |
| 19:10 | l1x | could somebody have a look what I am doing wrong in this? (for [mbean (doseq [s (jmx/mbean-names "hadoop:*")] (. s getCanonicalName))] (jmx/mbean mbean)) |
| 19:10 | jml | time to go to bed. thanks for the help. |
| 19:10 | l1x | basically i get the hadoop mbean names and i would like to iterate over it and get the actual attributes |
| 19:11 | nDuff | haspaker: ...there are also "pastebin" services specific to Clojure that run pasted code inside a sandboxed VM, so we can see what it does straight off the web... |
| 19:11 | nDuff | haspaker: ...whereas pastebin.com gives you no interesting features whatsoever, but lots and lots of ads. |
| 19:13 | patchwork | Anyone using swank-clojure ever get errors that never get displayed in slime, even though they are shown in the repl? |
| 19:13 | patchwork | is swank-clojure swallowing errors? |
| 19:14 | patchwork | The simplest case I have for this is simply (+ nil nil) |
| 19:14 | haspaker | nDuff: You made me see the error of my sinful ways, so at least it wasn't a worthless rant :> |
| 19:14 | patchwork | it shows the error in > lein repl |
| 19:14 | haspaker | https://gist.github.com/3374386 |
| 19:14 | patchwork | but in slime it just says "Evaluation aborted;" |
| 19:14 | amalloy | patchwork: it usually displays errors, but sometimes it doesn't and i don't know why |
| 19:14 | amalloy | eg, (+ nil nil) works fine for me (i get a trace) |
| 19:14 | patchwork | amalloy: sometimes if I do that twice, the second time it fails |
| 19:15 | patchwork | really weird |
| 19:15 | Bronsa | patchwork: same here |
| 19:15 | patchwork | Any clues? It can be really annoying to have kick up the repl in terminal |
| 19:16 | amalloy | patchwork: are you closing the error buffer correctly? |
| 19:16 | patchwork | I just hit '0' in emacs |
| 19:16 | patchwork | is there a better way to close it? |
| 19:16 | amalloy | 0 or q should both be fine. just don't like C-x 0 to hide the buffer |
| 19:16 | patchwork | I wonder if swank swallows jvm errors because it generates certain ones and wants to hide it |
| 19:17 | xeqi | haspaker: changing (flatten (map ...)) to (mapcat ...) causes a decrease from 850ms to 110ms on my box |
| 19:17 | technomancy | patchwork: there's a bug in clj-stacktrace where it can occasionally happen |
| 19:17 | technomancy | check *e |
| 19:17 | amalloy | flatten is atrocious in so many ways |
| 19:17 | xeqi | (inc amalloy) |
| 19:17 | lazybot | ⇒ 27 |
| 19:18 | amalloy | oh man, i can get karma for complaining about flatten? i could do that all day |
| 19:18 | patchwork | technomancy: So you think this is a clj-stacktrace problem, not a swank-clojure problem? Hmm... |
| 19:18 | patchwork | amalloy: what is wrong with flatten? |
| 19:18 | xeqi | ~flatten |
| 19:18 | clojurebot | flatten is rarely the right answer. Suppose you need to use a list as your "base type", for example. Usually you only want to flatten a single level, and in that case you're better off with concat. Or, better still, use mapcat to produce a sequence that's shaped right to begin with. |
| 19:22 | michaelr525 | damn |
| 19:23 | haspaker | xeql: Your solution makes it about as fast as the python file for small numbers, but Clojure still has a memory problem for the larger calculations |
| 19:23 | haspaker | For example, try (find-path 3 12912) |
| 19:23 | haspaker | Python spits out an answer in about 5 seconds |
| 19:23 | haspaker | Clojure chews for two minutes until it throws an OutOfMemoryError |
| 19:24 | haspaker | It seems like Clojure can't juggle with large lists the same way Python can |
| 19:24 | emezeske | haspaker: It looks like your recursion is in the tail position |
| 19:24 | emezeske | haspaker: Have you tried using recur? |
| 19:25 | haspaker | Wait a sec |
| 19:25 | emezeske | haspaker: I'm guessing that if you changed the Python version to use recursion that you'd have the same problem |
| 19:26 | haspaker | Recur seems to have the same problem |
| 19:26 | haspaker | emezeske: Yeah, but is it even possible to do it in Clojure without recursion? |
| 19:27 | emezeske | haspaker: Of course it is. Anyway, if you use recur, it will basically be just looping anyway. |
| 19:27 | amalloy | of course. but too much recusion is never going to lead to an OOME |
| 19:27 | emezeske | amalloy: It will always hit a stack overflow before oom? |
| 19:27 | amalloy | no |
| 19:28 | amalloy | but recursion will contribute to SOE, not to OOME. if you're hitting OOME, reducing recursion won't make a difference |
| 19:28 | emezeske | Huh |
| 19:28 | emezeske | I guess the stack space in the JVM is a separate thing from the heap space |
| 19:29 | emezeske | -Xss as opposed to -Xms or whatever |
| 19:29 | amalloy | yes |
| 19:29 | michaelr525 | why would (count (macro-with-binding (doall (lazy-seq-func)))) behave differently from (count (doall (macro-with-binding (lazy-seq-func))))? |
| 19:30 | amalloy | haspaker: fwiw, my solution to that problem solves (f 3 12912) in 5s |
| 19:31 | haspaker | Cool. Could you upload it? |
| 19:31 | michaelr525 | i don't get it gggg |
| 19:31 | michaelr525 | it drives me crazy |
| 19:31 | emezeske | michaelr525: What is macro-with-binding? |
| 19:32 | amalloy | god, 4clojure is so slow now. i thought i rolled back to a faster version |
| 19:32 | amalloy | haspaker: https://gist.github.com/349eb71c83e9bd98d04c |
| 19:32 | michaelr525 | it's a macro with just (binding [...] @body) |
| 19:32 | emezeske | michaelr525: Could your problem have to do with the fact that bindings and lazy-seqs don't get along well? |
| 19:33 | emezeske | michaelr525: In your second example, the binding would not affect the lazy-seq stuff when doall realized the lazy-seq, I think |
| 19:34 | michaelr525 | emezeske: the funny thing is that the second example behaves in a way it |
| 19:34 | michaelr525 | 's supposed to |
| 19:34 | emezeske | michaelr525: So does the first |
| 19:34 | michaelr525 | while the first one returns strange results |
| 19:34 | michaelr525 | i mean returns the expected results |
| 19:34 | emezeske | michaelr525: In your first example, the binding is not in effect when the lazy-seq is realized |
| 19:35 | michaelr525 | how so? |
| 19:35 | emezeske | michaelr525: http://kotka.de/blog/2009/11/Taming_the_Bound_Seq.html |
| 19:35 | emezeske | michaelr525: http://cemerick.com/2009/11/03/be-mindful-of-clojures-binding/ |
| 19:35 | emezeske | michaelr525: Maybe those will be helpful |
| 19:36 | michaelr525 | maybe.. |
| 19:36 | michaelr525 | thanks |
| 19:36 | michaelr525 | i'll read it |
| 19:36 | michaelr525 | sometimes clojure just drives me nuts |
| 19:37 | michaelr525 | is there reallly a good reason to write something in cps? |
| 19:37 | michaelr525 | i'm talking about clj-http |
| 19:46 | michaelr525 | emezeske: actually according to cemerick's article the first example should produce the correct result |
| 19:46 | michaelr525 | emezeske: in the first example i realize the lazy sequence inside the binding |
| 19:47 | emezeske | michaelr525: Oh, whichever way, I guess I had the order mixed up |
| 19:47 | emezeske | michaelr525: I don't know what you mean by "correct result", though, they both work correctly |
| 19:47 | emezeske | michaelr525: They just do different things |
| 19:48 | haspaker | I rewrote my Python code so that it relies purely on recursion |
| 19:48 | haspaker | It still takes only 15 seconds to spit out the correct answer |
| 19:49 | emezeske | haspaker: Did you see what amalloy said earlier? I was wrong about it being stack-space-related |
| 19:53 | haspaker | emezeske: Hmm. That only makes the error seem even more strange to me |
| 19:53 | haspaker | Now the Python code and the Clojure code performs almost exactly the same task |
| 19:54 | haspaker | But Python seems to soldier on just fine while Clojure gives up and dies |
| 19:55 | haspaker | *give up and die, of course |
| 19:57 | eggsby | hmm, why is the classic double tail recursive so slow in clojure (as compared to something like scala) |
| 19:57 | eggsby | like fib, for example |
| 19:57 | emezeske | haspaker: How big does the branches list get with the goal of 12912? |
| 19:57 | eggsby | Is it just because it has to do the type checks? |
| 19:57 | haspaker | Extremely big |
| 19:57 | emezeske | haspaker: Java has a fixed max heap size that you can set with command-line args |
| 19:58 | emezeske | haspaker: If it's bigger than the default max heap size, you'll hit OOM |
| 19:59 | emezeske | haspaker: You can set the Java max heap size with something like -Xmx500M or -Xmx2G |
| 19:59 | haspaker | emezeske: That could very well be the solution |
| 19:59 | haspaker | The size of the final list lies somewhere between 2^12912 and 3^12912 |
| 19:59 | emezeske | Heh, that's a big number :) |
| 20:05 | haspaker | emezeske: I realized now that I lied |
| 20:05 | haspaker | I meant to say 2^17 and 3^17 :> |
| 20:07 | emezeske | haspaker: Yeah, I was thinking about how ridiculously unimaginably big 2^12912 was just now :) |
| 20:13 | haspaker | emezeske: Yeah. 3^12912 is more than six thousand digits long |
| 20:14 | emezeske | haspaker: You might have to buy an extra stick of RAM for that |
| 20:24 | tomoj | djanatyn: see also http://dev.clojure.org/display/design/Where+Did+Clojure.Contrib+Go |
| 20:25 | djanatyn | thanks |
| 20:26 | tomoj | also http://search.maven.org/#search%7Cga%7C1%7Cclojure.math.combinatorics |
| 20:28 | tomoj | (which won't find stuff on clojars, but the core clojure libs are in maven central not clojars) |
| 20:52 | scizo_ | noob here trying to add something to the front of a vector and can't seem to find a function for it. |
| 20:52 | scizo_ | maybe better said to the front of any collection? |
| 20:54 | amalloy | scizo_: not every collection is optimized for adding to any particular spot. if you don't mind turning it into a seq, you can just use cons |
| 20:55 | scizo_ | amalloy: so with sequences cons and conj always add to the front? |
| 20:55 | amalloy | yes |
| 20:56 | scizo_ | amalloy: alright, thanks. |
| 21:22 | scizo_ | This might not be directly clojure related, maybe. I'm currently going through the clojure-koans and I am trying to write a recursive factorial function. I currently have this. https://gist.github.com/3375107 |
| 21:23 | scizo_ | This doesn't work because the recursion has to be at the tail, which I understand, but I am unable to come up with an alternative. |
| 21:27 | casion | scizo_: a clue would be that you would need more than 1 loop binding |
| 21:28 | adamvh | Hello all. |
| 21:28 | scizo_ | casion: Yeah, I just started playing around with that idea. I think I am almost there. |
| 21:29 | scizo_ | casion: It worked. Thanks. |
| 21:29 | casion | sure, not often I know an answer to anything asked in here, haha |
| 21:29 | adamvh | Does anyone know of good places to look for how to use core.logic with user-defined types? |
| 21:29 | Scriptor | the good ole' iterative recursive factorial |
| 21:31 | aperiodic | ~anyone |
| 21:31 | clojurebot | Just a heads up, you're more likely to get some help if you ask the question you really want the answer to, instead of "does anyone ..." |
| 21:31 | adamvh | Well, then. |
| 21:32 | adamvh | Where is there documentation on using user-defined types with core.logic? |
| 21:32 | adamvh | What kinds of data can a logic engine work with? |
| 21:34 | Scriptor | aperiodic: not really relevant, he's looking for places to find documentation, not asking if anyone knows about a topic |
| 21:34 | aperiodic | Scriptor: I thought he might have been running into a specific issue in trying to get that to work |
| 21:35 | scizo_ | I updated my factorial function (https://gist.github.com/3375107) and it works with the exception of a base case of zero. I want to ask if I can do an early return before the loop, but that doesn't seem to feel like the clojure way of doing it. |
| 21:35 | muhoo | factorials are the "hello world" of lisp |
| 21:36 | casion | scizo_: you dont need to test for a case of 1 |
| 21:36 | Scriptor | scizo_: if (fact 0) => 1 |
| 21:36 | Scriptor | er, ignore the 'if' in that |
| 21:37 | scizo_ | Scriptor casion: yes I see that now. Thanks. :) |
| 21:40 | dnolen | adamvh: you can extend unification to your own data types if that's what you mean. |
| 21:40 | dnolen | adamvh: the wiki has a Datomic example - you don't need to understand anything about Datomic to get it. |
| 21:40 | adamvh | dnolen: I'm sorry, I'm not entirely sure what unification means |
| 21:40 | adamvh | I'm rather new to logic programming in general |
| 21:41 | dnolen | adamvh: it means you can use your own data types. |
| 21:44 | dnolen | adamvh: unification is the process by which two pieces of data are attempted to be made equal. |
| 21:46 | dnolen | adamvh: out of the box, core.logic works the the standard Clojure data structures - I would stick with them until you feel a little more comfortable with how core.logic works. |
| 21:52 | barryTheIdiot | I'm having trouble evaluating a list with a parameter as a function. For example, (def example (list '+ 'x 1). then what I would love to do is (let [x 5] (eval example)), but running into scope issues i think |
| 21:52 | barryTheIdiot | what's the easiest way to do that kind of thing? |
| 21:54 | brehaut | barryTheIdiot: back up a bbit; what are you trying to achieve? eval is not common in real clojure code |
| 21:54 | adamvh | dnolen: The eventual goal is a program that will automatically validate army lists for a tabletop wargame |
| 21:54 | brehaut | barryTheIdiot: also, i think you idea of vars, symbols and scoping is wackadoodle |
| 21:54 | barryTheIdiot | probably :( |
| 21:54 | adamvh | dnolen: the idea being that you chose a collection of units, some of which can only be present in certain quantities, some of which are allowed to be present only if others are |
| 21:55 | barryTheIdiot | I have a list, that is literally (+ x 5). how can I evaluate it? |
| 21:55 | amalloy | clojurebot: your idea of vars, symbols, and scoping is wackadoodle |
| 21:55 | clojurebot | Ok. |
| 21:55 | Scriptor | barryTheIdiot: why do you want to evaluate it as a list? |
| 21:55 | Scriptor | you can simply do (+ x 5) |
| 21:56 | brehaut | ,(let [x 1] (apply + x 5)) |
| 21:56 | clojurebot | #<IllegalArgumentException java.lang.IllegalArgumentException: Don't know how to create ISeq from: java.lang.Long> |
| 21:56 | brehaut | crap |
| 21:56 | brehaut | ,(let [x 1] (apply + x [5])) |
| 21:56 | clojurebot | 6 |
| 21:56 | adamvh | dnolen: is that a good problem domain for core.logic? |
| 21:57 | brehaut | barryTheIdiot: (im assuming you want to know how to apply a function to a list?) |
| 21:57 | barryTheIdiot | yes, but I have it as a literal list bound to variable. I don't know how to "treat" it as a function |
| 21:57 | Scriptor | so you have '(+ x 5) |
| 21:57 | barryTheIdiot | yes |
| 21:57 | brehaut | barryTheIdiot: why do you have that list then? |
| 21:58 | adamvh | ,(eval '(+ x 5)) |
| 21:58 | clojurebot | #<Exception java.lang.Exception: SANBOX DENIED> |
| 21:58 | brehaut | ,'x |
| 21:58 | clojurebot | x |
| 21:58 | frio | i think brehaut's initial question is the main thing here: what are you actually trying to achieve? |
| 21:58 | brehaut | ,(read-string "x") |
| 21:58 | clojurebot | x |
| 21:58 | brehaut | i have no idea what im doing |
| 21:59 | barryTheIdiot | I want to be able to temporarily bind x to a number, let's say 19, and then using the previously bound list '(+ x 5), to do the function |
| 21:59 | barryTheIdiot | sorry if I'm not making sense, not had much sleep lately. |
| 21:59 | frio | no, i get that |
| 21:59 | frio | but why |
| 22:00 | frio | what is the overall purpose of that design :) |
| 22:00 | brehaut | barryTheIdiot: i think you want partial application |
| 22:00 | Scriptor | there might be a better way to do what you want |
| 22:00 | barryTheIdiot | it's for a program to find the next number in a sequence of numbers |
| 22:00 | Scriptor | ah |
| 22:00 | Scriptor | barryTheIdiot: do you know how to make a function? |
| 22:00 | muhoo | ,(read-string "eval") |
| 22:00 | clojurebot | eval |
| 22:00 | brehaut | (let [f (partial + 1) x 5] (f x)) |
| 22:00 | brehaut | ,(let [f (partial + 1) x 5] (f x)) |
| 22:00 | clojurebot | 6 |
| 22:01 | brehaut | barryTheIdiot: capture the expression as a function, and apply that function later on, rahter than trying to capture it as a list and then inject values |
| 22:01 | barryTheIdiot | alright, thanks, i'll try that |
| 22:02 | brehaut | btw, that particular case is 'inc ;) |
| 22:02 | adamvh | ,(let [f (partial + 1)] (take 5 (iterate f 5))) |
| 22:02 | clojurebot | (5 6 7 8 9) |
| 22:02 | adamvh | barryTheIdiot: that's more or less what you want, right? |
| 22:03 | brehaut | barryTheIdiot: if the functions arguments arent in the order you want, then #(…) is idiomatic to capture that sort of out of order partial application |
| 22:03 | Scriptor | barryTheIdiot: #(...) is shorthand for an anonymous function, which is like a regular clojure function but you don't supply it a name |
| 22:04 | Scriptor | sorry if I'm stating the obvious, just making sure we're covering the bases |
| 22:04 | dnolen | adamvh: static analysis of all kinds, scheduling, planning, in memory dbs, test generation, configuration - Prolog style programming is well suited to many problem domains. |
| 22:05 | adamvh | dnolen: Guess I'm just gonna have to put in some work to understand what it's all about :p |
| 22:06 | dnolen | adamvh: that you will - it's a big subject. I hardly know anything myself ... |
| 22:19 | XRR_Stanislav | Hmm, if you use (eval '(defn foo [] "I worship his shadow")) or something like that, does that alter the global scope? |
| 22:22 | brehaut | im pretty sure it alters the namespace it is run in (globally) |
| 22:37 | semperos | compiling a simple "hello world" for ClojureScript targeting Node.js; using lein-cljsbuild 0.2.5 which uses ClojureScript 0.0-1450 |
| 22:38 | semperos | all goes well until I try to add a second ClojureScript file and namespace to my build, at which point I get the following error: https://gist.github.com/3375417 |
| 22:38 | semperos | the second namespace is just contains the ns form, nothing else |
| 22:38 | semperos | compilation success, but running "node main.js" results in the error seen in that gist |
| 22:38 | semperos | anybody experience anything similar or have thoughts? |
| 22:39 | amalloy | semperos: ask Raynes and dnolen. known bug |
| 22:40 | semperos | amalloy: great, thanks |
| 22:40 | semperos | did a quick google for keywords in the error but didn't see anything obvious surface |
| 22:41 | muhoo | has anyone got nrepl + piggieback + cljsbuild running with the browser (not rhino)? |
| 22:43 | tomoj | semperos: is the second namespace name single-segment and the same as a local somewhere else? |
| 22:43 | tomoj | actually I guess it doesn't matter if it's single-segment, just if the first segment matches a local |
| 22:44 | semperos | a local where? |
| 22:44 | tomoj | well, since it's not in the second namespace, the other one, I guess |
| 22:45 | semperos | tomoj: the two namespaces are platform.core and platform.util, the util being the second one that creates the error at runtime |
| 22:45 | semperos | platform.core has only a `start` fn and the (set! *main-cli-fn* start) form |
| 22:45 | Raynes | semperos: Yeah, it's completely nuts. |
| 22:45 | semperos | :) |
| 22:45 | semperos | that's ok, I just wanted to make sure I wasn't completely nuts |
| 22:46 | tomoj | that doesn't sound like the problem I was thinking of |
| 22:46 | xeqi | muhoo: I got them to where I could use the browser repl |
| 22:46 | Raynes | It's baffling that the target was written, but apparently not tested at all. |
| 22:46 | Raynes | :p |
| 22:49 | tomoj | the node target? |
| 22:53 | muhoo | xeqi: what did you supply as :eval argument to cemerick.piggieback/cljs-repl ? |
| 22:53 | xeqi | muhoo: https://www.refheap.com/paste/4239 |
| 22:55 | xeqi | though doing that now it seems to be ignoring the first input I give it after starting the cljs-repl |
| 22:56 | muhoo | xeqi: you are a god |
| 22:56 | muhoo | thank you so much! |
| 22:59 | xeqi | its functional, but still in its infancy |
| 22:59 | xeqi | can't wait for nrepl.el to work well with it |
| 23:00 | muhoo | xeqi: that's what i'm using |
| 23:08 | muhoo | and it works. amazing. |
| 23:10 | xeqi | hmm, I didn't realize C-c C-k worked if I forced clojure-nrepl-mode for a cljs file |
| 23:10 | xeqi | neat |
| 23:11 | xeqi | though losing M-. is annoying |
| 23:16 | muhoo | i lost that years ago as my window manager binds it :-) |
| 23:16 | muhoo | or do you mean dabbrev? |
| 23:17 | xeqi | nrepl-jump |
| 23:20 | muhoo | hmm, a bigger problem than that for me now is that if cljs gets hung up, any reconections to the process via nrepl.el or lein repl :connect lock up too |
| 23:21 | xeqi | refresh the browser ? |
| 23:22 | muhoo | tried. it's in the main jvm process itself, it seems to me. i get "user>", but anything after that hangs |
| 23:23 | muhoo | wait, no, not hangs, throws an exception (in a terminal i didn't see) |
| 23:25 | muhoo | https://www.refheap.com/paste/4438 |
| 23:26 | muhoo | anwyay, this is very cool stuff, but, sadly, i can't propose delivering a customer project with this stuff yet. so back to java hell i go for the next 3 months. *sigh* |
| 23:38 | grettke | Hi folks. What is the definitive source on what version of SLIME should be used for Clojure in Emacs? |
| 23:40 | semperos | grettke: unless things have changed recently, the Emacs clojure-mode should handle pulling down what you need, including SLIME |
| 23:42 | semperos | it requires that you have lein-swank installed as well, but if you look through the clojure-mode and swank-clojure docs on their respective Github repo's, it says *not* to have other versions of SLIME loaded yourself |
| 23:42 | grettke | semperos: Thanks. Who is the official maintainer of clojure-mode, I see more than a couple branches out there. Yea I noticed that it pukes on my existing SLIME... great lol. |
| 23:43 | semperos | grettke: technomancy_ is the maintainer |
| 23:43 | semperos | his Github user is the same, minus the final underscore |
| 23:43 | semperos | grettke: I've ended up "delaying" my various Lisp configs in Emacs, so I can use different versions of everything as needed |
| 23:43 | semperos | including slime, etc. |
| 23:44 | grettke | semperos: I see. Did you cut over to v24 yet? Do folks grab clojure-mode using ELPA these days? |
| 23:44 | semperos | I do use v24, have for a while, no issues |
| 23:45 | semperos | I personally pull in clojure-mode from its Github repo in my .emacs.d, but it gets updated via ELPA/Marmalade frequently enough |
| 23:46 | xeqi | I used it from elpa |
| 23:47 | grettke | Right now I've got everything in my .emacs.d in vcs but wondering if that manual management can go away since ELPA is here? |