2011-03-26
| 00:00 | amalloy | tomoj: my point is that the asymptote here is at N=64, because there are no more bits available |
| 00:01 | amalloy | but in real life i am wrong |
| 00:01 | amalloy | sorta |
| 00:02 | tomoj | surely the distinction between log32 and 1 will become apparent before you run out of bits? |
| 00:03 | amalloy | tomoj: not really. so it's ten times slower; that's just a constant factor - it will never be *more* than ten times slower than O(1), so it's O(1) |
| 00:04 | tomoj | wordplay |
| 00:04 | amalloy | s/wordplay/definition of big-O |
| 00:04 | tomoj | no that's my point |
| 00:05 | tomoj | that 32 is big enough that 10x is as high as it goes doesn't change the mathematical fact that it's NOT O(1) |
| 00:07 | amalloy | http://en.wikipedia.org/wiki/Big_O_notation#Formal_definition - i claim that, because we define the range of x as 0..2^64, f(x) is at most C*g(x), where f is vector access, g is array access, and C is a constant |
| 00:08 | tomoj | but the very first thing there breaks |
| 00:08 | amalloy | because we're not taking the limit as x goes to infinity? |
| 00:08 | tomoj | yeah |
| 00:09 | amalloy | perhaps. the formal definition is unclear about what the "subset of the reals" means |
| 00:09 | amalloy | do they mean to imply that O-notation is meaningless for any finite-domain functions? it is, of course, which is why i'm able to get away with this trickery |
| 00:10 | tomoj | isn't _anything_ O(1) if you set a maximum for x? |
| 00:10 | amalloy | yeah |
| 00:11 | amalloy | i'm just saying, the log32(some 32-bit-number) won't come to a multiple larger than like five, which will be completely swamped by the constant factors involved in the rest of the computation |
| 00:12 | tomoj | right "practically constant" |
| 00:13 | tomoj | my objection was to using O-notation willy-nilly for practical considerations |
| 00:14 | Caffeine | Oh that's surprising... creating a table of 25M #{} is faster than 25M nil .. |
| 00:16 | tomoj | is your table mostly empty? |
| 00:16 | Caffeine | They're all empty at first |
| 00:16 | tomoj | how full do they get |
| 00:16 | amalloy | Caffeine: a "table of foo" meaning what in this context? |
| 00:16 | tomoj | it may be more efficient to use maps |
| 00:16 | Caffeine | they're stay empty for now |
| 00:17 | Caffeine | [] of [] |
| 00:17 | tomoj | I had a significant speedup switching from vectors to maps for 1800 element 1-d vectors |
| 00:17 | tomoj | (that were mostly sparse) |
| 00:17 | Caffeine | [[nil nil nil][nil nil nil][nil nil nil]] would be a table of 9 |
| 00:18 | tomoj | the problem of how to make sparse and dense play together and convert to dense when it's more efficient still bothers me |
| 00:18 | Caffeine | I could probably do it with a map... argh that's driving me crazy, changing the way I think my stuff every couple of hours haha |
| 00:18 | amalloy | &(time (let [row (vec (repeat 5e5 nil))] (vec (repeat 5e5 row)))) |
| 00:19 | sexpbot | java.lang.OutOfMemoryError: Java heap space |
| 00:19 | amalloy | hm. made it smaller but not small enough |
| 00:19 | tomoj | if they're all empty maps will certainly be more efficient |
| 00:19 | amalloy | &(time (let [row (vec (repeat 5e3 nil))] (vec (repeat 5e3 row)))) |
| 00:19 | tomoj | just {} :D |
| 00:19 | sexpbot | java.lang.OutOfMemoryError: Java heap space |
| 00:19 | amalloy | &(time (let [row (vec (repeat 5e2 nil))] (vec (repeat 5e2 row)))) |
| 00:19 | sexpbot | ⟹ "Elapsed time: 1.174534 msecs" [[nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil ... failed to gist: Broken pipe |
| 00:20 | amalloy | &(time (let [row (vec (repeat 5e2 #{}))] (vec (repeat 5e2 row)))) |
| 00:20 | sexpbot | ⟹ "Elapsed time: 0.895433 msecs" [[#{} #{} #{} #{} #{} #{} #{} #{} #{} #{} #{} #{} #{} #{} #{} #{} #{} #{} #{} #{} #{} #{} #{} #{} #{} #{} #{} #{} #{} #{} #{} #{} #{} #{} #{} #{} #{} #{} #{} #{} #{} #{} #{} #{} #{} #{} #{} #{} #{} #{} #{} #{} #{} #{} #{} #{} #{} #{} #{} ... failed to gist: Broken pipe |
| 00:20 | amalloy | that's weird. it actually is a liittle faster |
| 00:20 | Caffeine | oh haha it's trying to display it... I do a (def) to save the display part |
| 00:20 | Caffeine | Yeah, that's weird.. I noticed a little lag on 25M nil, nothing at all on #{} |
| 00:21 | amalloy | i can't imagine any reason #{} would be faster |
| 00:21 | amalloy | Caffeine: btw, note i'm reusing the row object rather than creating a new one over |
| 00:21 | amalloy | that should enable structural sharing and reduce memory/copying load |
| 00:22 | amalloy | though of course {} is smaller still as tomoj says |
| 00:22 | Caffeine | Hmm true |
| 00:22 | Caffeine | I think I'll use a {} yeah... |
| 00:23 | Caffeine | hoping hashes of (Number Number) are reliable |
| 00:23 | amalloy | hah |
| 00:23 | Caffeine | (Because it still has to act like a 2D table in the end...) |
| 00:24 | amalloy | &(let [i (int 10) L (long 10) m {i i}] (get m L)) |
| 00:24 | sexpbot | ⟹ nil |
| 00:25 | amalloy | Caffeine: be careful of that: the types have to match |
| 00:25 | Caffeine | Oh.... these are coordinates (latitude, longitude) |
| 00:26 | Caffeine | I guess I should cast them to double to make sure |
| 00:26 | amalloy | if any of them aren't already doubles, that's a good plan |
| 00:26 | amalloy | &(.equals (long 1) (int 1)) |
| 00:26 | sexpbot | ⟹ false |
| 00:27 | Caffeine | Yeah, it makes sense since everything is supposed to be an Object in Clojure.. if I remember well it doesn't use primitive types |
| 00:27 | Caffeine | they're automagically boxed |
| 00:30 | tomoj | whoa ##{(long 1) 2 (int 1) 3} |
| 00:30 | sexpbot | ⟹ {1 2, 1 3} |
| 00:30 | tomoj | that's fucked up |
| 00:30 | amalloy | Caffeine: that's kinda-sorta-almost true |
| 00:30 | amalloy | and a lot less true in 1.3 |
| 00:31 | amalloy | (should i start calling it 2.0? how did that discussion turn out?) |
| 00:31 | Caffeine | oh, really? I guess it could be much more efficient using primitives ... maybe not.. hmm |
| 00:34 | amalloy | 1.2 allows you to work with primitives, but they can't cross function boundaries: all functions cast args and return values to boxed objects |
| 00:35 | amalloy | where "cast" here is used in a totally inappropriate way because i needed a verb |
| 00:38 | cemerick | amalloy: "boxed" is a verb too :-) |
| 00:38 | amalloy | yeah i know. but i'd gotten past that part of the sentence and my ^H key is broken |
| 00:38 | Caffeine | Ahh ok, didn't know that. Saves the object manipulation inside functions |
| 00:38 | amalloy | #atrociouslie |
| 00:39 | amalloy | Caffeine: you have to *ask* for that behavior |
| 00:39 | amalloy | tomoj: just noticed someone brought up this "int/long as map key" problem again on the google group a few hours ago |
| 00:40 | Caffeine | alright |
| 00:40 | Caffeine | must happen very frequently .. |
| 00:40 | tomoj | I don't think I can even think about it |
| 00:40 | tomoj | that just disturbs me |
| 00:40 | amalloy | haha tomoj call me next time you get drunk, this is great |
| 00:40 | tomoj | I don't want to have to care what type numbers are when I'm sticking them into a map |
| 00:42 | tomoj | I can imagine very subtle bugs |
| 00:42 | Caffeine | I can even make some :) |
| 00:44 | amalloy | Caffeine: "must happen very frequently" is not really true. people complain about chunking all the time because it can have surprising side effects, but i can't find anyone who's had actual issues with it in real life; i think this long/int dichotomy is similar, though not identical |
| 00:46 | amalloy | and it's fixed in 1.3 |
| 00:46 | amalloy | "fixed" |
| 00:47 | amalloy | in that the clojure hashmaps now break the j.u.Map interface in a way that is clearly right :) |
| 00:49 | tomoj | given a leaf in a tree, crawl upwards/outwards/downwards to find the context of the leaf. this sound like a good fit with zippers? |
| 00:50 | amalloy | yes |
| 00:50 | amalloy | also aphids |
| 00:51 | tomoj | har har |
| 00:53 | amalloy | i saw the movie. wasn't a huge fan |
| 00:54 | amalloy | is the book better? |
| 00:54 | tomoj | having watched it for the first time on dxm my opinion is probably skewed far in the positive direction |
| 00:55 | tomoj | that substance-d was little red capsules is surely irrelevant! |
| 00:56 | technomancy | the book is always better, of course |
| 00:57 | technomancy | except for the Princess Bride; I guess there is some debate there. |
| 00:58 | technomancy | and fight club |
| 00:59 | technomancy | ISTR the author of Fight Club saying he prefers the movie. |
| 00:59 | amalloy | heh |
| 01:00 | technomancy | PKD tends to translate pretty decently to the big screen |
| 02:25 | amalloy | #cvs is a deserted wasteland. how will cvs users ever find out they're supposed to use something else? |
| 02:30 | tomoj | I heard about "microsoft source safe" recently |
| 02:30 | amalloy | tomoj: it's just a fad |
| 02:30 | tomoj | apparently if you wanted to edit a file you took out a lock on the file |
| 02:30 | amalloy | we'll be back to good old rcs before long, no worries |
| 02:31 | tomoj | then no one else could change that file until you checked in |
| 02:31 | tomoj | rcs? |
| 02:31 | amalloy | you only heard of this recently, really? |
| 02:31 | tomoj | really |
| 02:31 | tomoj | git was really my first |
| 02:31 | tomoj | used svn a few times but only really to check out |
| 02:31 | amalloy | well i've never used mss, thank god |
| 02:32 | amalloy | but i have a cvs repo from college hanging around somewhere |
| 02:32 | tomoj | at my first job they just used a network share and made .copy .copy2 .copy3 files :D |
| 02:33 | amalloy | i did some of that in school |
| 02:33 | amalloy | was fortunate to have a prof who took tools seriously |
| 02:34 | tomoj | great way of putting the problem |
| 02:36 | amalloy | had one project where it was like, "your team has to do weekly ant builds, persist data using mysql, share source with cvs, using ssh access to the repo on my server, and the final project has to work on my machine" |
| 02:36 | amalloy | oh and javadoc everything |
| 02:36 | amalloy | this was back when ant was cool |
| 02:37 | amalloy | which apparently it still is, but what can you do |
| 02:39 | amalloy | tomoj: anyway rcs is what came before cvs. most cvs features are implemented on top of rcs |
| 02:41 | amalloy | and svn is basically just cvs with different version-numbering schemes and different optimization tradeoffs |
| 02:46 | waxrose | >.> |
| 02:53 | amalloy | waxrose: eh? |
| 02:55 | waxrose | amalloy, Just kind of responding to what you typed @ the team statement |
| 02:56 | amalloy | that is...less of a response, more of a "vague eyes looking sideways" thing |
| 02:56 | waxrose | Yeah, sorry... I'm a bit vague. :P |
| 03:00 | waxrose | I find this REPL for Android interesting. |
| 03:36 | cnataren | technomancy: ping. |
| 04:28 | angerman | bindings are thread local right? |
| 05:12 | fliebel | Has anyone ever implemented a quad tree in Clojure? |
| 05:25 | Dranik | morning! |
| 05:25 | Dranik | how to transform a vector to map? |
| 05:31 | morphling | ,(apply hash-map [:a 1 :b 2]) |
| 05:31 | clojurebot | {:a 1, :b 2} |
| 05:44 | fliebel | How can I use version ranges to get the latest Clojure alphas? Can I just do [1.3,) or something like that? |
| 05:52 | fliebel | "[1.3.0-alpha5,)" gets me a snapshot :( |
| 05:53 | Dranik | morphling, thanks! |
| 06:34 | Dranik | I'm trying to build an uberjar but my source depends on external jars |
| 06:34 | Dranik | how to add the extrnal jars to the uberjar? |
| 06:38 | fliebel | Dranik: Add them to your local maven repo and declare them as dependecies in your project.clj |
| 06:39 | Dranik | fliebel, sounds a bit comples, but I'll give it a try |
| 06:39 | Dranik | *complex |
| 06:40 | fliebel | Dranik: Well, easier would be to find out if they exist in a maven repo already somewhere, or jst put the source files under your src and let cake or lein-javac take care of compiling them. |
| 06:45 | angerman | how can I test if a clojure object is serializable? |
| 06:46 | fliebel | angerman: (implements? obj Serializable)? |
| 06:47 | angerman | hmm where's implements/ |
| 06:53 | fliebel | Can anyone advice me on the ref/agent/atom decision? I have some shared state, but I just need to push data on there, so I don't need synchronicity or management. So I'd say an agent is appropriate, but I have a watch fn, and I'll be calling it from a thread pool, so I had the idea that I could run the watcher less by using dosync, and I feel like agents are a bit heavy. For some reason, the spinning of an atom feels inappropriate for this task. |
| 06:53 | Dranik | fliebel, thanks, that succeed |
| 06:53 | fliebel | :) |
| 06:54 | angerman | fliebel: could not find impelements? so far :/ |
| 06:54 | fliebel | angerman: I'm sure it's there, but not sure I got the name right… let me see... |
| 06:55 | fliebel | angerman: instance? |
| 06:55 | angerman | fliebel: hmm. |
| 06:56 | angerman | ,(instance? {} java.io.Serializable) |
| 06:56 | clojurebot | java.lang.ClassCastException: clojure.lang.PersistentArrayMap cannot be cast to java.lang.Class |
| 06:56 | angerman | ,(instance? (class {}) java.io.Serializable) |
| 06:56 | clojurebot | false |
| 06:56 | angerman | hmm maybe I've got it wrong. |
| 06:56 | fliebel | ,(instance? java.io.Serializable {}) |
| 06:56 | angerman | ,(instance? java.io.Serializable {}) |
| 06:56 | clojurebot | true |
| 06:56 | clojurebot | true |
| 06:56 | angerman | ahh. |
| 06:56 | fliebel | hah |
| 07:26 | opqdonut | yeah, those are the only operators I have problems with |
| 07:26 | opqdonut | in prefix notation |
| 07:26 | fliebel | Oh, but with prefix notation, I might be able to combine a few of them into one, but that'll hur my brain. |
| 07:27 | xkb | is there a standard function for the max of a list? |
| 07:28 | angerman | yikes. I needed an AOT |
| 07:28 | fliebel | xkb: No, but you can use reduce. |
| 07:28 | xkb | fliebel: thanks, that's what I did now. |
| 07:31 | fliebel | $findfn [1 4 2 6 2] 6 |
| 07:31 | sexpbot | [] |
| 07:31 | fliebel | $findfn max [1 4 2 6 2] 6 |
| 07:31 | sexpbot | [clojure.core/reduce clojure.core/apply] |
| 08:03 | fliebel | Hey, cool, what is this? I made a recursive function that should never end, but it ends almost instantly and produce the expected result. |
| 08:03 | arbscht | fliebel: you must have a fast computer ;) |
| 08:04 | fliebel | arbscht: Yea, Intel core^2 duo ;) |
| 08:05 | fliebel | check this: https://gist.github.com/888223 |
| 08:05 | fliebel | I'd say overlaps? should run forever, but it does not. |
| 08:06 | fliebel | it runs only twice. |
| 08:06 | fliebel | I mean, fine with me, but why? how? |
| 08:10 | mduerksen | fliebel: just took a quick look - is it quaranteed that all contains?-queries will always be false? otherwise, the or-statement won't evaluate the recursive call |
| 08:11 | fliebel | mduerksen: No, the statement returns true, so something at least returned true. |
| 08:12 | fliebel | user=> (overlaps? {:x 50, :y 50, :height 1, :width 1} {:x 50, :y 10, :height 100, :width 100}) |
| 08:12 | fliebel | test |
| 08:12 | fliebel | test |
| 08:12 | fliebel | true |
| 08:12 | fliebel | so what you;re saying is that if it'd return false, it'd never return? |
| 08:13 | fliebel | yea, right :) |
| 08:14 | mduerksen | i'm not sure that's what i wanted to say :) just wanted to make you aware that the or-statement only evaluates it's last parameter if all others are falsy |
| 08:15 | mduerksen | and that's what seems to happen if i understood you correctly |
| 08:15 | fliebel | mduerksen: Yea, forgot about that. |
| 08:16 | mduerksen | ah, ok - mission accomplished :) |
| 08:44 | fliebel | Writing data structures is hard :( |
| 08:46 | angerman | fliebel: very true. And even more saddening is that it's still far from a shippable product once the datastructure is in place. |
| 09:45 | TimMc | fliebel: Are you just trying to test for overlapping of axis-aligned rectangles? |
| 09:48 | TimMc | fliebel: If so... https://github.com/timmc/CS4300-HW4/blob/master/src/timmcHW4/core.clj#L43 |
| 09:49 | fliebel | TimMc: Well, checking if 2 boxes overlap is not hard at all, what is hard is determining which boxes to check. |
| 09:51 | fliebel | TimMc: Ah, this is your solution to the rabit rendering you showed a few days back? |
| 10:17 | TimMc | How many boxes do you have to check? |
| 10:17 | TimMc | Yeah, this is the 3D renderer. |
| 10:19 | fliebel | TimMc: Don't know… I might get away with checking them all, but I like the exercise. I'm trying to make a quadtree now. |
| 10:19 | TimMc | ah |
| 10:19 | TimMc | There's another algorithm for checking a bunch of aarects. |
| 10:19 | fliebel | oh, tell me :) |
| 10:20 | TimMc | Technically, it's for checking if the projections of polygons onto a line (line segments) have intersections. Let me find it. |
| 10:21 | fliebel | TimMc: That's never going to be faster than just checking the 4 points of my squares, is it? |
| 10:21 | TimMc | http://stackoverflow.com/questions/3324880/axisaligned-rectangles-intersection |
| 10:22 | TimMc | fliebel: Wait, are these actually squares? |
| 10:24 | fliebel | TimMc: Yea, I'm drawing sprites in 2D, not triangles from weird files ;) |
| 10:25 | fliebel | Okay, I admit the sweep and prune looks a lot easier than these trees. |
| 10:41 | fliebel | On second thought, For moving items, I really only need to know their nearest neighbor, and for the ground, I need to make sure items are over transparent pixels. |
| 10:53 | TimMc | Code management question! Our next assignment (HW5) builds off the last one. I currently have "HW4" and "timmcHW4" references sprinkled throughout my build files and namespaces. Should I just leave it as that and only change the user-visible references to HW5? |
| 11:31 | fliebel | How do I use defrecords from another namespace? Do I use the full class name, or what? |
| 11:32 | Raynes | fliebel: IIRC, you import the Java class corresponding to the record. |
| 11:33 | fliebel | Raynes: With all the _STAR_ stuff and underscores? |
| 11:34 | Raynes | fliebel: No clue. Haven't had to import many records. |
| 11:35 | fliebel | Oh, sure, logical… it has a underscore int eh ns and a dash in the class. |
| 11:56 | thorwil | enlive question: how do i select an element by a name attribute? |
| 12:04 | thorwil | ah, [(enlive/attr= :name "title")] |
| 12:05 | TimMc | $findfn 0 5 7 5 |
| 12:05 | sexpbot | [] |
| 12:05 | jlf` | hi all -- i'd like to have stdout redirected to my slime repl. there is emacs' slime-redirect-inferior-output, but i'm launching swank from -main and connecting via slime-connect. anyone know a solution? |
| 12:06 | TimMc | I keep writing (defn clamp [min max v] (Math/min max (Math/max min v))) -- I can't believe there isn't already something like this. |
| 12:21 | mduerksen | i have a question concerning "ensure". die docs say: "Protects the ref from modification by other transactions. [...] Allows for more concurrency than (ref-set ref @ref)". what does the last sentence mean? that the transaction won't fail if the competing transaction sets the ref to the same value? |
| 12:22 | TimMc | mduerksen: Does this help? http://clojuredocs.org/clojure_core/clojure.core/ensure#comment_73 |
| 12:23 | Caffeine | TimMc: Clojure provides his own min/max, why use Math's? |
| 12:23 | Caffeine | (Honest question, not a critique.) |
| 12:24 | TimMc | Caffeine: critique would be fine too. :-) Let me take a look. |
| 12:24 | Caffeine | haha okay :P |
| 12:24 | Fossi | why is it not possible to lein install ring? |
| 12:24 | TimMc | Huh. I don't actually know why I did that. |
| 12:25 | Caffeine | TimMc: You'll save 10 characters each time you type your clamp defn ^^ |
| 12:25 | Fossi | lein says: a.io.FileNotFoundException: $MY_HOME_PATH/ring/src (No such file or directory) |
| 12:27 | TimMc | Caffeine: Yeah, but now I have to come up with new names for the interval endpoints. :-( |
| 12:28 | Caffeine | yup... noticed that.. :S .. I kinda like lisp 2's for that .. haven't really thought of the cons |
| 12:28 | Caffeine | mn mx |
| 12:29 | Caffeine | or m M :o |
| 12:29 | TimMc | minv maxv |
| 12:29 | TimMc | (min maxv (max minv v)) |
| 12:30 | Caffeine | that's clear enough |
| 12:30 | TimMc | I still think there ought to be a clamp function. |
| 12:31 | TimMc | Caffeine: It's clear if you're familiar with the idiom. WHen I first derived it, I kept thinking "max min? min max? this can't be right..." |
| 12:31 | Caffeine | Don't know.. I wrote my own in Java too... the search was going to take longer than writing it I guess... |
| 12:44 | thorwil | is there something like a non-lazy concat? |
| 12:49 | Caffeine | noob question: can't we just force concat to fully evaluate if there isn't one non-lazy version? |
| 12:53 | thorwil | well, none of eval, dorun or doall help in my case |
| 13:09 | TimMc | thorwil: Why do you want eager concat? |
| 13:12 | thorwil | TimMc: i'm fighting with Enlive's "[selector] transformation [selector] transformation" syntax, where the lack of () around each pair is nice until i want to assemble stuff |
| 13:14 | krl | any pointers what this error is about? |
| 13:14 | krl | lein swank -> java.net.BindException: Cannot assign requested address (NO_SOURCE_FILE:1) |
| 13:16 | angerman | krl: looks like you are prevented from binding the swank server to a local address. |
| 13:17 | angerman | krl: is one already running? do you have enough priviledges to bind an address? |
| 13:18 | gfrlog | I really miss clojure's immutable data types when I'm programming in JavaScript. Does anybody know if there is a library of similar types in JavaScript anywhere? Or should I write my own? |
| 13:19 | krl | angerman: hmm. 4005 right? does not seem to be bound |
| 13:19 | angerman | gfrlog: what do you miss about them? |
| 13:20 | angerman | krl: I think you can try lein swank 8888 |
| 13:20 | gfrlog | angerman: writing functional code |
| 13:20 | angerman | $ lein swank 8888 and see if that works. |
| 13:21 | angerman | gfrlog: so you are missing the rich set of datastructures? or explicitly the immuability? |
| 13:21 | gfrlog | angerman: I want to be able to take a large data structure, pass a slightly mutated version to a function but still be able to use the old version |
| 13:21 | gfrlog | so the immutability and the efficient sharing of structure |
| 13:22 | gfrlog | of course having sets and hash maps would be nice too. Prototype has a Hash, but it's not all that good :-/ |
| 13:22 | angerman | gfrlog: I guess you are on your own then. Maybe take a look at clojurejs(?) ? |
| 13:23 | gfrlog | angerman: k, thanks |
| 13:30 | thorwil | i'm pretty sure my article is a map with a :title, but (let [article (models/retrieve-article path) title (article :title)] ...) leads to tlog.models.Article cannot be cast to clojure.lang.IFn !? |
| 13:32 | krl | thorwil: shouldn't that be (:title article)? |
| 13:33 | thorwil | krl: yes, indeed 0.o |
| 13:33 | thorwil | why do i think i saw it the other way round, and what would the reason be? |
| 13:34 | mippymoe | Hey guys, I'm given a set of arrays of doubles (all of equal length). I'm trying to figure out a good way to hash them. Any ideas? (for example, given an array, I could sum up all its elements and then mod it by the number of elements in the hash table, but this would be a bad function because addition is commutative) |
| 13:35 | hugod | thorwil: maps work either way round, but defrecord doesn't implement IFn |
| 13:36 | thorwil | ah! thanks hugod, krl |
| 13:36 | KirinDave | mippymoe: They're arrays? |
| 13:36 | mippymoe | KirinDave: yep |
| 13:36 | KirinDave | mippymoe: Why not just use binary signature as input to a real hash algorithm? |
| 13:36 | KirinDave | There are plenty of fast, low overhead algorithms |
| 13:37 | mippymoe | KirinDave: I gotta create my own, it's part of a project I'm working on for school |
| 13:37 | KirinDave | mippymoe: Oh. |
| 13:37 | KirinDave | mippymoe: Hope you're a math major. |
| 13:37 | opqdonut | heh |
| 13:37 | KirinDave | mippymoe: Designing good hash algorithms is hard work, and only partially in a computer science domain. |
| 13:38 | mippymoe | KirinDave: haha well I am fortunately, but actually, it's not a big deal |
| 13:38 | KirinDave | mippymoe: In any event, reduction to its binary signature is probably a good move, if only to get out of insanity of double representations. |
| 13:38 | mippymoe | KirinDave: its an undergrad course, so the hash can be fa rfrom perfect |
| 13:40 | mippymoe | KirinDave: hmm ok |
| 13:40 | opqdonut | mippymoe: have a look at string hashing algorithms |
| 13:41 | KirinDave | yeah |
| 13:41 | opqdonut | you might find some nice ideas there |
| 13:41 | KirinDave | Just treat it as a byte string. |
| 13:41 | opqdonut | mhmm |
| 13:41 | mippymoe | so like concatenate all the doubles in the array? |
| 13:41 | mippymoe | and then do some operation on that? |
| 13:42 | opqdonut | wrap the double array into a DoubleBuffer, and turn that into a ByteBuffer |
| 13:43 | KirinDave | opqdonut speaks wisdom. |
| 13:44 | opqdonut | then go through the bytes and do something like hash=(hash+byte)^17 |
| 13:44 | opqdonut | or whatever |
| 13:44 | mippymoe | thanks guys |
| 13:45 | KirinDave | mippymoe: Good luck. |
| 13:45 | KirinDave | opqdonut: Is 17 more magic than 11? I usually use 11. |
| 13:45 | KirinDave | I guess more hot bits. |
| 13:45 | opqdonut | I've seen 17 used quite a bit |
| 13:45 | opqdonut | that's all I know :D |
| 13:45 | KirinDave | :) |
| 13:46 | opqdonut | somewhat related: http://stackoverflow.com/questions/299304/why-does-javas-hashcode-in-string-use-31-as-a-multiplier |
| 13:49 | KirinDave | ugh |
| 13:49 | KirinDave | SO. |
| 13:49 | KirinDave | Will Never Click. |
| 13:49 | KirinDave | Woo scala 2.9 is out. |
| 14:01 | Caffeine | KirinDave: Why? |
| 14:01 | Caffeine | (SO) |
| 14:01 | KirinDave | Caffeine: I do not believe in SO's model or mission. |
| 14:02 | KirinDave | Caffeine: To bite Heinlein, you don't understand a beach by understanding each grain of sand. |
| 14:02 | Caffeine | It often fails, but it also very often help me go on with many tasks. |
| 14:03 | opqdonut | it can have interesting trivia/nuggets of information from well-informed people |
| 14:04 | KirinDave | It's sorta like straining your local sewer for lost jewelery |
| 14:04 | KirinDave | You can find great stuff |
| 14:05 | KirinDave | But only after going through a lot of poop. |
| 14:05 | opqdonut | I don't browse so, I merely have a look when somebody (eg. google) points me there |
| 14:15 | Caffeine | Yeah, I'm not searching it much... I'm posting my problems, and IF someone comes in with something good (which I must admit happens in no more than 1/3 of my threads), yay, else.. hmm.. I eventually answer my own problem. |
| 14:18 | sleekyak | hi all; if i'm just jumping back into clojure after 9mos or so, should i start with 1.3alphas or 1.2? |
| 14:25 | devn | sleekyak: i'd say jump in with both feet to the latest 1.3 alpha |
| 15:01 | symbole | I'm adding a directory to my classpath using -classpath, and this directory contains x/y/z.clj. I'm trying to require using (require 'x.y.z), however, I get the file not found exception. Does clojure recognize what's being passed to -clsspath? |
| 15:05 | raek | symbole: yes, it's supposed to work that way. |
| 15:06 | raek | symbole: are you sure that any hyphens in the namespace names are replaced with underscores in the file name? |
| 15:06 | raek | e.g. (ns x-y.foo-bar) should be in x_y/foo_bar.clj |
| 15:07 | raek | also, note that if you use the -jar option, the -cp/-classpath option is _ignored_ |
| 15:07 | raek | (silently) |
| 15:07 | symbole | I am using the jar option. |
| 15:09 | symbole | Is this JVM behavior, or clojure? |
| 15:09 | raek | JVM |
| 15:10 | fliebel | Anyone fancy helping me out finding a bug in a 30 line long function, or thinking about ways to trim it down? |
| 15:11 | raek | fliebel: paste? |
| 15:11 | symbole | So if I do want to start it from the command line, the alternative is unzip the clojure jar? |
| 15:11 | fliebel | raek: Moment... |
| 15:12 | raek | symbole: no, you can still do java -cp lib1.jar:lib2.jar:src/:clojure.jar clojure.main |
| 15:12 | raek | symbole: have you heard about leiningen or cake? |
| 15:12 | Caffeine | symbole: no, I think you can just -cp yourpack.jar:.:anotherpack.jar the-class-to-start no? |
| 15:12 | Caffeine | yeah what raek says |
| 15:12 | symbole | raek: I have, but I want to make sure I understand how it lower level details work. |
| 15:12 | fliebel | https://gist.github.com/888545 |
| 15:13 | fliebel | The problem is that quads do net get the proper offset, I think. |
| 15:14 | symbole | raek: You said that using the jar method of launching clojure ignored? Isn't that what you're doing? |
| 15:14 | symbole | Ugh. I meant, ignores -classpath. |
| 15:15 | Caffeine | We're not providing -jar option |
| 15:15 | Caffeine | so it doesn't ignore -cp |
| 15:15 | raek | symbole: what I said only applied to the "-jar" command line option, not using jar files in general |
| 15:15 | symbole | Oh, I see. |
| 15:15 | raek | -jar is for the case when you only have one jar file, and want to use its default main class |
| 15:16 | raek | lein uberjar produces those jars too |
| 15:17 | Caffeine | I'll have to seriously check that lein thing soon |
| 15:18 | symbole | Thanks. That worked. |
| 15:21 | david` | I saw someone with a clojure conj shirt on at lunch yesterday |
| 15:22 | NameNode | Five inches came and went, as did six. Slowly, his hard-on got |
| 15:22 | NameNode | thicker and longer as his tiny balls began to swell. It was like watching |
| 15:22 | NameNode | a long, thick balloon slowly fill. The pressure was growing more and more |
| 15:22 | NameNode | intense as seven inches neared. His balls were almost an inch and a half |
| 15:22 | NameNode | across now as the pressure swelled and suddenly, released. |
| 15:22 | NameNode | With orgasmic shock, Curt watched himself spray an arc of cum |
| 15:22 | NameNode | across the shower room to the opposite wall, six feet away. Each spasm |
| 15:23 | Caffeine | lollll wtf |
| 15:25 | dnolen | fliebel: do you have some input that gives the wrong out? |
| 15:26 | Clinteger | hahahaha |
| 15:29 | fliebel | dnolen: No, it seem rather random, but them , I'm using a random input :D I'll fix the bugs myself, but comments on code organization are appreciated :) (I pane to use Logos for that AI of my game btw) |
| 15:30 | fliebel | *plan |
| 15:30 | raek | fliebel: so a node in the quad tree is either nil, a quad object (which contains four nodes), or some data? |
| 15:30 | dnolen | fliebel: cool! the disequality stuff is going a little slower than planned. I have an idea for a better implementation than the one presented in Byrd's thesis. |
| 15:31 | fliebel | raek: Yea, so I drill down untill I find a nil, in which case I replace it, or I find another object, in which case I make a new quad and put both in htem. |
| 15:31 | fliebel | dnolen: Cool :) That monkey banana example really got me thinking. |
| 15:34 | dnolen | fliebel: heh, yeah it's pretty neat. once the disequality stuff is in I'll start converting more Bratko examples. |
| 15:34 | fliebel | dnolen: What is Brakto about? |
| 15:34 | devn | fliebel: what'd you find out with structmaps yesterday btw? you end up going with defrecord? |
| 15:35 | fliebel | devn: Yea, defrecord, don't know about the CG for sure, but it works. |
| 15:36 | devn | i was thinking maybe a structmap would be worth looking at, but maybe not too... |
| 15:36 | dnolen | fliebel: it's just a good introduction on Prolog. It's a good idea to have many examples on solving common problems w/ Logos, even better to have them based on a text that people can easily get their hands on. |
| 15:36 | fliebel | true |
| 15:37 | fliebel | Is this cheating for optional arguments? & [pidx parent] |
| 15:37 | Chousuke | nah |
| 15:38 | fliebel | thats good enough for me. |
| 15:43 | TimMc | fliebel: I thought each node in the quadtree would have a coll of items and optionally also 4 children. |
| 15:44 | dnolen | resurrecting delimited continuations for Clojure, https://github.com/swannodette/delimc |
| 15:45 | dnolen | but now in terms of Scheme's shift/reset |
| 15:45 | fliebel | TimMc: Uh, oh, that's not how I understood it. I think you;re supposed to split up the children untill ther is only one point per square. |
| 15:45 | TimMc | Ah, you have points, not shapes? |
| 15:46 | Raynes | devn: Is clj-shoes what I think it is? :O |
| 15:46 | fliebel | TimMc: No, much to complicated for me :P |
| 15:46 | arohner | is there a way to force clojure to ignore .class files, and always recompile? |
| 15:47 | arohner | I'm dealing with a jar that was compiled against an older version of clojure, and I'd rather not recompile it |
| 15:48 | raek | well, in a perfect world libs should not contain AOT compiled source at all |
| 15:49 | raek | ...or does the lib need AOT? |
| 15:49 | arohner | raek: I agree, most of the time. i think this library has a good reason for compiling one ns, but it precompiles all functions it needs in the AOT ns |
| 15:50 | arohner | and then I'm requiring one of the dependent ns-es, and clojure loads the .class file |
| 15:51 | raek | is the AOT essential for the lib (i.e. does it not work without it)? if not, the user of the lib should do the AOT, or the lib author should release one version of the lib for each stable clojure version |
| 15:51 | fliebel | yay, I haz a quadtree, now I want to visualize it :( |
| 15:52 | raek | but to answer the question: no, I don't think you can turn off loading class files like that |
| 15:53 | raek | until the version compability of compiled code issue is solved in some way, source-only is the only real option for libraries |
| 15:56 | arohner | raek: I think part of the problem is AOT compiles every function loaded, when this probably just needs to generate one class file |
| 16:00 | raek | well, you'd still have the clojure version incompability problem |
| 16:00 | raek | but yes, that bug/feature in the clojure.core/compile is a bit odd |
| 16:08 | devn | Raynes: I'm not sure... |
| 16:08 | devn | Raynes: What do you think it is? :D |
| 16:08 | danlarkin | dnolen: exciting! |
| 16:08 | dnolen | http://wikis.sun.com/display/OpenJDK/Mac+OS+X+Port |
| 16:34 | Raynes | devn: Shoes! |
| 16:36 | devn | Raynes: yes, but since you aren't a ruby guy im asking if you know what shoes is :) |
| 16:37 | fliebel | devn: That's some gui stuff by a guy who disappeared, right? |
| 16:37 | Raynes | devn: Yes. |
| 16:37 | Raynes | devn: I'm a fan. |
| 16:37 | devn | fliebel: yes |
| 16:37 | Raynes | devn: To be fair, I'm a fan of any Clojure GUI tools. |
| 16:37 | TimMc | _why |
| 16:37 | devn | Raynes: ah, cool -- yeah what is in that repo is a little...not shoesey...yet |
| 16:38 | fliebel | Raynes: Is your 2035 project going to be like shoes? |
| 16:38 | Raynes | fliebel: Heh, no. I've never actually used Shoes. I'm only excited at the prospect of Clojure GUI tools. |
| 16:39 | fliebel | Raynes: Oh, you're not a big fan of Swing? :D |
| 16:39 | Raynes | Not particularly. |
| 16:40 | Raynes | Good work. |
| 16:40 | Raynes | devn: What's in that repo is not much of anything. Yet. |
| 16:41 | fliebel | https://github.com/abhijith/clj-shoes |
| 16:47 | Raynes | fliebel: I was dead serious though. We are wrapping Swing. |
| 16:53 | lucian | is *anyone* a fan of swing, really? |
| 16:55 | fliebel | Raynes: I realize, and sympathize with your pains :( |
| 17:02 | dnolen | hmm is it possible to avoid reflection w/ proxy? |
| 17:03 | ssideris | hello |
| 17:03 | ssideris | I've written this macro: http://pastebin.com/ZvxGcNtQ |
| 17:04 | ssideris | I tried removing the second parameter and changing (actionPerformed [~event] ... to (actionPerformed [event] ... |
| 17:04 | ssideris | but I get an error about qualified names which I don't understand |
| 17:04 | ssideris | shouldn't that work? |
| 17:06 | raek | ssideris: syntax-quote will namespace qualify the addActionListener and actionPerformed symbols |
| 17:06 | raek | which you don't want in this case... |
| 17:07 | raek | if you use .foo instead of (. foo ...), syntax quote will not do that |
| 17:07 | raek | for the actionPerformed case, you simply need to write ~'actionPerformed |
| 17:08 | raek | (you can do that in the first case too) |
| 17:10 | ataggart | dnolen: sometimes you hit reflection in proxy due to the implicit 'this not having a tag |
| 17:11 | raek | ,`(proxy [java.awt.event.ActionListener] [] (actionPerformed [foo#] nil)) |
| 17:11 | clojurebot | (clojure.core/proxy [java.awt.event.ActionListener] [] (sandbox/actionPerformed [foo__5792__auto__] nil)) |
| 17:11 | ataggart | dnolen: if you provide your own typehinted (binding [^Foo this this]...) it will take care of some reflection cases. |
| 17:11 | ssideris | raek: ~'actionPerformed seems to have done the trick, but .~component doesn't seem to make a difference |
| 17:13 | raek | ssideris: change `(. ~component addActionListener ...) into `(.addActionListener ~component) or `(. ~component ~'addActionListener ...) |
| 17:13 | ssideris | oh that's what you meant |
| 17:13 | ssideris | sorry, i'm just starting with macros :-) |
| 17:13 | ssideris | thanks |
| 17:14 | raek | dnolen: you can do it if you build the proxy using get-proxy-class, construct-proxy and init-proxy, something like this: https://gist.github.com/877894 |
| 17:14 | raek | ssideris: eh, sorry for the broken foo example... |
| 17:15 | raek | (in the gist I also made the method call a var rather than a fn) |
| 17:15 | dnolen | raek: ataggart: here's what my code looks like. |
| 17:15 | dnolen | https://gist.github.com/888637 |
| 17:16 | raek | hrm. |
| 17:17 | ataggart | wrap the call to compute with (binding [^RecursiveTask this this] ...) |
| 17:17 | raek | dnolen: what does the RecursiveTask interface look like? |
| 17:17 | raek | binding? |
| 17:17 | clojurebot | :| |
| 17:18 | dnolen | raek: http://download.oracle.com/javase/7/docs/api/java/util/concurrent/RecursiveTask.html |
| 17:18 | raek | binding only works on vars, right? |
| 17:18 | ataggart | it'll work |
| 17:18 | ataggart | 'this is provided by the proxy code |
| 17:18 | dnolen | ataggart: wrap (.compute ...) ? |
| 17:18 | ataggart | yarp |
| 17:18 | dnolen | lame. |
| 17:19 | ataggart | hmm you're doing wierd stuff so I'm not sure where it should go |
| 17:20 | dnolen | ataggart: heh, why is it weird? I'll gladly not do it if there's a better way. |
| 17:20 | raek | I think the reflection is cause by the fact that the method is protected |
| 17:20 | ataggart | I'm guessing RecursiveTask is from java7 |
| 17:20 | dnolen | ataggart: yes, fork/join |
| 17:20 | ataggart | what's the reflection warning say? |
| 17:20 | raek | so maybe the reflector skips it |
| 17:21 | dnolen | reference to field compute can't be resolved. |
| 17:22 | ataggart | dnolen: ok, I'm probably wrong about the 'this being the culprit |
| 17:23 | ataggart | does that warning happen when the recursive-task function is read, or when you run the code inside the comment? |
| 17:23 | dnolen | when I compile the whole file |
| 17:23 | ataggart | so, not anything to do with the code inside the comment. |
| 17:23 | dnolen | when run .compute 1e6 times it takes 1.6s, which seems ridiculously slow for method calls. |
| 17:23 | dnolen | ataggart: no. |
| 17:31 | ataggart | dnolen: does the call actually work? |
| 17:31 | dnolen | ataggart: yes |
| 17:35 | ataggart | dnolen: I'm inclined to agree with raek. I'm not clear on what magic is being used to make a protected method publicly callable. |
| 17:40 | Sunil01 | Is Clojure better suited for working with Big Data than Haskell? |
| 17:41 | sritchie | tbatchelli and I are working on a hadoop configuration tool, using pallet, that will make that pretty easy |
| 17:41 | sritchie | Sunil01: I've been having a wonderful time working with hadoop in clojure, using nathanmarz's cascalog... can't say anything for the haskell side of the debate |
| 17:43 | ataggart | dnolen: ok I think I figured it out. While RecursiveTask has a protected compute method, thus typehinting doesn't buy you anything. When the call actually is made, the type is not RecursiveTask, but a proxy class that has a *public* compute method, thus the call works. |
| 17:43 | Sunil01 | sritchie: Thank you. Were you working with Clojure before this project? Was there a steep learning curve? |
| 17:43 | dnolen | ataggart: yes, totally |
| 17:44 | sritchie | Sunil01: actually, I wasn't |
| 17:44 | sritchie | working with clojure before |
| 17:44 | dnolen | ataggart: I switched to .invoke, 2ms now |
| 17:44 | dnolen | for 1e6 |
| 17:44 | ataggart | nice |
| 17:44 | sritchie | I'd worked my way through http://www.amazon.com/Little-Schemer-Daniel-P-Friedman/dp/0262560992, but that was about it, for lisp |
| 17:45 | Sunil01 | I have 'The little Lisper' and am working through SICP. |
| 17:45 | dnolen | ataggart: raek: thx for the insights. |
| 17:45 | Sunil01 | What did you use to get started with Clojure? |
| 17:46 | ssideris | is there a built-in way to create a proxy for a java interface where the provided methods are implemented and all the rest are just empty? |
| 17:46 | sritchie | I'm an emacs user, so I started with leiningen, with swank-clojure to access the REPL with SLIME -- https://github.com/technomancy/leiningen |
| 17:47 | sritchie | what editor do you like? |
| 17:47 | Sunil01 | sritchie: Thank you for the info. I am a vim and Textmate guy |
| 17:47 | sritchie | I use cake now -- https://github.com/ninjudd/cake -- as a couple of guys on my team aren't into emacs, yet, and cake has some nice tools for textmate |
| 17:47 | sritchie | https://github.com/swannodette/textmate-clojure |
| 17:48 | sritchie | here's a fun way to get started right now, if you're interested -- https://github.com/relevance/labrepl |
| 17:48 | Sunil01 | awesome, thank you. |
| 17:49 | sritchie | msg me, or head into the pallet channel if you decide you want to go the hadoop route, I'd be happy to help you get set up |
| 17:49 | raek | ssideris: if you leave out a method definition in proxy, it will be implemented by throwing an UnsupportedOperationException |
| 17:49 | sritchie | sorry to barrage you with info, but here's the last link you'll want to check out, on cascalog -- http://nathanmarz.com/blog/introducing-cascalog-a-clojure-based-query-language-for-hado.html |
| 17:50 | ssideris | raek: yeah, I saw that, but is it a good thing throwing all those exceptions? |
| 17:50 | sritchie | Sunil01: good luck |
| 17:50 | sritchie | ! |
| 17:50 | Sunil01 | sritchie: No you are not barraging....thank you for being so helpful. |
| 17:50 | sritchie | no problem, everyone in here's been so wonderful, it's nice to see a question I can answer ;) |
| 17:52 | raek | ssideris: at least it's something that you always can do. otherwise, what value should the method return? you can't return null if the return type is a primitive... |
| 17:53 | raek | that exception is also used in the java collection interfaces for destructive operations on read-only collections |
| 17:53 | ssideris | raek: good point didn't think about return values |
| 17:54 | raek | ...and also, is it a good thing to just silently ignore the method call? |
| 17:54 | ssideris | well, I'm trying to emulate what "adapters" do in Swing |
| 17:55 | ssideris | say you have a MouseListener, the MouseAdapter provides empty implementations of all the methods of the Listener interface for convenience |
| 17:55 | raek | in that case it makes more sense... |
| 17:55 | ssideris | so that you can override only the relevant ones |
| 17:56 | raek | thankfully, we can do something like (add-listeners {:click fn-1, :move fn-2}) in clojure :) |
| 17:56 | ssideris | how??? |
| 17:56 | raek | well, in pure clojure |
| 17:57 | ssideris | are you referring to clojure.contrib.swing-utils ? |
| 17:57 | raek | since in clojure, you don't have an interface for each possible use of an anonymous function |
| 17:58 | raek | ah, no. this was just a java rant :) |
| 17:58 | raek | pseudo-code |
| 17:58 | ssideris | oh sure |
| 17:58 | ssideris | that's what I'm trying to build more or less |
| 17:59 | ssideris | my code looks like that: http://pastebin.com/e3mMwJ6A |
| 18:00 | raek | neat |
| 18:00 | ssideris | although I'm a bit concerned about the wasteful creation of object that this might lead to if I start adding on-mouse-clicked etc |
| 18:01 | ssideris | because the MouseAdapter has methods for various mouse-related events |
| 18:01 | ssideris | and the way I'm doing it, it would create one mouse adapter per "on-" handler |
| 18:02 | ssideris | I mean that MouseAdapter can handle mouse clicked, mouse over, mouse out etc |
| 18:03 | raek | if you have a proxy like (defn make-mouse-listener [fnmap] (proxy [MouseListener] [] (mouseClicked [e] (when-let [f (:clicked fnmap)] (f e))) (mousePressed [e] (when-let [f (:pressed fnmap)] (f e))) ...)) |
| 18:04 | raek | you could use the same proxy |
| 18:04 | ssideris | yeah, I should reconsider my syntax a bit |
| 18:05 | ssideris | I liked your add-listeners pseudo-code |
| 18:05 | raek | then it would be easy to have something like (button "test" {:clicked (fn [_] ...)}), or maybe make a macro to make that prettier |
| 18:06 | raek | thinking of it, I would probably separate the adding from the creating of the proxy |
| 18:06 | ssideris | sure, but in many many cases it's convenient to have a way to add listeners in-place |
| 18:06 | ssideris | because in some cases the listeners are shared |
| 18:07 | raek | you can always add a macro for that later |
| 18:07 | ssideris | but in a lot of cases they are unique for a component |
| 18:07 | raek | not having a macro that does everything makes testing *a lot* easier |
| 18:08 | raek | to quote cgrand: "Syntax is icing, add it later!" |
| 18:08 | ssideris | makes sense |
| 18:08 | ssideris | I do Swing for my day job and I hate the verbosity |
| 18:09 | ssideris | so as therapy, I'm trying to make something in clojure that will express the same thing is as few keystrokes as possible |
| 18:09 | ssideris | :-) |
| 18:10 | raek | you will most certainly succeed with that :-) |
| 19:19 | dnolen | huh, anybody familiar w/ the ForkJoin stuff know what advantage the RecursiveTask has over the standard ForkJoinTask? |
| 19:34 | livingston | if you use a namespace that has a record in it you don't get access to that record by default? you have to then separately import the record too to get it's constructor? |
| 19:35 | livingston | I basically need to do this: http://tech.puredanger.com/2010/06/30/using-records-from-a-different-namespace-in-clojure/ |
| 19:46 | dnolen | fork/join is sick, https://gist.github.com/888733 |
| 19:47 | livingston | dnolen: you mean in a good or a bad way? |
| 19:49 | dnolen | livingston: good |
| 20:29 | ossareh | how dependable will ##(< (.hashCode [2011 1]) (.hashCode [2012 2])) be? |
| 20:29 | sexpbot | ⟹ true |
| 20:29 | ossareh | I just through a bunch of vectors into a #{} like that and they were in the correct order, I was expecting to have to use (sorted-set-by). |
| 20:30 | ossareh | s/through/threw/ |
| 20:30 | sexpbot | <ossareh> I just threw a bunch of vectors into a #{} like that and they were in the correct order, I was expecting to have to use (sorted-set-by). |
| 20:38 | dnolen | using fork/join to make Logos parallel should be fun |
| 20:43 | tomoj | ossareh: you want lexicographic? |
| 20:48 | tomoj | [] hashes to 1, nonempty v hashes to (+ (* 31 (.hashCode (pop v))) (.hashCode (peek v))) |
| 20:48 | tomoj | of course relying on that would be pretty evil |
| 20:49 | ossareh | tomoj: nope, that is a year and week number in the vector. Checked the APersistentVector .java and and it's hashcode delegates to the values within it. Since they're numbers, they'll sort correctly |
| 20:49 | ossareh | s/it's/its/ |
| 20:49 | sexpbot | <ossareh> tomoj: nope, that is a year and week number in the vector. Checked the APersistentVector .java and and its hashcode delegates to the values within it. Since they're numbers, they'll sort correctly |
| 20:53 | danbell | "IllegalArgumentException: Key must be integer" could only possibly refer to a vector being called as a function somewhere, right? |
| 20:54 | tomoj | ossareh: hmm |
| 20:55 | dudly | evenin' |
| 20:57 | dudly | So, I have this text file with somewhat unstructured data. |
| 20:57 | dudly | say: |
| 20:57 | dudly | 1. Did you do your laundry? Yes 2. did you take out the trash? No 3.Did you bring in the milk? yeS |
| 20:57 | dudly | There are any number of new lines or spaces or tabs after the respective "Yes" and "No"s |
| 20:59 | dudly | I'd like to generate a map of yes and no corresponding to the number. So I can look up by :1 :2 :3 etc. |
| 20:59 | brehaut | dudly: why would you use keywords for numbers? why not integers? |
| 20:59 | dudly | brehaut: hmm, I could use numbers as keys. |
| 21:00 | tomoj | ossareh: ##(< (.hashCode [2010 50]) (.hashCode [2011 1])) |
| 21:00 | sexpbot | ⟹ false |
| 21:01 | dudly | then I could do math with them etc, true... anyway, whats the shortest path to my solution? Indexing? and how would I get the index of a clause? |
| 21:01 | dudly | re-find and friends are only validating that the string exists, not returning location... what I really need is the tail of the string returned |
| 21:02 | ossareh | tomoj: fair play. |
| 21:02 | dudly | I'd like to be able to lazily pull in the string until there is an entire match of the clause, then hand me the rest of the string so I can extract the Yes or No |
| 21:03 | tomoj | I'm glad, because even if it had worked you shouldn't have used it :) |
| 21:04 | brehaut | ,(into {} (map (fn [[_ k v]][(Integer/parseInt k) v]) (re-seq #"(\d)+.[^?]+\?\s*(Yes|No)" |
| 21:04 | brehaut | "1.aba c?\n\nYes2. dfgdfgdfgdfgs fdg sdf\n\nsdg? No"))) |
| 21:04 | clojurebot | EOF while reading |
| 21:04 | brehaut | bah |
| 21:04 | sritchie | hey all, I'm blanking on an idiomatic way to get a subset of a map |
| 21:04 | brehaut | ,(into {} (map (fn [[_ k v]][(Integer/parseInt k) v]) (re-seq #"(\d)+.[^?]+\?\s*(Yes|No)" "1.aba c?\n\nYes2. dfgdfgdfgdfgs fdg sdf\n\nsdg? No"))) |
| 21:04 | clojurebot | {1 "Yes", 2 "No"} |
| 21:05 | dudly | wtf |
| 21:05 | brehaut | dudly: thats what you wanted right? |
| 21:05 | dudly | yup |
| 21:05 | sritchie | haha, you just freaked him out |
| 21:05 | dudly | I'm going to have cut and paste this into a text file to study for a moment |
| 21:05 | brehaut | sorry about regexp, also its not case insensitive because i forget those details |
| 21:05 | tomoj | sritchie: given what? |
| 21:06 | ossareh | tomoj: true dat. /me slaps his wrists for being tempted by dodgy solutions |
| 21:06 | sritchie | so, if I have {:tag :sometag, :phase thephase, :somekey someval}, I want to be able to apply a function and get a new map with {:tag :sometag, :phase thephase} |
| 21:06 | tomoj | given what? |
| 21:06 | sritchie | (f orig-map keys) |
| 21:07 | tomoj | ah |
| 21:07 | tomoj | they keys you want to keep? |
| 21:07 | sritchie | yes |
| 21:07 | tomoj | $findfn {:foo :bar :baz :bing} [:foo] {:foo :bar} |
| 21:07 | sexpbot | [clojure.core/select-keys] |
| 21:07 | sritchie | woah, that's pretty cool |
| 21:08 | sritchie | $findfn [1 2 3] [2] [1 2 3 1 2 3] |
| 21:08 | sexpbot | [] |
| 21:08 | sritchie | bummer |
| 21:09 | sritchie | if only if would output code for functions not written yet! |
| 21:09 | sritchie | tomoj: thanks a lot |
| 21:09 | tomoj | heh |
| 21:09 | dudly | Oh, I see how that works. that's neat |
| 21:09 | dudly | regexes are confusing though |
| 21:09 | brehaut | dudly: add (?i) to the start and it'll be case insensitive |
| 21:10 | dudly | brehaut: like #"(?i)(\d)+.[^?]+\?\s*(Yes|No)" ? |
| 21:10 | brehaut | dudly its any number of digits (captured) one or more thing that isnt a questionmark, any amount of whitespace, ayes or no |
| 21:10 | brehaut | i think so yes |
| 21:10 | brehaut | ,(re-matches #"(?i)foo" "FOO") |
| 21:10 | clojurebot | "FOO" |
| 21:11 | brehaut | (re-matches #"foo" "FOO") |
| 21:11 | brehaut | ,(re-matches #"foo" "FOO") |
| 21:11 | clojurebot | nil |
| 21:12 | dudly | brehaut: so the question mark is being used? |
| 21:12 | brehaut | its am agical java regexp option thing |
| 21:13 | dudly | what if the line was "4. gave the kids lunch money? (not too much: yes" |
| 21:13 | dudly | * much): |
| 21:13 | brehaut | then you have a problem |
| 21:14 | brehaut | dudly: use (fn [[_ k v]][(Integer/parseInt k) (-> v .toLowerCase first (= \y))]) as your map function; you'll get a bool back as the value |
| 21:15 | brehaut | or if you want to get #clojure points (comp (juxt #(Integer/parseInt %) #(-> % .toLowerCase first (= \y))]) rest) |
| 21:15 | brehaut | wait no i want the not-juxt |
| 21:16 | tomoj | I have at least a fraction of a point for #{\y} |
| 21:16 | brehaut | tomoj: absolutely |
| 21:16 | tomoj | er, no |
| 21:17 | tomoj | the whole point is to get a bool :) |
| 21:17 | brehaut | oh |
| 21:17 | brehaut | hah |
| 21:17 | dudly | theres a closing ] |
| 21:17 | brehaut | dudly: that was a typo in anotherwise broken expression |
| 21:18 | dudly | does it do the same thing as the (fn.. above? |
| 21:19 | brehaut | no because i used juxt in the wrong place |
| 21:21 | dudly | I could partition the line into lines that start with #period |
| 21:22 | dudly | but sometimes this document has headings prior to a given number, like sections |
| 21:23 | dudly | not often.. I could customize it, I could even get the index of each character, but I'm worried people will change the document before they submit it. |
| 21:23 | dudly | it's basically a checklist in my organization that people submit |
| 21:24 | dudly | I mean, if people accidently add a space near the top of the document, it will change the indexes of all the yeses and nos |
| 21:30 | dudly | ah, one more constraint.. there is always at least one \newline before and after the yes or no |
| 21:31 | dudly | and the whole clause is always part of one line.. so I can partition the whole document base on lines... |
| 21:32 | brehaut | dudly: sorry i dont have time to do any more for you sorry |
| 21:33 | dudly | you've done enough already, brehaut. I'm smarter now. |
| 21:33 | brehaut | dudly: cool :) |
| 21:34 | tomoj | I feel like the why stack needs to be popped |
| 21:34 | tomoj | a few times |
| 21:38 | flying_sheep | what is the correct way to return an unchanged data structure passed as a parameter to a function? |
| 21:38 | brehaut | ,(identity 1) |
| 21:39 | clojurebot | 1 |
| 21:39 | tomoj | why aren't seqs stacks? |
| 21:39 | flying_sheep | thanks brehaut :) |
| 21:40 | brehaut | flying_sheep: if i understood you properly, otherwise (fn [x] x) |
| 21:41 | flying_sheep | yup, identity is what I needed |
| 21:52 | devn | hm |
| 21:52 | devn | anyone else here a daily reader of the clojure google group list? |
| 21:52 | devn | I'm somewhat perturbed by the /lengthy/ discussion following "Jesus, how the heck to do anything?" |
| 21:53 | dudly | somebody feeding a troll? |
| 21:53 | devn | Some of the Java bashing and so on is getting a bit counter-productive |
| 21:53 | devn | It's subtle but it would discourage me if I had used Java in any serious capacity in the past and didn't yet "despise it" |
| 21:54 | devn | It's emotional, I guess... That's what bothers me so much about it. |
| 21:55 | dudly | it's cultural though... deeply ingrained |
| 21:55 | devn | There is no room for emotional discussions. The majority of the things that happen on the list are incredibly objective, but when some of those same topics veer off towards the emotional, they turn into "reasons you shouldn't join this community" |
| 21:55 | devn | there is plenty of room for opinions, but they ought to be objective |
| 21:55 | devn | ;) |
| 21:56 | dudly | yea, I haven't read the list in many months |
| 21:56 | devn | dudly: im back on it now -- i screwed up and chose the digest |
| 21:57 | devn | i like reading the threads -- so many great things hidden 28 messages deep in some of those threads |
| 21:57 | dudly | yea, I just have a few feeds on my feed reader and poignant mail list topics float up usually. |
| 21:57 | dudly | yea, I do miss those nuggets |
| 21:59 | dudly | planet clojure, clojure pipe, disclojure, and clojure reddit are on my feed's clojure folder |
| 21:59 | dudly | lotta dups but hits most of the pertinent news |
| 22:01 | devn | i havent ever read clojure pipe, link me? |
| 22:01 | devn | i usually just hit disclojure and planet clojure because there are dupes between those two as it is |
| 22:02 | dudly | http://pipes.yahoo.com/pipes/pipe.run?_id=4cc8ebb9ae0b852d6ab7d94956ce2638&_render=rss |
| 22:02 | dudly | yea, it's probably redundant |
| 22:03 | devn | speaking of yahoo pipes |
| 22:03 | devn | what an incredibly cool idea that they never chose to monetize |
| 22:03 | dudly | hmm |
| 22:04 | devn | or rather, they could have done a much better job of marketing it to the general public |
| 22:05 | devn | it's such a cool tool and IIRC they were the first to make a GUI like Yahoo Pipes for muxing data together like that |
| 22:05 | dudly | yea, I expected more to be built on top of it |
| 22:05 | dudly | maybe the should have built more semantic web smartness into it. |
| 22:06 | devn | it was built at a time when no one gave a damn about the semantic web |
| 22:06 | devn | only now do you see people even reasonably interested in paying to RDFify their entire site and so on |
| 22:08 | devn | anyways... |
| 22:08 | dudly | imagine a website frontend, built on top of yahoo pipes, pulling in semantic web components other websites |
| 22:34 | devn | the underlying tools exist |
| 22:53 | dudly | what other functions go with partition and group-by, that let you mess with the order of things |
| 22:54 | dudly | or better put, that let you arrange the categorization of things |
| 22:54 | no_mind | using enlive, I want to define a snippet for input type="text" only. How do I do it ? Examples on net handle generic [[:input]] only. |
| 22:56 | devn | dudly: filter, remove, conj, concat, distinct, partition-all, partition-by, split-at, shuffle, sort-by, reverse |
| 22:56 | devn | and some more |
| 22:57 | dudly | that'll do, thanks.. something in there will be it |
| 23:05 | tomoj | no_mind: use attr= |
| 23:05 | tomoj | like [[:input (attr= :type "text")]] I believe |
| 23:39 | sritchie | hey all, here's a really simple one... how can I convert a series of 2-vectors into a hash-map? |
| 23:42 | sritchie | ,(apply hash-map (flatten [[:key "word!"] [:another "test!"]])) |
| 23:42 | clojurebot | {:key "word!", :another "test!"} |
| 23:42 | sritchie | that works, just wondering if there's a more idiomatic way |
| 23:50 | hugod | ,(into {} [[:a 1][:b 2]]) |
| 23:50 | clojurebot | {:a 1, :b 2} |
| 23:50 | no_mind | how can I iterate over a map ? I want to print the keys and corresponding values |
| 23:53 | sritchie | hugod: cool, thanks |
| 23:54 | sritchie | no_mind: ,(for [[k v] {:a 1, :b 2}] (println "key: " k ", val: " v)) |
| 23:54 | sritchie | ,(for [[k v] {:a 1, :b 2}] (println "key: " k ", val: " v)) |
| 23:54 | clojurebot | key: :a , val: 1 |
| 23:54 | clojurebot | key: :b , val: 2 |
| 23:54 | clojurebot | (nil nil) |
| 23:55 | sritchie | ,(doseq [[k v] {:a 1, :b 2}] (println "key: " k ", val: " v)) |
| 23:55 | clojurebot | key: :a , val: 1 |
| 23:55 | clojurebot | key: :b , val: 2 |
| 23:55 | sritchie | no_mind: that's better |