#clojure logs

2011-03-14

00:01mecAnyone happen to know where that talk is by rich about clojure being made up of simples?
00:05technomancytomoj: if you're looking at doing a lucene wrapper you could extract something from https://github.com/technomancy/usable-az
00:06technomancyit's quite schemaless
00:07brehautmec its stuart halloways talk i believe
00:08mecah hah, maybe thats why i cant find it
00:08brehautmec http://clojure.blip.tv/file/4824610/
00:08mecbrehaut: thanks
00:08brehautmec: and slides https://github.com/downloads/stuarthalloway/clojure-presentations/Clojure-Simplicity.pdf
00:49sattvikHmmm... Given a protocol defined in namespace A, and extended in namespace B, is there any way for users of B to refer to the protocol function without including A as well?
00:50amalloysattvik: no. the protocol function is named A/myfn, so they have to at least (require 'A)
00:52sattvikThanks, that's what I thought. I was hoping to find someway around that problem.
00:56amalloywhat for?
00:59tomojI think there are some dirty tricks that will work
00:59tomojlike potemkin?
01:00sattvikWell, I'm developing a library. I designed a protocol with a few implementations in one namespace. In another, I extend the protocol in such a way that it depends on some vars defined in the new namespace. It would be nice if users of the second namespace could use the protocol function without needing to load the first explicitly.
01:00tomojemphasis on "dirty"
01:01sattvikI figured it'd have to be dirty. But I just haven't found the right way to do it, yet.
01:12sattvikAh, I think I got it worked out… In the second namespace, I exclude the protocol function in my ns declaration, then I extend the protocol, and, finally, (def foo A/foo).
01:14amalloysattvik: wait, why not just defalias?
01:14amalloyif you're going to go that route
01:14amalloy(disclaimer: no idea if defalias will solve this)
01:17sattvikamalloy: Well, I am trying to reduce dependencies as this is an Android library. Unfortunately, adding a new def also creates the problem of conflicting names if both namespaces are used.
01:17tufflaxHm, I notice that the example at the end here http://clojure.org/atoms didn't work as I first expected. I thought that calling ((memoize fib) 40) was gonna be fast, because the memoized version would use the memoized version in the recurisve calls. But that is apparently not what is happening. So I wanted to understand why that is not happening. Is it because "fib" in the (defn fib ...) body is like a local variable? Or, can someone explain
01:19amalloytufflax: (memoize f) returns a new version of f, such that each call to this new function is memoized, without changing the underlying function
01:20amalloyf cannot know that it has been memoized, so unless it is calling through something like a global var (which often it is), it won't pass through the cache again for recursive calls
01:20amalloy(def fib (memoize fib)) causes the recursive calls to *also* go through the memoization cache
01:22tufflaxamalloy: Excuse me, I shoud have said that even if I did (def fib (memoize fib)) it is not fast the first time.
01:26amalloyweird
01:26sattviktufflax: It won't be fast the first time since it hasn't cached any values. It's only on subsequent calls that you'll see the improvement.
01:26tufflaxSo, it seems you are wrong about that the recursive calls go through the memoization cache in that case. It seems that the recursive fibs don't refer to the global fib, but to the local one being defined in the defn.
01:27tufflaxsattvik if the recursive fibs did refer to the gobal var, then it would be fast the first time too.
01:27sattviktufflax: Yes, I think I see what you mean.
01:28amalloytufflax: (defn fib [] (fib)) macroexpands to (def fib (.withMeta (clojure.core/fn fib ([] (fib))) (.meta (var fib))))
01:28amalloyso it looks like it does indeed name the function fib rather than make it look up the var
01:31tufflaxHm, I'm not sure I understand what's happening there... :P
01:32sattvikThis works as expected (from the REPL): (defn fib [n] (if (<= n 1) n (+ (user/fib (dec n)) (user/fib (- n 2)))))
01:32amalloytufflax: (fn fib []) defines an anonymous function, but gives it a "local name" of fib so that it can be self-recursive if necessary
01:32tufflaxI mean, (clojure.core/fn fib ([] (fib))) looks just like it did previosuly
01:32amalloyas opposed to (fn [] (fib))
01:32tufflaxoh, yeah
01:34sattvikAn interesting quirk.
01:34tufflaxSo, the documentation here http://clojure.org/atoms is inaccurate :P
01:35tufflaxThe example at least
01:35sattvikAlthough, apparently it may not be necessary (def fib (fn [] (fib)) sitll works.
01:36amalloya shorthand for sattvik's user/fib workaround is just #'fib
01:47tufflaxamalloy: Hm, I'm not following that last thing you said. Where should I put #'fib?
01:47amalloy(defn fib [n] (+ (#'fib (dec n)) (#'fib (- 2 n)))
01:49tufflaxAh ok. Hm... I find that a bit strange. #'something and something isn't generally the same thing, right?
01:50amalloyright
01:50amalloy&[#'first first]
01:50sexpbot⟹ [#'clojure.core/first #<core$first clojure.core$first@849ba2>]
01:50amalloy"#'fib" is the global var holding the function "fib"
01:51amalloy&(identical? @#'first first]
01:51sexpbot⟹ true ; Adjusted to (identical? (clojure.core/deref (var first)) first)
01:54sattvikIt just so happens that vars are functions that will deref themselves and execute the result.
01:54sattvik,[(ifn? #'first) (.fn #'first)]
02:03amalloysattvik: not sure what you're hoping .fn will do
02:04tufflaxHm, I thought of names like 'fib' as some kind of reference to a var that holds the "value" of 'fib'. Is that a correct mental model? Or how should I think about the relationship between the name 'fib' and the var?
02:06clojurebotanonymous functions are functions with no names
02:06clojurebot[true #<core$first clojure.core$first@47193>]
02:08amalloyclojurebot: wb bro
02:08clojurebotyou have to watch twbray, if you take your eye off him for a second he is likely to blog post
02:09amalloyhiredman: any way to find out what caused him to tell us about anonymous functions? it's surprisingly relevant but delayed by like half an hour
02:10amalloytufflax: rather than "names", "symbols" is appropriate. and you are correct that symbols are basically holders for values
02:10tomojI see "are functions" and "wb" and am also curious
02:11amalloythe var #'fib is the value bound to 'fib, but it is a special reference type, referring to the value (fn ...)
02:11tufflaxSo, when evaluating 'fib', say, in the REPL, there is some kind of look-up from symbol to var going on? And then the var is derefed?
02:12amalloyyeah, that's about right
02:12tufflaxok... btw should I report the small bug I found in the documentation somewhere? :P
02:12amalloycheck out (ns-map *ns*). warning, that prints a lot, so you may want to ##(take 10 (ns-map *ns*))
02:12sexpbotjava.lang.SecurityException: You tripped the alarm! ns-map is bad!
02:12amalloyfeh
02:12amalloy,(take 10 (ns-map *ns*))
02:12clojurebot([sorted-map #'clojure.core/sorted-map] [read-line #'clojure.core/read-line] [re-pattern #'clojure.core/re-pattern] [keyword? #'clojure.core/keyword?] [val #'clojure.core/val] [ProcessBuilder java.lang.ProcessBuilder] [chunked-seq? #'clojure.core/chunked-seq?] [Enum java.lang.Enum] [find-protocol-impl #'clojure.core/find-protocol-impl] [SuppressWarnings java.lang.SuppressWarnings])
02:13amalloywhen the repl needs to find the value for a symbol, it first looks to see if there are any lexical bindings (eg (let [fib 1] fib))
02:13amalloyif there are none, it looks in the ns-map, and uses the value it finds there
02:14amalloyvars have the unusual behavior that, unless you specifically request the var object (with #'fib or (var fib)), they evaluate to the value they hold
02:14tufflaxoh, yeah, i read about that order somewhere. I'm working my way through the docs, but apparently I don't remeber everything
02:15amalloyso (first x) first fails to find a local named first, then finds a var associated with the symbol 'first, then finally resolves to the value of that var, (fn first [s] ...)
02:16amalloywhich it finally calls with the argument x
02:16tufflaxYeah ok. Thank you very much! I'm trying to get a good mental model of how everything works. Lacking such a model feels bad. :P
02:17amalloytufflax: no matter how many times i write out my model i find bits that are fuzzy
02:17amalloyif you instead write (#'first x), you're intentionally bypassing the first step
02:17amalloy(more or less)
02:17tufflaxI see
02:23amalloytufflax: this only works because of the trickery sattvik mentioned: if you attempt to call a var object directly, it delegates to the value it's holding
02:23tufflaxYeah
02:25tufflaxIdeally all such little things should be documented somewhere.I don't think I've seen any mention of that in the docs, and I don't think it is going to be in the parts I have left. :p
02:25amalloyheh
02:25amalloywell, depending on the quality of docs you require
02:25amalloyyou could say it's documented in Var.java
02:26tufflaxHehe yeah maybe
02:27tufflaxWell, I'm going to get some food. Thank you again!
04:06Matt324In a macro, is it possible to access the precise source location of what you get passed?
04:13tomojlooks like &form has line metadata, but not file
04:17tomojI suppose the line number isn't a precise location, though?
04:18Matt324I was hoping to be able to get a precise character range in the source
04:20tomojdon't think you can get that without hacking clojure's guts
04:22Matt324Fair enough ;-)
04:59ejacksonMorning all
05:31TobiasRaedermorning
05:40robinkTobiasRaeder: Morning.
06:44tsdhHi.
06:51tsdhI tried adding IEditableCollection support to ninjudd's PersistentOrderedSet class. But when using a jar with that version in my clojure code, I get wrong results. I don't use `transient' directly, but I frequently merge an arbitrary number of sets using `into', which by default goes transient if the datastructure supports that.
06:52tsdhIf someone wants to check my implementation of TransientOrderedSet (and PersistentOrderedSet.asTransient()) starting at line 202 at http://pastebin.com/H2k9q75u that would be awesome.
06:54tsdhOf course, I tried some debugging at the repl, but for all simple cases, the results are fine.
07:07tsdhHm, for testing, I've redefined the standard `into' in order not to go transient, and then it works with my patched version, too. So at least I can exclude that I accidentially broke the persistent version...
07:32robinkOK, I'm using Quassel.
07:34robinkoops, ww
07:38kumarshantanuhi
07:38kumarshantanuis there a way to discover all namespaces in a given/current classpath?
07:49angermanI need some help with desinging an api.
07:50kumarshantanuangerman: go ahead
07:50angermanI have a `geometry` record. that has nodes, vertices, edges and faces
07:50angermanAnd I have accessor methods like add-vertex / get-vertex / set-vertex / remove-vertex
07:51angermanright now (yes, it's a mess), the geometry record is bound globally, and thus (add-vertex),… do not need to be fed the geometry structure.
07:51angermanthat is quite convinient, e.g. you don't want to write: (add-vertex my-geometry a b c) each time.
07:52kumarshantanuangerman: are the fns add-vertex, get-vertex etc part of the record? (as in from a protocol?)
07:54angermankumarshantanu: not yet. it's pretty bare-bones no protocols yet
07:55angermanI'm wondering if some (with-geometry my-geometry … ) is the right choice
07:55kumarshantanuangerman: an idea - create a protocol having those fns and use (doto my-geometry (add-vertex vertex-arg))
07:56kumarshantanu,(doc doto)
07:56clojurebot"([x & forms]); Evaluates x then calls all of the methods and functions with the value of x supplied at the front of the given arguments. The forms are evaluated in order. Returns x. (doto (new java.util.HashMap) (.put \"a\" 1) (.put \"b\" 2))"
07:58kumarshantanuangerman: if (with-geometry ..) only binds the global var then it's probably not too different from the current approach
07:59angermankumarshantanu: yes. I guess I'll have to use multimethods and multi arity fns.
08:01angermane.g. what I'd like to have is (add-vertex a b c) (add-vertex [a b c]) (add-vertex geometry a b c) and (add-vertex geometry [a b c])
08:01angermanthe latter two look like protocol fns. right?
08:02angermanwhile the first two are regular multi arity fns.
08:02angermanI just wonder if I can mix them.
08:02kumarshantanuangerman: IMHO it is generally a good practice to separate a function from what operand it works on, so I would strongly advise against relying on a global var (even when used with (binding ...))
08:03kumarshantanuyou can mix them of course, as long as you have only one multi-arity version for each fn
08:05angermankumarshantanu: I'm somewhat undecided. but (add-vertex-to-geometry geometry …) just gets too long :/
08:05angermanI know that the idea feels a little like magic. :/
08:05kumarshantanuangerman: doto might be useful
08:06angermankumarshantanu: doto only works as long as there is a successive choice. but you would usually do a lot of different things, with the same backing geometry.
08:07angermanand they are not all directly associated with the geometry. E.g. there are flights of near perpendicular code to the geometry. It just fits there better for understanding. :/
08:08naeuHow might I reset an atom and get its previous value atomically?
08:09angermanneau (swap! atom (fn [_] val))
08:09angermanahh, you want the val as well.
08:09angermanhmm.
08:09naeuyup
08:10angermanI guess you want a ref then
08:10kumarshantanunaeu: consider STM for that
08:10naeuhmm, ok
08:10naeuperhaps I must be doing something wrong then
08:10naeuit felt like all I wanted was a version of reset! that returned the value that was swapped out
08:11naeuI mean, I already know the value I'm going to swap in as I have it
08:11kumarshantanuangerman: i see your point (re successive choice)
08:12angermanneau: atoms and refs are for different things. I assume what you really want is a ref.
08:12naeuangerman: but i don't want to coordinate over a bunch of shared state
08:19naeuok, so perhaps I'm asking the wrong question
08:20naeuso what might be the best way of looking at the values of a list, calling a fn with the vals and then resetting the list to the empty list all atomically?
08:21angermanso basically the list needs /not to change/ during the operation?
08:22naeuangerman: exactly
08:22naeuperhaps I should use an agent
08:22angermanmake the list a ref
08:22angermanand then dosync on it.
08:22naeuangerman: then my 'calling a fn with the vals' part might get repeated
08:23naeui guess i could return the vals from the dosync
08:23naeuand call the fn immediately after the transaction has completed
08:24angermanif you don't need to know the result of the fn, prior to resetting the list to empty. yes.
08:25naeuangerman: no i don't
08:25naeui just don't want to lose the result
08:25naeu(prior to resetting it)
08:26angerman(dosync (let [list @my-list] (ref-set! my-list '()) list))
08:26angermanno?
08:31naeuangerman: yup, that's exactly what i ended up doing :-)
08:31naeuit just seems like overworking the STM for this simple usecase
08:32chousernah. Until we have a version of swap that returns the old value, that's about as good as it gets
08:33chouserI think you'll find that unless there's a lot of contention on that ref, that it performs quite well enough.
08:45angermanso I cannot have [ & rest] fn in a record?
08:46angermanerr type?
08:47kumarshantanuis there a way to discover all namespaces in a given/current classpath? (this is a repeat question)
08:53mprokosJust getting started with clojure. I was thinking of using it in place of xml for a configuration file.
08:59mprokosHow do I modify a java object's member variable's w/o using the object's methods?
09:00fliebelmprokos: set! I think.
09:01mprokosnice! perfect
09:20kumarshantanu,(doc set!)
09:20clojurebotexcusez-moi
09:20kumarshantanufliebel: mprokos: there seems to be nothing called set!
09:21fliebelkumarshantanu: It's a secial form ;)
09:21fliebel*special
09:27mprokos(set! (. obj membervar) value) worked for me
09:30kumarshantanufliebel: mprokos: cool
09:31kumarshantanudo you need a setter to carry out the change?
09:32fliebelmprokos: I think obj/memvar is the preferred form.
11:36talladamhi guys, does anyone here use mongo from clojure?
11:36chousertalladam: yes
11:36talladamchouser: do you use congomongo, or the native java client?
11:36chousercongomongo uses the native java client
11:37talladamchouser: I know, but it seems to be less efficient
11:37talladamchouser: I was wondering if the 'fetch' functionality returned a lazy-seq of the results?
11:37chouserI started with congomongo, but eventually found its connection-handling API to be awkward for our usage. For that and other reasons we now have our own (not open-source, I'm afraid) wrapper.
11:38talladamchouser: seems the way I'm going - don't like the singleton connection stuff
11:38chouserbut in fact we're finding some performance issues with the native java driver as well, so I'm working on a solution for that right now.
11:38talladamchouser: also using reduce in the fetch will make the lazy-seq a non-lazy-seq (diligent-seq?)
11:39chouserseems to me the js shell should do *anything* faster than the java driver. :-P
11:39chousertalladam: opposite of lazy is usually "eager". :-)
11:40talladamchouser: I really want a lazy-seq because it fits with the cursor abstraction so nicely
11:41chouseryes, it does. Calling seq on a DBCursor directly actually works.
11:41chouserunfortunately, DBObjects are a bit of a mess from a Clojure point of view.
11:42talladamchouser: brilliant - thanks for the seq tip
11:42chouserI'm pretty sure the thing congomongo returns for fetch is a lazy seq
11:43talladamchouser: wouldn't reduce make it eager?
11:43chouserit lazily converts the DBObjects to clojure maps, vectors, etc.
11:43chousertalladam: where is reduce used?
11:44talladamchouser: you're right, its not - got confused in the source
11:45chouserfair enough.
11:45talladamchouser: uses vec which is lazy
11:45chousercongomongo helped me get up to speed quickly on the Java driver API, and get working code out there.
11:45talladamchouser: thanks for the help - didn't know #clojure existed - this is my first time here :)
11:46chouservec is not lazy.
11:46talladamchouser: it isn't?
11:46chouserno, it returns a vector which is never lazy
11:47talladamchouser: right- well its used in the congo coersion code
11:47chouserso congomongo converts DBLists (which aren't lazy) to vectors (which aren't lazy)
11:47chouserbut the cursor is wrapped in a lazy seq
11:48talladamyou mean the native driver cursor?
11:49talladamchouser: thanks for the tips - will use seq and see if my problems go away
11:49chouseryes, congomongo returns a lazy seq with a DBCursor inside
11:58mabesI don't suppose it would be possible for me to define a private method (writeObject) on a record, would it?
11:59sattvikmabes: No, unfortunately not.
11:59mabesdidn't think so... I would never think I would want to, and then I needed to tweak our our records are being serialized..
12:00sattvikAs far as I know, there is no way to create a private method in Clojure.
12:02naeuif I want to be able to start and stop a thread worker, what's the best way to achieve it?
12:02naeuit seems that the docs say resume() and stop() are deprecated
12:02sattvikYou could always create a Java object that can help serialize/deserialize a record.
12:03sattviknaeu: I think you have to do it manually. Create some sort of flag that gets checked and a means to set/unset it.
12:03mabessattvik: that would involve me wrapping the record in the java object, wouldn't it?
12:04naeusattvik: you mean create a keep-working atom and deref it continuously in the worker loop?
12:04naeusattvik: or is it ok to destroy() a thread?
12:06sattvikmabes: I think so. I haven't fully thought it out, but I am guessing it'd be done with some sort of simple wrapper object with a transient record field and your custom readObject/writeObject methods.
12:07sattviknaeu: The atom is more the way to go. If you are not interested in restarting, interrupt() is the preferred way to interrupt a thread. destroy is deprecated.
12:10naeusattvik: I'm worried about performance. I just implemented a worker that used the STM and it's horribly slow :-(
12:10sattviknaeu: What are you trying to do?
12:10naeuI'm trying to write a simple wrapper around RxTx
12:11naeuso I have an InputStream that I want to process
12:13sattvikWell, read() on an input stream is blocking... so it will respond to interrupt(), I believe.
12:14naeusattvik: does that mean that if i interrupt a thread blocked on a read that it will close the input stream?
12:16sattvikWell, not necessarily. Depending on the input stream, it may cause the read to throw some sort of InterruptedException. It's up to the thread to catch the exception and handle it (possibly closing the stream).
12:17naeuah ok
12:17sattvikNot sure if the following link helps: http://stackoverflow.com/questions/3843363/thread-interrupt-not-ending-blocking-call-on-input-stream-read
12:20naeusattvik: super, thanks
12:21sattvikNo problem.
12:23amalloyor something similar that actually compiles, i guess :P
12:26naeuamalloy: haha
12:33angermanwhat tool to use for testing?
12:37rata_hi
12:37raeknaeu: socket (and possibly file) operations do not respond to interruption
12:37TimMcangerman: clojure.test
12:38rata_is there any function that takes predicates and returns #(or (pred1 %) (pred2 %) ...)?
12:39TimMcLike a reversed `some`.
12:39rata_a reversed some? but some doesn't take many predicates
12:40TimMcsome applies one predicate to many inputs. You want many predicates and one input.
12:40amalloyrata_: sure it does: (let [x ...] (some #(% x) [pred1 pred2...]))
12:41amalloyanyway this does not already exist, and you are not the only one to want it. there was some talk about it on clj-dev a while ago, and it's getting added at some point. in the meantime, ninjudd's clj-useful library has it already
12:41amalloyer, clojure-useful
12:41_fogus_Indeed. I implemented some-fn to do this very thing... but it will not be in until 1.3
12:42sattvikrata_: I don't think so, not yet. There is an open issue on it: http://dev.clojure.org/jira/browse/CLJ-729
12:43rata_oh nice to know I'm not the only one to want it
12:44rata_it'd be cool if 'or' could also be 'and' or 'xor'
12:44rata_well, xor doesn't exist in core, right?
12:44amalloyrata_: xor is the same as not=
12:44amalloyvaguely
12:44TimMcamalloy: or odd? :-P
12:44tsdhWhat does a ":static true" metadata entry mean at defns?
12:44amalloyTimMc: wut
12:45TimMcamalloy: n-ary XOR is true iff an odd number of inputs are true
12:45naeuso i'm really struggling to wrap RxTx nicely. I seem to be able to handle each byte or n bytes efficiently enough. However, dealing with separators in an efficient manner is proving to be tricksy. My attempt is on-bytes-with-sep here: https://gist.github.com/869423 It has *horrible* performance and I'm pretty sure I shouldn't be using the STM at such a low level. Does anyone have any advice?
12:46raeknaeu: if you have Java Concurrency in Practice (or know a library that has it), I recommend reading chapter 7, which is about cancellation and interruption
12:46amalloy(defn xor [a b] (not= (boolean a) (boolean b)))
12:46amalloy(def xor (comp (partial apply not=) #(map boolean &%))) ; disgustingly point-free
12:47raeknaeu: if some operation is blocking on a socket, interrupting the trhead will not cause it to stop. however, closing the socket will
12:47amalloyTimMc: plz fix the latter to use odd? so i can claim credit
12:47angermanTimMc: thanks, will have a look
12:47rata_amalloy: it's disgusting because it's not completely point-free =P
12:48naeuraek: in the example i just popped in a gist i'm not using threads explicitly, rather RxTx's event handler stuff
12:48amalloyrata_: i couldn't figure out how to get the &% behavior otherwise
12:48naeuI think the problem is more with how I'm using the STM
12:48rata_amalloy: partial does it
12:48TimMcamalloy: Never seen &% -- is it for varargs in #() ?
12:48amalloyer, i meant %&
12:49amalloyTimMc: yes
12:49TimMcSweet.
12:49amalloyrata_: no it doesn't. (map boolean a b) is very different from (map boolean [a b])
12:49amalloyi guess the point-free way would be (comp (partial map boolean) vector)
12:49TimMcew
12:50amalloyTimMc: rest assured none of us plan to use this code. just golfing :P
12:50TimMcindeed
12:50rata_amalloy: mmm yes you're right
12:50raeknaeu: ok, I don't know abut the RxTx stuff. I just wanted to inform you that it indeed is possible to cancel a task that is blocking on a socket, even though it might not seem so
12:50naeuraek: thanks :-)
12:51rata_amalloy: anyway, the point-free version is better in this case because it handle any amount of args
12:51amalloyrata_: uh. it always returns false for 3+ args
12:51amalloyso if that counts as "handling" for you, that's cool
12:53TimMcamalloy: (defn xor [& xs] (odd? (count (filter boolean xs))))
12:53sattviknaeu: From a visual inspections, there may be a couple of things that may be impacting performance, but I haven't tested to see if they do.
12:53TimMcThat's my first approximation.
12:54naeusattvik: what seems odd from first inspections?
12:55amalloy(def xor (comp odd? count (partial filter boolean) list))
12:55amalloyTimMc: your version had too many points
12:55TimMchaha
12:55sattvikOne: Is it possible that a ref is overkill for your function? buffered-bytes seems to be lexically bound, and so should not suffer from concurrent access? Perhaps an atom may be lighter weight?
12:56rata_mmmm right... didn't thought of taht
12:56naeusattvik: yeah, i tried that but it didn't make much difference
12:57sattvikTwo: I think there's a lot of boxing/unboxing possibly going on. Instead of [], does (vector-of :byte) help?
12:57rata_another pattern I found in my little lib is #(if (pred %) (f %) %)
12:58naeusattvik: taht might be helpful
12:58sattvikGranted, at least in 1.2, it will still box/unbox across function calls, I believe.
12:59angermandoes it look `clean'? https://gist.github.com/869449
12:59dnolenfliebel: logos.minikanren is fixed. no more stack overflows, arithmetic stuff works.
13:00amalloyrata_: i have that too! i call it transform-if
13:01amalloyhttps://github.com/amalloy/amalloy-utils/blob/master/src/amalloy/utils/transform.clj
13:04fliebeldnolen: Fantastic!
13:39mattmitchelli have a few vars in a namespace that i'd like to resolve dynamically: (resolve "*my-var*")
13:39mattmitchellth
13:39mattmitchellthis returns: #'user/*my-var*
13:39mattmitchellhow can i resolve to the actual value of *my-var* ?
13:40amalloy&[#'first @#'first]
13:40sexpbot⟹ [#'clojure.core/first #<core$first clojure.core$first@849ba2>]
13:40raekmattmitchell: @, deref, or var-get
13:40sattvikmattmitchell: deref
13:40mattmitchelloh ok
13:42rata_what does a "no matching ctor found for class ...$fn__1234" means in a for?
13:42rata_I'm not doing any java interop
13:42fliebeldnolen: Where is the code? Or is it local still?
13:42dnolenfliebel: local still, one moment
13:43raekrata_: I suspect mismatching versions of a AOT compiled lib and clojure
13:45fliebeldnolen: I think I screwed my fork of Logos. So I'll have to study some more git before I can do Logos :)
13:45rata_raek: weird... I'm not using any lib besides c.c.generic.math-functions and it's not in that part
13:45amalloyrata_: it's definitely something AOTed
13:45amalloyblow away any jars you have hanging around
13:46amalloys/definitely/probably (but i like sounding definitive)/
13:46dnolenfliebel: 0.5 pushed.
13:46fliebeldnolen: Great :)
13:47raekrata_: does you project use any kind of AOT? do you have old class files lying around in class/?
13:49dnolenfliebel: one thing is that I still see duplicates in yr earlier example, but I'm pretty convinced that's not a bug in logos.minikanren anymore, but rather that the miniKanren algorithm has changed since TRS.
13:50fliebeldnolen: But your arithmetic.clj is based on the newer implementation, isn't it? Does that make any difference?
13:51rata_raek: no, it's just one file, 135 lines and it uses only c.c.generic.math-functions... I'll make a gist of it... maybe should I restart the persistent jvm?
13:53fliebeldnolen: :( Noooooo, still overfloooooow! https://gist.github.com/863180
13:54dnolenfliebel: heh, gimme a second, checking your other arithmetic examples.
13:54fliebelokay
13:58rata_raek: sorry, got disconnected
13:59TallAdamChouser: can I ask you a quick question?
14:00TallAdamanyone here?
14:00clojurebotPlease do not ask if anyone uses, knows, is good with, can help you with <some program or library>. Instead, ask your real question and someone will answer if they can help.
14:02amalloyhigh five, clojurebot
14:02TallAdamI am using mongo and pmap'ing a function that connects to the db. This quickly chomps through the maximum possible connections - how should I throttle that? should I someone block the connections? is there connection pooling that I can enable? Using a mixture of the native java driver and congomongo
14:03TallAdamamalloy: sorry :p
14:03amalloyTallAdam: split the 10,000 small tasks into 10 large tasks and then pmap those
14:03amalloyis the usual answer
14:03amalloy~o/
14:03clojurebot\o ... High five!
14:04amalloyheehee, he does give high fives. i love you, clojurebot
14:09rata_raek: https://gist.github.com/869563 line 120
14:10rata_I get a "No matching ctor found for class mca.gillespie$make_perturbation$fn__2604" exception
14:10rata_when running the commented code at the end of the gist
14:13amalloyrata_: the error message indicates that a function expects more (or fewer) closed-around bindings than it's getting
14:14amalloyso the class file for the anonymous function in make-perturbations is out of sync with the rest of your code somehow or other
14:16rata_amalloy: but make-pertubations is just the transform-if we're talking about
14:16amalloyyes. the code itself is clearly fine
14:16amalloybut you have old versions of something lying around somewhere
14:16raekyou shouldn't be able to get into this situation normally, right?
14:17amalloyraek: that is certainly true depending on what you mean by "normally"
14:17raekwhen compiling everything from source
14:17raekat the same time
14:18raekrata_: what happens if you restart clojure?
14:18rata_raek: I get the same error
14:18raekthis is weird
14:19rata_I've just run cake kill && cake swank
14:19rata_then (require '[mca.gillespie :as g])
14:19rata_and executed the commented code at the end of the gist
14:21amalloyrata_: $ find . \( -name '*.jar' -or -name '*.class' \) -delete
14:21amalloythen re-get your deps and try again :P
14:22rata_ok
14:22rata_amalloy: cake clean does that?
14:22amalloyi dunno
14:22amalloyi don't AOT-compile often
14:23rata_I'm just require'ing it, is that AOT-compile it?
14:23amalloyno, but you said you're "compiling everything from source"
14:23rata_no, I didn't say that
14:23amalloysorry, raek did
14:24amalloyi confess it's a bit puzzling
14:24amalloybut it's an error i've only seen before with out-of-sync classfiles so i'm trying to eliminate that possibility
14:24sattvikrata_: Could it be the fact that case is a macro be messing things up? Just a hunch, but it may be that the anonymous functions with #() sugar could be a cause.
14:25dnolenfliebel: looking now
14:25rata_sattvik: but that's handled by the reader, which afaik runs before the compiler
14:28fliebeldnolen: So what is fixed and what isn't now?
14:29dnolenfliebel: fixing your stack overflow is easy, your program is problematic tho.
14:30sattvikWell, it's definitely not an AOT problem. I got a similar exception trying to run it.
14:30fliebeldnolen: Oh? What is problematic about it?
14:30dnolenfliebel: one second, pushing fix, so stackoverflow doesn't occur on your program.
14:32dnolenfliebel: fix pushed, 81 lvars though is gonna take LONG time
14:32dnolenthe way your program is written.
14:33dnolendigit-o creates 9 possible searches, each lvar spawns another 9 possible searches. 9^81 power.
14:33fliebeldnolen: I guess so :)
14:34dnolenfliebel: but thanks, your program will run, not sure if you'll get your answer in this lifetime tho ;)
14:34fliebeldnolen: I havn't played with it much. I'll try to come up with improvements.
14:37rata_sattvik: thanks for confirming the problem =)
14:37rata_it's not a set-up problem then
14:42amalloyrata_: try macro-expanding the call to simulate
14:42fliebeldnolen: Does logos really go into all of these 9^81paths? I thought that since I want only 1 result, and the first cond-e line succeeds, it would initially only do these.
14:43amalloyobserve that it contains {:perturbations (#<make-perturbation...> ...)} instead of {:perturbations (make-perturbation ...)}, which is what you want
14:43amalloyie, you are embedding the function object in the expansion code instead opf expanding to code that will create a function object
14:45dnolenfliebel: look at your logic. (== empty-board []) will fail
14:46chouserwhy must converting between proxy and reify be so painful?
14:46dnolenfliebel: so it's going to traverse all 81 lvars.
14:46rata_amalloy: shouldn't I be able to include the fn object in the expansion?
14:47amalloyno
14:47amalloyi mean, it will work sometimes, but it's not guaranteed
14:47rata_that makes mixing macros and fns harder
14:48fliebeldnolen: Yea, all those 81, but why all 9 of these 81? there is no reason any cell of empty-board can't be 1, right?
14:48fliebel(note that I finished it when I was already way to tired)
14:51amalloyrata_: even if you could do it, you'd have issues. macros shouldn't expand into lists if you want the resulting code to have lists rather than function calls
14:52amalloybecause it was expanding to (#<make-perturbation> ...), recall, which is a function call, not a list
14:53dnolenfliebel: miniKanren while it make some improvements over Prolog, also has issues with clause order.
14:54fliebeldnolen: Are you saying that my methodology is right, but the order wrong?
14:55dnolenfliebel: make digit-o come last, and you'll get an answer right away.
14:55rata_amalloy: right... probably the best way to get rid of this problem is to do (parse-opts ~opts) instead of ~(parse-opts opts)
14:55amalloyrata_: yes, something along those lines
14:56amalloyi was trying to do that, but with no understanding of your problem domain or other functions it was proving kinda difficult to debug :P
14:56fliebeldnolen: Hm, I was thinking recursion should go last.
14:57amalloyi did get it to expand into a vector of stuff like (mca.gillespie/make-pred (quote when) (quote [X0 = 990])), though
14:58rata_made it! =) it was (parse-opts '~opts) instead
14:58rata_got immediatly to the next bug though =S
14:59fliebelHelp, my cake is taking parts of seconds to respond to keystrokes, like half a second. And it's not like it's running 100% cpu or memory.
15:00dnolenfliebel: I can't provide much insight about solving sudoku since I haven't thought about it much. The rule is not so much recursion should come last, but important unifications should come before recursion.
15:01dnolenfliebel: but your recursive call doesn't even use the unification from digit-o
15:01amalloyrata_: string can't be cast to function?
15:01rata_amalloy: yes
15:02amalloyi think it's encode-rxn-set
15:02amalloyit's returning a list instead of a vector
15:02fliebeldnolen: Okay. That works. Now my permutation-o is not doing what it is supposed to do, I think because of what you said about rember-o just going on.
15:02rata_and if I call the resulting code by hand, it gives me another error... because I'm calling (simulate* ... {:foo ...}) instead of (simulate* ... :foo ...)
15:03dnolenfliebel: what you want to avoid is recursive calls that have (== (cons-o a b) c)) where a b c are all fresh variables.
15:03amalloyrata_: don't make an internal function like simulate* take syntax-sugared arguments with &
15:03amalloyjust let it demand a map, and have the macro do the magic of turning keyword args into a map
15:05rata_amalloy: the problem with that is that simulate* isn't intended to be an internal fn so you can create chemical systems programatically and simulate them with simulate*
15:07fliebeldnolen: scrape my last comment, my permutation-o is total bogus.
15:07rata_that's also why I convert every symbol into a string in the macro, because strings are easier to manipulate programatically
15:08pdkbut they always taught me in cl land to work with strings as lists of symbols!
15:08pdkmy life is a lie :(
15:08amalloylists of symbols? CL doesn't have the notion of a character?
15:10pdkit should i think
15:10pdkthough lots of old code shows you doing stuff like '(hello world)
15:10pdkhell i have land of lisp on hand and the first few chapters teach you to handle strings that way
15:11pdkwhile graham acl at least used real strings
15:15rata_good bye guys, see you soon
15:15rata_and thanks a lot amalloy =)
15:16dnolenfliebel: working on pattern matching now ... this is gonna be fun :)
15:22fliebeldnolen: :) and then tabling?
15:22dnolenfliebel: yeah.
15:24fliebeldnolen: You said clojure.core.unfiy takes a different approach to unification, how is it different? From the short look I threw at it it even toes tabling and patternmatching.
15:24fliebel*does
15:27dnolenfliebel: unify isn't a logic programming library at the moment as far I can tell. It just does unification.
15:28amalloyhm. (subvec v -1) doesn't work, even though it could in cases like: (subvec (subvec [1 2 3] 1) -1)
15:29fliebeldnolen: True, but Logos has its own custom unification. What prevents you from using clojure.core.unify instead?
15:31romanroeJust found an old discussion on the mailing list about "generalizing -> and ->>" and introducing something like -$>, pipe, pipe-as etc. Was anything like this ever implemented in core or contrib?
15:31chouserromanroe: I think Rich has never been a fan, but people certainly have created and used sugh things
15:32chousersuch
15:32romanroechouser: mmh, ok. thanks
15:35dnolenfliebel: clojure.core.unify is a bit slow. logos extends all the core Clojure datatypes that represent source to IUnify. clojure.core.unify does return a unification map, but it represents logic vars as symbols instead of separate type.
15:36fliebeldnolen: I see...
15:37fliebeldnolen: Does Logos use all my cores, or does it have the potential to?
15:39fliebeldnolen: Sudoku works! but filling in 3 holes takes a minute.
15:40dnolenfliebel: it doesn't currently. But it has the potential to, since you can't write a program that takes advantage of the order of how results are returned.
15:40dnolenfliebel: nice!
15:41fliebeldnolen: Is that kind of execution time expected, or do I need to shuffle things around a bit more?
15:42dnolenfliebel: probably. But I can give much advice beyond looking for a fast Prolog solution. You should be able to use the same kind of optimizations.
15:43fliebeldnolen: Meh, got it down to 2 secs already :)
15:43dnolenfliebel: Prolog speeds things up with pruning. In logos.nonrel you'll find cond-u and cond-a which do pruning.
15:43dnolenfliebel: sick!
15:43fliebeldnolen: I realized the whole board-o stuff is redundant, and already enforce by permutation-o and the exist statement.
15:45dnolenfliebel: I'm glad this stuff is actually finally working for you :) sorry for the long delay. I spent about 2 weeks realizing that most of what I'd written was broken. I actually took Logos back to the design I had in November! (with fixes now that I have a better understanding).
15:45dnolenwell the goals stuff, not the unification stuff.
15:46fliebeldnolen: I'm happy we're both learning :)
15:51fliebel(I'm now running a real board, see what it takes to solve it)
15:56fliebeldnolen: One thing I notice with Logos and miniKanren that it is hard to name stuff, so I end up with vars named x y and z, and lose track of them. I suppose patter matching will end much of that as well?
15:56dnolenfliebel: exactly.
15:59tsdhIs it correct, that ((ITransientSet)PersistentHashSet.EMPTY.asTransient()).contains(foo) returns true for any Object foo? How can an empty set contain anything?
15:59fliebeldnolen: I am trying to read rember-o. I figured out you can get only the "expected" value by using member-o with the same params. I wonder if I can combine that into one run.
16:00dnolenfliebel: ?
16:01fliebeldnolen: In other words, I want something that for 3 [1 2 3 4] returns only [1 2 4], and if there is no 3 in it, returns nothing at all.
16:04mattmitchellany paredit ninjas out there?
16:04dnolenfliebel: so remember what I said about rember-o keeps going. Pruning is about stopping that. With cond-a a goal can only succeed once, all the remaining clauses are ignored.
16:04mattmitchella white belt will do actually
16:04dnolenfliebel: Thin Ice chapter in TRS talks about cond-a cond-u.
16:05fliebeldnolen: ah! *looks up cond-a and u* I remember TRS talking about them vaguely indeed.
16:05fliebelI dismissed it as ramping up to the real cond-e.
16:06rata_hi
16:11spewn&(.contains (.asTransient #{}) :foo)
16:11sexpbot⟹ true
16:11spewntsdh: Not sure what that means.
16:12tsdhspewn: Yeah, that's totally strange, isn't it?
16:12tsdhI'm just writing a mail to the mailinglist.
16:13rfgpfeiffer,(contains? #{} :foo)
16:13clojurebotfalse
16:13rfgpfeiffer,(contains? (transient #{}) :foo)
16:13clojurebotfalse
16:13spewn,(contains? (.asTransient #{}) :foo)
16:13clojurebotfalse
16:15tsdhYes, contains? works fine. But I'm implementing another clojure collection type in java, and there I had to check if an object was contained in a TransientHashSet.
16:16amalloymattmitchell: ask your real paredit question; that'll get a lot more help than "help with paredit"
16:17tsdhspewn: As a workaround, I made my check "transientHashSet.count()!=0 && transientHashSet.contains(obj)", but that's far from obvious...
16:20rata_is there any easy way to make to make a map's default return value for a non-existent key other than nil?
16:20mattmitchellamalloy: good point. well I have a string like: "value here (move out of string)" -- I want to move the (move out of string) out of the string.
16:20sattvik,(doc get)
16:20clojurebot"([map key] [map key not-found]); Returns the value mapped to key, not-found or nil if key not present."
16:20mattmitchellso i tried paredit-forward-barf-sexp but no luck
16:21amalloymattmitchell: C-k
16:21amalloywith point before (move
16:21amalloynot ideal, but it will kill the part you want
16:21mattmitchellamalloy: awesome i'll give it a shot
16:21sattvik,(get {:a 1 :b 2} :c :not-found)
16:21clojurebot:not-found
16:22sattvikrata_: ^
16:23raek,[(:c {:a 1, :b 2} :not-found) ({:a 1, :b 2} :c :not-found)]
16:23clojurebot[:not-found :not-found]
16:23naeudoes anyone know how cake determines your OS arch?
16:24rata_sattvik: I forgot to say that I need a different return value for update-in also
16:24amalloyrata_: fnil
16:24naeuwhen I do a cake deps, it seems to pull out the wrong native lib - it pulls the lib from x86 rather than x86_64
16:24amalloy&(update-in {} [:a] (fnil inc 0))
16:24sexpbot⟹ {:a 1}
16:27spewnnaeu: Check https://github.com/ninjudd/cake/blob/master/bake/bake/core.clj#L82
16:27naeuspewn: ah, thanks
16:27naeuspewn: looks like cake is forcing 32 bit mode
16:29amalloytsdh: weird. i've been reading the source (badly, apparently) and i can't see what's causing that
16:30amalloyoooo i think i do see actually
16:30amalloycheck out TransientHashMap.doValAt, in PersistentHashMap.java
16:31amalloyit looks like when there are no elements, (get m k not-found) returns nil instead of not-found
16:32tufflax(.instanceMember Classname args*) Hm, instanceMember of a class? And I can't find getName in the Javadocs ((.getName String) is an example in the clojuredocs.) I'm confused.
16:33tsdhamalloy: Indeed, it seems the root == null case is false...
16:34amalloytufflax: your question confuses me
16:34tufflaxHehe ok. First of all, do classes have instance members? I thought only instances had instance members.
16:35amalloyit's not the best terminology. if you like, you can consider a class's "instance members" to be its static members
16:35tufflaxIsn' that what this is for? Classname/staticField
16:36amalloy,(macroexpand '(String/name))
16:36clojurebot(. String name)
16:36amalloytufflax: the former is convenient for people. it's much easier to write macros that expand into the latter
16:38tufflax,(macroexpand '(.getName String))
16:38clojurebot(. (clojure.core/identity String) getName)
16:40amalloytsdh: i'll submit a patch for that
16:41tsdhamalloy: Cool, thank you. Could you also reply to my mail on the list, in order to indicate it's solved?
16:41nickikwhats an easy to use profiler for java (clojure)
16:41tsdhnickik: I like VisualVM.
16:42chouseryourkit is very nice. visualvm is free. :-)
16:42nickikI just need something that is as simple as possible
16:43tsdhnickik: I think VisualVM is your friend then. It's very intuitive yet powerful.
16:44nickiklooking into it right now.
16:44tufflaxamalloy: They don't seem to do the same thing. (If you were talking about Classname/field and (.field Classname)).
16:45tufflaxMaybe that's not what you meant
16:46nickikis there a way in clojure 1.3 to make all math operations unchecked?
16:48tsdhToo bad. I've just realized that using transients doesn't give me any performance improvement at all. Seems like merging sets of sizes between 0 and 1000 using `into' is only minor effort in comparison to the other calculations. :-(
16:49Chousukeinto uses transients :)
16:50tsdhChousuke: Yes, exactly. And I've implemented transient support for the collection type I use in my app. ;-)
16:50Chousukeah, I see
16:51ChousukeI realised a bit too late I misread you. never mind. :P
16:51tufflaxamalloy: Oh, now I see. (.instanceMember Classname args*) calls members of java.lang.Class
16:51amalloyright
16:52tsdhAnyway, it was a good exercise studying parts of the clojure internals. Pretty non-idiomatic java code, but cool. :-)
16:54nickikis visualvm the write tool if I have a relativly short running clojure benchmark
16:54nickik?
17:01angermananyone mind telling me if https://github.com/angerman/planarity is actually runnable outside of my home system?
17:01fliebelMy cake is doing strange things. It is very, very slow in responding. It also seems to continue it's job after a ^C and cake repl -r
17:05angermanfliebel: you can always check if there is still a running jvm process
17:05fliebelangerman: running kill inbetween solves the continuing thing, but the slow responding stays.
17:06angermanI'm actually not at all experience with cake
17:07angermanbut, that sounds to me like cake is starting up something that's eating resources on mass.
17:07fliebelangerman: Not at all, when I start cake fresh, it does not consume much memory and cpu at all.
17:07amalloyfliebel: tried #cake.clj, i imagine?
17:07fliebelI would rather think it is communicating with my computer over my external IP, if that was possible.
17:08fliebelamalloy: No, but I will.
17:12angerman(ask again) If someone has, like 3minutes or so and could $ git clone git@github.com:angerman/planarity.git && cd planarity && lein deps && lein native-deps && lein run -m scripts.demo-catmull-clark that would be great.
17:12amalloyangerman: well i *know* that won't work because i don't have ssh access to your private clone url :P
17:13angermanargs. github
17:13angerman$ git clone git://github.com/angerman/planarity.git && cd planarity && lein deps && lein native-deps && lein run -m scripts.demo-catmull-clark
17:15amalloyangerman: it might work after it's done with all this stuff, but [WARNING] POM for 'org.clojars.angerman:jreality-native-deps:pom:2011-01-29:compile' is invalid. It will be ignored for artifact resolution. Reason: Not a v4.0.0 POM
17:16angermanah, yea. that's probably because I don't know how to create clojures correctly yet.
17:16amalloyangerman: yeah, it works
17:17amalloyi get a 3d diagram i can move around with the mouse
17:17angermanand it should do some subdivision
17:17amalloythough somewhat disconcertingly it keeps changing shapes even if i'm moving it
17:17fliebeldnolen: cond-a does not work for me: (run 1 [q] (cond-a (s#) (u#))) => IllegalArgumentException No implementation of method: :bind of protocol: #'logos.minikanren/IBind found for class: clojure.lang.PersistentList
17:17amalloyi assume that's just "this is a demo"
17:17chouserperhaps there is some function language that has figured out better debugging names for anonymous functions.
17:17angermanyes, it cycles through a few shapes. Starting with a cube and ending with a T shape.
17:17chouserbetter than, you know, this: utils$proxy-STAR-$iter--3068--3072$fn--3073$iter--3140--3144$fn--3145$fn
17:18angermanamalloy: the code for the clojar builder is in mkjr/Makefile. Maybe we can go over that tomorrow?
17:18angermanchouser: full ack.
17:19dnolenfliebel: ah yeah, I need to update them.
17:19amalloyoh noes, "we"? how did i get involved in this
17:19fliebeldnolen: I was thinking that :)
17:22jeffthinkthis is a bigtime noob question, but I've tried a few different built in methods and I haven't found one that does what I want...essentially, I just want to create a list by merging two existing lists...what is the builtin method for this?
17:23brehaut&(concat (list 1 2 3) (list :a :b :c))
17:23sexpbot⟹ (1 2 3 :a :b :c)
17:25fliebeldnolen: What are the typical causes for a relation being non-deterministic(if there are any)? I wrote a relation, but it never finishes if you ask for more results than it can provide.
17:26jeffthinkthanks guys...was trying cons, conj, list, etc. but didn't see concat in the docs where I was looking...now I see it though
17:26rata_$('= 1 2)
17:26rata_&('= 1 2)
17:26sexpbot⟹ 2
17:26rata_why is that?
17:27amalloyrata_: you're looking up the symbol = in the map 1, returning 2 if it's not found
17:27dnolenthe stream may contain no more results, but the program is written in such a way that the search continues. Or you have a something like (== (cons-o a b) c)) in a recursion where all vars remain fresh.
17:27amalloy1 isn't a map, sooo....
17:27dnolenfliebel: ^
17:27technomancy,(get '= {'- :minus} :not-found)
17:27clojurebot:not-found
17:28rata_what's the best way to get the fn = from '=?
17:28amalloyresolve
17:29fliebeldnolen: Okay, I'll try to think about that. These are hte last 6 rules in my sudoku that do not function correctly.
17:29dnolenfliebel: 1) all goals fail, recursive goals is called, all goals fail, ...
17:31dnolenfliebel: 2) (defn recursive-goal [fresh-c] (exist [fresh-a fresh-b] (cons-o fresh-a fresh-b fresh-c) (recursive-goal b)))
17:31rata_&(resolve '=)
17:31sexpbotjava.lang.SecurityException: You tripped the alarm! resolve is bad!
17:33rata_nice, thank you amalloy
17:34fliebeldnolen: 1) how can all goals fail and still call a recursive function? (if the function consist of one cond-e statement, that is)
17:35dnolenfliebel: I meant if the recursive goal is the last goal of a cond-e expression, and none of the other clauses produces answers.
17:45fliebeldnolen: pen en paper show that such is the case.
17:46fliebeldnolen: or… hm. if I do (all s# u# s#), is the last goal ever considered, or does it just stop at the u#?
17:46dnolenfliebel: stops at u#
17:49fliebeldnolen: But that is not the case either. hm… my relation just leaves its last arg fresh in case it is not a match, so that means it will indeed recur on a fresh var.
17:50dnolenfliebel: it's ugly as hell, but it works, https://github.com/swannodette/logos/blob/match/src/logos/match.clj#L70, will cleanup later.
17:51dnolenfliebel: recur on fresh var is ok as long _some_ goal is producing answers in the recursive call.
17:51fliebeldnolen: I need to do more pen and paper to figure that out :(
17:55fliebeldnolen: What I'm basically doing is taking 2 seqs, take the first item from one, and remove it from the other, then recur on the rest and result after removal, until both are equal. But if nothing gets removed(e.g. seqs are not permutations), it will run and run and run. (cool, the destructuring, btw)
17:58waxrosegreetings all
18:00dnolenfliebel: so when they are equal, nothing gets removed? and that's the degenerate case?
18:01fliebeldnolen: when they are equal, that means they are the same, with the worst case being the same after all items have been removed. But when nothing gets removed because they are not permutations...
18:03dnolenfliebel: meaning they share nothing ?
18:03dnolenfliebel: gist?
18:04fliebeldnolen: basically, yes. Consider [1 2 3] [1 2 4], it will first remove 1 and 2, and then continue to remove.. wait! I got it!
18:06fliebeldnolen: No matter what, the first list will get shorter, so by binding that to a cons, I make sure we did not run out of one list.
18:07dnolenfliebel: nice.
18:22fliebeldnolen: Not really… I feel like I nearly got it though…
18:22dnolenfliebel: so that doesn't work?
18:22fliebelI think I mixed up my a b c x y z somewhere...
18:24fliebeldnolen: I'll let you in on the fun: https://gist.github.com/870001
18:26fliebelhm, now it depends on the order of the arguments whether or not it finishes or not.
18:27fliebelor if it finishes or not if it not finishes not
18:28fliebelAh, I understand why, and it is okay this way.
18:30fliebelentering [a b c] vs just q made the difference, because for q, it will check (_.0 _.1 _.2 . etc)
20:12phenom_hmmm, I find myself doing this alot: http://pastie.org/1672445 ... is there anyway to make it an atom rather than a reff?
20:15amalloyphenom_: ##(let [a (atom '[x [y z]])] (first (swap! a (fn [[_ [f & more]]] [f more]))))
20:15sexpbot⟹ y
20:15amalloy&(let [a (atom '[x [y z]])] [(first (swap! a (fn [[_ [f & more]]] [f more]))) @a])
20:15sexpbot⟹ [y [y (z)]]
20:16amalloyso you get the atom containing originally [x [y z]], then change it to [y [z]] and get the first element from its new state
20:21amalloythat's a pretty disgusting number of square brackets though, so feel free to find a cleaner way
20:28phenom_amalloy: cool :) out of curiosity ... the @a at the end may be stale right?
20:29amalloyyes
20:29amalloyit was just for clarifying what's going on. only (first (swap! ...)) is atomic
20:29phenom_cool, thnx :)
20:31aamarokay, struggling with this one: java.lang.StackOverflowError -> 1000s of lines of "at clojure.lang.Keyword.intern(Keyword.java:39)"
20:31technomancyaamar: it's a known bug
20:31technomancyaamar: clojure 1.2.1 will fix it
20:32aamarOh I see, I saw some references about it being fixed in master, thought it made it into 1.2.0.
20:32aamartechnomancy: thanks for clarifying
20:32hiredman1.2.0 is old
20:32aamaranyone know an acceptable workaround?
20:32hiredmanmaster is an alpha of 1.3
20:32brehautaamar: i run my jvm in -server
20:33brehautand it stops it taking out my JVM
20:33brehautbut its not 'fixed'
20:33technomancyaamar: it's not deterministic
20:33technomancyso you should be able to just retry whatever you were doing
20:33hiredmanif you are calling the keyword function a lot, you can memoize keyword
20:33technomancyactually 1.2.1 is in build.clojure.org already: http://build.clojure.org/releases/org/clojure/clojure/1.2.1/
20:33technomancyso you can use it
20:33hiredmanbasically just stop generating keywords
20:35aamarbrehaut, hiredman, technomancy: thanks, great things to try
20:35aamarjvm -server sounds like the quick fix for me, and I'll test my app in 1.2.1 asap as well
20:36brehautaamar: im not convinced -server actually fixes it, it just drops the frequency of complete JVM obliteration to a value so low ive not encountered it
20:37aamargood caveat; I'll make sure to port over to 1.2.1 pretty fast (should have been running in server mode anyway, really)
20:37brehautaamar: if its your own code calling keyword you do need to reevaluate if you need it. i understand its going to consume your JVMs permgen
20:39brehautaamar: and if that is true, and your code is passing untrusted values to keyword (eg from user input) then you have a potential DOS vector
20:41aamarhm, my app appears to only have one meaningful use of keyword, and it's safe. I guess it could be a problem.
20:42ZnudzonHi all. How i can run my clojure program from emacs ? I have Clojure Box (emacs with SLIME and other stuff) and i know how to compile it but not run.
20:42aamarMore likely it's clutch & json libraries
20:42brehautaamar: yes thats highly likely; its what does it in my app
20:49aamarZnudzon: you can execute code in emacs using the SLIME -> Evaluation menus
20:50aamarafter running lein swank, then slime-connect, then e.g. select some code and then run slime-compile-region (C-r C-c for me)
20:50aamaractually slime-eval-region, sorry
20:51TimMcWhen 1.2.1, how can I ensure all my projects get it? 1.2.0 is currently hardcoded in my project.clj files.
20:51TimMc*When 1.2.1 lands
20:51Znudzoncompiling in clojure allways take so much time ?
20:52brehautZnudzon: AOT is relatively slow, but its pretty fast otherwise
20:55Znudzonbrehaut:
20:55ZnudzonIs there any kind of trick that i may use to icrease speed of compiling ?
20:56brehautZnudzon: in what sense?
20:57TimMcZnudzon: Are you sure you aren't running any heavy calculations at compile time? I once accidentally had a top-level def that created and rendered GUI components, for instance.
20:57hiredmanZnudzon: most likely it isn't compiling taking up time, just emacs doing stuff it doesn't need to do
20:57Znudzonbrehaut: i have some piece of code : (. javax.swing.JOptionPane (showMessageDialog nil "Witaj, Clojure!")) and it takes me about 30 sec to compile and run this .
20:57hiredmanZnudzon: I doubt that
20:58ZnudzonI tryed campile it on other computer(linux) 3 gb of ram and it still takes 30 sec
20:58hiredmanZnudzon: no it doesn't
20:58brehautZnudzon: run the same thing from a bare repl, it should be basicly instant
21:00brehaut(javax.swing.JOptionPane/showMessageDialog nil "Hello, world!")
21:00brehauti just ran that in my repl: instant
21:01brehauta fresh repl (which includes jvm start time, and loading apple swing) is still under 3 seconds
21:01Znudzonbrehaut: Yes you have right. Hmm i will try reinstall everything and maybe this will help. Thank you for help. I thought that i have problem with my clojure not emacs :)
21:01hiredmanemacs tends to print stuffing about fontifying in the minibuffer, but that is totally useless
21:02ZnudzonThen what is the best editor for clojure ?
21:02brehautemacs
21:02hiredmanemacs
21:03amacemacs
21:03ZnudzonHow about NetBeans ,Eclipse or InteliJ ?
21:04brehautEclipse has a very nice mode (counter clockwise), but it also giant, and still isnt as good for straight clojure as emacs
21:04tomojgiant!
21:04brehautif you were doing very java heavy stuff with a smidge of clojure, then eclipse might make sense
21:04brehauttomoj: ?
21:06cemerickZnudzon: I use Eclipse all day every day.
21:06tomojI wonder if it's my computer or my window manager that makes eclipse unusable
21:06brehautZnudzon: i use the technomancy's emacs-starter-kit (https://github.com/technomancy/emacs-starter-kit)
21:06cemerickAnd my day is 98% clojure, FWIW.
21:07cemericktomoj: I wouldn't be surprised if esoteric WMs mess with SWT and such.
21:08tomojI quickly took the opportunity to blame eclipse and drop it :/
21:09brehautcemerick: i'll revise my opinion then; if you use eclipse for only clojure but dont use it all day, its not so good.
21:10cemericktomoj: I do the same thing with emacs every time I start it up, for reasons passing understanding. ;-)
21:11sritchie_hey all -- if I wrote the following function -- https://gist.github.com/870147 -- before realizing that the return value of each threading macro needs to be passed into the next iteration of doseq, in the place of request
21:11amalloyTimMc: you can depend on "[1.2.0,)"
21:11cemerickbrehaut: If you're used to X, tinkering with Y will often be unpleasant or strange or uncomfortable. *shrug*
21:12TimMcamalloy: Any way to indicate 1.2.* ?
21:12amalloy"[1.2.0,1.3.0)"
21:12TimMcah!
21:12brehautcemerick: im used to textmate; and i tinkered with emacs and eclipse. im in a foreign land nomatter what. theres no way textmate is going to be a good clojure enviroment any time soon
21:13amalloybrehaut: so you settled on textmate 2?
21:13brehautamalloy: ahahaha yeah i hear its bundled with duke
21:13cemerickbrehaut: ouch. Sorry, man.
21:14amalloyduke?
21:14waxrosebrehaut, Including StumpWM into the mix seems to make it an even interesting environment with Emacs.
21:14cemerickamalloy: nukem
21:14brehautamalloy:duke nukem
21:14cemerickbrehaut: I've been demoing sublime text for a while. It's a very capable potential TM replacement IMO.
21:14clojurebotcontext is the essence of humor
21:15sritchie_here's my new try -- https://gist.github.com/870147. is there a nicer way to write this?
21:15waxroseTimMc, Hello, btw.
21:15brehautcemerick: thanks for the pointer
21:15amalloybrehaut: i was referring to www.textmate2.com
21:15TimMchey, waxrose
21:15cemerickwhat a wise-ass domain name that is
21:15brehautamalloy: oh. haha
21:16amalloycemerick: and i discovered just now that .org redirects to vim
21:16amalloyso you can be neutral
21:16TimMcI cut a non-SNAPSHOT release of feedback. It's <v1.0.0 until I use it successfully in a project.
21:17brehautcemerick: does sublime look like it could be decent for clojure (could it support a paredit frinstance?)
21:17TimMcamalloy: though the title is incorrect for the latter
21:18cemerickbrehaut: yes, its extensions are *far* more powerful than TM bundles AFAICT. Highlighting and actions are bound to python code -- none of this regex + shell BS.
21:18brehautcemerick: BS is right. that sounds a lot more sane
21:19cemerickThe problem is UI -- there are no provisions for e.g. programmatically opening sidebars, panels, etc., so a proper in-window REPL would be tough.
21:19cemerickThat's all AFAICT.
21:19brehauti guess i'll just keep an eye on it
21:19jcromartieWhat's a good way to pick out a few keywords from a map
21:19jcromartieerr, a few keys
21:20cemerickHonestly, I don't expect an editor to be a reasonable Clojure environment.
21:20brehaut&(take 2 (shuffle (keys {:a 1 :b 2 :c 3})))
21:20sexpbot⟹ (:c :b)
21:20amalloyjcromartie: juxt or destructuring
21:21jcromartieI mean to create a new map
21:21amalloybrehaut: way to go. between the two of us we've covered two plausible meanings of his question, but not the one he wanted
21:21amalloyselect-keys
21:21brehautamalloy: …again
21:21jcromartieamalloy: thanks
21:21amalloyi'd like to take credit though. juxt seems closer than any of the others were
21:21jcromartie:)
21:22jcromartiejuxt would be good
21:22jcromartieif that's what I needed
21:22jcromartiebut it's not so...
21:22jcromartiephew, it's late and I'm not feeling well so I'm just going to keep quiet and enjoy my select-keys
21:22jcromartiethanks
21:22brehautany solution where juxt is not appropriate hasnt got the right problem yet
21:23amalloyhah
21:24jcromartieI tried explaining juxt in one sentence the other day.
21:24brehautcemerick: you mean that a proper IDE is needed? or something else ?
21:26tomojsritchie_: there must be
21:26tomojwhat's "phase"?
21:27sritchie_a macro that writes (fn [request] (-> request ...))
21:27sritchie_inserting its arguments into ...
21:27tomojdid you consider hygiene and decide against?
21:28sritchie_I didn't write phase, I'm writing a pallet crate
21:28tomojpallet has phase? :O
21:29sritchie_so, I have to funnel request through these other functions, which an operation to the request map and pass the modified map back
21:29hiredman,(do comp)
21:29clojurebot#<core$comp clojure.core$comp@dc5b6a>
21:29hiredman,(doc comp)
21:29clojurebot"([f] [f g] [f g h] [f1 f2 f3 & fs]); Takes a set of functions and returns a fn that is the composition of those fns. The returned fn takes a variable number of args, applies the rightmost of fns to the args, the next fn (right-to-left) to the result, etc."
21:29sritchie_hiredman: that's what I'm using in my gist
21:29sritchie_https://gist.github.com/870147
21:29cemerickbrehaut: "proper" is a semantic tar pit. But I'm generally a disbeliever of all things lightweight when it comes to development tools, yes.
21:30tomojoh, phase is hygienic
21:32tomojsritchie_: does it not matter in which order you compose the functions?
21:32sritchie_tomoj: nope, not in this case
21:33sritchie_the function currently adds the creation of three remote config files to the request
21:36tomojyour latest attempt doesn't look bad actually
21:36sritchie_tomoj: the first attempt was based on my assumption that nothing was added to the request, and that remote-file had side effects, and returned nil
21:36tomojwhen you originally asked the question I thought it was a reduce, and it could be, but I think it'd just be uglier
21:36sritchie_hence the doseq
21:37sritchie_tomoj: I was trying to fumble it into reduce first, actually
21:38sritchie_tomoj: I guess I could bind the result of the (apply comp ... ) to a local var in let, and then write (create-configs request) as the body, to make it cleaner
21:38sritchie_I guess I'm asking for style advice, here
21:42jcromartieyay for (mapcat vals x)
21:42jcromartiecemerick: what do you define as "lightweight?"
21:44cemerickjcromartie: having limited degrees of extensibility freedom?
21:44jcromartieah
21:44jcromartieso like, Scite or something
21:44jcromartieI'd call Emacs "lightweight" compared to Visual Studio or Eclipse
21:44cemericke.g. not being able to have long-running processes in, say, TextMate or vi is a big problem if you want to support richer editing and tooling use cases
21:45cemerickjcromartie: Maybe only if you're talking about resource utilization.
21:45cemerickI don't think that's germane, tho.
21:45jcromartiein all senses of resource usage
21:45jcromartiespace and time
21:46jcromartiebut would you say TextMate is lightweight?
21:46cemerickI don't follow. Emacs is far more easily extensible than either VS or Eclipse. Hardly "lightweight", at least as I've defined it so far. :-)
21:46cemerickabsolutely
21:46cemericktext munging features, and that's about it.
21:47waxroseEmacs 24 + Slime + StumpWM + Sunrise Commander = Fun
21:48jcromartieyeah I suppose, TextMate only really allows insertion or replacement
21:50cemerickI take my cues largely from things like lispworks and whatever they call the Racket IDE these days. Incredibly rich environments.
21:51jcromartieDrRacket
21:51cemerickI figured they must have renamed it.
21:52jcromartieso I think I missed some earlier stuff but are you talking about building a Clojure environment in Clojure?
21:52cemerickno, I wasn't talking about that earlier today
21:53cemerickMy ideal would be to get a good interop layer on top of the eclipse APIs so that it could be extended and modified as dynamically as emacs is today.
21:54cemerickThat might be a pipe dream, and maybe not even necessary/desirable. Sounds fun though, anyway.
21:54TimMcI haven't exactly studied the Java security model, but it seems to provide sandboxing in such a way that a program can be run in a normal-privileged JVM but be prevented from accessing, say, user files.
21:54TimMcCan Clojure provide for this too, given rebinding and such?
21:54brehautTimMc: i believe thats true if you are willing to accept a large bag of caveats
21:55cemerickReally, just a few more iterations on ccw as it stands will essentially surpass what swank/emacs offer, at least in terms of Clojure support.
21:55brehautccw is really great
21:55TimMcI'm thinking for instance of how Java makes String a final class to enforce immutability of data passed in to core security classes.
21:56TimMcbrehaut: What species of caveats?
21:56brehautTimMc: im not up on the security model, but i have heard [citation needed] that its not as successful as hoped
21:57TimMcThe Clojure one?
21:57brehautJava one
21:57TimMcAh! OK.
21:57brehautclojure is even harder to secure than java
21:57jcromartiereally?
21:57jcromartieI'd imagine you could strictly control the namespace that something is evaluated in
21:58hiredmannamespaces have nothing to do with security
21:58jcromartiebut I guess Java interop is kind of out of bounds
21:58brehaut&(clojure.lang.Compiler/maybeResolveIn *ns* (symbol "eval"))
21:58sexpbot⟹ #'clojure.core/eval
21:58jcromartieyou leet hax0r
21:59cemerickbrehaut: I'd be very interested in that citation. The Java security model is overly complicated, but well-implemented AFAIK.
21:59hiredmanhttps://github.com/hiredman/Arkham
21:59brehautcemerick: im digging, im pretty sure i saw something very recently
21:59brehauthiredman: best name ever
21:59hiredmanI know
21:59tomojbrehaut: ouch!
22:00TimMchiredman: I approve of "evil".
22:00tomojbetter report it
22:00brehauttomoj: i have done
22:00hiredmanif clojure's compiler provided a few hooks you could sandbox very easily
22:00brehautamalloy grumbled at me
22:00tomojI knew there had to be more holes for vars to fall through
22:01jcromartiehiredman: that's a great solution, actually
22:01brehautclojure is in a much better place than other dynamic languages
22:01hiredmanman, maybe thats what I should do for clojurebot instead of Arkham
22:01brehautlike say python or javascript
22:01hiredmanfor clojure and add the hooks I need to the compiler
22:01hiredmanfork
22:01hiredmanoh man
22:02amalloy(inc hiredman)
22:02sexpbot⟹ 2
22:02amalloyplz do all my work for me. i like this plan
22:02hiredmantoo bad, time for dinner
22:03TimMcbrehaut: window.undefined = 5;
22:03brehautever seen http://ha.ckers.org/xss.html ? its depressing
22:04TimMcbrehaut: Sure, but only depressing in the sense that WHEN WILL PEOPLE STOP USING BLACKLISTS.
22:04brehautnever
22:05brehauti feel confident in saying that people will stop writing code that stores passwords in clear before they stop using blacklists
22:05jcromartiehah
22:06brehautcemerick: i cant find what i was looking for. consider my comments retracted
22:07cemerickbrehaut: I have no particular bias, outside of having no memory of hearing of any problems with its implementation.
22:07TimMcbrehaut: Wrong: ##(< Double/POSITIVE_INFINITY Double/POSITIVE_INFINITY)
22:07sexpbot⟹ false
22:07brehautcemerick: neither do i, but i dont trust my memory enoguh to make some claim like that
22:07TimMcNeither will ever happen. ;.;
22:08brehautTimMc: my statement holds!
22:08TimMc,(>= Double/POSITIVE_INFINITY Double/POSITIVE_INFINITY)
22:08clojurebottrue
22:09TimMcI suppose if you phrase it that way...
22:09TimMchmm
22:15amalloybrehaut: i found their use of disgusting non-xhtml constructs more depressing than the actual xss
22:16brehautamalloy: whats wrong with html!
22:16amalloyevvvverything
22:18brehautyour well argued case has swayed me :P
22:19TimMcThe parens are all messed up.
22:21amalloybrehaut: would you accept "highly irregular grammar leads browsers to 'do their best', leading to xss issues all over"?
22:22brehautamalloy: half marks; even with a highly regular grammer, browsers still 'do their best'
22:23amalloyi'm inclined to believe this is because they have to be compatible with pages that are used to leniency
22:23amalloybut i believe a lot of false things, so ymmv
22:24TimMcIt's the downside of what's-his'face's law
22:24brehautamalloy: if you are sending your xhtml with xml application mimetype allowing them to run through a proper xml parser rather than a standards mode xhtml parser, however, you'd be right
22:24TimMcPostel
22:25TimMcbrehaut: Browsers have broken behavior for xml+xhtml -- the slightest error causes the page to be completely unrenderable.
22:26brehautif you send it with application/xml or whatever it is. they employ the draconian error handling that is specified by the xml spec
22:26brehautif you dont, then you get 'browsers best guess'
22:26pdkthat's the beauty of markup langs today
22:26brehautoh and the other caveat for the proper xml mimetype is that IE would choke on it completely up to (maybe including?) IE7
22:27pdkxml makes you bend over backwards and says right in its spec that complying implementations aren't allowed to do basic error correction that wouldn't even introduce ambiguity
22:27TimMcbrehaut: That's the good news. :-P
22:27pdkwhile it's anyone's guess how a malformed html document will come out
22:27amalloy+1 for xml
22:27brehautpdk: the best guess of most browsers is remarkably consistent these days
22:28brehautie6 being stagnant for so long had one good side effect
22:28pdkpeople standardizing on "make it show old pages geared for ie6 well?"
22:29brehautpdk: not exactly; webkit and gecko had more time to improve their heuristics in general. a lot of ie6's rendering deviations are from incorrect implementation of the box model (they did what most people consider the intuitively sane model)
22:29brehautso you just cant copy them with out breaking your rendering completely
22:30pdkhm
22:30cemerickbrehaut: I forgot about GAE. Surely they use the Java security model for their sandbox? http://code.google.com/appengine/docs/java/runtime.html
22:30pdkfill me in, what makes it bad yet still "intuitively correct"
22:30pdkis that code for how goto used to be the obvious right way to structure code for people who learned programming on basic in the 80s :p
22:30brehautcemerick: i guess so?
22:31brehautpdk you have 4 width and height effecting properties in CSS (on block level elements): width, padding, border and margins
22:32brehautin css the actual box that the element creates is width + padding + border widths + margin
22:32brehautin ie6 its width + margin, with the content width of the element being width - borders - padding
22:33waxroseYou shouldn't even support IE6 anymore anyways.
22:33cemerickthe alternative being that they implemented their own security model and/or JVM. Not out of reach, but…
22:34brehautcemerick: is everything in the app engine for a customer within one jvm process?
22:34brehautcemerick the issues i think i had heard were to do with a jvm having two different security contexts
22:35cemerickit's a clustered environment, so I presume requests to a single app could easily be on two different JVMs
22:35brehautpdk: im not even sure if the IE model is bad; its certainly useful that you can say 'this element is 100% wide, has a border and has 1 em of padding'
22:36waxrosebrehaut, It's not like IE follows standards anyways.
22:37TimMcwaxrose: They're getting better.
22:37brehautwaxrose: im not an IE or MS fan by any stretch but that BS; they didnt but they have picked up their game a lot
22:37TimMcThe IE 9 team was instructed to shape up.
22:37waxroseTimMc, Yeah, IE 9 supports Html 5 standards 100%.............................. 100% of the features implemented into IE9.
22:37brehautTimMc: I have less trouble with IE8 than FFx for some things
22:38TimMcOr more accurately, told that quality should yield less to timing pressures than in the past, I suppose.
22:38brehautwaxrose: an incomplete implementation of the spec is significantly different to a deviation from the spec for the same features
22:38TimMcwaxrose: Oh, I still despise IE, don't get me wrong. And they're nowhere near ready to be considered a serious browser.
22:39waxroseFx 4 beta 13 pre follows more web standards than IE 9 does. Besides, if you want a better standards compliant browser you would have to look at Opera.
22:39pdki haven't grabbed the 9 beta yet
22:39pdki thought they were told SHAPE UP ALREADY back with 7
22:39brehautpdk it took a long time to get trident into anything like reasonable shape
22:39TimMcpdk: Er, yes. That's what I meant.
22:39pdkso in short
22:39pdk7 was a marginal polish job over 6 and 8 slightly more so?
22:40waxrosebrehaut, True, but claiming they have the most advanced, HTML 5 compliant browser is another trick being spread as a rumor from MS.
22:40pdkwhile 9 is ideally throwing out the termite mound of a foundation
22:40TimMcThey did some serious improvements.
22:40waxroseMS is forced to roll out a better IE because no one takes their browser serious in my opinion.
22:41waxroseUnless it's for a corporation I assume.
22:42TimMcwaxrose: That's the install base of IE 6.
22:43waxroseFx, Safari, Opera, hell even broken Fennec serve better over standards than IE 9. I just think that with all their 800lb Gorilla funds they have, they would be a little more advanced than what they currently are. But I'll end my rant haha.
22:43waxroseoverall*
22:44waxroseTimMc, Yeah, I had to do a few contract project for Baylor Univ. two years ago and it was a horrible experience trying to get around their IE6 demands.
22:44waxroseprojects*
22:45arohnerhas anyone used cron4j? Good experiences? Is there a better library?
22:46pdkhave they at least rearranged their priorities with standards compat a bit
22:46pdki recall people lameting how standards were only bumped up a teeny little notch from "we don't give even half a shit, pal" as it was with 6
22:46TimMcBedtime! G'night.
22:47pdker bumped up with 7 from 6
22:47waxrosepdk, Haha, yeah.
22:47waxroseTimMc, night
22:48waxroseNearly all of my friends are Web Designers/Developers and I have to go through this argument of 508 and compliance all the time.
22:48brehautpdk my understanding is that the team working on IE9 do care about the standards, and making a great browser. whether that is a concern shared by management types is another matter
22:48TimMcbrehaut: Indeed.
22:49waxrosebrehaut, I will admit though, they HAVE greatly improved from the transition of IE7 -> 8 -> 9.
22:50waxroseThe interface of IE9 though is a bit awkward to me but I assume will play in the hand of Win 8. meh
23:03pdkis there any ui info on win8 then
23:03pdklike mockups/proposed features
23:05waxroseI haven't really looked since I only use Windows in a VirtualBox .vdi for school.
23:06pdki don't think that affects your ability to find news on an os that is still years from release :p
23:06jcromartiestrange things happen when realizing an element of a lazy seq throws an exception but you just abort that thread and run it again?
23:07waxroseThe only thing I heard about Windows 8 is that it will be dropping 32 bit.
23:08waxroseAnd will support x64 and x128.
23:08pdkcriminy
23:08pdkwell
23:08pdkjust so long as you can recompile doom source to x128
23:08pdksrsly!
23:09waxrosex128 just sounds crazy to me but it's going to be interesting when it's common.
23:09waxrosepdk, And yes, it will effect me to find news on it since I'm a Linux advocate. lol
23:10waxroseIf I didn't require it for my silly college, I wouldn't be using it.
23:11jcromartiex128... who cares? we're so far off from filling up the 64-bit address space
23:11jcromartieI'm not trying to be shortsighted
23:12pdkthe mainframe guys aren't
23:12pdkthen again
23:13jcromartieI guess so
23:13pdkthe mainframe guys could give two about windows
23:13jcromartiebut this is the first I've ever heard of 128-bit
23:13pdk(they're also gearing up for ipv8)
23:13waxroseI don't really care, but I love to live on the edge so once I see x128 I'll install it. lol
23:13pdk(you heard it here first)
23:14pdk(ps my dad works at nintendo)
23:15pdk(he showed me storyboard sketches for some cutscenes from mario party 12)
23:16jcromartieis it april 4?
23:16jcromartieI mean 1
23:16waxroselol