2013-04-16
| 01:04 | tieTYT | i have a list of booleans. How do I "or" the elements in the list? |
| 01:06 | rhg135 | (apply or the-list) |
| 01:06 | alandipert | tieTYT: (some identity thingies) perhaps |
| 01:06 | tieTYT | rhg135: that's what I thought... |
| 01:06 | alandipert | (can't apply or, as it's a macro) |
| 01:06 | rhg135 | i think |
| 01:06 | rhg135 | ok |
| 01:07 | tieTYT | CompilerException java.lang.RuntimeException: Can't take value of a macro: #'clojure.core/or, compiling:(fileorganizer\core.clj:31:26) |
| 01:07 | rhg135 | (apply #(or %&) the-list) |
| 01:07 | rhg135 | i mean |
| 01:07 | rhg135 | idk |
| 01:07 | alandipert | (reduce #(or %1 %2) the-list) maybe |
| 01:08 | rhg135 | yes ^ |
| 01:08 | tieTYT | ok |
| 01:08 | tieTYT | thx |
| 01:08 | alandipert | i'd go with the 'some identity' approach personally |
| 01:09 | tieTYT | whats that? |
| 01:09 | alandipert | (some identity the-list) |
| 01:09 | rhg135 | wow, fancy |
| 01:11 | tieTYT | that's kind of cool |
| 01:12 | tieTYT | i'll do that, thanks |
| 01:12 | mthvedt | some is one of my favorite clojure fns, it's surprising where/when it shows up |
| 01:12 | mthvedt | s/shows/comes |
| 01:13 | tieTYT | this is my first time using it |
| 01:24 | patbrown | :alandipert Dude, thanks for helping me learn some Clojure. I write some every day and I love it. |
| 01:30 | alandipert | patbrown: np man happy hacking! |
| 01:32 | patbrown | :alandipert Yeah, send my best to Brenton, I definitely didn't get much at the time, but I kept referring back to the class handout for the first three months and remembering some of yall's points. It was worth every penny. |
| 02:01 | base698 | Anyone know how to read a bufferedreader and NOT use line-seq. I need a sequence of chars. All i can find is line-seq |
| 02:03 | amalloy | base698: look up the methods defined for bufferedreader and see if you can come up with something clever |
| 02:10 | base698 | amallay: I just did passed the stream and called read. I just didn't want to do that if there was something built in. |
| 02:10 | base698 | Thanks! |
| 02:23 | noidi | base698, if you want to encapsulate that in a `char-seq` function, it should be easy to do: https://github.com/clojure/clojure/blob/master/src/clj/clojure/core.clj#L2725 |
| 05:03 | yusup | is anyone using clojure in production ? |
| 05:05 | ordnungswidrig | yusup: many do |
| 05:06 | maleghast | Yeah, in a tiny way so far… There are those with much more "in prod" experience on here... |
| 05:09 | yusup | everyting great? |
| 05:09 | maleghast | For Sho! |
| 05:09 | yusup | *everything |
| 05:10 | maleghast | You should try and see if you can talk to some of the engineers from Forward in London - one of their guys does a talk about re-inventing their application(s) with Clojure that is very encouraging... |
| 05:11 | yusup | thanks maleghast |
| 05:12 | maleghast | Here you go, his name is Paul Ingles and here is what he has to say on Clojure in Production… -> http://www.infoq.com/presentations/Clojure-uSwitch |
| 05:12 | ordnungswidrig | We should build a showcase site "clojure in production" to advertise clojure |
| 05:12 | maleghast | ordnungswidrig: That's a great idea, no question. |
| 05:13 | yusup | that will be awesome. |
| 05:14 | ordnungswidrig | short description of project / application, used liberaries/stacks. team size, and free text testimonial |
| 05:14 | ordnungswidrig | and public rating to define importance of an entry |
| 05:16 | ordnungswidrig | any volunteers? |
| 05:16 | ordnungswidrig | btw. there is http://dev.clojure.org/display/community/Clojure+Success+Stories |
| 05:17 | wink | ordnungswidrig: there's not many links to click though |
| 05:17 | wink | I'd love another page of real websites for example |
| 05:17 | yusup | that page is extremely slow. |
| 05:18 | wink | that's at least one heap of projects you can actually try :D |
| 05:18 | wink | yusup: it's confluence :P |
| 05:20 | Netfeed | infoq has great content in a shitty presenation |
| 05:21 | jasonjckn | Netfeed: have you tried horizontal button |
| 05:21 | Netfeed | hmm, no |
| 05:24 | ordnungswidrig | you can also download infoq slides after registration. |
| 05:24 | ordnungswidrig | sometimes. |
| 06:01 | bosie | ordnungswidrig: nice nick |
| 06:03 | ordnungswidrig | bosie: i tried to be subversive :-) |
| 06:03 | bosie | ordnungswidrig: but but ... you are german |
| 06:03 | bosie | ;) |
| 06:07 | ordnungswidrig | :-p |
| 06:09 | john2x | how do I start a clojurescript repl with all the dependencies in my project.clj ready for loading? (`lein repl` but for clojurescript?) |
| 06:19 | ambrosebs | john2x: Try lein-cljsbuild https://github.com/emezeske/lein-cljsbuild |
| 07:53 | nonuby | What approach are clojurers using to handle error notification in request based apps (ring/compojure), hipchat? |
| 07:55 | nonuby | anyone got clojure logs as data video? |
| 08:13 | ordnungswidrig | nonuby: what do you mean, "error notification"? |
| 08:25 | mynomoto | nonuby |
| 09:07 | jjl` | hi all. i have a question about clojurescript's support for legacy browsers. is there some documentation on how far back things are supported? |
| 09:32 | stuartsierra | jjl`: ClojureScript is mostly browser-agnostic. |
| 09:33 | jjl` | yes, but things like :keys, do they support old IE |
| 09:33 | jjl` | as object.keys() was added in ie9 |
| 09:33 | jjl` | (part of KS1.6) |
| 09:33 | jjl` | JS1.6* |
| 09:33 | jjl` | when i'm writing javascript, i either have to use a library to settle the differences for me or write it differently |
| 09:34 | stuartsierra | ClojureScript itself does not attempt to abstract over differences in JavaScript APIs. |
| 09:34 | jjl` | yes, but which version of javascript does it attempt to compile down to? |
| 09:35 | stuartsierra | That I do not know. |
| 09:35 | jjl` | i suspect it requires 1.6, which means it's not a viable option. but it's not documented anywhere i can find |
| 09:35 | ordnungswidrig | it depend son what the google closure spits out |
| 09:36 | bbloom | jjl`: I'm not sure what you're talking about with Object.keys, that's not anywhere in the clojurescript source that i can tell |
| 09:37 | jjl` | where 'Object' is any instance object |
| 09:37 | mpenet | yeah clojurescript maps do not map 1:1 with js maps |
| 09:37 | bbloom | jjl`: are you referring to the clojure.core/keys function? |
| 09:37 | mpenet | and js-keys uses google closure to iterate over the maps to get the keys |
| 09:37 | jjl` | mpenet: aha. that's the useful bit |
| 09:37 | mpenet | map entries* |
| 09:38 | bbloom | Google Closure abstracts over browsers |
| 09:38 | mpenet | so mostly browser agnostic as it's been said |
| 09:38 | jjl` | so i suppose what i'm looking at is google closure's browser support? |
| 09:38 | mpenet | yep |
| 09:38 | bbloom | jjl`: yes |
| 09:39 | jjl` | *sigh* there is of course no documentation on their support either |
| 09:39 | bbloom | jjl`: that's because it supports anything google supports, which is everything |
| 09:39 | jjl` | when google have been dropping support for old IE on their homepage? |
| 09:39 | Ember- | a long time ago |
| 09:40 | jjl` | sadly, i have a need to support ie8 as a hard limit and sometimes ie7 |
| 09:40 | Ember- | google has supported officially only latest two major releases of each browser for a while now |
| 09:40 | Ember- | which rules out IE8 |
| 09:40 | jjl` | *nod* |
| 09:40 | mpenet | jjl`: https://groups.google.com/d/msg/closure-library-discuss/cpHlaWAkFag/HzpCAD9ThIMJ |
| 09:41 | mpenet | seems safe, unless you are making a time machine |
| 09:41 | jjl` | hrm, that's from 2009 |
| 09:41 | jjl` | and googling for 'ie9 clojurescript' turned up a few people complaining about poor ie9 support |
| 09:42 | jjl` | (also old, so hard to know what current status is) |
| 09:42 | bbloom | jjl`: if you find it doesn't work on a particular browser, come in here and complain (with a repro case) and i'm sure somebody can fix it up pretty quickly |
| 09:42 | bbloom | or file a ticket |
| 09:43 | jjl` | okay, thanks |
| 09:43 | mpenet | I really doubt the core breaks on ie9 tbh, I think prismatic say they support ie8+ and they rely on cljs for their frontend |
| 09:43 | bbloom | cljs isn't coupled to the dom in any interesting way, so browser compat is relatively easy |
| 09:44 | bbloom | for the most part, google closure totally alleviates that pain |
| 10:04 | ordnungswidrig | If a type implements multiple interfaces and a protocol is implemented for multiple interfaces, which implementation is used? |
| 10:05 | ordnungswidrig | say, I implement a protocol for ILookup and Sequential which implementation of the protocol would be used for a [] or a {}? |
| 10:06 | ordnungswidrig | ok, I found it. "extend" say it's TBD :-) |
| 10:09 | bbloom | ordnungswidrig: yes, but there must be some opaque decision proces internally. i had the same question recently. let me know if you find anything out |
| 10:10 | ordnungswidrig | bbloom: I guest it boils down to map key order or like that. |
| 10:12 | ordnungswidrig | I remember a chart showing clojure datatypes and their implemented interfaces |
| 10:13 | bbloom | (source find-protocol-impl) ;; seems to be the definition |
| 10:13 | bbloom | in src/clj/clojure/core_deftype.clj |
| 10:14 | stuartsierra | ordnungswidrig: It is currently undefined what happens when you invoke a protocol function on an instance of a type which implements multiple interfaces to which you have extended that protocol. |
| 10:15 | stuartsierra | As a result, I generally recommend not to extend protocols to interfaces but only to concrete types. |
| 10:16 | ordnungswidrig | In liberator we provide default reoresentations for maps, sequences etc. To do this a protocol is extended for the types. |
| 10:17 | bbloom | stuartsierra: yeah, a quick read of the code suggests that the behavior that occurs depends on the order that java.lang.Class.getInterfaces returns |
| 10:17 | ordnungswidrig | I thought of using MapEquivalence and Sequential |
| 10:17 | bbloom | stuartsierra: which is " The order of the interface objects in the array corresponds to the order of the interface names in the implements clause of the declaration of the class represented by this object. " |
| 10:18 | stuartsierra | So at least it's predictable. Just arbitrary. |
| 10:18 | bbloom | yeah |
| 10:18 | bbloom | it's also a weird arbitrary |
| 10:18 | ordnungswidrig | like tax law |
| 10:18 | bbloom | if you write class Foo extends Bar implements IFoo, IBar |
| 10:18 | bbloom | then it seems like priority is left to right |
| 10:18 | stuartsierra | Not entirely - CL resolves multiple inheritance left-to-right based on declaration order. |
| 10:19 | bbloom | yeah, i guess that's consistent, but my intuition is that "mixins" override |
| 10:19 | ordnungswidrig | stuartsierra: IIRC you can even define the resolution order. |
| 10:21 | bbloom | just checked. scala resolves traits right to left |
| 10:22 | bbloom | a more careful reading shows that clojure reviews the chain of concrete inheritence first, THEN checks interfaces |
| 10:23 | bbloom | then resolves interface type preferences with .isAssignableFrom |
| 10:25 | bbloom | seems like this ought to be documented :-P |
| 10:25 | ordnungswidrig | bbloom: noboy should rely on this :-) |
| 10:25 | ordnungswidrig | bbloom: I suggest reading about CLOS. It's that powerful that you don't want to use it. |
| 10:27 | bbloom | fair enough. i was just curious how protocols worked. mystery solved: trivial method cache :-) |
| 10:28 | asaleh | question: is there a function to know if my var is a record? |
| 10:29 | bbloom | asaleh: (defn record? [x] (instance? clojure.lang.IRecord x)) |
| 10:29 | stuartsierra | bbloom: Rich tends to regard docstrings as specification, so he won't commit to anything that he might want to change in the future. |
| 10:29 | Ember- | ,(defrecord Rec [x]) (instance? clojure.lang.IRecord (Rec. "hi")) |
| 10:29 | clojurebot | #<Exception java.lang.Exception: SANBOX DENIED> |
| 10:30 | Ember- | aww |
| 10:30 | Ember- | anyway, that way |
| 10:30 | asaleh | bbloom, thanks, was looking for the clojure.lang.IRecord :) |
| 10:30 | bbloom | stuartsierra: makes sense |
| 10:30 | stuartsierra | We need words to differentiate between 'documentation of how it works NOW' versus 'documentation of the API I am promising to adhere to in the future'. |
| 10:30 | Ember- | and I was too late, bbloom was faster |
| 10:31 | Ember- | (needed to check with repl before my answer) |
| 10:32 | bbloom | Ember-: i did check in the repl ;-) |
| 10:32 | Ember- | hehe |
| 10:32 | Ember- | I wonder if clojurebot will accept this: |
| 10:32 | Ember- | ,(do (defrecord Rec [x]) (instance? clojure.lang.IRecord (Rec. "hi"))) |
| 10:32 | clojurebot | #<Exception java.lang.Exception: SANBOX DENIED> |
| 10:32 | Ember- | no, it doesn't |
| 10:32 | Ember- | which does make sense |
| 10:37 | danielgl_ | stuartsierra: *coming soon* <--- ? |
| 10:37 | stuartsierra | danielgl_: ? |
| 10:38 | bbloom | stuartsierra: i think he is referring to your comment about differentiating documentation of spec vs impl |
| 10:38 | danielgl_ | stuartsierra: a way to differentiate between the now and the later |
| 10:38 | bbloom | stuartsierra: either way, "Alpha" does not appear to be a robust spec mechanism in doc strings: |
| 10:38 | bbloom | (doc add-watch) |
| 10:38 | clojurebot | "([reference key fn]); Alpha - subject to change. Adds a watch function to an agent/atom/var/ref reference. The watch fn must be a fn of 4 args: a key, the reference, its old-state, its new-state. Whenever the reference's state might have been changed, any registered watches will have their functions called. The watch fn will be called synchronously, on the agent's thread if an agent, before any pending sends if agent |
| 10:38 | bbloom | weee alpha! |
| 10:39 | stuartsierra | bbloom: Tell me about it. |
| 10:39 | bbloom | "Implementation Details -- Subject To Change" |
| 10:39 | bbloom | boom. |
| 10:39 | bbloom | :-) |
| 10:43 | katratxo | hi all, one newbie question, i need an String[] for java interop, how can i get it from a vector? (.toArray ["one" "two"]) returns an Object[] |
| 10:44 | arrdem | ,(doc make-array) |
| 10:44 | clojurebot | "([type len] [type dim & more-dims]); Creates and returns an array of instances of the specified class of the specified dimension(s). Note that a class object is required. Class objects can be obtained by using their imported or fully-qualified name. Class objects for the primitive types can be obtained using, e.g., Integer/TYPE." |
| 10:44 | nDuff | kategeek: (into-array String ["one" "two"]) |
| 10:44 | katratxo | ha! thanks |
| 10:48 | asaleh | question: can I ask if some val implements a protocol? |
| 10:48 | bbloom | (doc satisfies?) |
| 10:48 | clojurebot | "([protocol x]); Returns true if x satisfies the protocol" |
| 10:49 | asaleh | bbloom, thanks! |
| 11:34 | naeg | is there some value representing infinity in clojure? or just the max. value of int64? |
| 11:34 | gfredericks | depends on what numeric types you're using |
| 11:35 | bbloom | naeg: for integers, use Integer/MAX_VALUE or Long/MAX_VALUE |
| 11:35 | bbloom | naeg: for floats and doubles, there are standard floating point infinity values |
| 11:36 | bbloom | you can also use keywords as sentinel values, if that is useful for your needs |
| 11:36 | naeg | just found out there seems to be Infinity too, like (> Infinity Integer/MAX_VALUE) |
| 11:37 | gfredericks | ,Infinity |
| 11:37 | clojurebot | #<CompilerException java.lang.RuntimeException: Unable to resolve symbol: Infinity in this context, compiling:(NO_SOURCE_PATH:0:0)> |
| 11:37 | gfredericks | &Infinity |
| 11:37 | lazybot | java.lang.RuntimeException: Unable to resolve symbol: Infinity in this context |
| 11:37 | gfredericks | o_O |
| 11:37 | bbloom | i dont think that exists |
| 11:38 | gfredericks | ,(> Double/POSITIVE_INFINITY Integer/MAX_VALUE) |
| 11:38 | clojurebot | true |
| 11:38 | naeg | woot, worked for me inside lighttable |
| 11:38 | bbloom | naeg: ah, clojurescript |
| 11:39 | bbloom | different thing :-P |
| 11:39 | naeg | I see. gotta use Double/POSITIVE_INFINITY then |
| 11:39 | gfredericks | ,(- Double/POSITIVE_INFINITY) |
| 11:39 | clojurebot | -Infinity |
| 11:39 | gfredericks | ,Double/POSITIVE_INFINITY |
| 11:39 | clojurebot | Infinity |
| 11:39 | bbloom | javascript only has double percision floating points |
| 11:40 | bbloom | gfredericks: yeah, that's just toString basically :-) |
| 11:40 | bbloom | although, I think that Infinity and -Infinity should probably be added to clojure (and maybe EDN) for cross-plat support |
| 11:40 | gfredericks | that doesn't sound too unreasonable |
| 11:40 | gfredericks | does EDN have a way to represent it currently? |
| 11:41 | gfredericks | I assume Double/POSITIVE_INFINITY doesn't mean anything |
| 11:41 | gfredericks | &clojure.edn/read-string |
| 11:41 | lazybot | java.lang.ClassNotFoundException: clojure.edn |
| 11:41 | gfredericks | &(require 'clojure.edn) |
| 11:41 | lazybot | java.io.FileNotFoundException: Could not locate clojure/edn__init.class or clojure/edn.clj on classpath: |
| 11:41 | clgv | ,(pr-str Double/POSITIVE_INFINITY) |
| 11:41 | clojurebot | "Infinity" |
| 11:41 | clgv | ,(binding [*print-dup* true] (pr-str Double/POSITIVE_INFINITY)) |
| 11:41 | clojurebot | "Infinity" |
| 11:41 | clgv | well thats buggy |
| 11:42 | gfredericks | yeah edn/read-string reads Double/POSITIVE_INFINITY as a symbol |
| 11:43 | TimMc | As it well should. |
| 11:45 | gfredericks | does the IEEE spec say anything about string representations of the numbers? |
| 11:45 | gfredericks | ,9e1000 |
| 11:45 | clojurebot | Infinity |
| 11:46 | gfredericks | ,-9e1000 |
| 11:46 | clojurebot | -Infinity |
| 11:46 | gfredericks | well I guess that's one way to encode it |
| 11:46 | bbloom | yeeeesh |
| 11:47 | gfredericks | better than nothing? is there any other way? |
| 11:47 | TimMc | niiiice |
| 11:47 | trptcolin | http://dev.clojure.org/jira/browse/CLJ-1074 |
| 11:47 | bbloom | ,(Double/parseDouble "Infinity") |
| 11:47 | clojurebot | Infinity |
| 11:47 | bbloom | (Double/parseDouble "Inf") |
| 11:48 | gfredericks | bbloom: in edn I mean |
| 11:48 | bbloom | gfredericks: i was trying to answer the question of standard notation |
| 11:48 | gfredericks | ah |
| 11:49 | juhu_chapa | Hi all! Is there a function like 'into' that does (into {} [[:x 1] [:x 2]]) -> {:x [1 2]} |
| 11:49 | mabes | juhu_chapa: merge-with |
| 11:50 | gfredericks | ,(merge-with into (for [[a b] [[:x 1] [:x 2]] [a [b]])) |
| 11:50 | clojurebot | #<RuntimeException java.lang.RuntimeException: Unmatched delimiter: )> |
| 11:50 | gfredericks | ,(merge-with into (for [[a b] [[:x 1] [:x 2]]] [a [b]])) |
| 11:50 | clojurebot | ([:x [1]] [:x [2]]) |
| 11:50 | gfredericks | ,(merge-with into (for [[a b] [[:x 1] [:x 2]]] {a [b]})) |
| 11:50 | clojurebot | ({:x [1]} {:x [2]}) |
| 11:50 | gfredericks | ,(apply merge-with into (for [[a b] [[:x 1] [:x 2]]] {a [b]})) |
| 11:50 | clojurebot | {:x [1 2]} |
| 11:51 | bbloom | neat. i forget that into is a fn and not a macro for some odd reason |
| 11:57 | juhu_chapa | mabes: :D thank you! |
| 12:04 | juhu_chapa | gfredericks: thank you! |
| 12:04 | gfredericks | for executable jars, you generally need a main namespace and a :gen-class. But that means that namespace gets AOT'd as well as everything it depends on? |
| 12:04 | gfredericks | i.e., inevitably the entire project is AOT'd? am I missing something? |
| 12:08 | hiredman | unless you use require and resolve to do runtime code loading |
| 12:09 | asaleh | question: is there a way to improve precondition errors? |
| 12:11 | cemerick | gfredericks: I saw a project once that provides a shim Java class with a main(String[]) that loads a file at a fixed location on the classpath. Seemed like a sane way to avoid the AOT business. |
| 12:11 | cemerick | I can't remember its name now, but it'd be quite simple to replicate. |
| 12:12 | trptcolin | i do that for reply |
| 12:13 | trptcolin | https://github.com/trptcolin/reply/blob/master/src/java/reply/ReplyMain.java |
| 12:13 | clgv | gfredericks, cemerick: lein-otf |
| 12:14 | cemerick | clgv: oh, that's even more clever |
| 12:15 | TimMc | It used to be all-Clojure. I don't remember why it has a Java shim now. |
| 12:18 | technomancy | you can also piggyback off the fact that clojure.main is AOTed and accepts a -m arg |
| 12:22 | gfredericks | trptcolin: this could be done in clojure, right? |
| 12:24 | TimMc | hyPiRion: WTF, how is http://dev.clojure.org/jira/browse/CLJ-1179 marked as "Declined"? Did you get a reason? |
| 12:25 | rasmusto | gfredericks: haha |
| 12:25 | trptcolin | gfredericks: yeah, same idea but using require/resolve in the -main like hiredman says. i should probably do that; that would be better |
| 12:26 | gfredericks | TimMc: hyPiRion: I'm trying to figure out if you could argue that no-arg distinct? is a meaningless as no-arg - |
| 12:26 | TimMc | &#{"hello" "goodbye" do} ;; That's *awesome*! http://dev.clojure.org/jira/browse/CLJ-1184 |
| 12:26 | lazybot | ⇒ "hello" |
| 12:26 | TimMc | gfredericks: No, it's perfectly meaningful. |
| 12:26 | TimMc | unlike - |
| 12:27 | gfredericks | certainly under the "no duplicates" interpretation |
| 12:27 | gfredericks | is that the only way to look at it? |
| 12:27 | TimMc | gfredericks: You can also use a set of invariants like "if (list* a xs) is distinct, then xs is as well." |
| 12:28 | TimMc | and "if x is in a distinct collection xs, then (list* x xs) is not distinct" |
| 12:28 | gfredericks | yeah; seems to make sense |
| 12:29 | TimMc | If you use invariants like those, you end up needing to define a base case... which the empty collection serves as nicely. |
| 12:37 | cemerick | dakrone: The note about trailing periods in the clojure-opennlp readme should be at the top. I was convinced the whole thing was a lost cause until I saw that, added periods to my play data, and found joy. :-) |
| 12:39 | TimMc | hyPiRion: That definitely explains it. |
| 12:42 | hyPiRion | yup. Life is hard |
| 12:44 | TimMc | hyPiRion: I love that that tweet is on a background of swearjure. |
| 12:44 | TimMc | Just got that. |
| 12:46 | hyPiRion | heh |
| 12:48 | TimMc | &(let [distinct?* (comp (partial (fnil apply :_ [:_]) distinct?) seq)] (map distinct?* [[] [1 2] [2 2]])) |
| 12:48 | lazybot | ⇒ (true true false) |
| 12:49 | TimMc | Is this what you want, rhickey? Is this really what you want? |
| 12:53 | dchandna | Hi. I have a question regarding the 'map' function. |
| 12:53 | ivaraasen | hyPiRion: the other night I started playing around with a generalisation of swearjure called trønderjure. it allows for the inclusion of æ, e, i, a, and å |
| 12:53 | pbuckley | I am getting errors with duplicate vars for libs that I want to use in my ns - but it seems like I should be able to have duplicate "namespaced" var names if I use :as, no? |
| 12:54 | pbuckley | (ns myproj.core (:refer-clojure :exclude [read read-string replace reverse get]) (:use [clojure.data.json :as json :exclude [pprint write read]] [clj-http.client :as client] [clj-http.cookies :as cookies] [clojure.edn :as edn] [clojure.string :as s])) |
| 12:54 | dchandna | (map [8 7 6 5 4 3 2 1] [7 6 5 4]) |
| 12:54 | pbuckley | I'm thinking I'm dumb and there is a better way to setup my ns, so I could for example use edn/read-string and json/read-string in the same ns? |
| 12:54 | trptcolin | pbuckley: use require |
| 12:55 | dchandna | and it returns (1 2 3 4). I am unable to wrap my brain around this. Can someone help? |
| 12:55 | pbuckley | trptcolin: thanks, I'll try that instead of use |
| 12:56 | hyPiRion | ivaraasen: hah |
| 12:56 | ivaraasen | dchandna: vectors, when called with a number as an argument, returns the element at that index |
| 12:57 | TimMc | ,#{(println "of") do (do :z/h283r (println "order")) (do :b121 (println "out"))} |
| 12:57 | clojurebot | out\nof\norder\n |
| 12:57 | dchandna | oh ok. so something like ([1 2 3 4 5] 1) would return 2 |
| 12:57 | dchandna | thanks ivaraasen |
| 12:58 | TimMc | hyPiRion: ^ New Clojure "art form" -- build programs out of do and #{} by cracking hashes. |
| 12:58 | hyPiRion | TimMc: what, how is do working inside there? |
| 12:58 | technomancy | bespoke clojure programs that only work on a given version of clojure |
| 12:59 | TimMc | hyPiRion: http://dev.clojure.org/jira/browse/CLJ-1184 |
| 12:59 | hyPiRion | ,((-> [$ !] #(* $ !)) 2 3) |
| 12:59 | clojurebot | #<CompilerException java.lang.RuntimeException: Unable to resolve symbol: $ in this context, compiling:(NO_SOURCE_PATH:0:0)> |
| 12:59 | hyPiRion | hm, what did I forget there |
| 12:59 | TimMc | hyPiRion: I was sad that I could inject an entire fn arity into #() via -> -- the problem is the trailing arg vector. |
| 13:00 | TimMc | &(macroexpand '(-> ([x y] (+ x y)) #())) |
| 13:00 | lazybot | ⇒ (fn* ([x y] (+ x y)) [] ()) |
| 13:00 | hyPiRion | yeah, I know, it's sad |
| 13:00 | hyPiRion | I've tried out that as well, but got no way of doing closures |
| 13:00 | gfredericks | ,[do 1 2] |
| 13:00 | clojurebot | 2 |
| 13:02 | TimMc | &'(#{do *} 5 6) |
| 13:02 | lazybot | ⇒ (#{* do} 5 6) |
| 13:03 | TimMc | &'(#{do (identity *)} 5 6) |
| 13:03 | lazybot | ⇒ (#{do (identity *)} 5 6) |
| 13:03 | TimMc | &(#{do (identity *)} 5 6) |
| 13:03 | lazybot | java.lang.RuntimeException: Unable to resolve symbol: do in this context |
| 13:03 | TimMc | Blah, sorry -- wrong window. |
| 13:06 | callen | ah motherfucker |
| 13:06 | callen | fucking fucker heroku fuck |
| 13:07 | ppppaul | what is the simplest way to turn something into a vector, and if it's already a vector, keep it the way it is |
| 13:07 | ticking | ppppaul: (apply vector …) |
| 13:08 | TimMc | vec |
| 13:08 | ticking | better ^ |
| 13:08 | TimMc | ppppaul: vec will give you back a new vector, by the way |
| 13:09 | ppppaul | ticking, thanks. that's what i came to as well |
| 13:09 | ppppaul | ,(doc vec) |
| 13:09 | clojurebot | "([coll]); Creates a new vector containing the contents of coll. Java arrays will be aliased and should not be modified." |
| 13:09 | hyPiRion | the simplest way is obviously `[~@foo] |
| 13:09 | ppppaul | ^_^ |
| 13:10 | hyPiRion | ,[`[~@(list 1 2 3)] `[~@[:a :b :c]]] |
| 13:10 | clojurebot | [[1 2 3] [:a :b :c]] |
| 13:12 | ppppaul | ,(->> "17592186045423" (apply vector)) |
| 13:12 | clojurebot | [\1 \7 \5 \9 \2 ...] |
| 13:13 | ppppaul | ,(->> "17592186045423" (apply vec)) |
| 13:13 | clojurebot | #<ArityException clojure.lang.ArityException: Wrong number of args (14) passed to: core$vec> |
| 13:13 | gfredericks | ,[if 1 2 3] |
| 13:13 | clojurebot | #<CompilerException java.lang.RuntimeException: Unable to resolve symbol: if in this context, compiling:(NO_SOURCE_PATH:0:0)> |
| 13:14 | ppppaul | i don't want the string to get seqed |
| 13:14 | ppppaul | i would like the vector to look like ["17592186045423"] |
| 13:14 | gfredericks | do you always have just a string? |
| 13:14 | ppppaul | sometimes i have an array of strings |
| 13:14 | gfredericks | and you want to do something different depending on which it is |
| 13:15 | gfredericks | you could say (if (string? x) [x] (vec x)) |
| 13:15 | dakrone | cemerick: duly noted, I've moved it up to near the top |
| 13:15 | ppppaul | i want to keep the array as is, or i want to turn the single string into an array of 1 string |
| 13:16 | ppppaul | well, guess i'm throwing in some conditions.... i was just curious if there was some other way to do this in clojure |
| 13:21 | dchandna | ppppaul: How about this: (vec (cons "1234554456" [])). Disclaimer: I am a Clojure newbie :) |
| 13:24 | Foxboron | ppppaul: conj? |
| 13:25 | Foxboron | (conj [] "clojure") |
| 13:25 | Foxboron | I am not really sure what you mean by "turn" tbh. |
| 13:27 | jjttjj | anyone know why I might be getting a "java.lang.NoClassDefFoundError: org/w3c/dom/ElementTraversal" error out of the box when I try to use the latest stable clj-webdriver? |
| 13:27 | jjttjj | |
| 13:43 | lynaghk | dnolen: do you know what the story is with ClojureScript's (undefined?) macro? |
| 13:43 | cyff | is it possible to run clojurescript on node.js without using clojure? |
| 13:43 | lynaghk | dnolen: it emits (void 0 === x), but that throws a reference error in Chrome if x is undefined. Any reason it's not typeof x == "undefined"? |
| 13:44 | noncom | is it possible to link 2 or more terminals to a clojure repl? |
| 13:44 | lynaghk | cyff: you can run the emitted JavaScript from ClojureScript, sure. If you're talking about avoiding the JVM entirely, I think a few people are working on ClojureScript-in-ClojureScript |
| 13:44 | technomancy | noncom: sure; `lein repl` in one and `lein repl :connect $PORT` in the other |
| 13:44 | cyff | lynaghk: you know the project? |
| 13:45 | cyff | the name of it |
| 13:45 | lynaghk | cyff: nah, not offhand but just google/github around and you'll find it |
| 13:45 | lynaghk | cyff: https://github.com/kanaka/clojurescript |
| 13:45 | cyff | doesn't seem to updated |
| 13:46 | lynaghk | cyff: there may be others |
| 13:46 | callen | lynaghk: void 0 is the standard way to check for undefined. |
| 13:46 | noncom | technomancy: very good! thank you! |
| 13:47 | lynaghk | callen: yeah, but you'll still get a reference error if you try to refer to a var that's not defined in the scope. |
| 13:48 | lynaghk | callen: my exact use case is a library that extends ClojureScript protocols to JavaScript things; I'd like to extend protocols to jQuery if it's available |
| 13:48 | cmajor7 | compojure, is there a way to route URNs. e.g. it comes is as "context/bank:dept:account-number:87632498763" (GET "/bank:dept:account-number:number"). The way Compojure (clout) matches it is not as a whole string "bank:dept:account-number:number", but as different variables (since it overloads ':' to recognize vars). regex can be used to match the "number", but the matching still fails (e.g. will match other "aaa:bbb:ccc") |
| 13:48 | lynaghk | callen: but (when-not (undefined? js/jQuery)) won't cut it because that throws a reference error when jQuery isn't defined. |
| 13:48 | callen | lynaghk: write your own macro? |
| 13:49 | callen | this is a lot of why I can't use CLJS right now. Too much impedance mismatch with the native client language. That along with sourcemaps. Ehgk. |
| 13:49 | lynaghk | callen: thought I'd ask David first about the cljs.core/undefined? behavior =) |
| 13:49 | callen | lynaghk: file an issue on the github to rattle cages more effectively. |
| 13:49 | lynaghk | callen: this has nothing to do with ClojureScript, the problem is with the JavaScript it's emitting |
| 13:50 | callen | I'd call that an act of sophistry. |
| 13:50 | lynaghk | callen: I troll dnolen enough in person |
| 13:50 | callen | then troll him in person. |
| 13:50 | callen | Seeing the pain with full CLJ/CLJS apps, I can see why node/meteor people run screaming. |
| 13:53 | dnolen | callen: lynaghk: it's come up before, perhaps we could provide a resolve macro which can be used for this purpose. |
| 13:54 | lynaghk | dnolen: is the typeof check slow or otherwise unidiomatic JS? |
| 13:54 | lynaghk | dnolen: I'm not sure what that's not being used. Or typeof x === void 0 |
| 13:54 | dnolen | lynaghk: no that sounds like reasonable approach to me, to use the typeof operator |
| 13:55 | lynaghk | dnolen: you want a patch? |
| 13:55 | dnolen | lynaghk: the reasoned undefined works the way it does is because it's function. we probably want something special for this particular case that JS people use typeof for. |
| 13:56 | lynaghk | dnolen: it's implemented as a macro |
| 13:57 | dnolen | lynaghk: that just for inlining |
| 13:57 | dnolen | lynaghk: it's proper function |
| 13:57 | octagon | hello! i would like to extend clojure.lang.IFn, the goal being to achieve support for variadic protocols which i need. is this a really bad idea? does anyone here know what would be involved, more or less? |
| 13:58 | dnolen | octagon: if you want variadic protocol behavior w/o a lot of work - it's simpler to put a real function in front of it which will handle the variadic bit |
| 13:59 | lynaghk | dnolen: I don't follow. |
| 13:59 | dnolen | lynaghk: undefined? is a function |
| 13:59 | dnolen | lynaghk: it's not a macro |
| 13:59 | dnolen | lynaghk: undefined? checks for the undefined value |
| 14:00 | octagon | dnolen: that doesn't work because i need to have a record type that implements IFn with variadic parameters |
| 14:00 | dnolen | lynaghk: for the typeof global case we probably want something else to handle that |
| 14:01 | lynaghk | dnolen: hmm, I have no idea what's going on here. it looks core.cljs's undefined? just proxies to the core.clj's undefined? macro. |
| 14:02 | dnolen | octagon: if you're going to implement IFn I don't really see how you can avoid implementing every arity. so perhaps a macro. |
| 14:02 | dnolen | lynaghk: and it's not different than + in that regard. |
| 14:02 | octagon | dnolen: thank you for supporting variadic protocols in cljs btw. seriously. |
| 14:03 | konr`` | in cljs, is there a function to turn a js object into a map? |
| 14:03 | dnolen | lynaghk: macros in ClojureScript can serve a different purpose than Clojure - we can use macros for inlining. |
| 14:03 | dnolen | octagon: there's no support for variadic protocols in CLJS - if it works it's an accident and not something you can depend on w/o some larger discussion. |
| 14:04 | dnolen | octagon: IFn is a gnarly case where inheritance actually seems pretty useful. |
| 14:04 | octagon | dnolen: please keep it in there. it's important. |
| 14:04 | dnolen | octagon: don't depend on it. |
| 14:05 | lynaghk | dnolen: sure. I'm still don't quite see what the issue would be with adding a "typeof" in the definition of core.clj undefined? |
| 14:05 | octagon | dnolen: the only means of combination there is in Lisp is function application |
| 14:05 | octagon | dnolen: this means that semantics is defined by IFn |
| 14:05 | octagon | dnolen: that's really important and deep i think |
| 14:06 | dnolen | octagon: I'm not going to have a larger discussion about IFn, if you think it's important bring it up on the dev list, I'll chime in and we'll see what the powers that be think. |
| 14:07 | dnolen | lynaghk: that won't work |
| 14:07 | dnolen | lynaghk: undefined? is a *function* |
| 14:07 | dnolen | (map undefined? [js/jQuery]) |
| 14:07 | dnolen | will blow up, even if you add typeof to the macro in core.clj |
| 14:08 | lynaghk | dnolen: ahhhh, got it. |
| 14:09 | lynaghk | dnolen: need to wake up a bit over here. |
| 14:09 | cyff | could someone who is good at clojure help him out: https://github.com/ajaxorg/ace/issues/1372#issuecomment-16461385 |
| 14:10 | cyff | and regexp |
| 14:11 | dnolen | lynaghk: feel free to open up a ticket for a special undefined? macro, if you have a good idea for a name that'd be nice. |
| 14:12 | lynaghk | dnolen: objections to converting the existing one into a macro? It's not being used as a value anywhere in core.cljs |
| 14:13 | lynaghk | dnolen: I just suspect that's what people will naturally reach for (especially if they're coming from JS)---more people will run into the reference error problem than the cannot-take-value-of-a-macro problem. |
| 14:13 | lynaghk | dnolen: but yeah, I'll open up a ticket. |
| 14:14 | dnolen | lynaghk: hmm, that'll break things. The only reason we didn't defer to goog.isUndefined is because we can tag undefined? as being a boolean returning function. |
| 14:14 | patchwork | The cannot-take-a-value-of-a-macro problem has driven me to never use macros |
| 14:14 | dnolen | lynaghk: I'd prefer a different name at this point I think. |
| 14:19 | naeg | is there something like a (max a b) supporting nils? e.g. (max nil 0) => 0 |
| 14:20 | noidi | naeg, http://clojuredocs.org/clojure_core/clojure.core/fnil |
| 14:20 | naeg | guess I can use (or nil 0) for that... |
| 14:20 | noidi | ,((fnil max 0 0) nil 8) |
| 14:20 | clojurebot | 8 |
| 14:21 | noidi | ,((fnil max 0 0) 3 nil) |
| 14:21 | clojurebot | 3 |
| 14:21 | naeg | noidi: how about using (or) instead? |
| 14:21 | naeg | it's actually a (max (f) 0), where f returns a number or nil. so I guess (or (f) 0) does the same? |
| 14:22 | ieure | Hm, I thought contains? worked for strings, but it seems like it doesn't. |
| 14:22 | ieure | Was this a 1.5.x change? |
| 14:22 | TimMc | ieure: contains? would never have worked on strings |
| 14:23 | TimMc | ~contains |
| 14:23 | clojurebot | contains? checks whether an indexed collection (set, map, vector) contains an object as a key. to search a sequence for a particular object, use the `some` function, which accepts a predicate. if you want to only match a certain object, you can use a set as the predicate: for example, (some #{5} (range)) finds the first occurrence of 5 |
| 14:23 | stuartsierra | ieure: `contains?` only works on keyed collections, but prior to Clojure 1.5 it would silently return nil when called on an unsupported type. |
| 14:23 | TimMc | oho |
| 14:23 | noidi | naeg, yes, that would work |
| 14:23 | ieure | stuartsierra, I see that ticket, but I have this unit test code which works in 1.4 and breaks in 1.5: (is true (contains? h "Available commands")) |
| 14:24 | ieure | Ah; but that should have been (is (= ...)) |
| 14:24 | ieure | I see. |
| 14:24 | ieure | Or (is (contains? ...)) |
| 14:24 | stuartsierra | ieure: And your `h` must be a set or a map. |
| 14:25 | ieure | stuartsierra, Got it. |
| 14:25 | ieure | Would be nice if there was a clojure.string/contains? method. |
| 14:26 | stuartsierra | ieure: That's just (.contains string substring) |
| 14:26 | Luyt_ | Is there some clojure-specific pastebin somewhere which will also execute the code? (It's not mentioned in topic) |
| 14:27 | ieure | stuartsierra, Sure, and (subs) is just (.substring string i) |
| 14:28 | stuartsierra | Can't explain that one. ;) |
| 14:29 | nDuff | Luyt_: ideone.com supports Clojure, among many other languages. |
| 14:29 | trptcolin | ,(map resolve '[every? not-every? any? not-any?]) |
| 14:29 | clojurebot | (#'clojure.core/every? #'clojure.core/not-every? nil #'clojure.core/not-any?) |
| 14:30 | trptcolin | o_O |
| 14:30 | Raynes | Evaluation is still a planned feature of refheap. |
| 14:32 | stuartsierra | trptcolin: `some` can fulfill the role of `any?`, but it's not a boolean predicate. |
| 14:32 | trptcolin | sure. (comp boolean some) |
| 14:33 | technomancy | you could say the same about not-any? as (comp not some) |
| 14:33 | trptcolin | and i know that discussion has been rehashed dozens of times |
| 14:33 | stuartsierra | (comp not some) is actually the definition of `not-any?` |
| 14:34 | technomancy | heh; nice |
| 14:34 | trptcolin | i just found that list of namings illustrative |
| 14:34 | stuartsierra | I tend to forget that `not-any?` exists. |
| 14:35 | technomancy | most of these discussions boil down to "these were written a long time ago, before the guidelines were solidified" |
| 14:35 | stuartsierra | yep |
| 14:36 | Luyt_ | http://ideone.com/izBszw I'm trying to destructure a vector and a map in a function call, but I do something wrong and I can't see what. The destructuring in the let bindings, however, do work OK. |
| 14:36 | trptcolin | stuartsierra: me too, just ran across it in auto-complete |
| 14:36 | technomancy | (which makes me thankful that Clojure stayed small early on) |
| 14:38 | noidi | Luyt_, you have a def instead of a defn |
| 14:39 | konr`` | shouldn't `js->clj` work for all objects? A map created from applying it to a goog.events.BrowserEvent doesn't respond to regular seq functions such as `count` with the error "Uncaught Error: No protocol method ISeqable.-seq defined for type object: [object Object]", although I can create a map from, say, `(-> "{...}" js* js->clj)` |
| 14:40 | Luyt_ | noidi: Ah! Thanks |
| 14:42 | Luyt_ | noidi: Now it works. http://ideone.com/9ciD20 I also had to add extra [ ] to the defn. |
| 14:44 | noidi | great |
| 14:45 | Luyt_ | stuartsierra: Are you the author of the book I have here: Practicl Clojure ? |
| 14:46 | stuartsierra | Luyt_: Yes, the Apress book, which I wrote with Luke VanderHart. |
| 14:47 | Luyt_ | Cool. I bought it a while ago, but only now I get around to stuff with clojure. |
| 14:56 | amalloy | naeg: using 0 doesn't work too well if (f) returns -100 |
| 14:56 | amalloy | you probably want (apply max (remove nil? coll)) or similar |
| 14:57 | amalloy | er, i guess i meant noidi |
| 14:57 | TimMc | &(max) |
| 14:57 | lazybot | clojure.lang.ArityException: Wrong number of args (0) passed to: core$max |
| 14:58 | trptcolin | lol, missing zero-arg arity strikes again! |
| 14:58 | trptcolin | err, zero-arity? |
| 14:58 | amalloy | well, it's not exactly missing |
| 14:58 | TimMc | I can't decide whether max should have a nullary invocation. |
| 14:58 | amalloy | there's simply no good way to define it |
| 14:58 | amalloy | TimMc: no way |
| 14:58 | TimMc | Double/NEGATIVE_INFINITY |
| 14:58 | pmonks | nil? |
| 14:58 | clojurebot | ⟹ "Returns the metadata of obj, returns nil if there is no metadata." |
| 14:59 | amalloy | gross as half a worm in your apple, TimMc |
| 14:59 | TimMc | haha |
| 14:59 | TimMc | It wouldn't change the behavior of max. |
| 15:00 | amalloy | obviously it would: calling it with zero args would behave differently |
| 15:00 | TimMc | meh |
| 15:01 | TimMc | If someone was relying on that throwing, they kind of deserve code breakage. |
| 15:02 | trptcolin | somebody could rely on getting ints back |
| 15:02 | trptcolin | err, longs |
| 15:02 | amalloy | i don't really agree. anyone who relies on (max) giving back NEGATIVE_INFINITY, though... |
| 16:28 | SegFaultAX | ,(into {} '((:a "foo"))) |
| 16:28 | clojurebot | #<ClassCastException java.lang.ClassCastException: clojure.lang.Keyword cannot be cast to java.util.Map$Entry> |
| 16:28 | technomancy | jweiss: mapentries are a subclass of vectors |
| 16:28 | SegFaultAX | That |
| 16:28 | SegFaultAX | It has nothing to do with array-map, though. |
| 16:28 | technomancy | the error message on the list one is really weird though |
| 16:28 | jweiss | yeah, i didn't mean to imply it was array-map, just happened to be using that |
| 16:29 | technomancy | I'd expect it to be a list that can't be cast |
| 16:29 | jweiss | yeah, why is it trying to cast Long to MapEntry |
| 16:32 | SegFaultAX | This is why: https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/APersistentMap.java#L40 |
| 16:33 | SegFaultAX | If it's not a map entry or a vector, it tries to turn each element into a map entry |
| 16:33 | technomancy | why does that sound so familiar |
| 16:33 | technomancy | oh yeah http://brehaut.net/blog/2013/duck_wrapping |
| 16:33 | gfredericks | (inc brehaut) |
| 16:33 | lazybot | ⇒ 12 |
| 16:33 | SegFaultAX | I don't know, but that's really strange behavior. |
| 16:34 | gfredericks | it's not actually duck-wrapping though |
| 16:34 | SegFaultAX | Haha, that's an awesome name. Duck wrapping. |
| 16:34 | gfredericks | duck wrapping would be something dumb like "if it's not a map entry, make a map entry where that's the key and the value is nil" |
| 16:35 | SegFaultAX | gfredericks: Yea that's not quite what's happening here. |
| 16:35 | SegFaultAX | gfredericks: The list '(1 2) doesn't become {(1 2) nil} in the case above. |
| 16:36 | gfredericks | thank goodness |
| 16:37 | SegFaultAX | gfredericks: Not that the /actual/ behavior is any more sensical. |
| 16:37 | jweiss | ok so this is basically into trying to do its best with the given input, what's an alternative, (apply array-map (interpose ...))? |
| 16:37 | SegFaultAX | I mean, it should error, but not the way it's erroring here. |
| 16:38 | SegFaultAX | ,(into {} (map vec '((1 2) (3 4)))) |
| 16:38 | clojurebot | {1 2, 3 4} |
| 16:38 | gfredericks | you're just saying the error message should be better, right? |
| 16:38 | jweiss | (oh i guess it wasn't clear from my example that i was trying to zipmap two lists, but keep the order |
| 16:38 | rbxbx | duck wrapping is a fairly common pattern in ruby :X |
| 16:38 | SegFaultAX | gfredericks: That it shouldn't be erroring like this at all. |
| 16:38 | rbxbx | aka probably a bad idea ;D |
| 16:38 | gfredericks | SegFaultAX: I must be missing the point |
| 16:39 | SegFaultAX | gfredericks: It should be a different class of error entir16:50 -!- machuga is now known as machuga|away |
| 16:50 | gfredericks | it's been discussed before. I'm sure ambrose had to deal with it. |
| 16:50 | gfredericks | ,(doc conj) |
| 16:50 | clojurebot | "([coll x] [coll x & xs]); conj[oin]. Returns a new collection with the xs 'added'. (conj nil item) returns (item). The 'addition' may happen at different 'places' depending on the concrete type." |
| 16:51 | SegFaultAX | gfredericks: You'll note that conj just delegates to cons |
| 16:51 | SegFaultAX | https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/RT.java#L559 |
| 16:52 | gfredericks | SegFaultAX: yep |
| 16:52 | gfredericks | but the docs should go on the var |
| 17:02 | TimMc | OK, here's my splicing version of prewalk-replace: https://gist.github.com/timmc/5399621 I feel like there could be some way to generalize, though. |
| 17:03 | Tekhne | I'm just learning clojure. Where can I find documentation on "cond" that exlains ":else"? I can guess well enough, but I'd like to read docs. |
| 17:03 | TimMc | Tekhne: :else is just a convention -- it's any truthy value |
| 17:04 | Tekhne | TimMc: ah, okay. Thanks. |
| 17:04 | SegFaultAX | Tekhne: Do you know how cond works without and :else branch? |
| 17:04 | Tekhne | TimMc: kind of a self-documenting thing. I get it. |
| 17:04 | nightfly__ | SegFaultAX: it just runs the conditions that are matched |
| 17:05 | SegFaultAX | nightfly__: Redirect to Tekhne, he's the one asking. |
| 17:05 | Tekhne | SegFaultAX: Yea, and now it makes sense. I was looking at other tutorials on stuff like destructuring function argument vectors and ":as" and that made me think that ":else" was something special. Now I see that it's not. |
| 17:06 | SegFaultAX | Tekhne: Cool! |
| 17:10 | SegFaultAX | gfredericks: The only obvious use case I can think of for handling arbitrary seqs in cons is for something like |
| 17:11 | SegFaultAX | ,(into {} (.entrySet {:a 1 :b 2 :c 3})) |
| 17:11 | TimMc | :or-I-guess-maybe |
| 17:11 | clojurebot | {:a 1, :c 3, :b 2} |
| 17:12 | SegFaultAX | gfredericks: I can't really think of another common case where you would have an iterable of map entries hanging about. :) |
| 17:12 | SegFaultAX | TimMc: Seems like a reasonable alternative to :else |
| 17:12 | SegFaultAX | :or-if-you-really-must |
| 17:12 | nightfly__ | :fuck-it-do-this-instead |
| 17:13 | SegFaultAX | For the lisper on the ragged edge. |
| 17:14 | SegFaultAX | Also, why doesn't APeristentMap.entrySet return a normal persistent set instead of an anonymous abstract set? |
| 17:27 | amalloy | SegFaultAX: it would be expensive to create, for no particular benefit |
| 17:27 | amalloy | and, of course, it *does* return a "normal" IPersistentSet: it just uses the underlying map as its backing store instead of using something else |
| 17:28 | amalloy | oh, entrySet? i guess it's returning a java.util.Map, not an IPersistentSet, but the same thing applies |
| 17:30 | SegFaultAX | amalloy: And I suppose how often do you really need to access the entrySet directly in Clojure. More often you can just seq over the map. |
| 17:41 | rasmusto | tpope: is it possible to evaluate a clojure expression with 'cpp' from a :Gdiff/:Gedit window? I'm curious what it would take to figure out what namespace the old git file would have been for |
| 17:44 | SegFaultAX | rasmusto: With fireplace? |
| 17:46 | pocho | How do you use cljsc/build with multiple .cljs files? If I build seperately, it complains about not having goog.provide(). |
| 17:57 | rasmusto | SegFaultAX: yes |
| 17:58 | rasmusto | SegFaultAX: when I try it, it asks me to install classpath.vim or :Connect to a repl |
| 20:09 | hugod | callen: what were you trying to do with clj-ssh? |
| 21:09 | devn | Good evening |
| 21:13 | technomancy | ivan: you could probably do that with an nrepl middleware |
| 21:14 | gfredericks | is there a way to get nrepl to look at the :repl-options in the project.clj? |
| 21:15 | amalloy | technomancy: really? i guess i don't know how nrepl middlewares work, but that sounds like witchcraft |
| 21:16 | technomancy | amalloy: you can do anything with middleware |
| 21:17 | technomancy | it would only work on direct .method calls though |
| 21:17 | technomancy | unless you do some insane rewriting/decorating thing a la guzheng |
| 21:18 | technomancy | makes you pine for CL conditions though |
| 21:18 | technomancy | ritz could probably do it actually =) |
| 21:18 | amalloy | right, i can believe it as a ritz thing |
| 22:04 | gfredericks | wow that data.json pretty printer is pretty bad |
| 22:12 | ivan | can I eval some forms in a function at compile time, without sticking them in top-level def? |
| 22:13 | gfredericks | you can do whatever you want at compile-time, generally |
| 22:14 | ivan | haha sublime text really doesn't like #= |
| 22:14 | ivan | yeah #= totally does not work for this Java method call |
| 22:15 | amalloy | ivan: you can write a macro that does the evaluation when it runs, or you can (let [pre-computed ...] (defn ...)) |
| 22:15 | amalloy | #= is 100% the wrong solution |
| 22:15 | ivan | oh, right, thanks, forgot I could put a let there |
| 22:18 | gfredericks | clojurebot: #= is 100% the wrong solution |
| 22:18 | clojurebot | Roger. |
| 22:18 | amalloy | (inc gfredericks) |
| 22:18 | lazybot | ⇒ 19 |
| 22:18 | gfredericks | I need to start endorsing things by saying that they are "0% the wrong solution" |
| 22:19 | ivan | #=? |
| 22:19 | clojurebot | #= is 100% the wrong solution |
| 22:20 | gfredericks | clojurebot: clojure is 0% the wrong solution |
| 22:20 | clojurebot | You don't have to tell me twice. |
| 22:20 | langmartin | so...... I have a problem with getting blocking serialization working. I have a pretty complicated threaded app and a largish set of tests. the tests need to line up neatly if it all possible. any suggestions are welcome |
| 22:20 | tpope | rasmusto: shouldn't be that hard but I have yet to reason it out |
| 22:21 | langmartin | I currently have a java.util.concurrent.Semaphore and in the result procedure I (def a global variable) and then release the semaphore |
| 22:21 | langmartin | this doesn't actually give me predictable values for the global |
| 22:24 | brehaut | langmartin: def? |
| 22:24 | langmartin | brehaut: yeah, I know |
| 22:24 | brehaut | langmartin: you should not be deffing things outside of your top level. |
| 22:25 | langmartin | the result handler gets called asynchronously from the perspective of the tests, and I need it to block, synchronous style |
| 22:25 | langmartin | so that I can make sequential assertions |
| 22:26 | langmartin | if it helps any, using an atom to carry the returned value doesn't seem to result in predictable values either, because I still have to deref it |
| 22:26 | brehaut | have you looked at promises? |
| 22:26 | langmartin | and deref seems to sometimes give me last run's answer even after I've released the lock |
| 22:26 | langmartin | brehaut: I did have promises in there before, yeah |
| 22:27 | langmartin | perhaps not in a neat pattern |
| 22:29 | langmartin | all this stuff (including the def) is just in the handler I pass into the application from the tests; it's not actually part of the program itself |
| 22:29 | langmartin | I just need the tests to block on each successive answer |
| 22:29 | amalloy | langmartin: yeah, promises or rewrite the whole thing to use lamina channels |
| 22:29 | langmartin | oof |
| 22:29 | langmartin | that's ... unlikely in the short term |
| 22:30 | brehaut | i think that if you want broader help than 'have you tried X' you will need to put some code somewhere because nobody is going to try to diagnose your threaded apps problems via irc guessing |
| 22:30 | amalloy | you might be able to just rewrite the handler; it's not really clear to me what's going on |
| 22:30 | amalloy | (inc brehaut) |
| 22:30 | lazybot | ⇒ 13 |
| 22:30 | langmartin | sure |
| 22:30 | amalloy | although i do enjoy "throw stuff till it sticks" debugging |
| 22:31 | gfredericks | try adding more parens |
| 22:31 | langmartin | I'm not free to share the code, unfortunately (not yet anyway). |
| 22:31 | TimMc | I bet you just need a few more dosyncs. |
| 22:32 | TimMc | (not actual advice) |
| 22:33 | gfredericks | TimMc: unable to resolve symbol: actual in this context |
| 22:33 | TimMc | langmartin: OK, is the general problem that you need to step the application through a series of I/O events and test the behavior? |
| 22:34 | langmartin | TimMc: exactly, and the application is multithreaded |
| 22:34 | TimMc | langmartin: I once wrote a thing called Lockstep.java that did something like that. Unfortunately, it was for a previous employer... |
| 22:34 | langmartin | ah |
| 22:35 | TimMc | Basically I had my handful of threads and a lock (or several?), and the threads took turns acquiring and releasing locks. |
| 22:35 | amalloy | gfredericks: usually it's "try removing some of the parens" |
| 22:36 | TimMc | It was pretty complicated to set up. :-/ |
| 22:37 | langmartin | TimMc: that's basically where I'm have it now, and it does, mostly, work |
| 22:38 | langmartin | I've probably missed something silly but def does not seem to be a reliable way to return the results even when the def statement is gaurded by the locks |
| 22:41 | amalloy | that's really what a promise is for, as far as i can tell |
| 22:43 | langmartin | amalloy: that's helpful. I may be able to cook up a more reasonable use of promises if I take another crack at it |
| 22:48 | langmartin | hmmm no promise? |
| 22:49 | langmartin | er, the procedure `promise?' thatis |
| 22:52 | brehaut | langmartin: that'd be pretty hard; promise is just a reification of IDeref and IBlockingDeref |
| 22:53 | langmartin | brehaut: 's cool, I'll just wrap it in my own deftype |
| 22:54 | brehaut | huh, i didnt realise that promises were callable, and thats all deliver does |
| 22:54 | Raynes | I promise that promises are callable brehaut. |
| 22:54 | technomancy | Raynes: `deliver` is my favourite horrible way to fake out 1-arity funcall |
| 22:55 | brehaut | technomancy: haha love it |
| 22:55 | technomancy | brehaut: I live on the wild side |
| 22:59 | l1x | hey guys |
| 23:00 | l1x | i am looking for a bitset/bitarray library in clojure, do you know any/do you use something like that what you would recommend? |
| 23:08 | langmartin | sorry to be so vague everyone, and thanks for the help. |
| 23:09 | brehaut | l1x: maybe https://github.com/rosejn/byte-spec ? never used it, but it turned up on clojuresphere and its used by overtone |
| 23:11 | brehaut | oh, http://github.com/overtone/byte-spec looks newer |
| 23:12 | l1x | thanks! |
| 23:17 | amalloy | l1x: what about using a java bitset? iirc that's a thing |
| 23:17 | amalloy | $google java bitset |
| 23:17 | lazybot | [BitSet (Java Platform SE 7 ) - Docs Oracle] http://docs.oracle.com/javase/7/docs/api/java/util/BitSet.html |
| 23:20 | amalloy | it's mutable, but c'est la vie |
| 23:21 | l1x | amalloy: yeah i have seen that, thanks for pulling it up. i was wondering how is this working if you have most of the values in the bitset 0s and some1s |
| 23:21 | amalloy | *shrug* i'm sure it's just an int, or array of ints, under the hood |
| 23:21 | l1x | i see |
| 23:23 | amalloy | it's a long[], apparently |
| 23:24 | amalloy | but it doesn't really matter: it does whatever it promises to do |
| 23:36 | l1x | :)) |
| 23:36 | l1x | i was reading the redis article about unique counts |
| 23:45 | adu_ | l1x: link? |
| 23:45 | l1x | adu_: http://blog.getspool.com/2011/11/29/fast-easy-realtime-metrics-using-redis-bitmaps/ |
| 23:45 | l1x | it is freakin' amazing |
| 23:46 | adu_ | l1x: what is? |
| 23:46 | l1x | using bitset to count visitors for your website :) |
| 23:48 | l1x | (for that matter, having a bitset where your index is a userid(int) and the values are bits (in case your collected data is binary) is really efficient, and surprisingly small footprint, applying compression is easy too) |
| 23:48 | adu_ | I can see some problems with that |
| 23:50 | adu_ | like what happens when a new user is created? how does the bitmap know to be resized? what happens when a user is deleted? does the bitmap remain empty? what if someone hacks your captcha and creates a large number of users? does redis run out of memory? |
| 23:51 | adu_ | but yes, it's on the edge of optimization |
| 23:53 | l1x | user is deleted -> you dont care, keep the user's id in the system |
| 23:55 | l1x | user is created -> add a new item to the bitset with a higher index than you had (it is not necessarily fix size, what happens when you add a new element to an array in any language?) |
| 23:55 | l1x | someone hacks -> it wont impact your system because you are counting the visitors, not the users created |
| 23:57 | adu | l1x: which are counted by user_id |