2012-03-05
| 00:01 | tmciver | tylergillies: one thing I notice about your paste: you check for (count node) to be three which implies that once you get to the nth call, you don't need the 'not-found' part anymore. This implies that you no longer need to check for (= node false). |
| 00:02 | tmciver | tylergillies: also, you can shorten it up a bit by using (nil? ...) instead of (= node nil) and (false? ...) instead of (= node false). Doesn't matter that much though. |
| 00:06 | m0smith | It looks like it is checking for a binary tree with each node being nil or a pair [a b], correct? |
| 00:07 | tmciver | each node is a nil or a triple (value, left-child, right-child) |
| 00:07 | tmciver | http://www.4clojure.com/problem/95 |
| 00:09 | tylergillies | tmciver: thanks for the input! :) |
| 00:10 | amalloy | in fairness, argument orders for clojure are very logical and orderly. except nth, which is horrible |
| 00:12 | tmciver | amalloy: nth's args are inline with get, is it not? |
| 00:13 | amalloy | yes. but nth is a sequence operator, and get is a collection operator |
| 00:13 | amalloy | all the other sequence operators (drop, map, filter) take the sequence last |
| 00:14 | ideally_world | what's the best way to get doc to work via clojure-jack-in? |
| 00:14 | ideally_world | I thought I could just use clojure.repl/doc, but that's not doing it for me :( |
| 00:14 | tmciver | ideally_world: (use 'clojure.repl) |
| 00:14 | amalloy | the parallel with get hadn't occurred to me, though. neat |
| 00:14 | technomancy | ideally_world: doc is lame compared to C-c C-d d |
| 00:15 | amalloy | i dunno. i usually prefer doc |
| 00:15 | ideally_world | ah, yeah, thanks |
| 00:15 | tmciver | technomancy: we all think you should (use 'clojure.repl) in clojure-jack-in. :) |
| 00:15 | ideally_world | technomancy, nice! :) |
| 00:15 | ideally_world | and thanks |
| 00:16 | technomancy | tmciver: there's no way to make it work well |
| 00:16 | technomancy | you can refer it into the user namespace, but that's 90%-useless |
| 00:16 | tmciver | Yeah, I remember you told me that before. I don't know the technical reasons so I take your word for it. |
| 00:17 | amalloy | technomancy: what about injecting it into clojure.core? |
| 00:17 | technomancy | ~guards |
| 00:17 | clojurebot | SEIZE HIM! |
| 00:17 | amalloy | yeah yeah |
| 00:17 | ideally_world | can C-c C-d d be used in a .clj buffer? |
| 00:17 | technomancy | amalloy: srsly though, use clj-nstools for that |
| 00:18 | tmciver | technomancy: why is it 90% useless? It always WORKSFORME. |
| 00:18 | technomancy | tmciver: maybe you spend more than 10% of your time in the user namespace? |
| 00:19 | technomancy | tmciver: there's no way to bring it into all namespaces like it used to be |
| 00:19 | technomancy | without amalloy's evil suggestion (or using clj-nstools) |
| 00:19 | technomancy | so bringing it into the user namespace would just trick people into thinking it works like it did before; the confusion would merely be delayed |
| 00:20 | tmciver | Yeah, I do spend most of my time in user. But couldn't you just 'use' it in whatever ns you were in? |
| 00:21 | tmciver | Does the trouble come for people who switch namespaces a lot? |
| 00:21 | technomancy | tmciver: I guess it could be done as a hook on C-c M-p, but then it wouldn't work when using in-ns, etc |
| 00:21 | technomancy | I'd rather have it predictably not work than work intermittently |
| 00:21 | xeqi | tylergillies: https://refheap.com/paste/929 - how I would refactor it |
| 00:22 | technomancy | tmciver: yeah I don't think keeping the repl in the user namespace is very common |
| 00:24 | tmciver | technomancy: Hmm, I should change my ways. I typically 'use my code from user. I should probably be taking more advantage of slime. |
| 00:25 | technomancy | I'm a fan of C-c M-p |
| 00:26 | tmciver | technomancy: Ah, another slime command I must learn. |
| 00:26 | tmciver | technomancy: Are you in the Boston area this week? There's a Clojure meetup. |
| 00:27 | tylergillies | xeqi: i don't understand the 'step' stuff |
| 00:27 | tylergillies | ooooh |
| 00:27 | tylergillies | you're showing me step by step how you got to yours |
| 00:27 | tylergillies | thanks |
| 00:27 | xeqi | yeah |
| 00:28 | technomancy | tmciver: no, I won't be in town |
| 00:28 | ideally_world | What's the best way to explore Java API's from Clojure? I'm looking at an interface, and I'd much rather do it all from the REPL? :( |
| 00:28 | tylergillies | bookmarking that |
| 00:28 | tylergillies | some good things to be mindful of |
| 00:28 | technomancy | ideally_world: C-c S-i to explore an interface |
| 00:28 | technomancy | or class or wahtever |
| 00:29 | ideally_world | S? |
| 00:29 | ideally_world | shfit? :) |
| 00:30 | ideally_world | nice |
| 00:30 | ideally_world | I should start writing these down |
| 00:31 | technomancy | there's also the swank-clojure readme; it covers most of them |
| 00:31 | ideally_world | or bertter yet, where's the cheat sheet with these gems? |
| 00:31 | ideally_world | thanks |
| 00:33 | ideally_world | oh, will definitely be usting C-c M-p a bit :) |
| 00:34 | ideally_world | I really need that tatooed on my inner eyelids |
| 00:35 | m0smith | xeqi: my solution is at https://gist.github.com/1976882 |
| 00:37 | m0smith | xeqi: pretty close to yours but with destructuring and simplified the conditions |
| 00:42 | ideally_world | Oh, I've been looking for C-M-x! |
| 00:43 | ideally_world | Thanks technomancy, you've made my development that much simpler |
| 00:47 | choffstein | Hey all. Anyone have any idea why I might just be getting an "; Evaluation aborted." when running a command via swank in emacs? It's never happened to me before, and it seems to be coming from someone else's library, and without an exception or a stack-trace, I don't really know how to get to the bottom of it... |
| 00:58 | ideally_world | not sure how many times EXIT_ON_CLOSE has bitten me :/ |
| 03:12 | antares_ | if I have a lazy seq, what's the most idiomatic way to take next value from it (like Java's Iterator#next)? |
| 03:16 | raek | antares_: Iterator#next actually does two things: first, it fetches a value, second, it advances its state through mutation |
| 03:16 | antares_ | raek: right, this is what I want in my case |
| 03:16 | raek | the fetch value part corresponds to 'first' |
| 03:16 | antares_ | raek: I cannot use take or take-while and similar things because I don't know how many I need upfront |
| 03:16 | raek | the advance part corresonds to 'rest' |
| 03:17 | antares_ | raek: yes but first does not advance |
| 03:17 | raek | yes, lazy-seqs are immutable |
| 03:17 | antares_ | raek: rest produces an infinite sequence |
| 03:17 | ibdknox | so take the first of it |
| 03:17 | antares_ | I basically need take 1 that advanced the "pointer" |
| 03:18 | raek | antares_: the pointer you need to advance is the local variable you hold the seq in |
| 03:18 | antares_ | hm, yeah, immutability is a good point |
| 03:19 | raek | (loop [coll ...] (if (some-predicate? (first coll)) (recur (rest coll)) ...)) |
| 03:19 | ibdknox | what're you trying to do? |
| 03:19 | antares_ | raek: that's exactly what I cannot do |
| 03:19 | raek | in soviet russia, data structures mutate YOU |
| 03:19 | antares_ | ibdknox: imagine I have an infinite sequence of dates |
| 03:20 | antares_ | ibdknox: and every once in a while (for example, during fixture data generation) I need to take "next value" from it and advance it |
| 03:20 | ibdknox | every once in a while? |
| 03:21 | antares_ | ibdknox: it does not happen N at a time and does not stop after specific condition |
| 03:21 | raek | antares_: on way could be to explicitly pass the sequence of "free dates" do whatever funtion that needs them (and let them return a sequence of the dates they didn't use) |
| 03:21 | raek | or you could simply use stateful constructs, such as atoms |
| 03:21 | ibdknox | from different threads? |
| 03:21 | ibdknox | it sounds like you just want an atom |
| 03:22 | ibdknox | with a little getter function that does what you describe |
| 03:22 | ibdknox | calls first and swaps it with the rest of itself |
| 03:22 | antares_ | ibdknox: yes, I was thinking that maybe atom is closer than lazy seq to what I need. Thanks. |
| 03:22 | raek | in Haskell I guess you would use the state monad to pass the seq "behind the scene" |
| 03:22 | ibdknox | you want both actually |
| 03:23 | raek | antares_: the lazy-seq will determine the logical succession of values and the atom will be responsible for holding the state |
| 03:26 | antares_ | raek: yeah, ibdknox just suggested something like that. Thanks for the suggestion, I will try this now! |
| 04:13 | harblcat | hi all. I'm wondering how to do something, and a quick perusal of the clojure docs isn't directing me anywhere... |
| 04:14 | harblcat | I've got something like the following: (def foo (ref {:a 100 :b []})) and am wondering how I would add items to the vector underneath b? |
| 04:15 | lucian | harblcat: could use something like http://clojure.github.com/clojure/clojure.core-api.html#clojure.core/alter |
| 04:17 | harblcat | I already understand how to alter the value under a: (alter _ conj {:a (inc (:a _))}) where _ is the ref... |
| 04:18 | lucian | then pass in a different function, that does assoc on :a |
| 04:18 | lucian | i think you could even just pass assoc |
| 04:18 | harblcat | I'll have to look into that, thanks :) |
| 04:21 | harblcat | looks like update-in is the thing I need: (update-in @_ [:b] conj 'foo) |
| 04:26 | amalloy | (alter the-atom update-in [:b] conj 4), though i guess i'm too late |
| 09:40 | tutysara | I am trying to setup emacs + slime on a windows machine. I had installed lein+swank, I could do lein swank from cygwin and connect from emcas24 started from cygwin using M-x slime-connect, but clojure-jack-in is not woking |
| 09:41 | tutysara | start-process-shell-command: Spawning child process: invalid argument is the error message |
| 09:42 | technomancy | choffstein: usually that means there was a problem showing the stack trace |
| 09:43 | choffstein | technomancy: Wow, talk about a delayed answer :) Thanks! I ended up figuring it out. Late night programming lead to a "defn" instead of a "def". I just thought it was odd that the stack-trace didn't show up. |
| 09:45 | RickInGA | tutysara did you install clojure mode? |
| 09:50 | gf3 | jonasen: are you the kibit Jonas? |
| 09:50 | jonasen | gf3: yes |
| 09:51 | gf3 | jonasen: just wanted to say: awesome project |
| 09:51 | jonasen | gf3: Thanks! |
| 10:16 | stuartsierra | ~archive |
| 10:16 | clojurebot | Pardon? |
| 10:16 | stuartsierra | ~logs |
| 10:16 | clojurebot | logs is http://clojure-log.n01se.net/ |
| 10:19 | gtuckerkellogg | what the hell am i doing wrong in updating lein to 2.0 |
| 10:19 | gtuckerkellogg | i run lein self-install, and it seems to be fine |
| 10:19 | gtuckerkellogg | then i run lein version, and I get "Exception in thread "main" java.io.FileNotFoundException: Could not locate leiningen/core/main__init.class or leiningen/core/main.clj on classpath: |
| 10:19 | dakrone | lein 2.0 is not released yet |
| 10:21 | gtuckerkellogg | d'oh! |
| 10:21 | gtuckerkellogg | really? I keep noticing packages that are already expecting it, and have a "if you are still using < 2.0 then do this" |
| 10:23 | babilen | gtuckerkellogg: http://groups.google.com/group/leiningen/browse_thread/thread/4c7157ea4d7f14f0 (On which OS did you install leiningen and how did you install it? - Please paste relevant commands+output) |
| 10:24 | gtuckerkellogg | this is macosx 2.7, tried with lein self-install; lein version |
| 10:24 | gtuckerkellogg | Downloading Leiningen now... |
| 10:24 | gtuckerkellogg | % Total % Received % Xferd Average Speed Time Time Time Current |
| 10:24 | gtuckerkellogg | Dload Upload Total Spent Left Speed |
| 10:24 | gtuckerkellogg | 100 9837k 100 9837k 0 0 358k 0 0:00:27 0:00:27 --:--:-- 345k |
| 10:24 | gtuckerkellogg | Exception in thread "main" java.io.FileNotFoundException: Could not locate leiningen/core/main__init.class or leiningen/core/main.clj on classpath: |
| 10:24 | gtuckerkellogg | should have put that in pastebin, sorry 'bout that |
| 10:27 | RickInGA | tutysra: you still having issues with getting set up on windows? |
| 10:28 | tutysra | RickInGA : Unfortunately yes, I got slime-connect + lein swank working |
| 10:28 | RickInGA | see if this post helps, http://onbeyondlambda.blogspot.com/2012/01/setting-up-clojure-emacs-on-windows.html |
| 10:28 | tutysra | RickInGA : having issues with clojure-jack-in |
| 10:33 | tutysra | RickInGA : thx Rick for putting that up, it is pretty much detailed and covers almost everything. I have a slightly different setup, I use cygwin and have installed lein inside cygwin. I have the normal windows emacs but start it from inside cygwin (also have .emacs.d inside cygwin) |
| 10:34 | RickInGA | have you installed the clojure-mode in your .emacs.d? |
| 10:35 | tutysra | yup, installed clojure-mode and it syntax highlights clj files, I also get auto-completion when I type clojure-jack-in |
| 10:35 | RickInGA | well, you have gone beyond anything I can help with, sorry |
| 10:36 | RickInGA | I just don't know how cygwin changes things |
| 10:38 | tutysra | I could do slime-connect to connect to swank, only clojure-jack-in says failed to create sub-process, I guess it has to be something with cygwin's path |
| 10:46 | dgrnbrg | If I have a clojure application that needs to scan directories and store a persistent DB of the info it gleaned about the files, what's the easiest backing store to use? I am thinking sqlite or redis, but I don't know if there's another better option. I also need a python program to either read from the DB or send its queries to the clojure program to get data from the db |
| 10:47 | TimMc | dgrnbrg: SQLite is dead easy. |
| 10:47 | raek | sqlite is quite easy to use with clojure.java.jdbc (but I haven't used redis myself) |
| 10:47 | dgrnbrg | and it has to run on NFS... |
| 10:48 | dgrnbrg | I forgot about that quirk... |
| 10:48 | raek | sqlite just uses a file |
| 10:48 | dgrnbrg | Is there an standardized chat format between python and clj? |
| 10:49 | TimMc | JSON is fine, I'm sure. |
| 10:49 | dgrnbrg | I suppose I could just send clj code as text from python to the clj indexing service |
| 10:50 | dgrnbrg | (i'm working on an improvement to vimclojure/nailgun's completion/discovery tools) |
| 10:54 | stuartsierra | somebody wrote a Clojure Reader in Python |
| 11:02 | dan_b | " Jark is a tool to run clojure code on the JVM, interactively and remotely. It has 2 components – a client written in OCaml and a server written in Clojure/Java. The client is compiled to native code and is extremely tiny (~300KB) |
| 11:02 | dan_b | when did 300k become "tiny"? |
| 11:03 | wilkes | 2003 |
| 11:04 | lucian | i'd say it's of reasonable size for what it does |
| 11:05 | lucian | now replace it with ClojureScript + node ! :) |
| 11:05 | dan_b | hah |
| 11:05 | lucian | i'd really like another backend for clojure |
| 11:05 | lucian | either python or C-ish |
| 11:06 | dan_b | llvm or something? |
| 11:06 | lucian | i guess that might work |
| 11:06 | dan_b | or do you actually want idiomatic C output? |
| 11:06 | TimMc | lucian: DId you see the Python impl? |
| 11:06 | lucian | not really |
| 11:06 | lucian | TimMc: it's an interpreter, and very primitive |
| 11:06 | lucian | TimMc: but I have considered contributing to the PyPy one |
| 11:07 | lucian | in fact, if there was a way to call python code from it, it'd be the perfect solutioj |
| 11:07 | lucian | also, clojure on android still sucks |
| 11:07 | dan_b | my sense of aesthetics rebels against the jvm as a backend, but half of everything I've written in my ~ 2 days of clojure so far has turned out to be bindings for java libs. so perhaps I should get over myself ;-) |
| 11:07 | jkdufair | tutysra, i submitted a patch for this prob |
| 11:08 | jkdufair | latest version of swank-clojure should have this fix |
| 11:08 | pipeline | dan_b: go replicate that work with CMUCL and FFI, see if you can work it out in two days ;) |
| 11:08 | lucian | dan_b: of course you should :) |
| 11:09 | lucian | clojure being on the jvm is very useful, but being *primarily* on the jvm, not so much |
| 11:09 | lucian | i'd love to see CinC further along, and several backends with similar maturity. perhaps it's a dream |
| 11:09 | TimMc | What's the CLR project up to these days? |
| 11:27 | Iceland_jack | Hey #clojure, quick question |
| 11:27 | Iceland_jack | The function http://clojuredocs.org/clojure_contrib/clojure.contrib.seq/separate is basically implemented as: |
| 11:27 | Iceland_jack | > [(filter f s) (filter (complement f) s)] |
| 11:28 | TimMc | (def separate (juxt filter remove)) |
| 11:28 | Iceland_jack | I'm an old Common Lisper and a relatively new Clojurer-er... but isn't that pretty wasteful? |
| 11:29 | lucian | a little, maybe |
| 11:29 | dgrnbrg | Has anyone got lein to work through a https proxy? It seems to ignore my http_proxy environment vars, and it isn't working well w/ .m2/settings.xml's proxy setitng |
| 11:29 | Iceland_jack | Maybe there is a reason for this, legibility perhaps |
| 11:29 | dgrnbrg | Iceland_jack: why would it be wasteful? filter is lazy, so it's just making a 2 element vector |
| 11:29 | TimMc | Iceland_jack: I'm wondering if it allows for more laziness. Haven't convinced myself either way. |
| 11:30 | Iceland_jack | dgrnbrg: for a resource-intensive `f' it would do double the amount of work |
| 11:30 | dgrnbrg | I see what you mean |
| 11:30 | TimMc | Presumably a user of separate is going to consume some amount of both seqs. |
| 11:30 | lucian | TimMc: it'd have to be much longer to be as lazy, i guess |
| 11:30 | Iceland_jack | Instead of running `f' once and consing it to an appropriate list |
| 11:31 | lucian | Iceland_jack: feel free to write your own with :) |
| 11:32 | TimMc | I'm having some trouble figuring out how I would write my own that only calls f once per element... |
| 11:32 | lucian | uh, with an explicit iteration |
| 11:32 | dgrnbrg | You could use an atom to store the "other side" results |
| 11:32 | dgrnbrg | or 2 atoms, and then check the atom before consuming from the next seq |
| 11:32 | TimMc | (map (juxt f identity) s) and then return lazy views on filter and remove of that |
| 11:32 | Iceland_jack | lucian: I might :) but I know that Python has at times taken a stance on maintaining their code base, often disregarding speed |
| 11:33 | lucian | Iceland_jack: it's a logical choice |
| 11:33 | Iceland_jack | so I thought it might be something similar |
| 11:33 | Iceland_jack | not that the alternative would be that more complicated |
| 11:34 | lucian | Iceland_jack: would the alternatives have the same laziness and concurrency properties? |
| 11:34 | Iceland_jack | I see no reason why not |
| 11:35 | calebphillips | It could be implemented in one pass, with reduce, right? |
| 11:35 | Iceland_jack | calebphillips: hey now, this isn't Haskell ;) |
| 11:36 | lucian | TimMc suggested the solution |
| 11:39 | Iceland_jack | Haskell's `partition' is defined similarily I see |
| 11:40 | Iceland_jack | but Haskell's compiler is free to optimize that |
| 11:43 | TimMc | calebphillips: I'm not sure it could. |
| 11:44 | TimMc | The result needs to be a vector (well, coll) of lazy seqs, and reduce would keep producing a new vector on each iteration. |
| 11:44 | sdeobald_ | Is anyone else getting "Duplicate key: clojars" when attempting plugin installs on brand new lein installs lately? |
| 11:45 | neotyk | datomic anyone? |
| 11:45 | calebphillips | TimMc: I looked back at your solution after I said that, and I imagine it would still be better even if the reduce was possible. |
| 11:46 | TimMc | neotyk: Any new info on what it is supposed to be? |
| 11:46 | jkkramer | http://datomic.com/ |
| 11:46 | TimMc | oh hey |
| 11:46 | neotyk | TimMc: just checking it out |
| 11:46 | scriptor | I hate to say this, but there is a lot of marketing talk on their website |
| 11:46 | neotyk | sorta db |
| 11:47 | neotyk | queries look like datalog :) |
| 11:48 | scriptor | so I guess by "moves ... into applications" they mean it's embeddable? |
| 11:48 | neotyk | oh wait it is datalog ... |
| 11:48 | Iceland_jack | I was wrong: Haskell's version actually maintains two lists and conses the value to the appropriate one |
| 11:49 | TimMc | Iceland_jack: Is there a clojure equivalent to how it maintains "state", or does it use some built-in for multiple-list generation? |
| 11:50 | Iceland_jack | It reduces a seperate function over the list |
| 11:51 | Iceland_jack | that function takes a predicate, a value to be tested and a tuple of two lists |
| 11:52 | TimMc | "Datomic is made available free of charge for applications that are open source." |
| 11:52 | Iceland_jack | In pseudocode: if (p x) then (x : true, false), else (true, x : false) |
| 11:52 | gf3 | hey guys |
| 11:52 | TimMc | Iceland_jack: I'll have to think on that. |
| 11:52 | gf3 | how do I truncate a sequence and still preserve the sequence type? |
| 11:53 | tmciver | This hype about this Datomic thing is the result of a mysterious tweet by Rich Hickey, yes? |
| 11:53 | gf3 | do I have to (into) it back into the original type? |
| 11:53 | TimMc | tmciver: yeo |
| 11:53 | TimMc | *yep |
| 11:53 | Iceland_jack | It's a fairly common idiom in Scheme/CL where you maintain an ‘aggregate’ function within the lexical scope of the main function |
| 11:54 | Iceland_jack | The auxilliary function in Haskell: |
| 11:54 | Iceland_jack | > select even 4 ([2], [1,3]) |
| 11:54 | Iceland_jack | ([4,2],[1,3]) |
| 11:55 | Iceland_jack | Then they reduce `select' partially applied to the predicate over a tuple with two empty lists ([], []) and the list |
| 11:57 | Iceland_jack | I didn't mean any offence, I was just curious; [(filter f s), (filter (complement f) s)] is perfectly readable |
| 11:57 | TimMc | Iceland_jack: other than the fact that fitler complement is remove. :-P |
| 11:57 | TimMc | so that's a bit silly |
| 11:57 | Iceland_jack | I know, I suppose the author has their reasons |
| 11:58 | Iceland_jack | ‘silly’ is probably an overstatement |
| 11:59 | gf3 | I'm sure this is common, non? |
| 11:59 | TimMc | gf3: empty |
| 12:00 | TimMc | gf3: Although you probably mean "collection", not "sequence". |
| 12:01 | gf3 | right |
| 12:01 | TimMc | &(empty [1 2 3]) |
| 12:01 | lazybot | ⇒ [] |
| 12:01 | gf3 | TimMc: so something like (into (empty x) (take n x)) |
| 12:02 | TimMc | Oh, you want to just get a portion of the original, I see. Not "truncate" in the SQL sense. |
| 12:02 | scriptor | ,(empty (cycle [1 2])) |
| 12:02 | clojurebot | () |
| 12:03 | gf3 | TimMc: right, would that be idiomatic? |
| 12:04 | gf3 | &(let [x [1 2 3 4 5]] (into (empty x) (take 3 x)))) |
| 12:04 | lazybot | ⇒ [1 2 3] |
| 12:04 | TimMc | If you don't know anything about the type, I guess that has to do. |
| 12:04 | gf3 | TimMc: sadly, I do not, I am accepting user input |
| 12:05 | TimMc | Hmm, looks like I was partially right about datomic -- a DB system that uses persistent data structures. |
| 12:06 | gf3 | TimMc: that sounds cool |
| 12:06 | TimMc | but it looks like the main point is actually the movement of querying from the server into the client |
| 12:07 | scriptor | so the data is combined with the client so that the client can query itself? |
| 12:07 | TimMc | I haven't finished skimming the whitepaper. |
| 12:08 | TimMc | The most important question I have so far is: How does one pronounce "datom"? |
| 12:08 | TimMc | "Datomic calls such atomic facts 'datoms'. |
| 12:09 | TimMc | " |
| 12:10 | Fossi | like atom, just with a d in front? |
| 12:10 | Fossi | ah, might be dee-atomic |
| 12:10 | scriptor | yea, same with atomic |
| 12:11 | redinger | long a |
| 12:11 | TimMc | day-tahm-ick |
| 12:11 | TimMc | day'-tum? |
| 12:11 | redinger | TimMc: Yes :) |
| 12:11 | tmciver | day-TimMc |
| 12:12 | TimMc | "My name is Rich Hickey, and I pronounce Datomic as 'Datomic'." |
| 12:12 | TimMc | tmciver: I like it. |
| 12:12 | scriptor | pfft, I'm going to stick with dah-tom |
| 12:13 | RickInGA | did some news come out about datomic? does anyone have a link? |
| 12:13 | TimMc | "In today's installment of Pronouncing Clever Tech Names 102, we'll cover Datomic, Linux, and PostgresQL." |
| 12:13 | scriptor | RickInGA: http://datomic.com/product/overview |
| 12:13 | RickInGA | thanks |
| 12:14 | scriptor | don't forget erlang and scala |
| 12:14 | scriptor | I still hold that erlang should be pronounced erlung |
| 12:14 | scriptor | sounds more elegant |
| 12:16 | TimMc | ibdknox: I find myself a little troubled by the binary search example in the Inventing on Principle talk. It's programming-by-experimentation, which entirely leaves out loop invariants and preconditions and suchlike. Made me twitchy. |
| 12:18 | dnolen | Hmm I wonder if there's any connection between Joseph M. Hellerstein's work and the ideas behind Datomic |
| 12:19 | TimMc | ibdknox: I still love the overall point of his talk, as well as his specific crusade, but I think "playing computer" will always be an important skill in programming, no matter what fantastic tools we have. |
| 12:20 | Iceland_jack | TimMc: sorry, what talk? |
| 12:21 | TimMc | Iceland_jack: http://vimeo.com/36579366 -- ibdknox implemented the live-edit side-scroller in CLJS |
| 12:22 | TimMc | (at least the important bits) |
| 12:22 | Iceland_jack | I had actually seen this one :) cheers, great work |
| 12:27 | the-kenny | What should I specify for "Project (Website)" in the Contributor Agreement? Github? |
| 12:29 | redinger | the-kenny: If you don't already have a project, just leave it blank |
| 12:30 | the-kenny | redinger: The "Contributing to Clojure" page says I should specify my Github username. Where? |
| 12:33 | TimMc | the-kenny: On mine I just wrote "Github: timmc" in one of the blanks |
| 12:33 | redinger | the-kenny: Yeah, just specify it in the username box |
| 12:34 | the-kenny | Ok, thanks :) |
| 12:38 | Iceland_jack | Another quick question, why do operations on strings in Clojure return lists? |
| 12:38 | Iceland_jack | ,(remove (partial = \a) "banana") |
| 12:38 | clojurebot | (\b \n \n) |
| 12:38 | Iceland_jack | while |
| 12:38 | Iceland_jack | > (remove #\a "banana") |
| 12:38 | Iceland_jack | "bnn" |
| 12:38 | Iceland_jack | in Common Lisp |
| 12:44 | dan_b | according to the cheat sheet, remove operates on a seq (i.e. lazy) and returns a seq |
| 12:44 | dan_b | I guess that "seq of string" is not a clojure concept: a seq is just a seq |
| 12:45 | Iceland_jack | (excuse lack of Clojure knowledge) :) |
| 12:45 | TimMc | Iceland_jack: 'remove calls 'seq on its argument, then does stuff with it |
| 12:45 | dnolen | Iceland_jack: because those are sequence operations, the string gets converted into a sequence first. if you want to work with strings directly (and more efficiently) look at clojure.string |
| 12:46 | Iceland_jack | I'm not worrying about efficiency :) Haskell also manages to operate on lists (strings are lists in Haskell) but to return lists of the same type back |
| 12:46 | Iceland_jack | So I'm just wondering why remove couldn't detect that it's argument was a string or something similar |
| 12:47 | TimMc | It could, but then it wouldn't be a simple seq-filtering fn. |
| 12:47 | Iceland_jack | hm I suppose |
| 12:47 | Iceland_jack | not that I mind (apply str …) |
| 12:47 | technomancy | haskell controls the string type |
| 12:47 | TimMc | there's that |
| 12:47 | technomancy | and Clojure strings are Java strings because otherwise interop would be hell |
| 12:49 | Iceland_jack | hm of course there's the interop, I suppose I'm just thinking out loud |
| 12:50 | dan_b | does clojure have builtin support for optional args, or is the (fn [& [arg]] ...) destructure-the-rest-arg idiomatic? |
| 12:50 | dan_b | or option (c) something else entirely |
| 12:50 | technomancy | dan_b: if you need arity checking you can use multiple arglists |
| 12:50 | pfedorow | hi guys, how do i add a new line in the repl with paredit mode on? |
| 12:50 | Iceland_jack | take 4 "banana" ⇒ "bana" is just a bit more intuitive than (apply str (take 4 "banana")) |
| 12:50 | Iceland_jack | thanks for the answers though :) |
| 12:51 | dan_b | technomancy: er, duh, yes. why didn;t I think of that? thanks |
| 12:52 | nizze | Hello! |
| 12:52 | technomancy | Iceland_jack: in general consistency is valued over intuitiveness in Clojure |
| 12:52 | technomancy | because consistency is absolute and intuitiveness is relative |
| 12:53 | TimMc | hrm |
| 12:53 | Iceland_jack | I suppose, but I don't view the two as mutually exclusive in this case |
| 12:53 | TimMc | slightly dubious |
| 12:53 | nizze | I'm studying Clojure and I find loop/recur somehow ugly. It seems like it's a hack on top of the whole thing, it seems that is does not belong there. Have I misunderstood something? |
| 12:53 | dnolen | Iceland_jack: no question. But Haskell has it's own strings. |
| 12:54 | technomancy | nizze: if you find yourself actually using loop/recur it's usually a sign that you're missing a built-in function that would do a better job |
| 12:55 | nizze | technomancy: that's what I've been guessing. So it's not usual in real world clojure code? |
| 12:55 | technomancy | nizze: it's basically only used for I/O |
| 12:55 | ibdknox | TimMc, I agree to some extent |
| 12:55 | ibdknox | The example he gives is pretty contrived |
| 12:55 | nizze | technomancy: Okay. |
| 12:55 | ibdknox | TimMc, the hard part of programming in most fields isn't algorithmic |
| 12:56 | TimMc | There's that too. :-) |
| 12:56 | ibdknox | one of the best parts of my time at MSFT was the end to end user study I did of VS |
| 12:56 | ibdknox | I spent hundreds of hours behind a one way mirror watching people solve problems |
| 12:57 | ibdknox | know what the greatest indicator of programming ability was? |
| 12:57 | TimMc | beards |
| 12:57 | technomancy | dvorak |
| 12:57 | ibdknox | haha if only ;) |
| 12:57 | nizze | TimMc: lol! |
| 12:57 | ibdknox | how accurate of a mental model they could hold in their head |
| 12:57 | duck1123 | Beards are usually a pretty good indicator |
| 12:57 | ibdknox | nothing else seemed to really matter |
| 12:58 | RickInGA | i have heard that code indentation correlates with fewer bugs. |
| 12:58 | Iceland_jack | ibdknox: How to you compare accuracy of mental models? :) |
| 12:58 | ibdknox | Iceland_jack, ask them questions |
| 12:58 | RickInGA | that people who take the time to make the code look presentable also take the time to make it work right |
| 12:58 | ibdknox | it's also pretty obvious once you watch them try to use the knowledge to solve programming issues |
| 12:59 | Iceland_jack | Not that I'm surprised by that result mind you |
| 12:59 | RickInGA | I read a couple of weeks ago of a study where people could predict accurately how people would do in computer science programs by the answers they gave them on a 5 question test. |
| 12:59 | ibdknox | yeah, the notion of assignment |
| 12:59 | raek | ibdknox: that's very interesting... |
| 12:59 | Iceland_jack | the term was just a bit vague, have you got an example of some of the questions? |
| 13:00 | RickInGA | ibdknox yeah, even if their answers were wrong, the people who answered consistantly did better than the people who were inconsistant |
| 13:01 | ibdknox | they were specific to the tasks they were given. They largely had to do with where bugs might be or how you'd change something |
| 13:01 | ibdknox | to prove a point I put one of our best devs in the room to do the same set of things |
| 13:02 | ibdknox | he's probably one of the better developers in the world :) It was fun to watch him |
| 13:02 | Iceland_jack | Can you say what the test was for ibdknox? Also how the results could be applied to teaching CS (or in general) |
| 13:03 | ibdknox | It was a thing developed in combination with CMU designed to assess programming aptitude, don't remember what it's called though. It might've been internal only |
| 13:03 | TimMc | ibdknox: I'd love to be around when we figure out the neurobiology of high-level thought, such as holding and manipulating a mental model of some algorithm. This is not stuff we really evolved for... |
| 13:03 | dan_b | so *that*'s why 'unless' was being indented weirdly |
| 13:03 | ibdknox | you weren't supposed to be able to finish it. Matt (our dev) finished it with 30 minutes left. |
| 13:03 | Iceland_jack | Go Matt! |
| 13:04 | ibdknox | to put that into perspective, of the hundreds of people who have taken it, he's the only one to have finished |
| 13:04 | ibdknox | and he actually did more than was asked haha |
| 13:04 | ibdknox | TimMc, I agree, I've always been fascinated by psychology |
| 13:05 | Iceland_jack | Any idea how that could be applied to teaching? |
| 13:05 | ibdknox | I have some ideas that I'd like to put into practice at some point |
| 13:05 | Iceland_jack | Asking students to describe the problem set/space of a task? |
| 13:06 | TimMc | My guess is that the skill is based on holding complex *social* models in our heads. |
| 13:06 | ibdknox | I think the primary one is that in order to teach people you have to steep them in things they don't understand and get them to learn how to intuit |
| 13:06 | Iceland_jack | > […] get them to learn how to intuit |
| 13:06 | nizze | What is filter's counter operation, like reject |
| 13:06 | Iceland_jack | that's very tricky |
| 13:06 | Iceland_jack | nizze: remove |
| 13:06 | ibdknox | yes it is |
| 13:06 | nizze | Thanks. |
| 13:06 | ibdknox | the first step is tinkering |
| 13:06 | ibdknox | that's how you build models |
| 13:07 | ibdknox | eventually you can do the tinkering in your head |
| 13:07 | TimMc | I think a certain amount of that approach depends on personality (?) types. |
| 13:07 | ibdknox | TimMc, it does |
| 13:07 | Iceland_jack | Getting people to tinker/experiment by ‘instruction’ is close to impossible in my experience |
| 13:07 | ibdknox | I've had moderate success |
| 13:07 | Iceland_jack | A bit like telling your kid “here, learn how to program; get interested!” |
| 13:08 | ibdknox | haha, well of course you have to want to learn |
| 13:08 | ibdknox | that is definitely true |
| 13:08 | TimMc | For example, when I was in elementary school, I would read Science News magazine. I didn't understand most of it, but eventually I would read enough to load a fairly accurate model of a topic into my head, and things would start clicking into place. |
| 13:08 | RickInGA | did you guys see the piece over the weekend, "How not to each programming"? it was on hn |
| 13:08 | nizze | Is it "normal" to find this hard to read: http://pastie.org/3527637 |
| 13:08 | nizze | ? |
| 13:08 | Iceland_jack | you can also be interested in something but still have no interest in learning about it from an external influence |
| 13:09 | ibdknox | TimMc, every "smart" person I've ever met did the same thing |
| 13:09 | xeqi | Iceland_jack: I remember seeing some papers on this, search for "Dehnadi mental model" and a few will come up |
| 13:09 | TimMc | ibdknox: But that's just one kind of "smart". |
| 13:09 | Iceland_jack | nizze: try mentally replacing “apply +” with “sum” |
| 13:09 | Iceland_jack | xeqi: (thanks I'll check it out) |
| 13:10 | Iceland_jack | nizze: Should the function be nullary or is that a mistake? |
| 13:10 | TimMc | nizze: I would put a line break before (count users) |
| 13:10 | nizze | Iceland_jack: The apply + is nice trick :) It's like folder + list in haskell |
| 13:10 | nizze | Okay, I get confused by such a deep nesting level. Is this something that I get used to over the time? |
| 13:10 | Iceland_jack | folding is very neat |
| 13:10 | dan_b | I would describe it as hard to read in the same way as a mathematical formula is hard to read |
| 13:10 | Iceland_jack | but you've got to watch out for the edge cases :) |
| 13:11 | dan_b | it's more information-dense and you can't just scan it like a para of text, but with that density comes precision |
| 13:11 | raek | nizze: putting the (count users) part on its own line would make it easier to parse (for a human), IMHO |
| 13:11 | TimMc | ibdknox: A really, really important skill is model abstraction -- being able to lock off parts as bloack boxes with invariants/constracts. |
| 13:11 | Iceland_jack | Generally not a problem in Lisps but with Haskell…: |
| 13:11 | Iceland_jack | > foldl1 (+) [] |
| 13:11 | dan_b | raek: good point |
| 13:11 | Iceland_jack | *** Exception: Prelude.foldl1: empty list |
| 13:11 | TimMc | and knowing when to open them again! |
| 13:12 | nizze | Hmm, so would it be okay to use let to alias things? |
| 13:12 | TimMc | sure |
| 13:12 | raek | (a (b (c (d (e f))))) is okay to scan, but (a (b (c (d (e f))) x)) is much harder |
| 13:12 | raek | (a (b (c (d (e f))) |
| 13:13 | raek | x)) |
| 13:13 | Iceland_jack | I almost added the parentheses from reflex 8) |
| 13:13 | raek | alignment often helps to reveal the structure |
| 13:13 | nizze | Is "->" (threading?) a bad practice / non-idiomatic clojure? |
| 13:13 | lucian | nizze: not at all |
| 13:13 | technomancy | threading is wunderbar |
| 13:13 | dan_b | I hope it's idiomatic cos I've never seen it anywhere else |
| 13:13 | lucian | nizze: although in some cases it makes code worse, not better |
| 13:14 | Iceland_jack | nizze: a good practice but depends on the problem (like everything) |
| 13:14 | lucian | dan_b: CL and scheme have similar macros |
| 13:14 | nizze | Okay :) |
| 13:14 | lucian | and haskell achieves similar results with point-free style |
| 13:14 | TimMc | threading *can* make it easy to lose track of exactly what data is being threaded through at various points. |
| 13:14 | nizze | As I'm starting to code clojure do I have to pay any attention to laziness? |
| 13:14 | dan_b | lucian: what's it called in CL? |
| 13:14 | lucian | dan_b: dunno, i just remember reading it has it |
| 13:15 | dan_b | * (-> #'oddp (lambda (x) (* 3 x)) 4) |
| 13:15 | dan_b | debugger invoked on a UNDEFINED-FUNCTION in thread #<THREAD "initial thread" RUNNING {100270E011}>: |
| 13:15 | raek | nizze: for purely function code, you don't have to care about it very much. it's when you get to code with side-effects it gets surprising |
| 13:15 | technomancy | gotta love all the yelling CL does |
| 13:15 | nizze | Okay. Is laziness built into language or is it a macro/library feature? |
| 13:16 | lucian | dan_b: i has some composition macros that achieve the same result, i think |
| 13:16 | dan_b | WHAT'S WRONG WITH UPPERCASE HUH? |
| 13:16 | lucian | nizze: it can be both |
| 13:16 | Iceland_jack | nizze: check out (source lazy-seq) |
| 13:16 | nizze | lucian: okay, so part there, part here :) |
| 13:16 | lucian | nizze: it generally is a language feature, or at least starts there |
| 13:16 | dan_b | lucian: I only ask because I've spent many years doing CL and I'm surprised not to have seen it there |
| 13:17 | lucian | dan_b: ah. i don't know much about cl, but i do remember seeing people preferring to mutate something several times instead |
| 13:17 | raek | nizze: some of the laziness stuff happens to be implemented in java with some macro sugar, but I don't see any theoretical reason it could't be implemented in clojure |
| 13:17 | nizze | dan_b: How do you think Clojure compares to CL (without the Java interop and the library goodness)? |
| 13:18 | Iceland_jack | raek: It can be implemented in Common Lisp :) |
| 13:18 | lucian | nizze: you're asking that in a biased channel :) |
| 13:18 | dan_b | nizze: I've only been doing clojure for about a week, it's probably still too soon to say |
| 13:18 | Iceland_jack | there is a library that provides laziness called CLAZY (there's that yelling again) :] |
| 13:18 | nizze | I know, I'll subtract some bias points :D |
| 13:18 | technomancy | CL doesn't have as much emphasis on consistency of argument order; I imagine that makes -> and ->> less useful |
| 13:19 | Iceland_jack | nizze: (if we know you're antibiased we'll have to get even more biased!) |
| 13:19 | dan_b | case-sensitivity is good, square brackets are ugly, uniform seqs rather nice, and I'm not missing pathnames |
| 13:19 | nizze | Iceland_jack: :D |
| 13:19 | lucian | dan_b: i love the literals |
| 13:19 | Iceland_jack | But I'm a big fan of Common Lisp, relatively new to Clojure |
| 13:19 | dan_b | but we really are talking about first impressions so far. when I get something big enough thath I'd use CLOS in CL I'll have a better idea |
| 13:19 | lucian | dan_b: especially [ ] used in syntax for things that aren't calls |
| 13:20 | Iceland_jack | And Common Lisp is starting to show its age |
| 13:20 | lucian | what i hate most about CL is Lisp-2, and i hate that a lot |
| 13:20 | nizze | dan_b: I find your opinion regarding [] odd. Rich said in some presentation that the problem with Scheme / CL is that () are overloaded. |
| 13:20 | nizze | dan_b: Don't you feel that way? |
| 13:20 | dan_b | the biggest problem with CL imo is that it is a platform not a language |
| 13:20 | lucian | nizze: people who have seen ( ) for a long time are likely to disagree |
| 13:21 | nizze | lucian: Okay :) |
| 13:21 | dan_b | interop with the host platform (see e.g. pathnames, gui, sockets) never really its strong point |
| 13:21 | lucian | there's something to be said for a little more syntax |
| 13:21 | AimHere | Is there any real problem with [] or {} - it's just syntactic sugar for (vector ...) or whatever anyways |
| 13:21 | dan_b | and I say that as the original author of trivial-sockets, bordeaux-threads and the cliki |
| 13:21 | AimHere | Just go back to () style if it upsets you |
| 13:21 | Iceland_jack | Persistent data structures are a great feature, Common Lisp is rather lacking RE: functional programming |
| 13:21 | technomancy | AimHere: it's just not what people are used to. same "problem" java fans have coming to any lisp. |
| 13:22 | lucian | technomancy: there are java fans? |
| 13:22 | Iceland_jack | lucian: :þ |
| 13:23 | lucian | technomancy: you're probably right, there is such a thing as C++ fans, or so i've heard |
| 13:23 | nizze | Okay, I understood that part of Lisp's power comes from ability to access read table. Why isn't clojure providing access to it? |
| 13:23 | technomancy | lucian: there was a guy who said he liked make on the leiningen user survey; nothing can shock me now. |
| 13:23 | Iceland_jack | nizze: I believe Rich didn't want people to create their custom syntax |
| 13:23 | Iceland_jack | I personally love the Common Lisp reader |
| 13:24 | dan_b | I would like the cl reader more if you could easily customize it *per-package* |
| 13:24 | Iceland_jack | that would prove a bit tricky though |
| 13:25 | dan_b | otherwise you pull in three other people's packages into your project and find you have two conflicting #u macros |
| 13:25 | nizze | Whoa! I must say that level of sophistication on this (and Haskell) channel is astounding. I've rarely had as good conversations about these kind of things. |
| 13:25 | dan_b | maybe per-source-file or something then. scoped in some way at least |
| 13:25 | lucian | dan_b: really? i thought those were namespaced |
| 13:25 | jsabeaudry | Somehow it would seem the :hooks [leiningen.cljsbuild] seems to cause problem. |
| 13:26 | dan_b | in retrospect, maybe I could have added that to asdf |
| 13:26 | Iceland_jack | dan_b: I suppose you /could/ have conditioned imports of reader syntax... not sure how that would work in practice |
| 13:26 | Iceland_jack | nizze: (thanks) |
| 13:26 | lucian | #haskell scares me a little |
| 13:27 | lucian | i mostly agree with not having reader macros, now |
| 13:30 | Iceland_jack | I love Lisp and Haskell is my mistress if anything, but I'm repeatedly surprised at Haskellers wondering “why Haskell isn't mainstream!” while it feels like they're working against it at times... |
| 13:32 | TimMc | technomancy: Make is the PHP of build tools. |
| 13:32 | TimMc | Dead easy to get started, gets tricky once you get a lot of it in a pile. |
| 13:32 | Iceland_jack | TimMc!! |
| 13:33 | TimMc | ...and damn useful for one-offs. |
| 13:33 | dan_b | the irony there is that make is a declarative system that probably replaced a lot of even gnarlier imperative shell scripts |
| 13:33 | ibdknox | TimMc, yeah, abstraction or more generally knowing what to focus on is arguably one of the most important meta-skills |
| 13:33 | TimMc | ibdknox: And you have thoughts on how to teach those? :-) |
| 13:34 | ibdknox | I spent most of my younger years learning how to learn them :) |
| 13:34 | ibdknox | it's how I got through college without reading a single thing :D |
| 13:34 | ibdknox | with 3 jobs lol |
| 13:35 | Iceland_jack | ibdknox: 3 jobs? Props |
| 13:35 | ibdknox | paid for all of it myself :) |
| 13:36 | ibdknox | TimMc, there's a decent book on some of it. Refactoring your wetware |
| 13:36 | ibdknox | TimMc, http://pragprog.com/book/ahptl/pragmatic-thinking-and-learning |
| 13:36 | ibdknox | it takes more of a software spin on it |
| 13:36 | ibdknox | but the ideas are universally applicable |
| 13:38 | ibdknox | I've always been of the opinion that meta-skills are the key to basically everything |
| 13:39 | dan_b | there is no problemin comiter science that can't be solved by another layer of meta |
| 13:39 | dan_b | er, pardon lousy typing |
| 13:39 | Iceland_jack | And no problem that can't be solved by removing one :) |
| 13:42 | TimMc | dan_b: I would say s/meta/indirection/ |
| 13:43 | ibdknox | yeah, those two aren't the same thing |
| 13:43 | dan_b | i think the original quote was "Indirection", yes |
| 13:43 | Iceland_jack | dan_b: (meta is an indirection on indirection) |
| 13:43 | ibdknox | lol |
| 13:44 | Iceland_jack | Two years ago I had accepted that Lisp had had it's moment though |
| 13:44 | Iceland_jack | *its |
| 13:45 | dan_b | Iceland_jack: that's not far off my own timescale. two years ago I decided I needed to stay employable and learned Ruby |
| 13:45 | Iceland_jack | and I thought of FORTH or APL... |
| 13:45 | Iceland_jack | Yeah |
| 13:46 | Iceland_jack | But now Clojure is doing surprisingly well |
| 13:46 | ibdknox | The way I see it, there's money in efficiency |
| 13:46 | ibdknox | and Clojure is amazingly efficient |
| 13:47 | TimMc | ibdknox: You're speaking of both programmer and program efficiency, yes? |
| 13:47 | TimMc | Or perhaps more of the former? |
| 13:47 | ibdknox | More the former |
| 13:47 | TimMc | You project manager, you! |
| 13:47 | ibdknox | ;) |
| 13:47 | dan_b | I still have a hard time conceiving of anything that runs on the jvm as machine-efficient, but my experience of java 1.0 and 1.1 may mave prejudiced me |
| 13:48 | ibdknox | the JVM is very efficient actually |
| 13:48 | jodaro | it has come a long way, baby |
| 13:48 | Iceland_jack | Trying to determine ‘why’ a programming language did well is a difficult (downright impossible?) task |
| 13:49 | SirDinosaur | anyone else disappointed that datomic isn't open source? |
| 13:49 | ibdknox | too many factors, too many of which are cultural |
| 13:49 | mtm | yes, very |
| 13:49 | dan_b | what chance it'll be open sourced later when the early adopters have given iut a good pummeling? |
| 13:49 | TimMc | SirDinosaur: Not me. It's surely spinning off open-source stuff as we speak. |
| 13:50 | ibdknox | they need to work on their marketing a bit |
| 13:50 | technomancy | SirDinosaur: more just annoyed at how much attention it's getting than anything else |
| 13:50 | TimMc | ibdknox: Such as actually maybe explaining what it is on the front page? |
| 13:50 | ibdknox | reading their site I don't understand what it is |
| 13:50 | ibdknox | TimMc, yes |
| 13:50 | TimMc | Had to poke around. The whitepaper helped... |
| 13:51 | ibdknox | you have about 2-3 sentences on average |
| 13:51 | ibdknox | they lost most people with their current copy |
| 13:51 | ibdknox | even ones who are interested :) |
| 13:51 | TimMc | "Datomic moves powerful data manipulation capabilities, and the data itself, into applications, coupling them with a sound and flexible data model. OH LOOK A SQUIRREL!" |
| 13:51 | ibdknox | haha the video is 20 minutes long |
| 13:52 | jodaro | watching now |
| 13:52 | ibdknox | it's sad, because I'm sure there's *really* cool stuff happening here |
| 13:52 | SirDinosaur | technomancy: everything rich hickey does now gets a lot of attention |
| 13:53 | dan_b | what's the current state of machine transcription, and how long before I can use it to avoid sitting through other peoples videos? |
| 13:53 | ibdknox | dan_b, you're not ken wesson are you? ;) |
| 13:53 | dan_b | heh. no |
| 13:53 | TimMc | redinger: "A cloud-scaled DB system that moves query capability directly into the client" |
| 13:53 | dan_b | that was the first thread I saw on the clojure lst, though |
| 13:53 | ibdknox | TimMc, that still doesn't make sense |
| 13:53 | ibdknox | lol |
| 13:54 | TimMc | ibdknox: It's probably not correct, either. |
| 13:54 | dan_b | "My real name is Stuart Halloway, and I have the ability to remove people from this mailing list" |
| 13:54 | Licenser | what is the current best way when you want to compile clojurescript for node.js / pure web applications |
| 13:54 | ibdknox | dan_b, haha welcome to the party ;) |
| 13:54 | TimMc | Oh, and "cloud-scaled" is BS that I just made up with my marketing markov model. |
| 13:54 | ibdknox | lol |
| 13:55 | dan_b | 'No match for "CLOUDSCALED.COM" ': quick, register the domain name |
| 13:55 | ibdknox | Actually this is a great example of where meta-skills would've helped |
| 13:55 | ivan | dan_b: I use VLC to watch Hickey at 1.3x-1.4x and some other people at 1.7x |
| 13:55 | ibdknox | smart people, especially engineers, have a hard time explaining what they make lol |
| 13:55 | TimMc | QFT |
| 13:56 | ibdknox | Quantum Field Theory? |
| 13:56 | TimMc | Either "Quoted For Truth" (in bulletin boards) or "Quite Fucking True". |
| 13:57 | TimMc | General indicator of complete agreement. |
| 13:57 | ibdknox | ah, no physics then |
| 13:57 | ibdknox | :) |
| 13:57 | Iceland_jack | ibdknox: “Quantum Field Theory” sounds like the next thing for Haskell, once Category Theory and System F become too mainstream ;) |
| 13:57 | TimMc | Sorry, no. I still need to learn tensor algebra. |
| 13:58 | ibdknox | dev appliance is a terrible name |
| 13:58 | ibdknox | it makes me think of a toaster |
| 13:59 | jodaro | and you hate toast? |
| 13:59 | ibdknox | I love toast |
| 13:59 | ibdknox | but toasting my data sounds bad |
| 13:59 | jodaro | you love toast, but you hate bread |
| 14:00 | Iceland_jack | lol, Data Toasting |
| 14:00 | jodaro | and |
| 14:00 | jodaro | its only a 447MB download |
| 14:00 | Iceland_jack | sounds like there should be a Wikipedia Entry on that |
| 14:00 | jodaro | wait |
| 14:00 | ibdknox | I wonder if the noir wikipedia entry is still there |
| 14:00 | jodaro | no github repo to clone? |
| 14:00 | Iceland_jack | ibdknox: it is |
| 14:01 | ibdknox | no point in filling it out though |
| 14:01 | twhume | A stylistic/philosophical question for you: I'm writing my first proper Clojure app. I've done a fair bit of non-functional programming before. It looks to me like my app will be composed of a huge number of well-specified and clear functions - many more than I would've naturally written in, say, Java. Is that the way of things with Clojure? Or is it just the way I'm doing it, do you think? |
| 14:01 | jsabeaudry | Does clojure mode reload the file automatically when saving now? |
| 14:01 | Iceland_jack | twhume: tricky question imo |
| 14:01 | ibdknox | jodaro, not open source |
| 14:02 | jodaro | i know, i was being a dick about it |
| 14:02 | Iceland_jack | some things you'd use looping statements for in Java you'd use (higher-order) functions in Clojure/CL |
| 14:03 | dgrnbrg | ibdknox: I am trying to get your lein-nailgun plugin, and I have it as a dev dependency on version 1.1.1 w/ the path as org.clojars.ibdknox/lein-nailgun, but it fails w/ an artifactsnotfound exception |
| 14:03 | ibdknox | I should've started my product consultancy, that would've been fun probably |
| 14:03 | twhume | iceland_jack: thanks. I'm quite early into learning it, but keen to get into good habits now. I'm finding I write lots of very small functions, unit test them, and then chain them together. My general feeling is that the individual bits are thus well-testing, but I'll need to get better at looking across large chains of function calls to get an overview of what my code's doing. Does that make sense to you? |
| 14:03 | ibdknox | dgrnbrg, gist of the project.clj? |
| 14:04 | Iceland_jack | twhume: First of all, a lot of the functions you might write could be anonymous functions or accomplished via predefined operators |
| 14:04 | dgrnbrg | no can do…but the dev-dependency is [org.clojars.ibdknox/lein-nailgun "1.1.1"] |
| 14:04 | dgrnbrg | it's just from lein new |
| 14:04 | ibdknox | wierd |
| 14:04 | ibdknox | weird* |
| 14:05 | ibdknox | that should work |
| 14:05 | twhume | iceland_jack: so would what I'm doing be considered poor, stylistically? Or forgivable for a beginner? |
| 14:05 | Iceland_jack | I can't tell! I'd have to see some code |
| 14:05 | dgrnbrg | ibdknox: do you have other versions on clojars I could try to grab? |
| 14:05 | SirDinosaur | twhume: it should be clear what your program does by looking at the "top-most" function. functions should be used as abstractions |
| 14:05 | Vinzent | twhume, yeah, I think clojure forces you to writing much more little functions than in java, and it's a good thing |
| 14:06 | Iceland_jack | Speaking of code, every time you use a Clojure function wonder how it's implemented and check (source <fn>) to see whether your intuition was right |
| 14:06 | cacodaemon | ibdknox, why example code on start page of sqlkorma.com uses :username option and not :user ? |
| 14:06 | Iceland_jack | Also read, read, read source code |
| 14:06 | ibdknox | dgrnbrg, http://clojars.org/repo/org/clojars/ibdknox/lein-nailgun/1.1.1/ |
| 14:06 | ibdknox | dgrnbrg, it's there |
| 14:06 | dgrnbrg | I'm trying to get it from behind a proxy |
| 14:07 | dgrnbrg | is there a way to prime my .m2/repositories with a raw maven command, and then re-try lein deps? |
| 14:07 | TimMc | twhume, Iceland_jack: Don't put too much stock in the implementation details of clojure.core functions -- there's some nasty bootstrapping code in there, although mostly near the top. |
| 14:07 | ibdknox | cacodaemon, ah just a typo in the example |
| 14:07 | Iceland_jack | twhume: sure :) but it's still a good way to learn |
| 14:07 | Iceland_jack | oops, TimMc |
| 14:07 | twhume | TimMc: so what's a good reference? Def. a good idea, I should do more of that. |
| 14:07 | TimMc | I'm not sure, actually. |
| 14:08 | ibdknox | dgrnbrg, not if you just put it in the right folder structure it'll work |
| 14:08 | ibdknox | dgrnbrg, -not |
| 14:08 | dgrnbrg | ibdknox: I think I'm going to have lots of proxy issues |
| 14:09 | dgrnbrg | I have my http_proxy set up, and mvn can get its packages too, but lein seems to be struggling w/ the packages now |
| 14:10 | technomancy | dgrnbrg: lein pom && mvn dependency:tree ought to do it |
| 14:11 | dgrnbrg | :) :) :) |
| 14:11 | dgrnbrg | that worked |
| 14:11 | dgrnbrg | why doesn't lein work? |
| 14:11 | twhume | Thanks all :) |
| 14:11 | dgrnbrg | technomancy: I don't mean that to be accusatory--lein is the best build system I've ever used |
| 14:11 | dgrnbrg | so I'm trying to get it into my proxy-restricted environment |
| 14:11 | technomancy | dgrnbrg: basically because nobody who uses proxies has submitted any patches |
| 14:12 | dgrnbrg | technomancy: does lein respect .m2/settings.xml? |
| 14:13 | technomancy | dgrnbrg: some of the settings are picked up, but only by accident |
| 14:13 | dgrnbrg | I think that if the security/proxy settings got picked up, that'd solve my problem. Do you think that's any easy thing to do, or particularly hard? |
| 14:14 | technomancy | I don't know, but fixing it for 1.x will not fix it for 2.x |
| 14:14 | technomancy | since the underlying library changed |
| 14:14 | dgrnbrg | i see |
| 14:14 | dgrnbrg | i'll wait for it to stabilize |
| 14:15 | dgrnbrg | in the meantime, i finally have a workaround |
| 14:15 | dgrnbrg | thank you! |
| 14:15 | technomancy | sure |
| 14:15 | technomancy | FWIW lein2 is pretty much already stabilized |
| 14:17 | tylergillies | is it gonna be called lein2 or is that just the version number? |
| 14:17 | technomancy | you can save the script as anything you like =) |
| 14:17 | tylergillies | i also like the colour green |
| 14:17 | TimMc | you can call it anything but late-for-dinner.sh |
| 14:18 | technomancy | I've been symlinking it as lein2 for now because I'm keeping 1.x around, but I'll probably swap it up |
| 14:26 | y3di | ibdknox: do you know if datomic.com is built in clojure(noir) |
| 14:26 | ibdknox | almost guaranteedly not noir |
| 14:27 | y3di | whyd you assume that? |
| 14:27 | technomancy | he hasn't been getting pings from his secret backdoor phone-home routines |
| 14:27 | ibdknox | they don't tend to take dependencies on other people's things. They wouldn't even use lein for a long time |
| 14:28 | ibdknox | plus I don't think they like me very much :) |
| 14:28 | jweiss_ | any slime/emacs users ever get ";; Evaluation aborted." at the repl, but no sldb stacktrace frame? if I run (/1 0) i get one, but the code i'm trying to test just aborts with no info |
| 14:28 | dgrnbrg | is "they" reliance? |
| 14:28 | ibdknox | though as technomancy points out, my red phone hasn't been beeping |
| 14:28 | ibdknox | actually.. I did just get a really weird email though lol |
| 14:28 | ibdknox | that warrants red phone beeping |
| 14:28 | technomancy | jweiss_: usually a problem with the stacktrace rendering |
| 14:29 | ibdknox | y3di: it's most likely ClojureScript One |
| 14:30 | dgrnbrg | ibdknox: is "they" who don't like you "reliance"? |
| 14:30 | hhutch | ibdknox: i have to say, i discovered the fetch + lein-cljsbuild combo last week, and I am blown away... |
| 14:30 | jodaro | so has anyone set it up yet? |
| 14:30 | jodaro | datomic i mean |
| 14:30 | jweiss_ | technomancy: in the slime-events buffer, i see (:debug-return 2 1 nil) (:return (:abort) |
| 14:31 | jweiss_ | 27) |
| 14:31 | hhutch | I can't really figure out the flow of cljs-one, but lein-cljsbuild + fetch + jayq is really great |
| 14:31 | jweiss_ | looks like the exception doesn't even come back from swank |
| 14:32 | `fogus | ibdnox: Not true. Like everyone, they are amazed by you. |
| 14:32 | SirDinosaur | asked if there were any plans to open source datomic in #datomic: |
| 14:32 | SirDinosaur | 11:18 < rhickey> SirDinosaur: There are no plans to open source Datomic at this time |
| 14:33 | SirDinosaur | just wanted to make sure.. but :( |
| 14:34 | ibdknox | hhutch: I'm glad :) My hope was that it would be easily digestable |
| 14:35 | gf3 | so, I guess my clojure pastebin is live, guys |
| 14:35 | gf3 | http://cljbin.com/ |
| 14:35 | gf3 | http://news.ycombinator.com/item?id=3667954 |
| 14:36 | ibdknox | it's very pretty :) |
| 14:36 | SirDinosaur | ibdknox: i agree with hhutch, thanks |
| 14:36 | `fogus | What is this "fetch thing"? |
| 14:36 | pipeline | it's both faster and handsomer than ideone.com |
| 14:36 | gf3 | ibdknox: thank you |
| 14:37 | ibdknox | `fogus: a very simple library to do rpc/xhr between noir and cljs |
| 14:37 | gf3 | `fogus: ohai! |
| 14:37 | ibdknox | `fogus: part of my yet unnamed cljs suite of things: http://www.chris-granger.com/projects/cljs/ |
| 14:37 | `fogus | Sorry, I meant "fetch + lein-cljsbuild combo" |
| 14:37 | `fogus | ? |
| 14:37 | `fogus | I already knew about fetch |
| 14:37 | ibdknox | oh, that I'm not sure about |
| 14:38 | hhutch | `fogus: https://github.com/hhutch/hutch-web |
| 14:38 | ibdknox | `fogus: did you see noir-cljs came back? You can now do my game demo from emacs/vim :) |
| 14:38 | `fogus | YAY! Marg made the cut! :-) |
| 14:39 | hhutch | `fogus: i just have 'lein cljsbuild auto' running while I work in emacs+clojure-jack-in ... so any CLJS code writes get auto compiled |
| 14:39 | hhutch | it's not browser-repl like clojurescript one |
| 14:39 | ibdknox | hhutch: CLJS one will do that too :) |
| 14:39 | hhutch | but this workflow makes a little more sense to me |
| 14:40 | dnolen | gf3: wow NICE |
| 14:40 | gf3 | dnolen: thank you! |
| 14:40 | hhutch | ibdknox: yeah, i know, it's just I haven't quite understood how one goes about building a production app in cljsone |
| 14:41 | hhutch | i have to spend more time in it |
| 14:41 | ibdknox | yeah |
| 14:41 | Vinzent | gf3, looks very cool! |
| 14:42 | ibdknox | unfortunately it got voting ringed I think |
| 14:42 | ibdknox | none of us can vote on stuff anymore |
| 14:42 | ibdknox | I asked around |
| 14:42 | ibdknox | apparently the smallest valid voting ring is only 4 people :( |
| 14:42 | dgrnbrg | technomancy: is there a way that I can tell a lein project which jvm to use? |
| 14:42 | technomancy | `fogus: is there anything specific blocking a lein-marg 0.7.0 release? |
| 14:42 | technomancy | dgrnbrg: you can set the JAVA_CMD environment variable |
| 14:43 | technomancy | dgrnbrg: there's an open ticket to allow that to be set in project.clj; if you want a leiningen sticker you should submit a patch before someone else snatches it up! |
| 14:43 | gf3 | Vinzent: thanks! |
| 14:43 | dgrnbrg | technomancy: does lein's build functionality use the programmatic compiler APIs, so that setting the java_cmd is sufficient to make my whole project use a different version? |
| 14:44 | technomancy | dgrnbrg: it has to launch a subprocess, but it will honor JAVA_CMD for the subprocesses |
| 14:44 | dgrnbrg | cool, thanks! |
| 14:44 | dnolen | ibdknox: sux |
| 14:44 | ibdknox | it's a bit ridiculous |
| 14:44 | dgrnbrg | technomancy: I'd love to contribute to lein, but my job makes it hard :( |
| 14:44 | ibdknox | 4 people? |
| 14:44 | ibdknox | the probability that that happens is very high |
| 14:45 | technomancy | dgrnbrg: even for four lines? |
| 14:45 | dgrnbrg | technomancy: only if I want to spend 1-2hrs in meetings discussing whether it's an IP leak |
| 14:45 | technomancy | gross |
| 14:46 | `fogus | technomancy: I think just one keyword bug. I'll 2x check |
| 14:46 | dgrnbrg | technomancy: do you require clojure contributor agreement, or can I just git pull request? |
| 14:46 | technomancy | `fogus: would be nice to have a lein2-compatible version once the leiningen preview comes out in a few days |
| 14:46 | technomancy | dgrnbrg: heh; please use a pull request |
| 14:46 | `fogus | technomancy: When would you like it? |
| 14:46 | technomancy | I will never require paperwork for people who want to help me out. |
| 14:47 | dgrnbrg | technomancy: that makes it easier, then :) |
| 14:47 | technomancy | dgrnbrg: this change is so small that it's probably not even subject to copyright in the US |
| 14:47 | ibdknox | technomancy: are you sure? Paperwork could be fun. "In order to submit a pull request, please do this crossword puzzle" |
| 14:47 | technomancy | `fogus: any time this week would be super |
| 14:47 | `fogus | technomancy: It shall be |
| 14:48 | technomancy | `fogus: thanks |
| 14:48 | technomancy | ibdknox: you do have to run some obfuscated code to get a sticker |
| 14:48 | dgrnbrg | technomancy: is java_cmd used by other java applications, or is that just for lein? |
| 14:48 | technomancy | ibdknox: but that's only because I don't want my home address floating around the interwebs |
| 14:48 | ibdknox | haha |
| 14:48 | technomancy | dgrnbrg: I've seen it used a few other places |
| 15:20 | Luke | I'm getting this with incanter "1: [CAUSE1] Invoke debugger on cause java.lang.String cannot be cast to java.lang.Number [Thrown class java.lang.ClassCastException]" when trying to do a simple double/string scatter plot |
| 15:21 | TimMc | "A cannot be cast to B" means "I expected a B but you gve me an A |
| 15:21 | TimMc | " |
| 15:22 | Luke | right but in Incanter, I'm not talking about datatypes and I'm only sending it doubles in the dataset |
| 15:23 | Luke | oh never mind, the doubles are being quoted in the CSV file |
| 15:24 | Luke | is there a way to tell incanter to parse a string as a double? |
| 15:34 | Raynes | gf3: ping |
| 15:37 | dgrnbrg | What's the easiest way to get a class that has a single method "public static boolean start(MyObj o)" that is defined in closure? |
| 15:37 | dgrnbrg | I want to write a doclet in clojure, and the doclet api looks for this static method instead of being sane and using an interface |
| 15:37 | dgrnbrg | can I accomplish that with reify? |
| 15:38 | TimMc | dgrnbrg: I think you'll need genclass. |
| 15:38 | TimMc | I don't think even proxy can do statics. |
| 15:38 | dgrnbrg | can genclass be used at runtime? |
| 15:38 | dgrnbrg | or will I have to AOT my code? |
| 15:45 | TimMc | Good question! It at *least* depends on how your code will be called. |
| 15:46 | Raynes | gf3: I think you and I have similar interests. :) |
| 15:49 | dgrnbrg | How can I get tools.jar onto the class path of lein? |
| 15:49 | dgrnbrg | TimMc: I'll have to figure that part out later :) |
| 15:51 | dgrnbrg | technomancy: how do I get the jdk tools.jar onto the class path? |
| 15:53 | amalloy | i don't think it depends on how your code will be called. gen-class is a no-op except when AOTing |
| 15:53 | TimMc | dgrnbrg: Oh man, I had to do this in Maven recently, it was annoying. |
| 15:53 | dgrnbrg | hmm, i see |
| 15:53 | dgrnbrg | i found this article: |
| 15:53 | dgrnbrg | http://maven.apache.org/general.html#tools-jar-dependency |
| 15:53 | dgrnbrg | hopefully that does it |
| 15:54 | dgrnbrg | wait, that doesn't explain how to set the resolve path |
| 15:55 | dgrnbrg | Is there a way to get lein to use a system path for an artifact? |
| 15:57 | dgrnbrg | I just copied it to lib--is that going to work in the long term? |
| 15:57 | TimMc | nope |
| 15:58 | TimMc | lib gets cleared |
| 16:00 | pyninja | is there a separate channel for clojurescript? |
| 16:01 | Raynes | Nope. |
| 16:03 | tmciver | dgrnbrg: I just created a symlink to the system tools.jar in ~/.lein/plugins; I did that to get rid of the warning. |
| 16:03 | pyninja | okay, does anyone know how to use a javascript library (e.g. moment.js) in a clojurescript project? i'm playing around with clojurescript one |
| 16:03 | dgrnbrg | tmciver: will that get picked up by uberjar? |
| 16:04 | tmciver | dgrnbrg: No idea. I didn't know what problem you were trying to solve; I just know that a lot of people (including myself) get warnings about tools.jar without the symlink. |
| 16:05 | dgrnbrg | I am writing a tool like vimclojure for Java development |
| 16:05 | dgrnbrg | and I need to call javadoc programmatically :( |
| 16:06 | tmciver | dgrnbrg: If the symlink doesn't work you might try copying tools.jar to the plugins directory directly (seems like a hack though). |
| 16:12 | jsabeaudry | Is it legal to have a /src/foo.clj and a /src/foo/bar.clj in the same project? lein run works fine but lein compile gives me a NPE on the ns clause of foo |
| 16:13 | RickInGA | what are the namespaces defined in the files? |
| 16:14 | RickInGA | I would think that they would need to be (ns project.foo) and (ns project.foo.bar) |
| 16:14 | brehaut_ | RickInGA: im pretty sure it is valid |
| 16:14 | jsabeaudry | RickInGA, That is what they are |
| 16:14 | errkle | wherefrom in GA? |
| 16:14 | brehaut_ | err, sorry, jsabeaudry |
| 16:15 | RickInGA | Flowery Branch (about 30 miles north of Atlanta) |
| 16:15 | errkle | sounds delightful |
| 16:15 | errkle | i'm in ATL |
| 16:15 | TimMc | RickInGA: Peach flowers? I bet it's a peach tree. |
| 16:16 | errkle | preach tree |
| 16:16 | pipeline | RickInGA: I have actually been there |
| 16:16 | TimMc | everything is named after peaches in GA |
| 16:16 | pipeline | flowery branch is named after wishful thinking ;) |
| 16:17 | RickInGA | errkle are there other Clojer-ers in Atlanta that you know of? |
| 16:17 | jsabeaudry | brehaut_, RickInGA: If I remove the (:use [project.foo.bar]) from my (ns project.foo ...) the NPE disappears |
| 16:18 | TimMc | jsabeaudry: That's a standard layout, sure. |
| 16:18 | TimMc | jsabeaudry: Just makes sure it's not actually a single-segment namespace -- (ns foo) is a problem, (ns foo.core) is not. |
| 16:19 | TimMc | (don't ask me why, I've just been told that) |
| 16:19 | jsabeaudry | TimMc, Yes, it is x.y.foo.bar and x.y.foo |
| 16:20 | jsabeaudry | If I add a :only clause it becomes an ExceptionInInitializerError |
| 16:20 | TimMc | Must be something else, I use that in projects sometimes. |
| 16:20 | RickInGA | do you have other files in your project that can see each other? is this the only problem you are having? |
| 16:20 | TimMc | Try just use'ing the second ns from the REPL. |
| 16:22 | jsabeaudry | TimMc, use from the repl works fine |
| 16:22 | jsabeaudry | TimMc, lein run also works |
| 16:23 | RickInGA | I don't know a lot about lein but my projects all have a structure like <proj name> / src / <proj name> / foo.clj |
| 16:23 | RickInGA | I think it is the sub directories of src that resolve to the namespace name |
| 16:23 | jsabeaudry | I'll try setting up a micro project |
| 16:23 | weavejester | TimMc: It's because a single-segment namespace is an unpackaged Java class |
| 16:24 | weavejester | TimMc: Which I believe can cause problems… somehow :) |
| 16:24 | TimMc | weavejester: Ah, so no package. Got it. |
| 16:24 | TimMc | I'm willing to believe that, I just don't have specifics. |
| 16:25 | weavejester | Has anyone looked into datatomic in detail yet? |
| 16:26 | jodaro | i'm still downloading it |
| 16:26 | Raynes | weavejester: datomic. Get it right, dude. |
| 16:27 | weavejester | Raynes: Oh yep, my mind somehow thinks "datatomic" instead of "datomic" |
| 16:27 | Raynes | I feel your pain. |
| 16:28 | zakwilson | I'm really curious as to why half the information about it is in a PDF instead of a normal web page. |
| 16:28 | weavejester | zakwilson: A PDF? |
| 16:28 | zakwilson | weavejester: http://datomic.com/docs/datomic-whitepaper.pdf |
| 16:29 | weavejester | Ah |
| 16:29 | weavejester | Is there any way to destroy information in datatomic? |
| 16:30 | weavejester | I'm serious :) |
| 16:30 | Raynes | I know, but you said 'datatomic' again. |
| 16:30 | weavejester | Oh! |
| 16:30 | weavejester | Gah! |
| 16:30 | zakwilson | I suspect some non-technical reason that has something to do with how things are sold to big companies. I honestly do want to understand this sort of thing. |
| 16:30 | Raynes | It's adorable. |
| 16:30 | weavejester | At some point my brain will get the right association. |
| 16:31 | Raynes | It reminds me of how young children sometimes have trouble pronouncing certain names and thus come up with slightly different easier to pronounce ones. |
| 16:31 | weavejester | I guess it's because datomic is clearly a play on data and atomic |
| 16:31 | weavejester | I just need to remember dat-omic |
| 16:31 | weavejester | Or d-atomic |
| 16:33 | weavejester | Anyway… it looks like although you can retract facts, they persist in the database. |
| 16:33 | weavejester | Which is really nice from a technical point of view. |
| 16:33 | weavejester | But maybe less nice if privacy laws tell you to wipe a person's data. |
| 16:33 | jsabeaudry | Ah by lein compile project.foo.bar I learn that the problem is there, at least the NPE is triggered |
| 16:34 | TimMc | weavejester: Well, I'm sure you can define custom GC. |
| 16:37 | technomancy | https://mobile.twitter.com/coda/status/176763984257630208 |
| 16:38 | weavejester | TimMc: I dunno, the current API is quite minimal and I don't see any custom GC options |
| 16:38 | Raynes | technomancy: Bahaha |
| 16:39 | jsabeaudry | It seems that this creates a NPE when compiling (defn- byte [n] (clojure.core/byte (.byteValue n))) |
| 16:39 | weavejester | technomancy: I don't think that's completely fair… :) |
| 16:39 | hagna | would you use dotimes to append to a string or loop/recur? |
| 16:40 | technomancy | weavejester: it just reminds me of this awesome quip: https://mobile.twitter.com/coda/status/170689994904698880 |
| 16:41 | amalloy | why would you use either, hagna? (apply str (for ...)) |
| 16:41 | hagna | amalloy: ok that's similar to what I was thinking you'd do for dotimes |
| 16:41 | technomancy | dotimes is very wrong |
| 16:42 | gf3 | Raynes: ohai! |
| 16:42 | technomancy | it's about side-effects only |
| 16:42 | gf3 | Raynes: so it would seem |
| 16:42 | Raynes | gf3: HAI THAR |
| 16:42 | gf3 | Raynes: thanks for the comment on HN |
| 16:42 | TimMc | jsabeaudry: Interesting. |
| 16:42 | amalloy | technomancy: well, that's a bit strong. dotimes makes me hella sad, but that's how StringBuilder works |
| 16:43 | Raynes | Yeah, mentioning RefHeap seems kinda self-promoting in hindsight -- sorry if it came off that way. |
| 16:43 | Raynes | Not sure if you already knew about RefHeap or not. |
| 16:43 | gf3 | Raynes: I did, actually, Refheap is awesome |
| 16:43 | gf3 | Raynes: I love the BrowserID integration |
| 16:43 | Raynes | <3 |
| 16:44 | jsabeaudry | TimMc, simply (defn map []) will also do the trick, is it illegal to shadow clojure.core ? |
| 16:44 | Raynes | So, what motivated you to write cljbin? |
| 16:44 | jsabeaudry | the trick being triggering a NPE |
| 16:44 | Raynes | I figured it was the eval, but that seemed to be added after the fact. |
| 16:44 | gf3 | Raynes: I wanted the eval |
| 16:44 | Raynes | Not sure if it was an initial design goal. |
| 16:44 | TimMc | jsabeaudry: Have you used :refer-clojure? |
| 16:44 | gf3 | Raynes: I didn't know you guys were adding it to Refheap |
| 16:44 | Raynes | Yeah, I'm excited about eval in RefHeap. |
| 16:44 | Raynes | I've been keeping it quiet until I saw how it turned out. |
| 16:44 | jsabeaudry | TimMc, no |
| 16:45 | hagna | amalloy: yes ok for thank you I had it mixed up |
| 16:45 | Raynes | Still a bit off. It'll be built around an entirely different service, which is why I can't just implement it right off the bat. |
| 16:45 | TimMc | jsabeaudry: Ah, you'll want a (:refer-clojure :exclude (byte)) in your ns. |
| 16:45 | TimMc | or something like that |
| 16:45 | pyninja | does clojurescript have a function that converts objects into JSON? |
| 16:45 | gf3 | Raynes: sounded pretty sweet from your comment earlier |
| 16:45 | Raynes | But it'll support eval for most of the popular languages refheap supports. |
| 16:45 | TimMc | pyninja: Grab the cheshire lib |
| 16:45 | pyninja | TimMc: thanks |
| 16:46 | Raynes | gf3: Your textarea is sexy. |
| 16:46 | TimMc | Raynes: I bet you say that to all the gf3s. |
| 16:46 | Raynes | It's nice how you've integrated buttons and information all into the same place. |
| 16:46 | gf3 | Raynes: haha thanks |
| 16:46 | gf3 | TimMc: /me blushes |
| 16:46 | pyninja | TimMc: wait but this is a clojure library, not clojurescript right? |
| 16:46 | TimMc | pyninja: Ack, sorry. |
| 16:47 | Raynes | gf3: Seriously, if you ever have some time, I'd love to see what you could do with the RefHeap text area and stuff. |
| 16:47 | Raynes | I'm not much of a design guy. |
| 16:47 | gf3 | Raynes: cool, I'd love to help out! |
| 16:47 | pyninja | really i just need to serialize and unserialize some data in clojurescript, JSON seems most natural as long as clojurescript supports that |
| 16:48 | TimMc | pyninja: And you're not talking to a Clojure server? |
| 16:48 | gf3 | Raynes: I'll toss you my email just in case you want to throw some ideas back and forth |
| 16:48 | gf3 | Raynes: gianni@runlevel6.org |
| 16:48 | Raynes | gf3: We have a #refheap IRC channel and there are a gazillion issues on the issue tracker. |
| 16:48 | Raynes | If you ever want to drop in. |
| 16:48 | jsabeaudry | TimMc, Oh wow, the refer-clojure works, thank you very much. |
| 16:48 | pyninja | TimMc: well I could send the data to the server for serialization, I guess, but it seems like overkill. shouldn't cljs support that natively? |
| 16:48 | tylergillies | in 'lein repl' is there a way to kill the last command without killing JVM? like (iterate inc 0) puts me in an infinite loop |
| 16:48 | hyperboreean | guys, what's the easiest way to run unit tests from within emacs after I ran clojure-jack-in ? |
| 16:48 | TimMc | pyninja: I mean, is the serialized data consumed by the server? |
| 16:48 | technomancy | tylergillies: only in lein2 |
| 16:49 | technomancy | hyperboreean: clojure-test-mode |
| 16:49 | pyninja | TimMc: no |
| 16:49 | amalloy | wat. if you're just serializing and unserializing, use the clojure reader and printer |
| 16:49 | Licenser | My clojurescript refuses to use prn-str for some reason :( I always get: "return server.routes.dispatch.call(null, server.core.prn_str.call(null, b)" and prn_str seems to be undefined |
| 16:49 | tylergillies | technomancy: ok, thnx |
| 16:49 | pyninja | amalloy: what's that |
| 16:49 | weavejester | hyperboreean: C-c , will run tests when in a Clojure test file. |
| 16:49 | stuartsierra | Licenser: try pr-str |
| 16:49 | weavejester | hyperboreean: C-c t will take you from a source file to a test file. |
| 16:50 | TimMc | pyninja: If you just need to roundtrip the data through a cookie or whatever, pr-str and read-string. |
| 16:50 | amalloy | ,(let [m {:a 1 :b 2}] (= m (read-string (pr-str m)))) |
| 16:50 | TimMc | JSON is only needed for talking to JS services. |
| 16:50 | clojurebot | true |
| 16:50 | pyninja | TimMc: oh, i didn't know read-string and pr-str were inverses. that's good |
| 16:50 | Licenser | sneaky thank you stuartsierra :) was it always pr-str and I'm making prn-str up? |
| 16:51 | stuartsierra | Licenser: yes |
| 16:51 | weavejester | datomic doesn't support removing data yet, so it looks like we need to be very careful not to store personal data in it in the EU! |
| 16:51 | tylergillies | prn-str makes me think of porn star |
| 16:51 | Licenser | odd clojuredocs says there is a prn-str |
| 16:51 | TimMc | &(prn-str 5) |
| 16:51 | lazybot | ⇒ "5\n" |
| 16:51 | hyperboreean | weavejester: ok, thanks for the tips. I think I'll need to install first clojure-test-mode as suggested by technomancy (thanks, btw) |
| 16:51 | stuartsierra | Licenser: maybe there is, in Clojure/JVM |
| 16:52 | Licenser | oh sneaky |
| 16:52 | weavejester | hyperboreean: Do you have marmalade in your package sources? |
| 16:52 | Licenser | &(pn-str 5) |
| 16:52 | lazybot | java.lang.RuntimeException: Unable to resolve symbol: pn-str in this context |
| 16:52 | stuartsierra | Licenser: you could file a ClojureScript ticket with a patch, easy enough to fix |
| 16:52 | Licenser | &(pr-str 5) |
| 16:52 | lazybot | ⇒ "5" |
| 16:52 | hyperboreean | weavejester: no, not really |
| 16:52 | Licenser | hmm |
| 16:52 | TimMc | tylergillies: That's how I pronounce it sometimes. |
| 16:53 | stuartsierra | But you can't actually print anything in ClojureScript, so prn / println don't make much sense. |
| 16:53 | TimMc | stuartsierra: pr-str and prn-str do! |
| 16:53 | Licenser | at least it is confusing that they are missing and TimMc is kind of right prn-str kind of makes sense |
| 16:54 | stuartsierra | TimMc: prn-str is pretty pointless if you're serializing for a server, but it wouldn't hurt to have it for consistency |
| 16:54 | TimMc | stuartsierra: Makes sense if you're serializing for a debugging pane. |
| 16:55 | weavejester | hyperboreean: If you have http://marmalade-repo.org/ getting an up-to-date clojure-test-mode (along with other packages) is a lot easier |
| 16:55 | TimMc | stuartsierra: Or a REPL... |
| 16:55 | stuartsierra | TimMc: I suppose. I used the JS Console for that right now. |
| 16:57 | alexyk | nathanmarz: awesome talk at strata |
| 17:03 | cran1988 | does clojure has a team for testing clojure applications every week ? |
| 17:04 | weavejester | cran1988: Which applications in particular? |
| 17:04 | sorenmacbeth | what's the current state of the world re extending parameterized type calles via (gen-class) ? |
| 17:04 | cran1988 | any application , i would like to take part in such a team |
| 17:04 | sorenmacbeth | s/calles/classes/ |
| 17:05 | technomancy | sorenmacbeth: you mean generics? |
| 17:05 | sorenmacbeth | technomancy: yes |
| 17:05 | technomancy | sorenmacbeth: generics are a fiction of javac |
| 17:05 | weavejester | cran1988: So a team that chooses a random application or library each week and tests it? |
| 17:05 | technomancy | there are no generics beyond java's original compile-time |
| 17:05 | TimMc | technomancy: Sort of? |
| 17:05 | weavejester | cran1988: To ensure correctness or for fun? |
| 17:06 | sorenmacbeth | technomancy: so instead of extending AbstractWhatever<SomeClass>, I can just extend AbstractWhatever? |
| 17:06 | cran1988 | weavejester: fun and for correctness |
| 17:06 | technomancy | sorenmacbeth: I guess? I don't actually know Java. |
| 17:06 | weavejester | cran1988: Ah, then unfortunately I don't know of any group that does that in Clojure. |
| 17:06 | sorenmacbeth | technomancy: me neither ;-p |
| 17:07 | technomancy | you should be fine |
| 17:07 | hyperboreean | weavejester: got it working (and marmalde did help); thanks! |
| 17:07 | weavejester | hyperboreean: awesome :) |
| 17:12 | tylergillies | whats the difference between 'mod' and 'rem'? |
| 17:13 | RickInGA | tylergillies try it with a negative number and see |
| 17:13 | tylergillies | RickInGA: ah, thnx |
| 17:14 | nathanmarz | alexyk: thanks |
| 17:14 | TimMc | ,(-> (filter #(= "get" (.getName %)) (.getMethods java.util.HashMap)) first .getGenericReturnType) ;; technomancy |
| 17:14 | clojurebot | #<TypeVariableImpl V> |
| 17:14 | TimMc | As in "V get(Object key)" |
| 17:14 | technomancy | TimMc: o_O |
| 17:15 | alexyk | nathanmarz: will your 3/29 talk at Data Mining meetup follow the same general outline? And, Clojure/West's? :) Or will you be more open about Clojure at the latter? :) |
| 17:15 | alexyk | just trying to prioritize my crazily shrinking time... |
| 17:15 | nathanmarz | alexyk: my talk at data mining meetup will be the same |
| 17:15 | nathanmarz | alexyk: my talk at clojure/west will use clojure for all the examples |
| 17:16 | alexyk | nathanmarz: awesome for the latter! :) |
| 17:21 | tylergillies | woah this is weird when i '(for [x (range 40) |
| 17:21 | tylergillies | :when (= 1 (rem x 4))] |
| 17:21 | tylergillies | doh |
| 17:21 | tylergillies | wrong buffer sorry |
| 17:22 | tylergillies | when i '(iterate #(* 0.5 %) 100)' the repl output goes down to zero and then repeat the cycle from 100 |
| 17:22 | tylergillies | over and over |
| 17:23 | tylergillies | http://cl.ly/1u1a0Z1L2W023Q0c3f2w |
| 17:23 | RickInGA | iterate is infinite lazy sequence, need to do take or take while if you only want some |
| 17:24 | tylergillies | i understand that, i was just watching the 'infinite' output for fun and notice that |
| 17:24 | tylergillies | noticed* |
| 17:25 | TimMc | &(take 20 (drop 4000 (iterate #(* 0.5 %) 100))) |
| 17:25 | lazybot | ⇒ (0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0) |
| 17:25 | TimMc | tylergillies: Where did you see repeats? |
| 17:26 | TimMc | You must have typed something more than that. |
| 17:26 | tylergillies | TimMc: in that screenshot i posted, where the 0 ends and it output 100 |
| 17:26 | amalloy | technomancy: tylergillies's issue sounds a lot like the one i was having with lein repl on long outputs, but i can't find that issue in lein |
| 17:26 | tylergillies | TimMc: i swear i didn't. that was from a fresh repl |
| 17:26 | TimMc | tylergillies: I see "(100" after the zeroes, some other seq is starting. |
| 17:26 | tylergillies | TimMc: i know. thats why i thought it was odd |
| 17:26 | amalloy | TimMc: no, i've seen this before |
| 17:27 | TimMc | y'all are going to make me wedge my computer for no reason, but here goes... |
| 17:27 | amalloy | where if i print a really large sequence in lein repl (finite in my case) it gets partway through printing, hiccups, and starts over |
| 17:27 | amalloy | TimMc: nah, just print a large one |
| 17:27 | amalloy | for me (repeat 1000 'a) is sufficient |
| 17:28 | TimMc | lolwut |
| 17:28 | tylergillies | i told you |
| 17:28 | TimMc | (take 1e4 (iterate #(* 0.5 %) 100)) did it |
| 17:29 | amalloy | so glad to hear it isn't just me |
| 17:29 | technomancy | about ready to tell everyone using lein repl to jump ship onto reply |
| 17:29 | technomancy | because it's so much better |
| 17:30 | tylergillies | url? |
| 17:30 | clojurebot | something |
| 17:30 | technomancy | https://github.com/trptcolin/reply |
| 17:31 | tylergillies | thnx |
| 17:31 | TimMc | Oh man, just the C-c support is enough. |
| 17:31 | jsabeaudry | How can we execute code when the program gets C-c at the console? |
| 17:32 | jsabeaudry | The problem is that now that I have agents the jvm wont stop appropriately i need to shutdown agents |
| 17:33 | TimMc | technomancy: Is there a lein-reply plugin yet? |
| 17:34 | technomancy | TimMc: I think so? |
| 17:34 | technomancy | wait, don't you use swank? |
| 17:35 | technomancy | don't make me call the ~guards |
| 17:36 | TimMc | eep |
| 17:38 | tylergillies | ~bards |
| 17:38 | clojurebot | Huh? |
| 17:42 | romanandreg | does clojurescript uses internally the calcdeps.py script from gclosure? |
| 17:54 | Raynes | technomancy: Dude. Not everybody uses Emacs. |
| 17:54 | Raynes | And sometimes having a non-Emacs repl is useful. |
| 17:54 | Raynes | Even if you do use Emacs. |
| 17:55 | pipeline | there are non-emacs users? |
| 17:55 | Iceland_jack | huh? |
| 17:55 | Null-A | not likely… |
| 17:59 | TimMc | plenty |
| 17:59 | TimMc | Mostly vim, some CCW (Eclipse) |
| 17:59 | TimMc | Emacs is of course the majority. |
| 18:01 | technoma` | I'm just surprised that reply would appeal to a swank user |
| 18:03 | brehaut_ | technoma`: i use reply and swank |
| 18:04 | errkle | rick i know no other clorians |
| 18:04 | errkle | clojurians in ga* |
| 18:08 | TimMc | midiclojurians |
| 18:09 | Raynes | Yeah, and I'm waiting for the moon to turn into a chocolate cupcake. |
| 18:10 | TimMc | Raynes: What good would that do you, without a rocket or a really long spoon? |
| 18:10 | jodaro | you can't turn cheese into a chocolate cupcake |
| 18:10 | technoma` | two slime repls in a single emacs instance gets ugly |
| 18:11 | TimMc | technoma`: Nice haircut. |
| 18:12 | technoma` | thanks! |
| 18:15 | jcrossley3 | errkle: RickInGA: i'm in roswell |
| 18:16 | slyrus | technoma`: I use multiple slime repls fairly regulary |
| 18:17 | technoma` | slyrus: don't you have to switch between them manually? |
| 18:21 | slyrus | I'm not sure exactly what you mean by manually, but M-x slime-cycle-connnections works for me |
| 18:22 | technoma` | right; it can't figure out for you which buffers belong to which slime connection |
| 18:23 | TimMc | I tend to have 1 Emacs open on each workspace, so I would just have a separate slime for each. |
| 18:23 | slyrus | technoma`: true |
| 18:25 | chris-m-r | i'm getting an error '; evaluation-aborted' in a slime-repl, (emacs / slime-connect) and it provides no stack-trace, is there a reason for this? and is there a way to get the stack trace? |
| 18:26 | chris-m-r | (calling a multimethod) |
| 18:31 | TimMc | chris-m-r: What does (pst) do? |
| 18:32 | chris-m-r | TimMc: umm, like this? (pst) Unable to resolve symbol: pst in this context [Thrown class java.lang.RuntimeException] |
| 18:33 | chris-m-r | I found the error, a function taking the wrong number of arguments - however I don't understand why I didn't get a stack trace |
| 18:34 | TimMc | I don't use slime... but it is it possible you didn't escape back out to the top level before running pst? |
| 18:35 | TimMc | (If it's anything like this one REPL I used...) |
| 18:36 | chris-m-r | (pst) |
| 18:38 | chris-m-r | pst usually works fine, however after that error it wasn't - fairly certain I was top level, I think it might be something to do with log4j |
| 18:46 | y3di | SirDinosaur: what did they say when yu asked about opensourcing datomic? i dced |
| 18:47 | RickInGA | jcrossley3: Sorry for the delayed response. Glad to hear from another person near Atlanta |
| 18:51 | jcrossley3 | RickInGA: indeed. are you the rick who posted on the lisp meetup forum? |
| 18:51 | RickInGA | yeah |
| 18:52 | RickInGA | I need to check back and see if anyone responded. I don't know if I will get an email if they do |
| 18:53 | RickInGA | ah, excellent, I see your reply… how do you feel about Taco Mac? |
| 18:55 | jcrossley3 | RickInGA: i don't like the one near me. :) |
| 18:56 | RickInGA | If you are in Roswell, do you like Harp Irish Pub? That would be easy for people to get to in case anyone sees it on the Lisp group |
| 18:57 | nenorbot | Hi... does anyone know what reason there could be for incanter to ignore my :title/:x-label/:y-label options I give when creating an xy-plot? |
| 18:57 | jcrossley3 | RickInGA: is that the one over behind that sandwich shop? i haven't been there in a while, but yeah, it's cool. |
| 18:58 | jcrossley3 | RickInGA: i thought you meant beer in SJ, not ATL. :) |
| 18:58 | RickInGA | haha, ok can have one there too |
| 19:00 | RickInGA | was hoping if we posted on the user group board we might get other people to stop by too, try and get some community involvement |
| 19:00 | errkle | i like the sound of that |
| 19:01 | jcrossley3 | RickInGA: sure, count me in. the worst that can happen is that you and me and errkle share a few beers. :) |
| 19:02 | errkle | overtone jam sess. |
| 19:02 | errkle | worst that can happen is we blow our ears out |
| 19:02 | RickInGA | :) |
| 19:03 | RickInGA | jcrossley3: errkle: when you guys want to get together? thursday night? saturday afternoon? other? |
| 19:03 | errkle | i like thurs nights / this saturday i'm w/family |
| 19:03 | errkle | |
| 19:08 | jcrossley3 | thurs should work for me |
| 19:09 | RickInGA | cool, what time you guys want to shoot for? 6? 7? |
| 19:09 | jcrossley3 | 7's good |
| 19:10 | RickInGA | cool, I will post that on the Lisp group. errkle you know where Harp is? |
| 19:13 | RickInGA | errkle: http://maps.google.com/maps?saddr=&daddr=1425%2BMarket%2BBlvd%2C%2BRoswell%2C%2BGA%2B30076&hl=en |
| 19:19 | errkle | thankyou |
| 19:26 | jcrossley3 | RickInGA: errkle: just found out i have a band concert to attend at 6:30 thurs, so i'll be closer to 7:30-8, sorry. |
| 19:26 | RickInGA | ok, no problem, we'll just have the first round without you |
| 19:26 | jcrossley3 | :) |
| 19:27 | RickInGA | so you guys can find me, I look like my picture on twitter @rickhall2000 (and yes I really am that ugly) |
| 19:28 | jcrossley3 | RickInGA: followed |
| 19:31 | burlappsack | check |
| 19:38 | errkle | 18:30 Thursday, March 8th, Roswell Ga |
| 19:39 | RickInGA | errkle: 19:00, (though I will probably be early) |
| 19:39 | RickInGA | I'll be the fat guy with the mac book and the guinness |
| 19:49 | pipeline | how do i determine which clojure is launched byuclojure-jack-in ? |
| 19:50 | qbg | the one specified in project.clj |
| 19:51 | gfredericks | pipeline: I think there's a ##(clojure-version) function as well |
| 19:51 | lazybot | ⇒ "1.3.0" |
| 19:51 | pipeline | d'oh |
| 19:51 | pipeline | I should have thought of project.clj |
| 19:51 | gfredericks | for when you're extra paranoid |
| 19:51 | qbg | &*clojure-version* |
| 19:51 | lazybot | ⇒ {:major 1, :minor 3, :incremental 0, :qualifier nil} |
| 19:51 | qbg | That too |
| 19:51 | gfredericks | yeah for when you're triple-extra paranoid |
| 19:51 | TimMc | RickInGA: A typo on your website made for an intriguing out-of-context snippet: "compiled verses" |
| 19:52 | qbg | (System/exit 0) for when you are really paranoid |
| 19:52 | RickInGA | oops |
| 19:52 | TimMc | RickInGA: I'm imagining writing a compiler for song lyrics. |
| 19:52 | TimMc | :-) |
| 19:52 | gfredericks | TimMc: start with the parser, that should keep you occupied for a while |
| 19:53 | qbg | TimMc: Make it work with overtone |
| 19:53 | TimMc | gfredericks: seq, done |
| 19:53 | gfredericks | boooh |
| 19:53 | TimMc | The AST generator is going to be harder this way, though. |
| 19:53 | RickInGA | I wrote that post a week or so ago, but just had 'this doesn't apply to clojure' for the compilation, at the last minute today I decided to write more. Now I regret it :) |
| 19:54 | RickInGA | oh, verses as in vs. is that spelled wrong? |
| 19:54 | RickInGA | or just a pun |
| 19:54 | TimMc | oh, it's actually "complied verses" -- double typo! |
| 19:54 | TimMc | RickInGA: "versus" |
| 19:54 | qbg | Of by one error |
| 19:54 | TimMc | qbg: haha, nice |
| 19:55 | RickInGA | that's what happens when you go from a 17 inch monitor to a 13 inch! |
| 19:55 | TimMc | Not trying to pick on you, just having fun with language. |
| 19:55 | gfredericks | fanguage |
| 19:55 | RickInGA | no worries, pretty funny |
| 19:56 | RickInGA | I am just delighted anyone reads my stuff! |
| 20:13 | lynaghk | Is it possible for a protocol to require implementation of another protocol? |
| 20:13 | brehaut | no |
| 20:13 | brehaut | i dont believe so |
| 20:13 | lynaghk | e.g., implement these functions, plus (invoke [this x]) |
| 20:14 | Frozenlock | IP ---> TCP would be a good example of a protocol requiring another protocol, no? |
| 20:14 | ibdknox | lol |
| 20:14 | ibdknox | different kind of protocol ;) |
| 20:14 | gfredericks | shouldn't the arrow go the other way? |
| 20:15 | Frozenlock | Depends, I work from the ground up :P |
| 20:28 | hiredman | qbg: https://github.com/hiredman/syntax-quote/blob/master/src/syntax_quote/core.clj |
| 20:28 | amalloy | qbg: clojure.tools.macro |
| 20:28 | hiredman | sort of ish |
| 20:29 | qbg | This is for core.logic, so that limits what I can use |
| 20:30 | gfredericks | what is a symbol macro? |
| 20:30 | qbg | Instead of a call |
| 20:30 | qbg | it looks like a symbol |
| 20:30 | gfredericks | the symbol-macrolet example is really weird |
| 20:31 | qbg | So you could have foobar expand into (lots-of-crazy-stuff a b c) |
| 20:31 | RickInGA | jcrossley3: I am watching the lightning talks from clojure conj 2011, didn't know I would see you there! |
| 20:31 | qbg | I've used them in CL before to define executable pixel art |
| 20:31 | hiredman | defn:let::defmacro:symbol-macrolet |
| 20:32 | gfredericks | hiredman: very nice, thank you. |
| 20:32 | gfredericks | I still don't understand why (def def foo); is it because the first def is a special form which precludes the second def being symbol-macro-replaced? |
| 20:32 | hiredman | my let-smacros is strickly substitution |
| 20:33 | hiredman | def only has meaning that the beginning of a list |
| 20:33 | gfredericks | hiredman: right, but in (symbol-macrolet [def foo] (def def def)), only the third def got replaced |
| 20:34 | amalloy | gfredericks: yes, that's why |
| 20:34 | amalloy | only the third def is an expression. the first is a special form dictating that the second is a name |
| 20:34 | gfredericks | so does the symbol-macrolet macro know about def? or does the compiler somehow get to the inner form first? |
| 20:35 | amalloy | gfredericks: whose symbol-macrolet are you talking about? tools.macro? |
| 20:35 | gfredericks | yeah |
| 20:35 | gfredericks | I'm looking at the example in the README |
| 20:35 | gfredericks | I guess I could go look at the code |
| 20:35 | amalloy | tools.macro has a very complex code-walker |
| 20:36 | qbg | A reason why it should live in the compiler |
| 20:36 | amalloy | absolutely |
| 20:36 | qbg | "wait for new compiler" it says on Confluence |
| 20:36 | gfredericks | I guess that means it's the former |
| 20:37 | amalloy | (macrolet [(inc [x] `(dec ~x))] (+ (inc 1) (let [inc clojure.core/inc] (inc 1)))) - tools.macro is smart enough to only replace the first instance of inc, because the second is shadowed by a let, i believe |
| 20:37 | lynaghk | whoa, does reify not work with protocols that have multiarity functions? |
| 20:37 | amalloy | lynaghk: you're either getting the syntax wrong, or using varargs |
| 20:38 | gfredericks | amalloy: that is pretty intense. I would not want to have written the code to do that. |
| 20:38 | gfredericks | what if you macrolet let first? |
| 20:38 | TimMc | lynaghk: Collapse multiple arities into a single form |
| 20:38 | amalloy | dunno |
| 20:39 | lynaghk | TimMc: just tried that, no luck |
| 20:39 | TimMc | lynaghk: (foo ([] ...) ([a b c] ...)) |
| 20:39 | TimMc | huh |
| 20:39 | lynaghk | amalloy: https://gist.github.com/255b708b7a6e7a1647ba |
| 20:40 | amalloy | you got the protocol definition wrong |
| 20:40 | amalloy | &(doc defprotocol) |
| 20:40 | lazybot | ⇒ "Macro ([name & opts+sigs]); A protocol is a named set of named methods and their signatures: (defprotocol AProtocolName ;optional doc string \"A doc string for AProtocol abstraction\" ;method signatures (bar [this a b] \"bar docs\") (baz [this a] [this a b] [this a ... https://refheap.com/paste/935 |
| 20:41 | lynaghk | ah, yes I did. Thanks amalloy |
| 20:44 | gfredericks | in the future clojure will have symbol macros? |
| 20:45 | hiredman | I think so |
| 20:46 | hiredman | it's in the confluence wiki as something desired whenever the compielr gets rewritten |
| 20:46 | gfredericks | I've only just heard of this rewriting -- I imagine rewritten in clojure? |
| 20:47 | hiredman | yes |
| 20:48 | hiredman | http://dev.clojure.org/display/design/letmacro |
| 20:49 | gfredericks | hiredman: thanks |
| 20:59 | qbg | Oh boy, I almost want to use potemkin now... |
| 20:59 | ztellman | qbg: what pushed you over the edge? |
| 21:00 | qbg | Have you see core.logic? |
| 21:00 | qbg | Merging gensyms would be useful in more than one occasion... |
| 21:01 | PntBlnk_ | Hi all. Quick question: how do I call an inherited instance method on a class? I can see the inherited methods with .getMethods, but not with clojure.reflect/reflect. |
| 21:06 | qbg | PntBlnk_: I think you want to specify the :ancestors option to reflect |
| 21:08 | jcrossley3 | RickInGA: yep :) |
| 21:09 | PntBlnk_ | qbg: Thanks, I'll have a go. I presume I should be looking at :import options for something similar as well? |
| 21:10 | qbg | PntBlnk_: Not sure I understand. Take a look at the doc for type-reflect |
| 21:11 | PntBlnk_ | qbg: well I want to actually use the method, not just see it when I call reflect. I'm sure I can find my way with your pointers. Heading to the docs... Cheers. |
| 21:12 | qbg | PntBlnk_: You don't need to import anything to call a method |
| 21:12 | qbg | You only need to import class that you don't want to fully qualify |
| 21:12 | TimMc | &(.byteValue 5) |
| 21:12 | lazybot | ⇒ 5 |
| 21:13 | TimMc | Look ma, no imports. |
| 21:13 | TimMc | (On second thought, I have probably totally misunderstood your question.) |
| 21:15 | PntBlnk_ | qbg: I'm not sure I understand. I've imported com.unboundid.ldap.sdk.SearchRequest, which inherits a setControls method from com.unboundid.ldap.sdk.UpdatableLDAPRequest. I get a no matching method found when I try to call it... |
| 21:16 | qbg | You're probably calling it with the wrong number (or type of) arguments |
| 21:16 | TimMc | PntBlnk_: Ah, then you probably need to do a cast, or maybe it is a varargs problem. |
| 21:16 | qbg | What does the method sig look like? |
| 21:16 | qbg | If it has varargs, you need to box those args in an array manually |
| 21:19 | PntBlnk_ | qbg: public final void setControls(Control... controls) |
| 21:19 | qbg | Yeah, you'll need to box those |
| 21:20 | TimMc | PntBlnk_: Control... is Java slang for Control[] |
| 21:20 | qbg | You may find into-array useful |
| 21:20 | gfredericks | that sounds like a good macro. I bet one already exists. |
| 21:20 | gfredericks | making arrays always takes me several tries :/ |
| 21:20 | PntBlnk_ | TimMc: So I'm getting the error because I'm passing an "unboxed" control to the method? |
| 21:21 | qbg | You are passing some number of Controls instead of a Control[] |
| 21:21 | amalloy | gfredericks: what macro? |
| 21:21 | scriptor | into-array exists |
| 21:21 | PntBlnk_ | qbg: Thanks! I understand now. |
| 21:21 | gfredericks | amalloy: a macro for calling vararg java functions |
| 21:22 | amalloy | it's not as easy as you think |
| 21:22 | gfredericks | amalloy: cuz of types? |
| 21:22 | amalloy | that's some of it |
| 21:22 | TimMc | gfredericks: Smarter reflection code would probably be enough. |
| 21:22 | boodle | Hi, why is this false? (contains? (range (int \A) (int \Z)) (int \A)) |
| 21:22 | amalloy | the other is that you have to be very explicit about how many fixed args there are |
| 21:22 | qbg | &(doc contains?) |
| 21:22 | lazybot | ⇒ "([coll key]); Returns true if key is present in the given collection, otherwise returns false. Note that for numerically indexed collections like vectors and Java arrays, this tests if the numeric key is within the range of indexes. 'contains?' operates constant or ... https://refheap.com/paste/941 |
| 21:23 | qbg | That is why |
| 21:23 | gfredericks | amalloy: yeah for that I imagined a vector literal at the end, rather than ambiguously open |
| 21:23 | PntBlnk_ | qbg: (.setControls (SearchRequest. searchbase SearchScope/SUB account-filter (into-array ["*"])) (into-array [(SimplePagedResultsControl. 100 nil)])) works a treat. Thanks again. I'll add that one to my Gotcha's list... |
| 21:23 | qbg | contains? is for map like collections |
| 21:23 | gfredericks | so not too much gain, but easier in my mind than remembering how the different array functions work |
| 21:23 | TimMc | heh |
| 21:23 | amalloy | in that case, it's only difficult because of types :P |
| 21:24 | TimMc | Varargs make me in nervous in Java, actually. |
| 21:24 | TimMc | I'm still not clear on where they might be ambiguous. |
| 21:24 | boodle | qbg: is there a function that is true if a sequence has a value? |
| 21:24 | qbg | &(doc some) |
| 21:24 | lazybot | ⇒ "([pred coll]); Returns the first logical true value of (pred x) for any x in coll, else nil. One common idiom is to use a set as pred, for example this will return :fred if :fred is in the sequence, otherwise nil: (some #{:fred} coll)" |
| 21:24 | boodle | k |
| 21:24 | qbg | See that idiom :) |
| 21:25 | amalloy | TimMc: you should read some blog posts about the sneaky interplay between varargs, generics, and other stuff |
| 21:25 | boodle | qbg: ty |
| 21:25 | amalloy | nightmares |
| 21:25 | TimMc | amalloy: Or maybe I shouldn't. |
| 21:25 | gfredericks | $google the sneaky interplay between varargs, generics, and other stuff |
| 21:25 | lazybot | [Wealthfront Engineering: November 2010] http://eng.wealthfront.com/2010_11_01_archive.html |
| 21:27 | gfredericks | clearly google has a long way to go |
| 21:28 | amalloy | TimMc: http://strangeloop2010.com/system/talks/presentations/000/014/450/BlochLee-JavaPuzzlers.pdf is one i remember |
| 21:30 | gfredericks | oh man |
| 21:34 | TimMc | aaagghhh Java WTF |
| 21:36 | TimMc | So if you use a raw type, all the method type params are dropped? |
| 21:36 | qbg | A collection of unknown type |
| 21:37 | gfredericks | it is different from a raw type? |
| 21:37 | qbg | Yes, but not by too much :) |
| 21:37 | gfredericks | awesome. |
| 21:37 | qbg | I keep running into javac bugs when I use generics |
| 21:37 | gfredericks | it must also be different from Collection<Object>? |
| 21:37 | qbg | Eclipse doesn't have those bugs... |
| 21:37 | TimMc | gfredericks: And then List (raw) becomes a better match than Collection (raw). |
| 21:38 | qbg | Yes |
| 21:38 | qbg | A Collection<Object> is a collection of objects |
| 21:38 | gfredericks | is there something you can do with a Collection<?> that you can't do with a Collection<Object> or vice versa? |
| 21:38 | qbg | Think about what it means to add an item to it |
| 21:39 | gfredericks | so in Collection<?> the runtime collection could have a more restrictive type? |
| 21:39 | qbg | Yes |
| 21:39 | gfredericks | but then I don't know that's not the case with a Collection<Object> as well... |
| 21:39 | qbg | You really can't add anything to a Collection<?> |
| 21:40 | qbg | You have to do an unchecked cast to view a more restrictive collection as Collection<Object> |
| 21:40 | gfredericks | but you can read out of a Collection<?> and assign that to an Object I imagine |
| 21:40 | qbg | You can't assign Collection<Integer> to Collection<Object>, but you can to Collection<?> |
| 21:41 | gfredericks | oh I misknew that then |
| 21:41 | qbg | Collections aren't covariant |
| 21:41 | qbg | * generics |
| 21:42 | gfredericks | not understanding that phrase makes me want to learn haskell. |
| 21:42 | TimMc | and <?> is an escape valve for that |
| 21:42 | qbg | Arrays in java are covariant though |
| 21:42 | qbg | (which is weird...) |
| 21:42 | TimMc | yep -- insta runtime bugs |
| 21:42 | qbg | And that causes issues with generic arrays |
| 21:42 | TimMc | gfredericks: I hand you an Object[], and you try to put an Integer in it -- what happens? |
| 21:42 | qbg | Because it needs to be checked at runtime |
| 21:43 | gfredericks | TimMc: it works! |
| 21:43 | TimMc | gfredericks: NOPE. It was really a String[]! |
| 21:43 | gfredericks | CRAP |
| 21:43 | TimMc | That's covariance for ya. |
| 21:43 | qbg | Covariance only makes sense for immutable collections |
| 21:44 | gfredericks | so likewise you could hand me a Collection<?> and I put an Integer in it and then I lose because it was really a Collection<String> |
| 21:44 | qbg | You can't put an integer in it |
| 21:44 | qbg | Because the types don't match |
| 21:44 | gfredericks | the compiler enforces read-only? |
| 21:44 | qbg | (An integer isn't an ?) |
| 21:45 | gfredericks | but an ? is an Object? |
| 21:45 | qbg | Object is a superclass of ? |
| 21:45 | amalloy | TimMc: i guess it's been a long time since i used arrays. i remember all the pitfalls about List<?> vs List<Object>, but i had forgotten that Object[] is a superclass of Integer[] |
| 21:45 | TimMc | Yeah. Sucks. |
| 21:45 | amalloy | that's messed up, man |
| 21:45 | TimMc | The whole Java type system is fucked. |
| 21:46 | qbg | We can also cover ? extends Foo and ? super Foo :) |
| 21:46 | gfredericks | java will never catch on |
| 21:46 | TimMc | I especially like the bit where "int i = j" can give you an NPE. |
| 21:46 | qbg | javac has so many generics bugs |
| 21:46 | TimMc | That'll give you a headache the first time you encounter it. |
| 21:46 | amalloy | gfredericks: the compiler sees that you have a Collection<?> and knows it can't safely put anything in there, because it might be enforcing any type |
| 21:46 | qbg | Eclipse works so much better |
| 21:46 | amalloy | but you can safely get an Object out, because everything is an Object |
| 21:47 | TimMc | or can be boxed as one |
| 21:47 | gfredericks | amalloy: it makes sense when I think about it carefully |
| 21:47 | amalloy | TimMc: any element already in the Collection must be an Object, if you prefer |
| 21:47 | TimMc | That too. |
| 21:47 | qbg | It is one, you can't have primitive generic collections |
| 21:47 | amalloy | with a Collection<Object>, the compiler knows the collection is capable of holding Objects, so you can put one in |
| 21:48 | qbg | Don't you appreciate Clojure now? |
| 21:48 | gfredericks | and haskell somehow does all this without being fucked up? |
| 21:48 | qbg | Subclassing causes all of the problems |
| 21:48 | TimMc | and mutation |
| 21:49 | amalloy | gfredericks: yeah, i think it actually does, more or less |
| 21:49 | gfredericks | this must be why people talk about it |
| 21:49 | TimMc | gfredericks: That, and the ASCII art. |
| 21:50 | qbg | OO does not play well with all of this |
| 21:50 | qbg | (Java style OO that is) |
| 21:51 | qbg | Generic methods are my favorite |
| 21:51 | qbg | Got to love that syntax |
| 21:52 | TimMc | My favorite is writing typed tuples in Java. |
| 21:52 | qbg | Sum types! |
| 21:53 | TimMc | Cons<String, Cons<Integer, Cons<Double, Nil>>> foo = ... ; |
| 21:53 | qbg | Too bad they don't work generic interfaces |
| 21:53 | TimMc | That'll really fuck with your average bean-grinder. |
| 21:54 | gfredericks | which is all you can really hope for |
| 21:54 | TimMc | It's the best possible outcome. |
| 21:54 | qbg | I just define a bunch of TupleN types |
| 21:54 | TimMc | qbg: Just like Haskell amirite |
| 21:55 | qbg | I've been basically porting some useful Clojure functions to Java at work |
| 21:55 | TimMc | Oh wait, no... I'm thinking of zip2, zip3, zip4... |
| 21:55 | qbg | But if I go all out with generics, javac dies :( |
| 21:56 | qbg | javac isn't very good at type inference |
| 21:56 | brehaut | todays understatement award goes to qbg |
| 21:57 | qbg | It wouldn't be so bad if eclipsec was broken also |
| 21:57 | qbg | But as it stands, your code compiles fine in eclipse, but the maven build dies |
| 21:57 | scriptor | what's eclipsec? |
| 21:57 | qbg | The eclipse compiler |
| 21:57 | TimMc | a typo |
| 21:57 | TimMc | oh |
| 21:58 | TimMc | <- bad snarker, no muffin |
| 21:58 | scriptor | wait, eclipse has its own compiler, it doesn't use the existing jdk? |
| 21:58 | scriptor | this is why I don't do java |
| 21:58 | qbg | It needs it for the incremental compilation |
| 21:58 | qbg | and other good stuff |
| 21:58 | qbg | Like turning syntax errors into runtime errors |
| 21:58 | scriptor | ah |
| 21:59 | qbg | That bytecode is fun to look at |
| 21:59 | qbg | This method just throws an exception... |
| 21:59 | gfredericks | oh it compiles syntax errors into exception-throwing methods? |
| 21:59 | qbg | Yes |
| 21:59 | brehaut | thats different |
| 22:00 | qbg | By default, you can change that |
| 22:00 | gfredericks | presumably it couldn't do that for all syntax errors |
| 22:00 | qbg | Eclipse handles syntax errors really well |
| 22:01 | amalloy | eclipsec is nice, but it's a bit awful to push/commit source files that don't compile under javac |
| 22:01 | qbg | They could basically add a DWIM mode and have it be correct a majority of the time |
| 22:01 | amalloy | i usually used it to make the compiler stricter, not looser |
| 22:01 | qbg | I turn on a lot of extra warnings in Eclipse |
| 22:02 | qbg | But then I look at coworker code, and there are warnings everywhere... |
| 22:03 | amalloy | at one time i went a bit mad, turning tons of warnings into errors. "no, never let me check something for null if you already know whether it's null" |
| 22:04 | qbg | I keep the Javadoc warning off for the most part :) |
| 22:05 | amalloy | eclipse writes so much code for you. i speculate this is why java programmers don't realize they need macros |
| 22:05 | qbg | No, just ignorance |
| 22:05 | qbg | I still want macros so bad in Java |
| 22:06 | qbg | I don't want to use ASM... |
| 22:07 | pipeline | java is verbose enough that macros would end up like C preprocessor macros anyway |
| 22:08 | scriptor | I wonder if some sort of lazy evaluation would be a good start |
| 22:08 | scriptor | so that the arguments aren't immediately evaluated |
| 22:08 | qbg | The impl doesn't matter as much as the resulting syntax |
| 22:09 | qbg | The most common use of macros for me would be for defining classes |
| 22:09 | amalloy | how does verbosity have anything to do with lisp vs c macros? the difference is homoiconicity |
| 22:10 | gfredericks | we could make java homoiconic by replacing all the basic data structures with ASTs |
| 22:11 | qbg | Or we could just use Clojure instead |
| 22:11 | scriptor | wouldn't have to replace them |
| 22:11 | scriptor | just add the AST data structure |
| 22:11 | gfredericks | I guess so |
| 22:11 | scriptor | what's perl 6 doing? |
| 22:11 | scriptor | I think it's something like that, with their macros |
| 22:26 | jcromartie | does anybody really use derby with Clojure? |
| 22:26 | jcromartie | the examples I'm finding are not usable |
| 22:31 | jcromartie | looks like H2 is the way to go |
| 22:31 | jcromartie | done! |
| 22:32 | RickInGA | what are derby and h2 for? |
| 22:32 | jcromartie | they are embedded pure-Java databases |
| 22:32 | jcromartie | Derby is an Apache project |
| 22:32 | RickInGA | ah, cool |
| 22:32 | jcromartie | H2 seems to be a bit more lively |
| 22:33 | jcromartie | now I know |
| 23:00 | zawzey | hmm, how do i force a lazy-eval? i tried (str "some sequence: " (doall a-lazy-seq)) but it returns "some sequence: clojure.lang.LazySeq@e93c3" |
| 23:00 | zawzey | only works when i replaced doall with vec |
| 23:01 | zawzey | i meant, how do i force the eval of a lazy sequence in that case, doall didn't seem to work. why? |
| 23:03 | amalloy | don't use str |
| 23:03 | amalloy | pr-str |
| 23:04 | hiredman | zawzey: doall does force it, but that doesn't change the resuting of calling str on it |
| 23:04 | zawzey | @amalloy well i wasn't trying to print it.. per se, just returning some string for unit tests |
| 23:05 | TimMc | amalloy: Whoa, #5 in that slideshow (EnumMap) is just terrible. That's a straight-up Java bug, nothing to it. :-( |
| 23:05 | amalloy | TimMc: yeah, i was horrified when i discovered IdentityHashMap does that |
| 23:06 | zawzey | hiredman: so what is the proper way to do that in this case |
| 23:06 | hiredman | zawzey: what amalloy said |
| 23:10 | zawzey | thanks guys, that works, now could i ask why prn-str works? |
| 23:12 | TimMc | zawzey: pr (the underlying fn) means "print for reader" |
| 23:13 | TimMc | pr-str is a variant that returns the result as a string instead of printing to stdout |
| 23:13 | TimMc | prn and prn-str are further variants that tack on a newline |
| 23:14 | mk | why isn't str simply equivalent to pr-str? |
| 23:14 | TimMc | because it calls the .toString method on things |
| 23:15 | mk | what does the other do? |
| 23:15 | TimMc | str makes things responsible for printing themselves. pr does the work for them, and works against various abstractions. |
| 23:16 | zawzey | so str doesn't evaluate lazy sequences as a side effect? |
| 23:17 | mk | pr source: https://github.com/clojure/clojure/blob/f5f827ac9fbb87e770d25007472504403ed3d7a6/src/clj/clojure/core.clj#L3267 |
| 23:17 | zawzey | but in that case, i tried to force the lazy sequence to be evaluated with doall |
| 23:18 | mk | zawzey: I'm guessing, but perhaps str calls .toString on the lazy sequence object itself, while pr does something else |
| 23:21 | zawzey | mk: well doall does call dorun which also walks through the sequence |
| 23:21 | zawzey | https://github.com/clojure/clojure/blob/f5f827ac9fbb87e770d25007472504403ed3d7a6/src/clj/clojure/core.clj#L2714 |
| 23:23 | mk | totally guessing now, but perhaps: yes, it walks through the sequence, but the sequence doesn't become something new, it's still a LazySequence, so when you .toString it, that's what ya' get |
| 23:36 | amalloy | correct, mk |
| 23:38 | scriptor | the 2nd and last expression in doall just returns coll |
| 23:56 | mac | SirDinosaur: what did they say when yu asked about opensourcing datomic? i dced |
| 23:59 | mk | mac: http://clojure-log.n01se.net/ |