2013-02-07
| 00:17 | Deece | Sorry if this is OT for #clojure, but I read on the google group a while ago the mention of a new-ish (>2009?) lisp unrelated to Clojure. it had pattern matching. it was called something er, vaguely "buddhist"-sounding? |
| 00:18 | Deece | Wondering if it rings a bell for anyone. |
| 00:19 | technomancy | there's Qi, which is a lisp with interesting ideas about static types and a horrible license |
| 00:19 | technomancy | or Shen rather |
| 00:19 | alisdair | joxa or lfe? the erlang lisps? they have pattern matching |
| 00:21 | Deece | technomancy: it was Shen, thank you. The shen license looks.. weird, but not too bad. |
| 00:23 | technomancy | depends what you're going to use it for I guess |
| 00:24 | technomancy | not the kind of thing I'd invest a lot of time in if someone else is going to tell me what I can use it for |
| 00:30 | shaunxcode | what uses does the license prohibit? |
| 00:35 | technomancy | distributing anything based on Shen which doesn't pass the spec |
| 00:35 | technomancy | among other things |
| 00:35 | technomancy | kinda similar to the way oracle restricts openjdk forks with the compatibility kit |
| 00:36 | Guest76208 | isnt that a good thing? J++? |
| 00:37 | amalloy | ask apache about harmony |
| 00:37 | tmciver | technomancy: it doesn't sound too restrictive if you're only creating apps with it: "the code you write which rides on the top of our code is not bound by our license, this is yours." |
| 00:38 | technomancy | Guest76208: in the case of Oracle it's very bad, since they don't let you even have the compatibility kit unless you're their pal |
| 00:39 | shaunxcode | I think the most interesting thing about shen is KL, I have been waiting to see if anyone else uses it as a target for other lisps (or languages in general) |
| 00:39 | technomancy | Guest76208: in the case of Shen, it's bad because they won't even let you base your work on it if you change the name. it's not like they're just out to avoid confusion or anything. |
| 00:40 | technomancy | if you read the reasoning behind the license, you can tell he's just bitter about his inability to make a living from the software he's written |
| 00:40 | technomancy | Oracle's is worse because if you get on their bad side they've got a big pile of patents they'll use against you, of course. Shen is just silly. |
| 00:41 | technomancy | (silly about compatibility) |
| 00:42 | shaunxcode | yeah the notion of anything beside MIT licensing just seems odd to me but I'm a simple kind of guy |
| 00:42 | shaunxcode | (for open source/languages that is) |
| 00:42 | technomancy | ugh; MIT's a bit of a mess when it comes to patents though |
| 00:42 | technomancy | someone can submit a patch to your MIT-licensed codebase, get bought by oracle, and then sue your pants off |
| 00:43 | technomancy | most licenses longer than a page avoid that |
| 00:44 | shaunxcode | hah really? I guess I should pay more attention - is their a case where something like that has happened? |
| 00:45 | technomancy | not sure if it's happened with MIT specifically, but it has no patent provisions at all, which is foolish for anything high-profile. |
| 00:47 | amalloy | does anyone know if every contrib requires patches come exclusively through jira? ISTR rich saying at some point that as long as you only take patches from people with CAs you're okay |
| 00:48 | amalloy | i ask because i have some small fixes to tools.reader and don't fancy sticking my hand into the jira bag of scorpions |
| 00:57 | shaunxcode | anyone have thoughts on how to pretty print a map with a literal tag in it e.g. for creating datomic schemas programatically? I have a quaint work around, but now I am intrigued as to how you can do it |
| 01:04 | callenbot | yogthos: next time you're around, I have some potential additions/improvements to Luminus to discuss. |
| 01:04 | callenbot | yogthos: I'd just do a PR, but I'd rather discuss them with you first |
| 01:18 | fsvehla | I have a deconstructuring question, is it possible to get a map with {key, (the-vector 1), other-key (the-vector 2), ... from a vector? |
| 01:18 | Ember- | the-vector meaning element at index x? |
| 01:18 | fsvehla | I currently use { :host (fields 0) :timestamp (fields 1) :url (fields 2) ... |
| 01:19 | fsvehla | Ember-: Yes |
| 01:19 | fsvehla | Of course starting with 0 |
| 01:20 | fsvehla | I was looking over the destructuring examples of jay fields, but I don’t actually think that’s possible... |
| 01:20 | amalloy | (zipmap [:host :timestamp] v) |
| 01:21 | fsvehla | Actually I think locals following the let form would be even nicer |
| 01:21 | fsvehla | zipmap, thanks |
| 01:22 | Ember- | I'm not sure if that's possible via destructing |
| 01:22 | Ember- | it's a one liner otherwise though |
| 01:24 | Ember- | ,(map-indexed hash-map ["a" "b" "c" "d"]) |
| 01:24 | clojurebot | ({0 "a"} {1 "b"} {2 "c"} {3 "d"}) |
| 01:24 | Ember- | wasn't that what you wanted? |
| 01:24 | Ember- | no it was not |
| 01:24 | Ember- | almost! |
| 01:26 | fsvehla | The zipmap solution works to return a map with the specified keys :) |
| 01:27 | fsvehla | I just wasn’t sure if that isn’t possible via destructing, because it is a kind-a obvious feature |
| 01:33 | amalloy | fsvehla: nonsense. destructuring isn't for building objects, it's for tearing them apart. and you asked to build a map |
| 02:09 | durka42 | what on earth does that mean |
| 02:09 | durka42 | "PLASMA warning: plasma_init(): PLASMA re-initialized" |
| 02:09 | durka42 | (using incanter) |
| 04:03 | AtKaaZ | has anyone found a solution for this or is it impossible? &(#(var %) prn) |
| 04:03 | AtKaaZ | &(#(var %) prn) |
| 04:03 | lazybot | java.lang.RuntimeException: Unable to resolve var: p1__12841# in this context |
| 04:04 | AtKaaZ | &(#(var-get %) prn) |
| 04:04 | lazybot | java.lang.ClassCastException: clojure.core$prn cannot be cast to clojure.lang.Var |
| 04:04 | durka42 | wait what are you trying to do |
| 04:05 | Sgeo | var-get should be a function like any other |
| 04:05 | AtKaaZ | to be able to give a symbol to a function and get the var, if that even makes sense |
| 04:05 | Sgeo | resolve? |
| 04:05 | clojurebot | Unable to resolve symbol: pst-elem-str is you have an old version of clj-stacktrace somewhere. see the Troubleshooting section of the swank-clojure readme. |
| 04:05 | Sgeo | (doc resolve) |
| 04:05 | clojurebot | "([sym] [env sym]); same as (ns-resolve *ns* symbol) or (ns-resolve *ns* &env symbol)" |
| 04:05 | Sgeo | (resolve 'resolve) |
| 04:05 | Sgeo | ,(resolve 'resolve) |
| 04:05 | clojurebot | #'clojure.core/resolve |
| 04:05 | AtKaaZ | something like: (fn [func] (add-hook func #'incTimes_hook)) |
| 04:06 | durka42 | ,(class #'prn) |
| 04:06 | clojurebot | clojure.lang.Var |
| 04:07 | AtKaaZ | where func needs to be a var |
| 04:07 | AtKaaZ | but I don't want to pass a var, I want to pass a symbol |
| 04:07 | Sgeo | AtKaaZ, what's wrong with resolve? |
| 04:07 | AtKaaZ | Sgeo, don't know how to use it in this context |
| 04:07 | Sgeo | If what you're doing is even sensible, which I don't know |
| 04:08 | Sgeo | Pass it a symbol, it finds the var that would be named by the symbol in the current namespace |
| 04:08 | AtKaaZ | oh it has to be quoted, wait |
| 04:11 | AtKaaZ | &(#(resolve (quote %)) prn) |
| 04:11 | lazybot | java.lang.SecurityException: You tripped the alarm! resolve is bad! |
| 04:11 | AtKaaZ | i don't know how:) |
| 04:13 | AtKaaZ | maybe from a macro, trying... |
| 04:14 | durka42 | you'll need a macro, by the time #(resolve (quote %)) gets prn it has already been resolved into #'clojure.core/prn |
| 04:14 | durka42 | ,'(prn) |
| 04:14 | clojurebot | (prn) |
| 04:14 | durka42 | hmm, maybe not? |
| 04:15 | AtKaaZ | my problem is, I think, that it's passing p1__9968# to the macro, by I want its value instead |
| 04:16 | AtKaaZ | so instead of p1__9968# it would pass prn |
| 04:16 | AtKaaZ | i wish |
| 04:19 | AtKaaZ | in other words, I want the symbol which was passed to the anon function, but I can't unless the function is a macro, i see |
| 04:20 | AtKaaZ | ie. (xx prn) when xx is a macro will get me prn inside the macro, but (#(xx %) prn) will never get me "prn" but only things like p1__13332# or #<core$prn clojure.core$prn@741854be> |
| 04:23 | AtKaaZ | unless there's a way to get "#<core$prn clojure.core$prn@741854be>" to "prn" ? |
| 04:23 | AtKaaZ | ,prn |
| 04:23 | clojurebot | #<core$prn clojure.core$prn@37f8ff58> |
| 04:24 | AtKaaZ | that's one way, but I want the opposite way |
| 04:29 | AtKaaZ | ok, I got what I wanted for, thanks , if anyone cares it's this: https://github.com/DeMLinkS/demlinks/blob/92379ca7f955033d18a3b8eec677ce1cc1e7db25/src/runtime/q.clj#L673 |
| 04:31 | AtKaaZ | (ignore that :pre btw xD) |
| 04:37 | AtKaaZ | right that makes sense why you can't resolve backwards from #<core$prn clojure.core$prn@37f8ff58> to prn because more than one symbol maybe be associated with that #<core$prn clojure.core$prn@37f8ff58> |
| 04:40 | OscarZ_ | if i want to define a function with multiple arities, do I have to use defn or is it possible with just fn ? |
| 04:53 | AtKaaZ | OscarZ_: you can use fn |
| 04:53 | nonuby | i dissoc a key from a map and save that into mongo via monger, mongodb has the document with the key set to null, is there an alternative to dissoc |
| 04:56 | nonuby | ignore i was doing something stupid |
| 04:58 | nonuby | can i use update-in to update multiple keys |
| 05:40 | lpetit | Hello there |
| 05:40 | cemerick | hi :-) |
| 05:40 | lpetit | What is the best available library for file manipulation / folder creation, etc., etc. over there ? (beyond plain use of java API) |
| 05:40 | lpetit | cemerick: you're everywhere :-) |
| 05:41 | cemerick | maybe Raynes' fs lib? |
| 05:41 | cemerick | I've never used it |
| 05:41 | lpetit | or maybe just plain old apache commons io ? |
| 05:49 | ejackson | lpetit: I've been using Raynes' fs |
| 05:49 | ejackson | its good |
| 05:50 | lpetit | ejackson: thanks for the feedback. And I also see that it has apache commons compress as a dependency, so hopefully it will provide me with not so low level APIs for e.g. unzipping files |
| 06:13 | pepijndevos | If the default lein template includes a .gitignore, why doesn;t it come with the git repo right away? |
| 06:13 | durka42 | you might be like me and create the lein project inside a larger extant git repo |
| 06:17 | pepijndevos | hm |
| 06:20 | pepijndevos | I like the idea of drip, but it doesn't seem to help me much. lein repl still takes several seconds to start. |
| 06:21 | pepijndevos | In fact, there is not decernible difference on either my mac or linux laptop. drip ps does show a ton of vms running. I don't get it. |
| 06:30 | the-kenny | pepijndevos: I remember problems with drip & lein2 |
| 06:30 | pepijndevos | ew |
| 06:30 | the-kenny | lein2 used some caches which changed the command line of the JVM so drip couldn't cache |
| 06:30 | the-kenny | dunno if that was fixed |
| 06:31 | pepijndevos | oh, it says you need to build it yourself |
| 06:31 | pepijndevos | all the way down: https://github.com/flatland/drip/wiki/Clojure |
| 06:31 | pepijndevos | oh, the other way around |
| 06:31 | pepijndevos | you need to build leiningen |
| 06:32 | clgv | pepijndevos: well latest snapshot after preview 10 should be included in 2.0.0 |
| 06:33 | aroemers | pepijndevos: Also make sure you have the latest version of drip. With some earlier version, drip had a bug that it did not reuse any spawned VM. |
| 06:34 | pepijndevos | bottom line: version hell |
| 06:39 | pepijndevos | oh, I have lein 2.0.0--SNAPSHOT, and a pretty old one at that, I guess |
| 06:39 | pepijndevos | $ lein upgrade |
| 06:39 | pepijndevos | The upgrade task is only meant for stable releases. |
| 06:51 | clgv | pepijndevos: install leiningen manually |
| 07:01 | pepijndevos | hm, the brew seems to be cray broken |
| 07:01 | pepijndevos | stable is 1.7, devel is 2.0.0 and HEAD is 2.1.0-SNAPSHOT, which is not on S3. |
| 07:09 | AtKaaZ | is there some testbed that causes my function f that I pass to swap! to be call more than once? i need to test that somehow and see what happens |
| 07:09 | pepijndevos | grrr, I'm now on a checkout version of drip and the latest leiningen that I can get. Nothing |
| 07:10 | AtKaaZ | pepijndevos: is that lein from github master branch? |
| 07:11 | pepijndevos | AtKaaZ: no, just 2.0.0 :( |
| 07:12 | pepijndevos | there is no such thing as 2.1.0-SNAPSHOT on amazon |
| 07:12 | AtKaaZ | no idea how that works, I take it you can't compile it there? |
| 07:13 | AtKaaZ | ~logs |
| 07:13 | clojurebot | logs is http://clojure-log.n01se.net/ |
| 07:13 | pepijndevos | I suppose I can. I don;t know. It refers to a nonexsistant hacking section of the readme |
| 07:14 | clgv | pepijndevos: lein 2.0.0 is stable |
| 07:14 | AtKaaZ | maybe you wanted this: https://github.com/technomancy/leiningen/blob/master/CONTRIBUTING.md#bootstrapping |
| 07:17 | pepijndevos | clgv: so do I need master for drip? |
| 07:18 | clgv | pepijndevos: take that on: https://raw.github.com/technomancy/leiningen/stable/bin/lein |
| 07:18 | pepijndevos | clgv: that is what I have |
| 07:19 | clgv | pepijndevos: if that does not work you then maybe something for drip was broken again in 2.0.0 |
| 07:20 | pepijndevos | I'm going to try lein trampoline, that always fixes stuf… oh, no, maybe not |
| 07:21 | AtKaaZ | if anyone cares, on win7 this is what I use to build leiningen from master https://gist.github.com/AtKaaZ/4730559 |
| 07:27 | wunki | how would I get the metadata of a namespace. `(meta *ns*) keeps returning `nil` |
| 07:27 | AtKaaZ | ,(meta (var *ns*)) |
| 07:27 | clojurebot | {:ns #<Namespace clojure.core>, :name *ns*, :added "1.0", :doc "A clojure.lang.Namespace object representing the current namespace.", :tag clojure.lang.Namespace} |
| 07:28 | AtKaaZ | that's not it xD |
| 07:29 | wunki | AtKaaZ: nope :( |
| 07:33 | clgv | try ##(meta (the-ns 'clojure.set)) |
| 07:33 | lazybot | java.lang.SecurityException: You tripped the alarm! the-ns is bad! |
| 07:36 | pepijndevos | <inappropriate terms> I'm now running checkout versioins of both drip and leiningen. Still takes like ten seconds to do lein repl, while having a dozen jvms running, each consuming over 50MB of RAM |
| 07:39 | AtKaaZ | wunki: that actually works if the ns has meta, (meta *ns*) |
| 07:40 | AtKaaZ | wunki: like https://www.refheap.com/paste/10994 |
| 07:40 | wunki | AtKaaZ: I think I found my problem, maybe the `ns` doesn't get recompiled in Emacs. A fresh `lein run` seems to find the meta now |
| 07:41 | AtKaaZ | wunki: yes I had to restart my ccw repl also |
| 07:44 | wunki | AtKaaZ: thanks for checking it out |
| 07:45 | AtKaaZ | wunki: np, I enjoyed it |
| 07:46 | pepijndevos | wut, where did my Java prefs go in OS X 10.8? |
| 07:47 | pepijndevos | uh, found it.. It's in system prefs, but it's not |
| 07:51 | pepijndevos | wut, no more java 6 I guess |
| 07:53 | pepijndevos | or, just chaos. I can no longer select the version, like I could in the utilities java thing. the prefs say 7, the terminal says 1.6 |
| 07:57 | pepijndevos | http://reviews.cnet.com/8301-13727_7-57533880-263/java-preferences-missing-after-latest-os-x-java-update/ |
| 08:35 | TimMc | I wonder if core.logic could be used to solve this puzzle: http://www.coinheist.com/rubik/a_regular_crossword/grid.pdf (PDF warning) |
| 08:39 | clgv | TimMc: hmm you would have to normalize it I think |
| 08:40 | clgv | TimMc: you can use the regexps as predicates but you have to determine the domains for the fields |
| 08:45 | clgv | TimMc: but a real unification would be difficult I guess |
| 08:49 | progo | did some of the clojure books have a venn diagram of clojure's essential sections I could use in a presentation? |
| 08:50 | hyPiRion | progo: Essential sections? |
| 08:51 | hyPiRion | http://clojure.com/ has a diagram with focus, empowerment and simplicity. |
| 08:51 | abp | Oh, great: https://codeq.io/ |
| 08:52 | progo | hyPiRion: like that but less enterprisey, and in a book that has better authority in citations :P |
| 08:54 | noidi | progo, the joy of clojure has one |
| 08:54 | noidi | on page 4 |
| 08:55 | progo | noidi, great. I was just at page 16 walking backwards :D |
| 08:56 | noidi | :D |
| 09:22 | octagon | hello, does anyone know of a document that describes how the case* special form works? i see it in the macroexpansion for case, but it's very confusing and the java code is sort of without comments |
| 09:24 | octagon | https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/Compiler.java#L8362 <-- that is the java implementation |
| 09:26 | octagon | https://gist.github.com/micha/4731233 <-- macro expansion of a case expr |
| 09:34 | luxbock | is there a way to auto-load some code when nrepl starts itself in Emacs? |
| 09:35 | luxbock | for example I would like to have Pomegranate loaded everytime by default in case I need to install any new libraries |
| 09:44 | @rhickey | When we support #bin"base64" - which base64 and why? http://en.wikipedia.org/wiki/Base64 |
| 09:45 | `fogus | oh my... I had no idea that there were so many choices. |
| 09:48 | @rhickey | http://tools.ietf.org/html/rfc4648 ? |
| 09:48 | @rhickey | Is there a Java lib that does rfc4648? |
| 09:49 | hyPiRion | $google java rfc4648 |
| 09:49 | lazybot | [RFC4648 - jinahya - RFC-4648 Implementation. - Jinahya's Java ...] http://code.google.com/p/jinahya/wiki/RFC4648 |
| 09:55 | stuartsierra | Apache Commons Codec is probably the most commonly-used Java lib, it claims to comply with RFC 2045. |
| 09:55 | jkkramer | other std libs: ruby - rfc 2045, python - rfc 3548, php - rfc 2045 |
| 09:55 | @rhickey | stuartsierra: yeah, but http://www.ietf.org/rfc/rfc2045.txt looks gross |
| 09:55 | jeremyheiler | what does data.codec implement? |
| 09:56 | aroemers | rhickey: whatever the choice, I am happy to see #bin will become part of edn. :) |
| 10:00 | @rhickey | I like filename/url compatible and no fixed line lengths |
| 10:00 | clgv | ssh seems to use RFC2045 for keyfiles |
| 10:00 | @rhickey | no fix/max |
| 10:00 | TimMc | rhickey: Strong preference for +/ |
| 10:01 | @rhickey | TimMc: because? |
| 10:01 | TimMc | It's the original, so basically every base64 tool I've seen uses it. |
| 10:02 | TimMc | The URL/Filename stuff is just... I don't know, a special transport-dependent encoding. |
| 10:02 | @rhickey | and yet, most newer ones don't, for good reasons |
| 10:02 | @rhickey | transport-dependent? transport compatible |
| 10:02 | TimMc | Sure. |
| 10:03 | TimMc | Could you support both? It doesn't look ambiguous. |
| 10:03 | TimMc | One danger is that you would misread (say) _- variants instead of rejecting them. |
| 10:04 | TimMc | (because it uses the same alphabet as -_) |
| 10:04 | hyPiRion | Wouldn't it be smarter to use the standard used by most other languages? As long sound implementations of the standard exists, it will be both easier and simpler to extend/implement EDN on those platforms then. Unless there's significant issues with the most popular, I don't see a reason why this should be a discussion. |
| 10:04 | @rhickey | hyPiRion: "I don't see a reason why this should be a discussion." - then don't participate |
| 10:04 | TimMc | That's rude. |
| 10:05 | @rhickey | I don't see a reason why this should be a discussion. is rude |
| 10:05 | TimMc | I think he's asking you to justify the bikeshedding. |
| 10:05 | @rhickey | I think the existence of the variants demonstrates the bikeshedding is not due to me |
| 10:06 | TimMc | You expressed a preference for filename/URL compatible variants -- why? |
| 10:06 | pepijndevos | technomancy: ping |
| 10:07 | hyPiRion | rhickey: You lost the head of that sentence. What I meant was that if there's minor differences between the characters used, then use the most popular one. |
| 10:07 | hyPiRion | Disclaimer: I have no knowledge on base64. |
| 10:15 | aroemers | One could always add a #my/rfc2045 data reader oneself of course, if the default is not to one's liking. |
| 10:16 | TimMc | #base64-_ |
| 10:16 | TimMc | (not entirely serious) |
| 10:17 | TimMc | ,(javax.xml.bind.DatatypeConverter/printBase64Binary (.getBytes "k\ueff3")) |
| 10:17 | clojurebot | "a+6/sw==" |
| 10:23 | pepijndevos | Is (:require :refer) the same as (:use :only) ? |
| 10:28 | saolsen | pepijndevos: yep, and :refer :all would be the same as just :use |
| 10:29 | pepijndevos | I was hoping I could use slamhound to develop with :use and publish with :only/refer |
| 10:29 | pepijndevos | That way, a reader knows where everything comes from, and I don't have to spell it out |
| 10:30 | hyPiRion | (:require [foo :refer [bar]]) would make it possible to use foo/baz as well |
| 10:35 | gfredericks | what's a use case for evaling IFns? i.e., why does (eval (list + 1 2 3)) work? |
| 10:36 | nDuff | gfredericks: Sorry? (list + 1 2 3) is just a PersistentList, not an IFn. |
| 10:36 | danielglauser | hyPiRion: How so? Just tried at the repl, if I :refer [bar] I can't access anything else from foo besides bar |
| 10:37 | hyPiRion | danielglauser: what? |
| 10:37 | hyPiRion | ,(require '[clojure.pprint :refer [cl-format])) |
| 10:37 | clojurebot | #<ExecutionException java.util.concurrent.ExecutionException: java.lang.RuntimeException: Unmatched delimiter: )> |
| 10:37 | hyPiRion | ,(require '[clojure.pprint :refer [cl-format]]) |
| 10:37 | clojurebot | nil |
| 10:38 | hyPiRion | ,(cl-format true "~R" 150) |
| 10:38 | clojurebot | one hundred fifty |
| 10:38 | hyPiRion | ,(clojure.pprint/pprint {:a 1 :b nil}) |
| 10:38 | clojurebot | {:a 1, :b nil}\n |
| 10:38 | danielglauser | hyPiRion: Got it, didn't realize you were talking about using the fully qualified namespace |
| 10:39 | hyPiRion | oh |
| 10:39 | Sgeo | http://ideone.com/O0LqJy |
| 10:39 | Sgeo | Huh. That's simpler than I expected |
| 10:41 | gfredericks | nDuff: yes but + is an IFn, and it's not quoted |
| 10:41 | clgv | Sgeo: what? |
| 10:41 | Sgeo | clgv, using deftype to store data |
| 10:41 | Sgeo | (I need it to be a type to distinguish from other kinds of data) |
| 10:42 | clgv | Sgeo: you can also use maps with :type metadata for that ^^ |
| 10:42 | Sgeo | I'm just writing a version of trampoline which requires the loop to be ended with (done blah) rather than just blah, meaning functions can be returned |
| 10:42 | Sgeo | It's for my blog post |
| 10:42 | clgv | &(type (with-meta {:a 1} {:type :blubb-type})) |
| 10:42 | lazybot | ⇒ :blubb-type |
| 10:43 | Sgeo | That argues that that sort of thinking is a good thing |
| 10:43 | nDuff | gfredericks: eval would be confusing to use if it didn't behave that way. Would you _really_ want to force folks to pass '+ instead of +? |
| 10:45 | Sgeo | IFns functioness is only meaningful at the beginning of a list (or when something calls it, say, if you're passing it in to a higher order function) |
| 10:45 | hyPiRion | Well.. |
| 10:45 | Sgeo | (+ 1 2 3) this, as a list, sees + at the beginning is an IFn, so evaluates it |
| 10:45 | clojurebot | #<RuntimeException java.lang.RuntimeException: java.lang.NumberFormatException: For input string: "+"> |
| 10:45 | Sgeo | ..? |
| 10:45 | Sgeo | (+ 1 2 3) |
| 10:45 | clojurebot | *suffusion of yellow* |
| 10:45 | hyPiRion | Sgeo: no, that resolves the symbol |
| 10:45 | hyPiRion | ,('+ 1 2) |
| 10:45 | clojurebot | 2 |
| 10:45 | clgv | (+ 1 2 3), |
| 10:45 | clojurebot | *suffusion of yellow* |
| 10:45 | clgv | oops |
| 10:46 | clgv | ,(+ 1 2 3) |
| 10:46 | clojurebot | 6 |
| 10:46 | hyPiRion | (eval (list 'foo 1 2)) returns "unable to resolve symbol: foo in this context" |
| 10:46 | Sgeo | Well, yeah, symbols get resolved first |
| 10:46 | hyPiRion | Whereas double-quoting it resolves that issue |
| 10:47 | Sgeo | What's the problem exactly? |
| 10:47 | hyPiRion | Sgeo: I have no issue with it, really. Behaves as I expect. |
| 10:47 | Sgeo | Someone seemed like they were having an issue? |
| 10:47 | Sgeo | Don't mind me, I'm tired |
| 10:48 | Sgeo | And forcing myself to stay awake so I can stop sleeping in the middle of the day |
| 10:48 | hyPiRion | Sgeo: yeah, gfredericks mentioned something I didn't quite grasp |
| 10:49 | Sgeo | <gfredericks> what's a use case for evaling IFns? i.e., why does (eval (list + 1 2 3)) work? |
| 10:49 | Sgeo | gfredericks, all Clojure code is data |
| 10:50 | Sgeo | First it's read in, which turns "(+ 1 2 3)" for example into a list containing a symbol +, a number 1, a number 2, a number 3 |
| 10:50 | Sgeo | Then that list is evaluated |
| 10:50 | Sgeo | (Or whatever the result of reading it is) |
| 10:50 | Sgeo | ,(read "(+ 1 2 3)") |
| 10:50 | clojurebot | #<ClassCastException java.lang.ClassCastException: java.lang.String cannot be cast to java.io.PushbackReader> |
| 10:50 | Sgeo | :( |
| 10:50 | Sgeo | (doc read) |
| 10:50 | clojurebot | "([] [stream] [stream eof-error? eof-value] [stream eof-error? eof-value recursive?]); Reads the next object from stream, which must be an instance of java.io.PushbackReader or some derivee. stream defaults to the current value of *in* ." |
| 10:50 | hyPiRion | read-string |
| 10:50 | Sgeo | ,(read-string "(+ 1 2 3)") |
| 10:50 | clojurebot | (+ 1 2 3) |
| 10:51 | Sgeo | That + is a symbol, which then gets resolved, in this case, to a function |
| 10:51 | hyPiRion | Ooh. But (list + 1 2 3) doesn't do that. It resolves + into the function plus. |
| 10:51 | the-kenny | ,(list + 1 2 3) |
| 10:51 | clojurebot | (#<core$_PLUS_ clojure.core$_PLUS_@463bb30a> 1 2 3) |
| 10:51 | Sgeo | Ah, so, in that case, eval is seeing the function object directly, rather than the symbol |
| 10:52 | the-kenny | ,(#<core$_PLUS_ clojure.core$_PLUS_@463bb30a> 2 3 4) |
| 10:52 | clojurebot | #<ExecutionException java.util.concurrent.ExecutionException: java.lang.RuntimeException: Unreadable form> |
| 10:52 | Sgeo | Well, that's part of what evaluation means |
| 10:52 | Sgeo | Evaluation on a symbol resolves the symbol and evaluates the result |
| 10:52 | Sgeo | Erm, wait, it... hmm |
| 10:53 | Sgeo | So resolving is not theoretically a separate step from evaluation, it's what it means to evaluate a symbol |
| 10:53 | Sgeo | although, hmm. (list 'quote 'foo) gets evaluated to foo but the foo symbol doesn't get evaluated |
| 10:54 | Sgeo | I guess quote says "don't evaluate this" and symbols say "go ahead and evaluate the result" |
| 10:54 | hyPiRion | Sgeo: I think it's because functions are values. |
| 10:55 | Sgeo | It bothers me though that Clojure doesn't accept arbitrary objects in forms |
| 10:55 | hyPiRion | (= (eval 1) (eval '(quote 1))), same applies for functions |
| 10:56 | hyPiRion | A value resolves to itself, whereas a symbol doesn't. |
| 10:56 | Sgeo | (def foo 'foo)? |
| 10:57 | ivaraasen | hyPiRion: ever tried test.generative BTW? |
| 10:57 | Sgeo | I think there's some sort of phases mechanism that I'm forgetting about |
| 10:58 | Sgeo | Or... not quite phases |
| 10:58 | hyPiRion | Sgeo: You meanie. A symbol resolves to the value it refers to in the context it is evaluated in. |
| 10:58 | hyPiRion | ivaraasen: Not generative, I'm afraid |
| 10:58 | hyPiRion | just tesrt |
| 10:58 | hyPiRion | *test |
| 10:59 | ivaraasen | hyPiRion: pretty sweet stuff. using it to test array-utils. |
| 10:59 | hyPiRion | ivaraasen: What is its use case? |
| 10:59 | hyPiRion | Does it generate data to work with? |
| 10:59 | hyPiRion | /s/work/test/ |
| 11:00 | clgv | hyPiRion: there are two steps: resolve and var-get (or calling the symbol) |
| 11:00 | clgv | I meant: *the var |
| 11:00 | ivaraasen | hyPiRion: yeah, in my case it just generates tons of different long-arrays and double-arrays to test the rigidity of the exposed API |
| 11:01 | Sgeo | ...I forgot about vars |
| 11:01 | ivaraasen | so things that shouldn't be mutated aren't mutated, et cetera. |
| 11:01 | Sgeo | derpderpderpderpderpderp |
| 11:01 | hyPiRion | ivaraasen: Oh, that sounds valuable. |
| 11:01 | hyPiRion | At least for some stuff. |
| 11:02 | ivaraasen | hyPiRion: discovered a bug in afill! (and afill-bounded!) thanks to this, actually. |
| 11:14 | gtrak | anyone have a working phonegap/android clojurescript repl or know of a technical reason why it wouldn't work? (eg, does phonegap or android disallow eval or something weird like that?) |
| 11:16 | matthavener | gtrak: its my understanding that android doesn't preclude clojure, but the gc pressure is a little high for the dalvik jvm |
| 11:16 | gtrak | ah, yes, that's why I'm considering clojurescript as an alternative. Real clojure would be nice, but impractical. |
| 11:17 | cemerick | gtrak: clojurescript does not have eval, unless you're talking about kanaka's fork |
| 11:17 | gtrak | I see a bunch of getting-started things, but no browser-repls on google |
| 11:18 | gtrak | cemerick: 'eval' in the sense of browser-repl, doesn't it rely on JS eval? |
| 11:18 | cemerick | no |
| 11:18 | gtrak | ah |
| 11:18 | cemerick | The ClojureScript compiler is implemented in Clojure. |
| 11:18 | gtrak | I get that, I'm talking about the browser repl |
| 11:18 | gtrak | it somehow sends forms over the wire and runs them |
| 11:19 | cemerick | The browser-repl is just a different runtime environment for cljs; it still needs a cljs compiler. |
| 11:19 | pimeys | btw. let's build a browser with llvm support :) |
| 11:19 | gtrak | yes, I have the cljs compiler part working :-) |
| 11:19 | pimeys | just came to my mind while I'm writing javascript here again :( |
| 11:19 | gtrak | not the browser-repl part (works locally, not on phonegap) |
| 11:20 | alexnixon | how is Clojure (the language itself) built and deployed? Does it come from a CI machine or is it built and pushed manually on someone (rhickey's?) personal machine? |
| 11:20 | cemerick | gtrak: You might want to check out kanaka's fork, he's been working on it for quite a while now (and perhaps using it in real stuff?) |
| 11:20 | gtrak | ie, I've compiled a cljs file into javascript that *should* connect to lein trampoline cljsbuild repl-listen, but silently breaks |
| 11:21 | cemerick | alexnixon: see http://build.clojure.org |
| 11:21 | cemerick | gtrak: Whatever the issue there, you'll still need a Clojure runtime to compile cljs to drive a browser-repl. |
| 11:22 | gtrak | that's what lein-cljs repl-listen does |
| 11:25 | alexnixon | cemerick: thanks for that - just trying to figure out the best way of managing build/releases internally |
| 11:26 | cemerick | gtrak: oooh, you just want to run browser-REPL with cljs running on android, not have a self-hosted cljs |
| 11:26 | gtrak | yes! :-) |
| 11:26 | cemerick | The joys of short-form textual communication. |
| 11:27 | cemerick | gtrak: silent failure might sound like you're violating the same-origin policy |
| 11:27 | gtrak | ah, I was just thinking it could be a security policy |
| 11:28 | gtrak | the android emulator has a hook for 10.0.2.2 to refer to the host IP, that's what address I'm trying to connect to |
| 11:28 | gtrak | when every other cljs example I've seen is localhost, (won't work in this case) |
| 11:29 | cemerick | gtrak: If you can get the same file to work when loaded from localhost (*not* file:/), then yeah, you're running into a phonegap/network/browser security restriction. |
| 11:29 | cemerick | You can't just throw a random URL into your browser repl connection call |
| 11:29 | gtrak | that makes sense |
| 11:29 | cemerick | it has to be the same host as where the cljs was loaded from |
| 11:30 | gtrak | I will hack it :-) |
| 11:37 | gtrak | cemerick: looks like the browser-repl indeed uses js eval? just curious now: (js* "eval(~{block})")) |
| 11:39 | gtrak | along with some crazy string interpolation macro trick |
| 11:40 | gfredericks | Sgeo: hyPiRion: I just noticed the long conversation I spawned; was there any resolution? |
| 11:40 | cemerick | gtrak: oh, cljs does use js eval, but not in service of compiling cljs->js |
| 11:41 | cemerick | which is what I thought you meant |
| 11:42 | gtrak | ah, yea, no. cljs-eval js-eval browser-repl-eval clojure closure google-closure, I think we need some more ambiguity :-) |
| 11:42 | Sgeo | My own personal conclusion is that I need more sleep. |
| 11:46 | pepijndevos | Any carmine users around? I'm confused about how it does pipelining. Am i correct that any command ran inside a car/with-conn actually returns nil and only returns the result at the end? |
| 11:47 | alexnixon | cemerick: with the Clojure release process, what is to prevent a sneaky commit being pushed by someone in the second before rhickey clicks the "release" button in Jenkins? Is it safe because rhickey is the only guy with push-to-master privileges? |
| 11:48 | cemerick | alexnixon: AFAIK, only he and Stuart Halloway have commit. That might be outdated info, but it's a very limited set in any case. |
| 11:50 | alexnixon | cemerick: thanks for the info - that sounds plausible |
| 11:51 | Chousuke | stuff like that is probably the main reason I like git |
| 11:51 | Chousuke | everyone has commit access, so you only need to decide whose collection of commits you like best |
| 11:52 | alexnixon | git definitely makes a bunch of different workflows possible |
| 11:52 | alexnixon | it's just tricky finding the "right" one for the situation |
| 11:52 | Chousuke | I find working with svn so awkward because I can't save my code before I'm ready to publish it :/ |
| 11:53 | Chousuke | fortunately git-svn exists |
| 11:54 | Chousuke | though I've found that often I end up with a bunch of crappy commits and then svn dcommit them all. :P |
| 11:56 | Chousuke | that's still marginally better than having a huge bunch of code uncommitted in the working copy, however |
| 11:59 | Chousuke | And I tend to use branches so often that I find it hard to imagine working without them :P |
| 11:59 | gfredericks | I can't imagine not viewing a git repo as a graph |
| 12:00 | Chousuke | that's what it is |
| 12:00 | gfredericks | yes I mean for looking at it visually |
| 12:00 | gfredericks | the default format of `git log` seems so worthless |
| 12:00 | Chousuke | I mostly use git log -p |
| 12:01 | Chousuke | to review changes |
| 12:01 | gfredericks | I use git log --graph --all --format=\"%h[%t] %d %an--%s\" |
| 12:02 | gfredericks | those backslashes are probably unhelpful |
| 12:02 | Chousuke | branches make everything so carefree in git |
| 12:02 | gfredericks | my favorite is debugging by creating a `wtf` branch and deleting half of the code at a time until the error is isolated |
| 12:02 | nDuff | they're certainly unhelpful. |
| 12:02 | Chousuke | have a cool new idea? branch. need to fix something? branch. hard merge/rebase? branch |
| 12:03 | nDuff | Use the slashes like that and the shell will string-split the contents |
| 12:03 | gfredericks | nDuff: I needed them in the .gitconfig as an alias |
| 12:03 | nDuff | so your command becomes: git log --graph --all '--format="%h[%t]' '%d' '%an--%s"' |
| 12:03 | nDuff | Ahh. |
| 12:04 | Chousuke | the way I usually do rebases is branch -> rebase -i -> ff merge to original. sometimes with several branching steps |
| 12:05 | Chousuke | so I end up for foo-rebase-1 through 10 |
| 12:05 | Chousuke | the amusing part is that you don't even have to do that manually since git keeps all the information in the reflog anyway |
| 12:06 | Chousuke | but somehow it still helps |
| 12:08 | technomancy | pepijndevos: hi |
| 12:10 | pepijndevos | technomancy: I was playing with slamhound, hoping it would allow me to turn (:use) clauses to (:require :refer) ones. So far, it just crashes |
| 12:10 | technomancy | oh, that's a drag |
| 12:10 | pepijndevos | what do you mean? |
| 12:11 | technomancy | oh, just that it's unfortunate |
| 12:11 | pepijndevos | oh |
| 12:11 | nDuff | Heh; the joys of using slang on an international forum |
| 12:11 | pepijndevos | My use case is that when reading code, I like to see where stuff comes from, but when I write code, I don't want to specify every little function. |
| 12:12 | pepijndevos | technomancy: is that something slamhound could do, if I got it to work? |
| 12:12 | technomancy | pepijndevos: oh yeah, definitely |
| 12:12 | pepijndevos | cool |
| 12:13 | hammer__ | if i'm looking at a seq and want to compare an element to its previous element |
| 12:13 | hammer__ | how do i do that sort of comprehension? |
| 12:13 | pepijndevos | Failed to reconstruct: #<File src/asky/core.clj> |
| 12:13 | pepijndevos | java.lang.RuntimeException: Unable to resolve symbol: == in this context, compiling:(NO_SOURCE_PATH:1:139) |
| 12:13 | technomancy | pepijndevos: ok, yeah the regex for exceptions needs tweaking |
| 12:13 | rasmusto | hammer__: partition might be of use |
| 12:14 | pepijndevos | technomancy: what does that mean? |
| 12:14 | technomancy | shouldn't be too tricky; I think it assumes missing vars are going to be compliant with the symbol name restrictions on clojure.org |
| 12:14 | hammer__ | oh that's exactly what i was look for, thanks rasmusto |
| 12:14 | hammer__ | (inc rasmusto) |
| 12:14 | lazybot | ⇒ 1 |
| 12:14 | technomancy | pepijndevos: this explains how slamhound works: http://technomancy.us/148 |
| 12:15 | pepijndevos | ok, will read |
| 12:15 | technomancy | basically it looks at the message for each exception to see what var is missing |
| 12:15 | rasmusto | hammer__: (partition 2 1 someseq) is something I use a lot |
| 12:15 | technomancy | so it can search for it and add it into the candidate ns |
| 12:15 | technomancy | so it's just a matter of tweaking the regex |
| 12:15 | pepijndevos | ah, nice. So all the 2 namespaces I tried must have defeaten the regex in some way |
| 12:16 | pepijndevos | for the other one it says: nth not supported on this type: Symbol |
| 12:16 | technomancy | that's the thing about regexes... they never cover all the possibilities |
| 12:16 | craigbro | hmm |
| 12:17 | craigbro | core.logic issue |
| 12:17 | craigbro | if I do (run N ... |
| 12:17 | craigbro | will it repeat results into I get N? |
| 12:17 | pepijndevos | craigbro: no |
| 12:17 | hiredman | I don't think so |
| 12:18 | maio | OT: native english speakers - is it possible to say word raweri? :) |
| 12:18 | craigbro | hmm |
| 12:18 | hiredman | but depending on your program you can have duplicate results |
| 12:18 | pepijndevos | &(#(println %&) 1 2 3) |
| 12:18 | lazybot | ⇒ (1 2 3) nil |
| 12:18 | nDuff | maio: I don't know -- it's hard to know how it should be pronounced from only seeing it spelled. :) |
| 12:18 | pepijndevos | My new favourite syntax |
| 12:21 | desertmonad | Chousuke: I'm still a bit of a git novice. At work SVN is mandated, but I am able to use git-svn. Do you know of a work flow that would let me git clone a repository that was created by git-svn? |
| 12:22 | desertmonad | I can do the clone, of course, but git svn dcommit rebases to change the log messages (afaik) |
| 12:22 | Chousuke | hmm, yeah |
| 12:22 | desertmonad | and so the git clone diverges |
| 12:22 | gfredericks | maio: depends on what you mean by "possible" I guess; looks like pronounced "rah WHERE ee" |
| 12:23 | gfredericks | but definitely looks foreign |
| 12:23 | Chousuke | desertmonad: probably easiest to have two separate git-svn clones and just work with them treating them as two SVN committers (with occasional sending of patches back and forth) |
| 12:23 | nDuff | (though it does so only because bzr changed their backend to accomodate better SVN interop) |
| 12:23 | nDuff | s/only// |
| 12:25 | desertmonad | Yeah, I've thought about doing that. My goal is to not publish to SVN if I'm in the middle of tweaking something… best I've come up with is using rsync, which is less than ideal. |
| 12:26 | gfredericks | has using println with a lazy seq always given reasonable results? |
| 12:26 | gfredericks | (as opposed to str) |
| 12:26 | hiredman | yes |
| 12:28 | ln2 | Hi all. =) |
| 12:28 | ln2 | Do you guys have any recommended reading other than "The Joy of Clojure"? |
| 12:29 | gfredericks | "because I hate the joy of clojure" or "because I've already read the joy of clojure"? |
| 12:29 | hiredman | read clojure.org |
| 12:29 | hiredman | http://clojure.org/documentation http://clojure.org/rationale http://clojure.org/features |
| 12:30 | hiredman | etc |
| 12:30 | ln2 | "Because I just started reading The Joy of Clojure and I am excited to line something up in front of it. =) |
| 12:30 | ln2 | hiredman: Thank You! |
| 12:32 | brainproxy | ln2: Clojure Programming pub'd by O'Reilly was a great read, imo |
| 12:32 | ln2 | I do have one dilemma though. I've never programmed in *any* language before. So I guess my question should be more along the lines of. "Is there a Clojure for Dummies?". |
| 12:32 | hyPiRion | ln2: Depends. If you want to learn Clojure, then Clojure Programming is great. |
| 12:32 | brainproxy | one of the best O'Reilly books I've ever read, in terms of quality of the writings and examples, and the depth of learning |
| 12:33 | ln2 | brainproxy: The one with the big bird on the front? Haha |
| 12:33 | gfredericks | has anybody heard any anecdotes of new programmers learning clojure? |
| 12:33 | ln2 | Is that the same thing as horror stories? |
| 12:34 | gfredericks | :) |
| 12:34 | brainproxy | ln2: this one http://www.clojurebook.com/ |
| 12:34 | Sgeo | Is Clojure really a good idea for a starting language? |
| 12:34 | hyPiRion | ln2: I am not sure if any Clojure book is "not programmed anything yet" friendly. I do know that there are some python books out there for people completely new to programming, but I can't tell you which ones to choose. |
| 12:35 | cemerick | gfredericks: borkdude is a prof IIRC; Lee Spector also teaches total noobs Clojure. *shrug* |
| 12:35 | ln2 | I'm starting to learn the difference between Clojure and the more popular languages as I go. But again... I've never programmed in any language. (advantage?). |
| 12:35 | dnolen | Sgeo: IMO it's about as good as any other. |
| 12:35 | Natch | ln2: programming clojure 2nd edition by halloway and bedra is great. clojure programming from oreilly seems good but it has 3-4 annotations per page and is extremey annoying to read, imho.. |
| 12:35 | Sgeo | dnolen, well, there's the whole Java interop that is around that could cause issues |
| 12:35 | ln2 | To help I'm trying to learn Lambda Calculus also. I'm sure it will help. Probably... haha |
| 12:35 | Sgeo | Which is not the case with most languages |
| 12:35 | dnolen | Sgeo: doing anything useful in any language is pain. |
| 12:36 | rasmusto | ln2: could be partially an advantage, might make you take less notice of unique clojure features though |
| 12:36 | Natch | *extremely |
| 12:36 | ln2 | Natch: Thank you! I will get that one also. =) |
| 12:36 | cemerick | Natch: sorry about that; it's O'Reilly house style, something we fought tooth and nail about, but lost |
| 12:36 | gfredericks | "If you haven't programmed before I recommend starting with clojure and the lambda calculus." |
| 12:37 | pbostrom_ | ln2: you also might try some exercises on http://www.4clojure.com/ to reinforce your book learning |
| 12:37 | ln2 | gfredericks: Is this sarcasm? Haha |
| 12:37 | ln2 | pbostrom_: I've never seen this site! Thank you!!! |
| 12:37 | rasmusto | ln2: clojure koans are good too (on github), it's slightly more structured than 4clojure |
| 12:37 | Natch | cemerick: that's a shame |
| 12:38 | Natch | cemerick: because it seemed really nice otherwise |
| 12:38 | ln2 | rasmusto: I am working through the Clojure Koans right now as we speak. =) |
| 12:38 | rasmusto | ln2: cool :) |
| 12:39 | Frozenlock | I just realized why the docstring is before the arguments in clojure, as opposed to say elisp... For when you have multiple arity. |
| 12:39 | rasmusto | Frozenlock: oo, I was wondering that too. Good point |
| 12:40 | creese | Has anyone read the new o'reilly book on cljs? |
| 12:40 | ln2 | I was a little turned off aesthetically to the massive amounts of parens in Clojure until I saw lamda calculus. Maybe I should be thankful? O_o |
| 12:40 | gfredericks | ln2: a little bit. nothing wrong with being ambitious though :) |
| 12:41 | technomancy | SKI or go home |
| 12:41 | hyPiRion | ln2: If you're that far (doing Clojure Koans) and never programmed before, I'd go with Clojure Programming as a book for learning Clojure. You sound like a smart and motivated guy, so it shouldn't be a problem. |
| 12:42 | ln2 | gfredericks: Maybe the next generation of programmers it will be ambitious to try and comprehend object oriented languages! We can all hope... |
| 12:42 | Frozenlock | ln2: http://www.thejach.com/imgs/lisp_parens.png |
| 12:42 | Sgeo | Fun fact: There's more to OO than you would think just by looking at the most popular languages |
| 12:43 | Sgeo | The style of you see in Java and C# and C++ is not the only one out there |
| 12:43 | gfredericks | Sgeo: just because something is rich and subtle doesn't make it good :P |
| 12:43 | pimeys | sicp teaches objects in chapter three |
| 12:43 | Sgeo | *style of oo |
| 12:43 | pimeys | and of course you can do the same with clojure |
| 12:43 | ln2 | hyPiRion: It may seem that way... O.o. In reality I'm only average at logic and seriously inept at higher math (pretty good at mental). I'm not having the easiest time with visually following a fn embedded into a fn taking two fn ect. ect. |
| 12:43 | pimeys | having a function with inner functions, message passing and returning a closure |
| 12:43 | ln2 | I'm really really trying to go slow. xD |
| 12:44 | Sgeo | message sending implies single-dispatch I think (but not certain) |
| 12:44 | Sgeo | I'm not especially a fan of single dispatch, but I'm not sure what I would like |
| 12:44 | pimeys | me neither |
| 12:44 | pimeys | but it's possible |
| 12:44 | pimeys | and one way of building your app |
| 12:44 | pimeys | I think that the hardest part with lisps is that it doesn't force you to anything |
| 12:44 | hyPiRion | ln2: Being smart is not the same as being knowledgable. Being smart is about learning rapidly and being open to new ideas :) |
| 12:45 | pimeys | you can use whatever style you prefer |
| 12:45 | technomancy | for most people the hardest part of learning clojure is unlearning bad imperative habits |
| 12:45 | Sgeo | pimeys, which gets annoying when you try to mix different OO systems together |
| 12:45 | Sgeo | Say in Scheme if one person is using TinyCLOS and another is using, I don't know, coops |
| 12:45 | pimeys | technomancy: but you can also use your imperative habits |
| 12:45 | pimeys | keep state etc. |
| 12:45 | Sgeo | Tcl has this problem too |
| 12:45 | pimeys | Sgeo: yep |
| 12:46 | technomancy | pimeys: arguably then you haven't really learned it =) |
| 12:46 | Sgeo | Although Snit tries to solve it by saying that anything that looks like an object is an object |
| 12:46 | ln2 | For example. This Koans got me. I cheated and got the answer from a YouTube series. |
| 12:46 | Sgeo | I think |
| 12:46 | pimeys | technomancy: well, who says so :D |
| 12:46 | pimeys | lisps are not so much of functional languages, I'd say |
| 12:46 | ln2 | http://tny.cz/7feb3618 |
| 12:46 | dnolen | ln2: go slow |
| 12:46 | Sgeo | pimeys, depends on the Lisp |
| 12:46 | pimeys | but they have a nice way of giving you that possibility |
| 12:46 | Sgeo | Trying to categorize them all into one mold seems like a fool's errend |
| 12:46 | technomancy | actually that's not true, I judge all the time |
| 12:47 | ln2 | Even worse. The explanation on YouTube was basically. "That was convoluted... lets move on now!" |
| 12:47 | Sgeo | Lisp is a style of syntax and metaprogramming, imo |
| 12:47 | gfredericks | technomancy: and I'm going to judge you either way so you can't really avoid it |
| 12:47 | ln2 | O.o |
| 12:48 | ln2 | I'm assuming all of you can solve that one pretty easily? |
| 12:48 | pbostrom_ | creese: I read it, it's pretty light on content, but that's reflected in the price, probably worth if if you're brand new to cljs, but if you're already up and running, you won't learn anything new |
| 12:48 | Sgeo | Took me a bit more thinking than it should have, to be honest. But yeah |
| 12:49 | Sgeo | Think about what the fn is supposed to be doing. What is its role, what is its job there? |
| 12:49 | ln2 | To remove words that don't meet certain conditions? |
| 12:50 | Sgeo | reduce isn't a mover, it's a thing that takes a list and gives a result. And the fn you pass into it is supposed to take a result so far and an item, and return a new item-so-far |
| 12:50 | Sgeo | *reduce isn't a remover |
| 12:51 | Sgeo | (also, saying "list" was a bad choice of words on my part) |
| 12:51 | ln2 | Oh right. Because nothing can / should be "removed". Just returned. |
| 12:51 | ln2 | Because "removing" is a mutation. |
| 12:51 | Sgeo | Well, there is a function that returns a copy with some stuff different in the copy. Removed if it doesn't meet a condition. But that's not what reduce is for. |
| 12:52 | dnolen | Sgeo: message sending isn't necessarily single dispatch, look at Cecil, also the whole idea behind CLOS was being able to support different OO systems under the same roof. |
| 12:53 | ln2 | I suppose it's starting to make more sense now. I wish there was an easier way to format these but there really isn't because it's a single expression. |
| 12:53 | ln2 | Maybe this IS what draws people to OO? |
| 12:53 | Sgeo | I think what draws people to OO is the fact that it's one of the first things they learn |
| 12:54 | ln2 | Then maybe.. really.. we only have public schools to blame... |
| 12:54 | Sgeo | As far as formatting goes, that's not really much of an OO vs. functional thing. There are ways to split things up in functional languages |
| 12:54 | Sgeo | But imperative languages do admittedly tend to partition into separate statements more than having an expression |
| 12:54 | ln2 | Sgeo: Really? I'm interested in that! |
| 12:55 | Sgeo | ,(doc let) |
| 12:55 | clojurebot | "([bindings & body]); binding => binding-form init-expr Evaluates the exprs in a lexical context in which the symbols in the binding-forms are bound to their respective init-exprs or parts therein." |
| 12:55 | ln2 | I wonder if I could reason how to split up that koans... might be a fun exercise. |
| 12:55 | Sgeo | ,(let [a 5 b 6] (+ a b)) |
| 12:55 | clojurebot | 11 |
| 12:56 | Sgeo | Other functional languages have other approaches. And you can usually drag an fn out and give it a name |
| 12:56 | Sgeo | (although not always) |
| 12:56 | enquora | anyone from prismatic here? is the Graph library Clojurescript-friendly? |
| 12:56 | Sgeo | But at least with this koan, it's just a matter of fill in the blank |
| 12:56 | Sgeo | I promise that for this one, the blanks are very simple, they won't complicate the expression at all |
| 12:56 | ln2 | Binding... I was watching a talk about binding and how it do it without Macros. |
| 12:57 | Sgeo | ,((fn [a b] (+ a b)) 5 6) |
| 12:57 | clojurebot | 11 |
| 12:57 | ln2 | I don't actually know what let / binding do yet. |
| 12:57 | Sgeo | ^^roughly equivalent to the above let |
| 12:57 | ln2 | Wait a minute. Theres a REPL in this channel? |
| 12:57 | Sgeo | Two, although imperfect |
| 12:58 | ln2 | Ha! That is amazing! |
| 12:58 | brianwong | that is amazing |
| 12:59 | brianwong | i didnt know that |
| 12:59 | brianwong | (doc let) |
| 12:59 | clojurebot | "([bindings & body]); binding => binding-form init-expr Evaluates the exprs in a lexical context in which the symbols in the binding-forms are bound to their respective init-exprs or parts therein." |
| 12:59 | brianwong | err |
| 12:59 | ln2 | ,(* 2 2) |
| 12:59 | clojurebot | 4 |
| 12:59 | brianwong | ,(doc let) |
| 12:59 | clojurebot | "([bindings & body]); binding => binding-form init-expr Evaluates the exprs in a lexical context in which the symbols in the binding-forms are bound to their respective init-exprs or parts therein." |
| 12:59 | ln2 | It's fast too. *giggles like a schoolgirl* |
| 12:59 | ln2 | And it has the doc namespace! |
| 13:00 | ln2 | Does an XMPP REPL exist? |
| 13:00 | technomancy | clojurebot used to have an XMPP interface |
| 13:00 | technomancy | I think it was removed though |
| 13:00 | ln2 | =( |
| 13:02 | callenbot | enquora: I sincerely doubt it, and why would you want it to be? |
| 13:03 | enquora | need to build a PDF report generator to run in both browser and on server |
| 13:04 | enquora | it's a non-trivial task, just thinking now how to structure it |
| 13:04 | hyPiRion | enquora: What do you mean by "in browser"? |
| 13:05 | enquora | HTML browser |
| 13:05 | hyPiRion | Should the PDF be build by ClojureScript, or could it be sent from the server to the browser? |
| 13:05 | hyPiRion | built* |
| 13:05 | enquora | must run offline |
| 13:06 | enquora | it's a distributed system |
| 13:07 | ln2 | Do most of you guys use LightTable? |
| 13:07 | enquora | the web browser app is a cached HTML app, or browser extension |
| 13:07 | craigbro | not I |
| 13:07 | craigbro | but I'm an emacs curmudgeon, so may not be representative, and is no judge of LT |
| 13:08 | TimMc | ln2: Most folks here use emacs or vim. |
| 13:08 | TimMc | LT is very young. |
| 13:08 | nDuff | *nod*. It's a very neat toy, and has promise. |
| 13:09 | shaunxcode | I seem to recall there was a pure js pdf gen tool floating around recently |
| 13:09 | ln2 | Having zero programming background I'm not sure I could bring myself to use tools like emacs and vim. I'm really impressed by some of the features I've seen from both of them though, features I did not expect in cli apps. |
| 13:09 | TimMc | ln2: Learn one thing at a time. |
| 13:09 | TimMc | Both emacs and vim have long learning curves. |
| 13:09 | ln2 | TimMc: That's the method I'm trying to use. LightTable is helping me get going fast. =) |
| 13:10 | TimMc | Good. |
| 13:10 | nDuff | ln2: If you want to be blown away, watch the Emacs Live intro video. http://vimeo.com/22798433 |
| 13:10 | shaunxcode | ln2: the nice thing about using a generic text editor when starting is you learn the difference between what is language magic v.s. what is ide magic v.s. build tool wizardry |
| 13:10 | TimMc | I had to try learning emacs 3 times before it stuck; the first two times I was trying to learn a new programming language at the same time, so it sucked. :-P |
| 13:11 | ln2 | One thing I would really like to have is some way of auto-correcting my parens. Light table color codes them. But I think it was emacs that actually does parens for you? |
| 13:11 | dnolen | ln2: yes paredit |
| 13:11 | rasmusto | ln2: paredit.el or paredit.vim |
| 13:12 | TimMc | ~paredit |
| 13:12 | clojurebot | paredit is not for everyone, but what you need to understand ís how to become the kind of person that paredit ís for. |
| 13:12 | TimMc | :-P |
| 13:12 | shaunxcode | codemirror has paredit mode http://htmlpreview.github.com/?https://github.com/achengs/subpar/blob/master/demo/normal.html |
| 13:12 | technomancy | clojurebot: botsnack |
| 13:12 | clojurebot | Thanks! Can I have chocolate next time |
| 13:12 | ln2 | Did the bot just talk? O_O |
| 13:12 | TimMc | I triggered a factoid. |
| 13:12 | technomancy | as long as it obeys the Three Laws clojurebot can do anything |
| 13:12 | ln2 | Aahhhhahha! |
| 13:12 | ln2 | Is the bot as opinionated as Hickey? xD |
| 13:13 | TimMc | The bot is opinionated as the people who care to feed it things. |
| 13:13 | TimMc | Also it randomly picks up quotes from the channel, which can be... odd. |
| 13:14 | ln2 | It's also a Furby? O _ O |
| 13:14 | Sgeo | Paredit is awesome |
| 13:14 | Sgeo | I wish I had paredit in here |
| 13:14 | technomancy | Sgeo: (add-hook 'erc-mode-hook 'paredit-mode) ; =D |
| 13:14 | jballanc | clojurebot: litany against cons |
| 13:14 | clojurebot | litany against cons is "I must not cons. Cons is the perf-killer. Cons is the little death that brings total obliteration. I will face my cons and permit it to pass over me and through me, and when it has gone past I will turn my GC to see its path. And where it has gone there will be nothing; only I will remain." |
| 13:14 | Sgeo | technomancy, heh |
| 13:14 | craigbro | conj |
| 13:14 | hyPiRion | It replies to certain things. right clojurebot??? |
| 13:14 | lazybot | hyPiRion: Yes, 100% for sure. |
| 13:14 | hyPiRion | oh, that's the wrong one. |
| 13:15 | llasram | technomancy: I just tried it, and paredit is unhappy lingering emoticons :-( |
| 13:15 | Sgeo | Close all emoticons! (:) |
| 13:15 | Sgeo | (:-) |
| 13:15 | technomancy | llasram: yeah, show-paren-mode is good enough for me |
| 13:16 | Bronsa | show-paren-mode is awesome |
| 13:20 | hyPiRion | I prefer highlight-parentheses. |
| 13:23 | aaelony | does anyone know of a tutorial or link that describes how to profile a clojure program running at the repl via yourkit ? |
| 13:24 | aaelony | or running a jar produced by lein uberjar ? |
| 13:24 | hyPiRion | aaelony: running a jar? java -jar name-of-uberjar |
| 13:25 | aaelony | hyPiRion: how to profile that running jar though? |
| 13:25 | ln2 | http://tny.cz/f15ac6b4 |
| 13:25 | ln2 | I'm trying to understand how this "inline function" can be expressed in a way that is easier to read. What am I missing? |
| 13:26 | hyPiRion | aaelony: I'm afraid I don't know that. I saw the questions as two decoupled ones. |
| 13:27 | aaelony | hyPiRion: thanks anyways. yeah I have a jar I am running that I'd like to profile. I have an evaluation license for yourkit and trying to get it to analyze my jar.. Youkit's docs say I should do this: java -jar yjp-controller-api-redist.jar localhost 10001 capture-memory-snapshot but unsure what host and port and how it knows to analyze the uberjar running... |
| 13:28 | aaelony | http://www.yourkit.com/docs/12/help/command_line_tool.jsp |
| 13:31 | owengalenjones | a few minutes late, what's wrong with cons? |
| 13:31 | technomancy | this is pretty sweet: http://schneems.com/post/42508340989/open-source-in-your-inbox-code-triage |
| 13:32 | technomancy | owengalenjones: nothing apart from the fact that allocating memory is often at odds with performance |
| 13:33 | technomancy | nobody should be following the litany against cons unless they're neck-deep in profiling =D |
| 13:35 | owengalenjones | ok, heh hadnt seen that before and was curious |
| 13:35 | technomancy | it's mostly an excuse to quote Dune I guess? |
| 13:36 | desertmonad | the litany against fear got me through some final exams in years past :) |
| 13:38 | Sgeo | Huh. So that's where "politics is the mind-killer" came from, I guess |
| 13:38 | Sgeo | Dune reference |
| 13:41 | desertmonad | Dune is one of my all time favorites. That and Neuromancer. |
| 13:41 | technomancy | the bot's gotta have some neuromancer quotations in there somewhere, but I can't think of any off the top of my head |
| 13:42 | gtrak | isn't cons pretty obvious? cache-thrashing... java programmers know arraylist is generally always faster than linkedlist |
| 13:44 | nishant | Hi! Is there a way to comp a function with itself n times? Something with this behavior - (f(inc, 5), 0) => 5 ? |
| 13:44 | gtrak | iterate? |
| 13:44 | technomancy | ,((apply comp (repeat 5 inc)) 0) |
| 13:44 | nishant | Iterate almost works, except it returns a seq of all the intermediate results too |
| 13:44 | clojurebot | 5 |
| 13:44 | gtrak | ,(doc iterate) |
| 13:44 | clojurebot | "([f x]); Returns a lazy sequence of x, (f x), (f (f x)) etc. f must be free of side-effects" |
| 13:45 | owengalenjones | IANA java progrrammer |
| 13:45 | AimHere | (nth #(iterate inc 0) 5) |
| 13:45 | AimHere | ,(nth #(iterate inc 0) 5) |
| 13:45 | clojurebot | #<UnsupportedOperationException java.lang.UnsupportedOperationException: nth not supported on this type: sandbox$eval77$fn__78> |
| 13:45 | gtrak | nishant: it's lazy, don't keep the head |
| 13:45 | nishant | Ah, thanks! |
| 13:45 | AimHere | Oops |
| 13:45 | gtrak | ,(nth (iterate inc 0) 5) |
| 13:45 | clojurebot | 5 |
| 13:46 | gtrak | not sure why returning a seq would be anything other than convenient |
| 13:46 | technomancy | clojurebot: oinc |
| 13:46 | clojurebot | oinc is octo-inc: (apply comp (take 8 (repeat inc))) |
| 13:46 | technomancy | hm; that must predate repeat's second arity |
| 13:48 | dnolen | `fogus: ping |
| 13:49 | brainproxy | I must not fear. Fear is the mind-killer. Fear is the little-death that brings total obliteration. I will face my fear. I will permit it to pass over me and through me. |
| 13:57 | ln2 | I am trying to re-write one of the Clojure Koans from section 8. What is going on here? Haha |
| 13:57 | ln2 | http://tny.cz/6ad1b8bc |
| 13:58 | gtrak | ln2: you need to return an accumulator |
| 13:58 | gtrak | (reduce (fn [acc next-element] do-something-to-acc) source-seq) |
| 13:59 | ln2 | "source-seq" is the accumulator? |
| 13:59 | gtrak | acc |
| 13:59 | ln2 | Sorry for all of the questions! You guys have been a massive help. =D |
| 13:59 | gtrak | that's just kinda what reduce does :-) |
| 14:00 | ln2 | The Koans are amazing but I wish there was a detailed explanation of each problem somewhere. Not a cheat sheet but just some information. xD |
| 14:01 | gtrak | well, the doc for reduce is helpful ##(doc reduce) |
| 14:01 | lazybot | ⇒ "([f coll] [f val coll]); f should be a function of 2 arguments. If val is not supplied, returns the result of applying f to the first 2 items in coll, then applying f to that result and the 3rd item, etc. If coll contains no items, f must accept no arguments a... https://www.refheap.com/paste/11004 |
| 14:05 | ln2 | If I wanted to make this two functions then I could create one that takes an input and does a reduce with an acc. Then call that function from another function that checks if one word is larger than another? |
| 14:10 | ln2 | *crickets* |
| 14:11 | gtrak | it is two functions, whether they're both bound to a vars or not |
| 14:12 | gtrak | but I think what you described seems inverted |
| 14:12 | TimMc | &(reduce (fn [accum next-thing] (str accum ", " next-thing)) "0" [1 2 3 4]) |
| 14:12 | gtrak | reduce is the control-flow, it's calling the aggregator or whatever you wanna call it |
| 14:12 | lazybot | ⇒ "0, 1, 2, 3, 4" |
| 14:17 | ln2 | Thanks a lot guys! I think I'm managing to figure it out through trial and error. I'm not sure this would be possible without a REPL. Haha |
| 14:17 | jimduey | brainproxy: LOL |
| 14:17 | ln2 | I have it reduced to a "key must be an integer" error. Hmm. |
| 14:17 | ln2 | To google! |
| 14:18 | amalloy | ln2: you're attempting to call a vector as a function, and passing it a non-integer |
| 14:19 | ln2 | amalloy: I think I'm trying to pass a vector TO a function. I wonder how I managed to pass it AS a function. O.o |
| 14:21 | TimMc | ,([:a :b :c] 0) |
| 14:21 | clojurebot | :a |
| 14:27 | ln2 | Alright I think my problem is that I have two functions "lengthycheck" which uses the if statement to determine which is longer (a or b). "lengthyness" uses the reduce function. The values a and b are being passed to "lengthyness" but not to "lengthycheck". I need to read more about embedding functions. =( |
| 14:37 | dnolen | lynaghk: ping |
| 14:49 | ln2 | TimMc: I had my first extremely minor programming victory. I turned your expression into a function! |
| 14:49 | ln2 | (defn first-in-list [a] |
| 14:49 | ln2 | ('[a] 0)) |
| 14:49 | amalloy | errrrr, that always returns the symbol 'a, ln2, ignoring its input |
| 14:50 | ln2 | CRAP! |
| 14:50 | TimMc | What you probably want is `first`. |
| 14:51 | amalloy | TimMc: really? it looks to me like he was writing identity |
| 14:51 | ln2 | TimMc: I can't just express the function in the same simple way? ([:a :b :c] 0) ? |
| 14:51 | TimMc | amalloy: Not with the name "first-in-list". |
| 14:51 | amalloy | oh |
| 14:52 | TimMc | ln2: (fn [a] (a 0)), which works if a is a vector |
| 14:52 | amalloy | i never read function names. easier to just run them on all possible inputs in my head, observe the outputs, and derive the function's meaning thereby |
| 14:53 | ln2 | TimMc: Holy sh* that did it! My function was calling [a] the vector and not a the value. Thanks! |
| 14:53 | svedubois | How I can write these 2 lines: |
| 14:53 | svedubois | (show image1) |
| 14:53 | svedubois | (show image2) |
| 14:53 | svedubois | in only 1 line? |
| 14:53 | svedubois | (show image1 image2) |
| 14:54 | ln2 | This has the behavior I was looking for. |
| 14:54 | ln2 | (defn first-in-list [a] |
| 14:54 | ln2 | (a 0)) |
| 14:54 | ln2 | Thanks guys! I'm not as proud now though because Tim solved it for me. =( |
| 14:54 | rasmusto | ln2: ,(first [1 2 3]) |
| 14:55 | ln2 | rasmusto: I figured that there was an easier way to do this. I am just trying to understand the language so I'm rebuilding various expressions as functions. Thank you though! |
| 14:55 | rasmusto | ,(first [1 2 3]) |
| 14:55 | clojurebot | 1 |
| 14:55 | Guest14889 | i saw recently there is a server specially for clojure, forgot the name |
| 14:56 | Guest14889 | can anyone help? |
| 14:56 | ln2 | In a lot of ways it is like lamda calc. Even the most basic operations has to be reduced to logic. Instead of calling + or * you need an expression. |
| 14:56 | joegallo | Guest14889: immutatnt |
| 14:56 | rasmusto | ln2: first/rest are interesting because they work on more than just one type of sequence. They'll work on vectors, maps, seqs, etc. |
| 14:56 | Guest14889 | what wevserver do people commonly deploy to? |
| 14:56 | joegallo | typo |
| 14:56 | joegallo | immutant |
| 14:56 | Guest14889 | joegallo: thats the one, thanks |
| 14:56 | technomancy | jetty is the most common |
| 14:57 | technomancy | but immutant can be good if you need to integrate into certain environments |
| 14:57 | ln2 | rasmusto: I know about rest from the Koans problems. I'm going to write a basic rest function manually right now. =) |
| 14:57 | Guest14889 | im open to anything, i want to deploy it on a new vps |
| 14:58 | amalloy | ln2: you can't really write first or rest without in fact using first and rest. they're the primitives of sequence manipulation |
| 14:58 | Guest14889 | i'd probably go with jetty unless immutant offered significant benefits |
| 14:58 | technomancy | jetty is the simplest |
| 14:59 | amalloy | you can write versions that only work on vectors, as you did for first, but it's not very useful even as an exercise |
| 14:59 | akhudek | immutant is a lot more than just a web server. You may or may not need the extra features it has. Jetty is good for a straight forward web server. |
| 15:00 | ln2 | amalloy: This function does not always return the first character? |
| 15:00 | ln2 | (defn first-in-list [a] |
| 15:00 | ln2 | (a 0)) |
| 15:00 | amalloy | try it with (list 1 2 3) |
| 15:00 | Guest14889 | also, is pallet the favourite for automated deployments? or do people generally use a non-clojure tool? |
| 15:00 | ln2 | (first-in-list [:a :b :c]) returns :a for me |
| 15:01 | Guest14889 | if anyone has any simple pallet scripts that deploy a basic app on jetty/immutant i'd be interested i seeing one |
| 15:01 | technomancy | Guest14889: pallet is a bit less polished than other tools, but the underlying models it uses are much, much better-designed. |
| 15:01 | rasmusto | ,(get '(1 2 3) 0) |
| 15:01 | clojurebot | nil |
| 15:02 | Guest14889 | technomancy: interesting, i'll probably give it a try at least |
| 15:02 | Guest14889 | maybe i can help polish it |
| 15:02 | amalloy | ln2: so, you're saying you did not do what i suggested and try (first-in-list (list 1 2 3)) |
| 15:03 | the-kenny | (list 1 2 3) is doesn't implement the same interfaces as [1 2 3] |
| 15:04 | ln2 | amalloy: That fails. But "(first-in-list [1 2 3])" succeeds. |
| 15:04 | amalloy | as i said, you invented a solution that works only for vectors |
| 15:04 | technomancy | Guest14889: I'm sure they'd appreciate feedback and help. they were very responsive when I had questions. |
| 15:05 | ln2 | amalloy: Interesting. |
| 15:05 | llasram | &((fn [[x]] x) (list 1 2 3)) |
| 15:05 | lazybot | ⇒ 1 |
| 15:05 | llasram | Hehe |
| 15:05 | ln2 | amalloy: However. Rest is possible with only vectors also correct? I need to use increment? |
| 15:05 | nDuff | Hugo _is_ responsive. On the other hand, the amount of ground Pallet needed to make up to cover a lot of my use cases when last evaluated was pretty overwhelming. |
| 15:06 | nDuff | Then again, if I were amenable to a nuke-and-pave cloud deployment model, that wouldn't so much be the case. |
| 15:06 | nDuff | (and it's been a long time since I took a close look) |
| 15:07 | hyPiRion | ln2: rest is possible with anything you can do `seq` on and return a sequence |
| 15:07 | hugod | nDuff: if you want incremental edits of config files, that's a hard problem |
| 15:08 | hyPiRion | ,(seq (list 1 2 3 4)) |
| 15:08 | clojurebot | (1 2 3 4) |
| 15:08 | hyPiRion | ,(seq (vector 1 2 3 4)) |
| 15:08 | clojurebot | (1 2 3 4) |
| 15:08 | hyPiRion | ,(seq (hash-map 1 2 3 4)) ;; Don't worry about this for now, just be aware of it |
| 15:08 | clojurebot | ([1 2] [3 4]) |
| 15:08 | hugod | nDuff: or was it something else you needed? |
| 15:09 | ln2 | Rest is more difficult because apparently this is impossible. |
| 15:09 | ln2 | (defn rest-of-list [a] |
| 15:09 | ln2 | (a (> 0)) |
| 15:10 | nDuff | hugod: Not so much editing _files_ incrementally as configurations which could span multiple files / be determined only by invocation of queries or commands (example: Determining an edit list of invocations of vendor-provided tools to move from current state to desired configuration) |
| 15:10 | ln2 | hyPiRion: Just noticed your response. Yes I think I do need a sequence. =) |
| 15:10 | technomancy | ln2: interesting idea. for that to work, a would have to take a predicate on the index of the element, you could do it like so: (a (partial > 0)) |
| 15:11 | the-kenny | Reminds me bit of logic programming |
| 15:11 | nDuff | hugod: ...it's not an easy problem, granted, which is why I spent so much of my time a few jobs ago working on toolage to tackle it. |
| 15:11 | hugod | nDuff: so updating based on querying the current system status? |
| 15:12 | nDuff | *nod*. |
| 15:12 | hugod | ok, 0.8 should be much better at that |
| 15:13 | hugod | you can use the return values of actions in flow control, etc |
| 15:13 | nDuff | Nice. I'll definitely need to reevaluate, then. |
| 15:13 | hugod | should be released before clojure/west, I hope |
| 15:14 | ln2 | technomancy: I'm still getting a "key must be an integer" exception. =( |
| 15:14 | technomancy | ln2: oh, I didn't mean that would work; I meant if vectors took predicates it would work. |
| 15:15 | ln2 | Hahaha! |
| 15:15 | technomancy | I was noting that your assumption it did was interesting from an API design point of view. |
| 15:15 | ln2 | technomancy: Well thank you very much. I try to be interesting. ;) |
| 15:16 | ln2 | technomancy: I'm determined to get this to work. I'm pretty sure I need to create a sequence to index the input data and ignore the first entry? |
| 15:17 | technomancy | there are a bunch of ways you could do it; that's a decent place to start. |
| 15:18 | technomancy | assuming you have a vector, anyway |
| 15:18 | ln2 | technomancy: A bunch of ways huh? Well you really know how to make someone feel smart. ; ) |
| 15:19 | technomancy | ln2: well, think of it as an artistic expression more than a puzzle. |
| 15:20 | ln2 | technomancy: Now I feel a ton better! If I fail I'm simply not artistic. xD |
| 15:21 | nDuff | ln2: One easy way to do that (without the obvious thing of using first, of course) would be destructuring. |
| 15:21 | technomancy | heh; I was restraining myself from saying that =) |
| 15:22 | technomancy | let him get it working this way first so he'll appreciate that more =) |
| 15:22 | lynaghk | dnolen: pong |
| 15:22 | lynaghk | dnolen: I just saw your core.logic push on github. Looking forward to checking it out---might be able to this afternoon |
| 15:22 | hyPiRion | ln2: You're looking at it wrong. You're unfamiliar with the paintbrush you use. In fact, you're unfamiliar with anything which involves paint. It's not about being artistic or not, it's about knowing the details of the paintbrush. |
| 15:22 | lynaghk | finally back in Portland |
| 15:22 | dnolen | lynaghk: some significant changes to simple unifier in master |
| 15:23 | TimMc | technomancy: And then I can show ln2 the swearjure approach to rest, and we can *all* appreciate the standard way more. :-P |
| 15:23 | dnolen | lynaghk: only thing left to do is to distinguish vector & sets of symbols -> constraints |
| 15:24 | lynaghk | dnolen: awesome. I'll take things around for a spin and if I'm feeling lucky I'll take a crack at the vector+sets constraints |
| 15:24 | ln2 | hyPiRion: I think that is pretty much right. Compared to actual painting I'm accomplishing what amounts to a poorly drawn stick figure. Only been programming for 4 days! |
| 15:24 | ln2 | nDuff: Thank you for the suggestion! I will do it that way after I figure out another way of doing it first. =) |
| 15:24 | jsabeaudry | What are the popular choices for doing parameter validation on your rest api? |
| 15:25 | hyPiRion | TimMc: yeah, I used a similar version of your rest to get quicksort working. It's not really quicksort though, since it's O(n^3) when the seq is already sorted. |
| 15:25 | hyPiRion | But if we assume rest is constant time, it's quicksort :) |
| 15:28 | TimMc | :-P |
| 15:28 | DerGuteMoritz | hello, I think I found a bug in clojurescript's core.cljs which requires a one-line fix. I haven't got a CA, yet, nor do I intend to get one right now. does anyone here care about it and wants to submit it as their own patch perhaps? |
| 15:28 | lynaghk | DerGuteMoritz: what is it? |
| 15:29 | DerGuteMoritz | lynaghk: I think the if-not in https://github.com/clojure/clojurescript/blob/master/src/cljs/cljs/core.cljs#L4428 is missing an else branch |
| 15:29 | DerGuteMoritz | with a (recur (inc i) init) call |
| 15:30 | DerGuteMoritz | I may be mistaken though! |
| 15:31 | DerGuteMoritz | hm, maybe I should take this opportunity and do the CA dance once and for all |
| 15:31 | lynaghk | DerGuteMoritz: How did you come across this? If you're just reading core.cljs for fun, then yeah, you should totally get a CA = ) |
| 15:32 | hyPiRion | ^ +1 |
| 15:32 | DerGuteMoritz | lynaghk: I am actually porting PersistentHashMap to Scheme right now hehehe |
| 15:32 | DerGuteMoritz | ok I shall, then |
| 15:32 | lynaghk | DerGuteMoritz: ah. Yeah, I don't know enough about the internals to say if that's a bug or if someone used if-not when they meant when-not |
| 15:32 | amalloy | DerGuteMoritz: i wouldn't be surprised if this code is correct, though i'm not familiar with the internals |
| 15:33 | amalloy | ie, it seems unlikely to me that there would be a nil node followed by a non-nil node |
| 15:33 | DerGuteMoritz | let's see |
| 15:33 | DerGuteMoritz | well |
| 15:33 | DerGuteMoritz | but the correct thing to return then would be init, then, wouldn't it? |
| 15:33 | hyPiRion | A repro case is usually sweet to have. |
| 15:33 | DerGuteMoritz | yeah, I agree, that would be best |
| 15:34 | DerGuteMoritz | I will follow the code path completely again, maybe I overlooked something |
| 15:34 | amalloy | good point |
| 15:34 | TimMc | It could be a masked bug, i.e., not actually demonstrable until some other code changes and reveals it. |
| 15:36 | DerGuteMoritz | TimMc: yeah might be! |
| 15:41 | DerGuteMoritz | amalloy: for the record: empircally it seems to be possible that an ArrayNode has gaps |
| 15:41 | TimMc | That expression really points to the need for a let-loop-if-let-if-let-if macro. |
| 15:42 | DerGuteMoritz | absolutely |
| 15:42 | DerGuteMoritz | so this CA means I assign the copyright of contributions to Rich? |
| 15:44 | amalloy | DerGuteMoritz: you give him joint copyright, which is basically permission to do whatever he wants with it |
| 15:44 | DerGuteMoritz | ah yes, I just read the text |
| 15:45 | hyPiRion | DerGuteMoritz: It's there so that you cannot submit a patch, get it accepted and sue afterwards if you have a patent on the thing you submitted. IIRC. |
| 15:45 | ln2 | (defn rest-of-vector [a] |
| 15:45 | ln2 | (subvec a 1)) |
| 15:45 | hyPiRion | Though don't quote me on that. |
| 15:45 | ln2 | 8) |
| 15:46 | amalloy | hyPiRion: that is the main reason it exists, yes |
| 15:46 | TimMc | hyPiRion: Also for relicensing. |
| 15:46 | jsabeaudry | out of curiosity, why don't I need a CA for contributing to the linux kernel? |
| 15:46 | DerGuteMoritz | hmmm so does that mean we could lose clojure completely if Rich decides to go proprietary? :-) |
| 15:46 | TimMc | Nah. |
| 15:47 | amalloy | DerGuteMoritz: no, because he's already licensed existing versions of it |
| 15:47 | amalloy | you could lose access to his latest and greatest new ideas if he decides not to share them with you, but that's hardly unusual |
| 15:47 | TimMc | In short, it would create a fork. |
| 15:47 | hyPiRion | amalloy: You won't lose access, you wouldn't get them to begin with. |
| 15:48 | DerGuteMoritz | ah, so it can't be used to change the past, good :-) |
| 15:48 | ln2 | Is there any alternative to his database that is open source? |
| 15:48 | ln2 | ^Datomic |
| 15:48 | ravster | hello all |
| 15:48 | amalloy | ln2: postgres |
| 15:48 | DerGuteMoritz | ok guys, I gotta leave for a bit, I'll get back to you later when I know more about the possible bug |
| 15:48 | DerGuteMoritz | thanks for your feedback so far! |
| 15:48 | amalloy | mongodb. millions of open-source alternative databases. i realize this doesn't answer the question you meant to ask, but it's kinda a silly question :P |
| 15:48 | ln2 | amalloy: Is it possible to mimic the same ideas with postgres? An accumulating data structure with timestamps ect? |
| 15:49 | ln2 | amalloy: I was under the assumption that Datomic was unique. |
| 15:49 | ln2 | ravster: Hello. =) |
| 15:49 | amalloy | *shrug* everything is unique |
| 15:49 | dnolen | DerGuteMoritz: that's one for Michal Marcyk to look at, if you open an issue and assign it to him he will probably respond pretty quickly. |
| 15:49 | ln2 | amalloy: I was under the assumption that Datomic had capabilities that other databases didn't have? |
| 15:49 | amalloy | if you've been programming for four days i'd save worrying about datomic's licensing for later |
| 15:50 | gtrak | ln2: you can run datomic on postgres if you like.. what do you mean by possible to mimic the same ideas? |
| 15:50 | hyPiRion | ln2: Well, he has explained how Datomic works, so it's possible to create an open version of it. |
| 15:52 | ln2 | amalloy: Understandable. The reason I'm drawn to Clojure is because I agree with the basic concepts. Even with programming for two weeks I think it's reasonable to start working with databases. No point in working with databases that don't agree with the basic concepts of the langauge. =) |
| 15:52 | DerGuteMoritz | dnolen: I can't open an issue without having signed the CA though, right? |
| 15:52 | hyPiRion | DerGuteMoritz: You can. |
| 15:52 | dnolen | DerGuteMoritz: anyone can open an issue |
| 15:52 | DerGuteMoritz | ah, cool, then I misunderstood that part |
| 15:53 | ln2 | hyPiRion: That is what I was getting at. I understand that Datomic ultimately uses other databases as raw data stores. But the way that it places and organizes that data is unique (time based, imutable, ect.). |
| 15:53 | DerGuteMoritz | then I shall do that, thansk! |
| 15:53 | DerGuteMoritz | afk now for real :-) |
| 15:53 | hyPiRion | ln2: It unique in this moment, yes :) |
| 15:54 | ln2 | gtrak: Yes. More along the lines of "Have those ideas been copied yet". It looks like the answer is no unfortunately. |
| 15:55 | gtrak | 'a particular set of design tradeoffs', anything can do anything if you try hard enough |
| 15:56 | ln2 | I wish I was a more competent programmer. I would help implement FreeTomic. ; ) |
| 15:57 | ln2 | It's unfortunate that Rich didn't kickstart Datomic, open source it and profit from support and solutions. |
| 15:58 | ln2 | hyPiRion: Is there something missing from this or will this actually rest any vector? |
| 15:58 | ln2 | (defn rest-of-vector [a] |
| 15:58 | ln2 | (subvec a 1)) |
| 16:01 | hyPiRion | ln2: It will indeed rest any vector. |
| 16:01 | ln2 | hyPiRion: Sweet! I ran a bunch of tests but I wasn't sure if I had missed something stupid / obvious. |
| 16:01 | hyPiRion | Well, it won't return a seq, but it will return a collection without the first element |
| 16:02 | hyPiRion | oh right, we may have an odditiy. |
| 16:02 | hyPiRion | ,(subvec [] 1) |
| 16:02 | clojurebot | #<IndexOutOfBoundsException java.lang.IndexOutOfBoundsException> |
| 16:02 | hyPiRion | Yeah, you need to handle that case. |
| 16:02 | ln2 | An empty vector..... |
| 16:02 | TimMc | &(pop []) |
| 16:02 | lazybot | java.lang.IllegalStateException: Can't pop empty vector |
| 16:02 | hyPiRion | ,(rest []) |
| 16:02 | clojurebot | () |
| 16:03 | ln2 | & is an anonymous function? |
| 16:03 | lazybot | java.lang.RuntimeException: Unable to resolve symbol: is in this context |
| 16:03 | TimMc | ln2: No, & is lazybot's eval trigger. |
| 16:03 | ln2 | Rest also fails against an empty vector? Interesting. |
| 16:03 | amalloy | hyPiRion: he only needs to handle that case if it's part of the function's contract, and he's making it up himself |
| 16:03 | TimMc | ln2: What do you mean by "fails"? |
| 16:04 | ln2 | ,(rest []) |
| 16:04 | clojurebot | () |
| 16:04 | hyPiRion | ln2: Doesn't fail, it returns (). |
| 16:04 | Raynes | That isn't failure. |
| 16:04 | Raynes | There is no rest of nothing. |
| 16:04 | ln2 | I see it. Read the responses in the wrong order. =) |
| 16:04 | amalloy | there *ain't no rest of nothing |
| 16:04 | TimMc | heh |
| 16:04 | holo | hi |
| 16:05 | ln2 | amalloy: Interesting. I'm trying to understand contracts. It really just means the "purpose" of the function as defined by me? |
| 16:05 | amalloy | yes |
| 16:06 | ln2 | amalloy: If that purpose never involved empty vectors then theres no problem. I am still curious enough to try and fix that case. |
| 16:07 | gtrak | maybe being broken on empty it is part of the contract, conveniently, since that's what it does |
| 16:07 | ravster | cemerick: in 'friend', does the users data have to be a map of stuff that has username as a key and in the map itself? |
| 16:08 | ln2 | gtrak: Maybe I just need to find a more productive problem to solve now that I *mostly* solved that one. Haha |
| 16:09 | holo | in korma, when a defentity users has-one email, this singular name "email" refers to a defentity email? or does it follow a plural names convention and it refers to defentity emails? |
| 16:11 | cemerick | ravster: maps are just convenient credential fns; see https://github.com/cemerick/friend/#credential-functions-and-authentication-maps |
| 16:13 | ln2 | I tried a google on this one but can't seem to figure it out. What is the difference between the values 1 and :1? |
| 16:13 | ln2 | Int vs Str? |
| 16:13 | jsabeaudry | Is validateur the defacto standard for parameter validation in a rest webapp ? |
| 16:13 | amalloy | jsabeaudry: no such standard has arisen yet |
| 16:14 | jsabeaudry | amalloy, what are the other top dogs? |
| 16:15 | amalloy | hell if i know. i just validate stuff by hand |
| 16:15 | Raynes | amalloy, jsabeaudry: lib-noir has a tiny validation thingy that I've never used and have nothing to do with. |
| 16:17 | ravster | cemerick: thanks |
| 16:19 | ppppaul | weavejester, you here? |
| 16:20 | SurlyFrog | Has anyone ever gotten a `ClassNotFoundException org.apache.http.impl.conn.PoolingClientConnectionManager` when trying to require clj-http.client ? |
| 16:20 | craigbro | nope |
| 16:20 | craigbro | however, if it was working previously... |
| 16:20 | amalloy | i'm guessing at least one person has |
| 16:20 | craigbro | sometimes rming target helps clean up confusion about deps |
| 16:21 | SurlyFrog | I'll try that |
| 16:21 | craigbro | gets me alot when switching between branches of a project that has different deps on different branches |
| 16:21 | holo | jsabeaudry, i think i lost several days trying and making market study with many of the validation solutions, only to end up rolling my own validation module. I still use the lib-noir email validation e.g., but i don't use it's stateful errors |
| 16:22 | weavejester | ppppaul: Yep |
| 16:22 | callenbot | Raynes: we need to talk. |
| 16:22 | ppppaul | what would be the easiest way to deal with having singular and pluralized routes map to the same fn? |
| 16:22 | callenbot | Raynes: but first: http://www.youtube.com/watch?v=7tOo2OMUhB8 |
| 16:23 | weavejester | ppppaul: What do you mean? |
| 16:23 | callenbot | ppppaul: what like "/page/:id" and "/pages/:id" ? |
| 16:23 | ppppaul | yup |
| 16:23 | callenbot | weavejester: exercise a little imagination mate :) |
| 16:23 | weavejester | callenbot: Yes, but why would that be a problem? |
| 16:24 | Raynes | callenbot: Talk |
| 16:24 | callenbot | Raynes: what's the deal with signed cookies in lib noir? |
| 16:24 | Raynes | callenbot: EH? |
| 16:24 | SurlyFrog | removing target didn't help |
| 16:24 | jsabeaudry | holo, Interesting, what made you reject the libraries you found? |
| 16:24 | callenbot | Raynes: you can see the values. |
| 16:24 | callenbot | Raynes: it's key and key__s or whatever |
| 16:24 | gtrak | validateur seems to me no better than apply |
| 16:24 | callenbot | Raynes: and it just nukes the k/v pair if the __s doesn't match the value |
| 16:25 | Raynes | callenbot: I didn't write that, so *shrug*. |
| 16:25 | Raynes | I guess ibdknox likes broken shit? |
| 16:25 | callenbot | Raynes: balls. Enjoy the Misty Mountain Cold anyway. who do I harass? |
| 16:25 | callenbot | oh this is his fault? |
| 16:25 | callenbot | I'd better write a patch. |
| 16:25 | Raynes | Well, ibdknox wrote it but he won't be able to fix it. |
| 16:25 | callenbot | I know, that's why I realized I have to write it |
| 16:26 | Raynes | I'd take a patch to fix it, but I don't have time to do so myself anytime soon, especially since I don't know squat about cookies. |
| 16:26 | gtrak | "(numericality-of :age :even true)" I mean seriously? how about (even? x) |
| 16:26 | callenbot | Raynes: they're a sticking point / bugbear of mine. I'll fix it. |
| 16:26 | weavejester | ppppaul: Could you explain why plural vs. singular would be a problem? |
| 16:26 | weavejester | And for that matter, why you'd want it. |
| 16:26 | callenbot | weavejester: legacy URL compatibility? |
| 16:26 | ppppaul | it's not a problem. i'm just wondering how i would deal with this in as little code as possible |
| 16:27 | callenbot | weavejester: unless there's a legitimate x-y problem going on, it's usually a waste of time to pushback on peoples' stated needs. Sometimes they don't have a choice. |
| 16:27 | weavejester | ppppaul: Well, there's https://github.com/r0man/inflections-clj |
| 16:27 | ppppaul | legacy URL compatability is actually what i would like to deal with |
| 16:27 | weavejester | callenbot: Getting more information about the cause of the issue is almost never a bad idea. |
| 16:28 | callenbot | weavejester: maybe so but I've had a lot of bad experiences with time wasted questioning needs and having to re-explain an irrelevant use-case over and over. |
| 16:28 | ppppaul | in many cases in my app singular and plural don't have meaning for the api |
| 16:28 | holo | jsabeaudry, some were hard to understand, others did too much, and all of them (obviously) assumed i had to specify what kind of validation to run against each field. because i had to change constraints in the db, and repeat the process in the code, i built my own constraint map extracted from the db |
| 16:29 | rasmusto | hyPiRion: thanks for the leiningen patch (`lein clean`) |
| 16:30 | technomancy | ln2: for the record, clojars uses a data store that has the same assumptions of immutability and append-only as datomic, but since the data set is small (and not distributed) it's much easier to implement. |
| 16:30 | technomancy | oops |
| 16:31 | weavejester | callenbot: I've mostly had the opposite problem. Asking one or two questions before leaping to answer a problem is often a sound idea, and usually doesn't take up much time. |
| 16:31 | holo | jsabeaudry, i also use conventions of my own extracted from the database (but not constraints) to validate for errors that are not available from constraints. e.g. validate for email when a field's name has *email* in the name |
| 16:31 | ppppaul | thanks for the link weavejester, however i'm talking about matching routes. do i have to duplicate my routes then? clout can't handle something like what i'm asking for? |
| 16:32 | callenbot | weavejester: fair. also if I'm first person to notice the sucky cookies implementation then how have you been doing auth/saved-signin all this time? |
| 16:32 | gfredericks | what kind of storage does datomic free use? some opaque internal thing? |
| 16:33 | hiredman | gfredericks: looks like hsql |
| 16:33 | hiredman | gfredericks: but that is just a guess since I'g gotten hsql exceptions from broken datoic free setups |
| 16:33 | desertmonad | so is it "day-tom-ic" or "duh-tom-ic"? |
| 16:33 | weavejester | ppppaul: Hum. You could look for directory paths in the path and setup some regular expression to match both parts. |
| 16:33 | weavejester | callenbot: Sucky cookies implementation? |
| 16:34 | weavejester | callenbot: What do you mean? |
| 16:34 | weavejester | ppppaul: Or… maybe a "normalize route" middleware. |
| 16:35 | weavejester | ppppaul: Split a route up by /, then pluralize any singular words. |
| 16:35 | gfredericks | hiredman: cool thanks |
| 16:35 | callenbot | weavejester: signed cookies in lib-noir upsets me :) |
| 16:35 | gfredericks | desertmonad: this is english, so yes |
| 16:36 | jsabeaudry | holo, I see, do you remember the names of the better ones you considered? (besides validateur and lib-noir) |
| 16:36 | weavejester | callenbot: I hadn't seen that before. I don't have a lot of interation with lib-noir. |
| 16:37 | weavejester | What's the purpose of put-signed? |
| 16:37 | callenbot | weavejester: okay fine but that wasn't my question |
| 16:37 | callenbot | weavejester: I was asking you how you kept users logged in |
| 16:37 | weavejester | callenbot: With cookies? I'm not sure I understand the question. |
| 16:37 | callenbot | weavejester: you do use cookies? |
| 16:38 | weavejester | callenbot: Yes, but not lib-noir. |
| 16:38 | callenbot | weavejester: what do you save, an id or something? How do you keep them from tampering with the cookie? |
| 16:38 | callenbot | are you signing them yourself? |
| 16:39 | weavejester | callenbot: It depends. Ring has several different cookie stores. The most common mechanism is to generate a UUID and link that to a database value that contains session data. |
| 16:39 | amalloy | callenbot: everyone just sends the user an id, and keeps the real data server-side somewhere |
| 16:39 | callenbot | amalloy: a db-backed session id? |
| 16:39 | weavejester | callenbot: But Ring also has a cookie-store implementation that encrypts the session data with AES and HMACs it with a secret key. |
| 16:39 | ppppaul | weavejester, i think i'll use multiple contexts with inflections-clj that point to the same route |
| 16:39 | callenbot | weavejester: wait wait, where's this cookie-store implementation? |
| 16:39 | holo | jsabeaudry, i can't precise it now after so much time, but it's safer to go to clojuresphere.com and check how many projects are using foo and bar validation libs. if no one is using it, suspect something is wrong with the lib :) |
| 16:40 | callenbot | weavejester: that's what I need. is something that hides the kv pairs. |
| 16:40 | weavejester | callenbot: https://github.com/ring-clojure/ring/blob/master/ring-core/src/ring/middleware/session/cookie.clj |
| 16:40 | callenbot | I don't like db-backed session stores. |
| 16:40 | weavejester | callenbot: Also read: https://github.com/ring-clojure/ring/wiki/Sessions |
| 16:40 | weavejester | I believe lib-noir has a stateful session implementation based on top of Ring's sessions. |
| 16:41 | hyPiRion | rasmusto: Oh, you're welcome :) |
| 16:42 | jsabeaudry | holo, oh wow thanks, I didn't know about clojuresphere |
| 16:42 | technomancy | hyPiRion has been on fire recently =) |
| 16:42 | weavejester | callenbot: (wrap-session handler {:store (cookie-store secret-key)}) |
| 16:42 | callenbot | weavejester: yeah I see it. I'm pondering how to make the wrapping work with my template rendering |
| 16:42 | holo | jsabeaudry, you're welcome |
| 16:42 | callenbot | weavejester: thanks for the pointer, it's much appreciated. |
| 16:43 | technomancy | http://www.generationgamerz.com/images/post/361/nbaj_02.jpg |
| 16:43 | rasmusto | technomancy: that symlink? code seems like it should exist somewhere else, are symlinks just not used frequently in clojure projects? (my case may have been special) |
| 16:43 | weavejester | callenbot: No problem. You can take the session data out and put it into a binding, of course. And lib-noir provides stateful session functions. |
| 16:43 | callenbot | technomancy: damn dude, now I want to play that. |
| 16:44 | gtrak | technomancy: sb3j3c2 nyhkhbs is a cheat-code for some reason I can never forget. haven't played in 13 years. |
| 16:44 | holo | jsabeaudry, i would gladly provide you my module, but unfortunately it has too much code smell, and is coupled with database details |
| 16:44 | weavejester | So you could write: (wrap-noir-session handler {:store (cookie-store …)}) |
| 16:44 | callenbot | weavejester: I don't like the stateful session stuff in lib-noir. I have my own cookie and request context stuff floating around |
| 16:44 | weavejester | And then (noir.session/get "foo") |
| 16:44 | weavejester | (noir.session/put! "foo" "bar") |
| 16:45 | technomancy | rasmusto: it'd be nice if it were in clojure.java.io, but it's small enough that it's probably not worth the effort that would take |
| 16:45 | weavejester | Behind the scenes it uses an atom that exists for the duration of the request. |
| 16:45 | weavejester | I usually prefer a more functional approach, however. |
| 16:46 | TimMc | hyPiRion: Nice solution. |
| 16:46 | callenbot | weavejester: I have my own atom thing I'm using that does that. |
| 16:46 | hyPiRion | TimMc: Chinese wall of Apache Commons solution, praise them. |
| 16:46 | holo | weavejester, are you able to sanely not use session state? |
| 16:47 | rasmusto | technomancy: understood |
| 16:48 | TimMc | hyPiRion: I was trying to work something like that out yesterday. I didn't think of taking the canonical parent and sticking the last path element back on. |
| 16:48 | weavejester | holo: I just use session state for holding the user ID. |
| 16:48 | weavejester | holo: I've never needed anything more. |
| 16:49 | callenbot | weavejester: I do the same thing. |
| 16:49 | callenbot | weavejester: I do need a RequestContext thingamajig to keep from getting pissed off though. |
| 16:49 | hyPiRion | TimMc: Well, now you know that trick! |
| 16:49 | gtrak | how do you expire a cookiestore session without another store? |
| 16:49 | weavejester | callenbot: Did you implement that? |
| 16:50 | weavejester | gtrak: Cookies have their own expiration mechanism. |
| 16:50 | holo | weavejester, amazing! after some unsuccessful refactorings, i came with the same conclusion (yesterday) - just store the user ID |
| 16:50 | hyPiRion | To be fair, I was hoping for a cleaner solution, but the "Java on all platforms" kind of breaks down when you're dealing with system specific things. |
| 16:50 | gtrak | ah, tell the browser to expire it and hope it complies |
| 16:51 | weavejester | gtrak: Well, if you want to be certain about it, you can set an internal timestamp and check it. |
| 16:51 | TimMc | hyPiRion: "Runs on all platforms" is like "it's Turing complete!". |
| 16:52 | callenbot | weavejester: yes but it's not an original idea. I based it on Django/Flask RequestContext and data lifecycles |
| 16:52 | gtrak | ah |
| 16:52 | holo | weavejester, ok, that's a lie. i actually store the username too, but the ID is the most important since it's reliable cause it never changes |
| 16:52 | weavejester | holo: I can't really think of anything else you'd want to store. People give examples like shopping baskets and such, but they're usually better implemented as resources on the server. |
| 16:52 | callenbot | weavejester: I implemented it myself because none of the people who hadn't used Python before had any idea what the hell I was talking about. |
| 16:53 | weavejester | callenbot: I'd encourage you to release it as middleware, if you have time. |
| 16:53 | callenbot | weavejester: you people will hiss at me because it's not functional. |
| 16:54 | rbarraud | You people?! <ninja_pose> (Me, myself and Irene) :-/ |
| 16:54 | holo | weavester, i store the username, cause every page salutes the user >.> .. i thought it would be slugish to make a query on every page change hehe.. and it's not a big deal if the username is not up to date with the db for this purpose |
| 16:54 | rbarraud | Rofl |
| 16:54 | technomancy | we wouldn't do that |
| 16:54 | technomancy | we have bots to do the hissing for us now |
| 16:54 | TimMc | $hiss |
| 16:54 | TimMc | :-( |
| 16:54 | rasmusto | clojurebot: hiss |
| 16:54 | clojurebot | Gabh mo leithscéal? |
| 16:54 | callenbot | technomancy: :D (btw, I was talking to me best friend who also moved to Cali about Seattle. He might follow me there if I move) |
| 16:54 | TimMc | clojurebot: boo is <reply>hiss |
| 16:54 | clojurebot | In Ordnung |
| 16:55 | weavejester | callenbot: Sometimes one has to depart from pure functional code, but pure functions are very nice to work with. |
| 16:55 | rbarraud | Clojurebot: rant |
| 16:55 | weavejester | holo: Caching the username seems reasonable. |
| 16:55 | callenbot | weavejester: alright I'll do it. Do you use lib-noir? |
| 16:55 | rbarraud | Fail... |
| 16:55 | weavejester | callenbot: Nope. |
| 16:56 | callenbot | weavejester: you said you didn't right? okay. |
| 16:56 | callenbot | I'll try to keep it ring-only then. |
| 16:56 | TimMc | clojurebot: rant is http://www.ccs.neu.edu/home/shivers/rants/ |
| 16:56 | clojurebot | You don't have to tell me twice. |
| 16:56 | rasmusto | clojurebot: rant |
| 16:56 | clojurebot | rant is http://www.ccs.neu.edu/home/shivers/rants/ |
| 16:56 | weavejester | callenbot: I'm not advocating avoiding lib-noir. If it's useful, by all means, use it :) |
| 16:57 | weavejester | But lib-noir tends to advocate a slightly less functional approach than Ring. |
| 16:57 | callenbot | weavejester: I'm just saying that I'll strive for reusability and composability. |
| 16:57 | weavejester | callenbot: I'm all for that :) |
| 16:57 | abp | callenbot: That's need a (def (atom ..)) per namespace! |
| 16:57 | weavejester | Which reminds me... |
| 16:57 | rbarraud | clojurebot: rant |
| 16:57 | clojurebot | rant is http://www.ccs.neu.edu/home/shivers/rants/ |
| 16:58 | weavejester | I need to release crypto-password |
| 16:58 | callenbot | abp: what? |
| 16:59 | abp | yea the sentence was f**d up |
| 16:59 | callenbot | abp: wat |
| 17:00 | abp | callenbot: For reusability and composability you need at least one (def x (atom ...)) per namespace. :P |
| 17:00 | gtrak | I thought the point of dynamic binding was that it wasn't composable? |
| 17:00 | callenbot | abp: no I don't |
| 17:00 | callenbot | abp: my thingy works fine. |
| 17:01 | abp | I were joking. |
| 17:01 | callenbot | I use it to shoot stuff from pre-processing middleware to the templates. |
| 17:01 | callenbot | abp: I don't have a sense of humor. |
| 17:02 | abp | And I shouldn't do jokes based on my opinions in a technical irc-channel, probably. |
| 17:02 | holo | callenbot, i find the defpages from noir really sweet |
| 17:02 | callenbot | holo: I don't do webapps that way. |
| 17:02 | callenbot | holo: most of my web work is collaborative/team based |
| 17:03 | callenbot | aka I'm working with a frontend guy...that doesn't know Clojure. |
| 17:03 | gtrak | Vars shouldn't be in libraries. I hate it when people make assumptions about lifecycles for me. |
| 17:03 | abp | So no hiccup for you? |
| 17:03 | callenbot | gtrak: so don't use it. boohoo. |
| 17:04 | callenbot | gtrak: I need it and so do a lot of web apps. |
| 17:04 | hyPiRion | callenbot: The obvious solution is to learn them Clojure. |
| 17:04 | callenbot | gtrak: it's just ring middleware. |
| 17:04 | callenbot | hyPiRion: we don't want to repeat this conversation. |
| 17:04 | callenbot | hyPiRion: I've been working and running teams long enough to know what's in the cards and what ain't |
| 17:04 | gtrak | callenbot: just saying, vars are more useful for an application... and not talking about you specifically, other libs have the same problem |
| 17:04 | callenbot | hyPiRion: guess what? it ain't in the fucking cards. |
| 17:05 | callenbot | gtrak: well I need a way to shoot data around the handlers. so blah. |
| 17:05 | abp | callenbot: That can't be put into the request-map? |
| 17:05 | gtrak | yes, I actually like vars more than most of my colleagues, just at the top |
| 17:05 | weavejester | gtrak: You mean like with-connection or something? |
| 17:06 | gtrak | weavejester: I think so? |
| 17:06 | callenbot | abp: hrm. I just got an idea. |
| 17:07 | TimMc | &(format "%02x" (int \#)) |
| 17:07 | lazybot | ⇒ "23" |
| 17:07 | gtrak | weavejester: yea. I prefer to write extra glue than do surgery on a namespace |
| 17:07 | brianwong | (for [x (range 4)] (println x)) |
| 17:07 | abp | callenbot: Around getting rid of state? :D |
| 17:07 | brianwong | is the reason the nils are at the end in REPL because of the lazy evaluation? |
| 17:07 | abp | mutable* |
| 17:08 | weavejester | gtrak: Agreed. I don't like side channels, especially when they're not written by me ;) |
| 17:08 | holo | any good advice for a unix shell script lisp? or i will just try fish. it looks nice |
| 17:08 | brianwong | as in the side-effects are not guaranteed to happen before the next item is returned? |
| 17:08 | gtrak | I really like vars that I write :-) |
| 17:08 | gfredericks | brianwong: yeah |
| 17:08 | gfredericks | brianwong: the side effects happen as the repl walks through the lazy seq to print the nils |
| 17:09 | gfredericks | brianwong: wrap the thing in doall to see a different effect |
| 17:12 | ubuntu1 | hi |
| 17:12 | gfredericks | hi. |
| 17:12 | holo | hi |
| 17:12 | brianwong | gfredericks: why doesnt the (for [x (range 4)] (println x)) print anything? |
| 17:13 | hiredman | ~for |
| 17:13 | clojurebot | for is complected |
| 17:13 | hiredman | ~for |
| 17:13 | clojurebot | for is not used often enough. |
| 17:13 | hiredman | ~for |
| 17:13 | clojurebot | for is not a loop |
| 17:13 | nDuff | brianwong: for creates a lazy sequence. |
| 17:13 | brianwong | a list comprehension |
| 17:13 | gfredericks | hiredman: oh oh is there inference on "is not"? :D |
| 17:14 | nDuff | brianwong: ...if you want it to execute immediately, and you aren't looking for side effects, you should probably be using doseq instead. |
| 17:14 | gfredericks | nDuff: s/aren't/are/? |
| 17:14 | nDuff | err, right. |
| 17:14 | brianwong | i see |
| 17:15 | gtrak | sequences are about values, side effects aren't |
| 17:15 | gfredericks | laziness and side effects aren't comfortable together |
| 17:15 | gfredericks | they fight a lot |
| 17:15 | hiredman | gfredericks: I think the verb there is |is| so you would have to say "not a loop is xyz" |
| 17:15 | brianwong | (doc doall) |
| 17:15 | clojurebot | "([coll] [n coll]); When lazy sequences are produced via functions that have side effects, any effects other than those needed to produce the first element in the seq do not occur until the seq is consumed. doall can be used to force any effects. Walks through the successive nexts of the seq, retains the head and returns it, thus causing the entire seq to reside in memory at one time." |
| 17:16 | brianwong | it says that the side effects of a lazy sequence would happen after the sequence is consumed |
| 17:16 | gfredericks | the "other than those needed to produce the first element" sounds wrong? |
| 17:16 | brianwong | so shouldnt (for [x (range 4)] (println x)) produce the side-effects? |
| 17:16 | nDuff | brianwong: What's consuming it? |
| 17:16 | brianwong | even at the end? |
| 17:16 | brianwong | ahhh |
| 17:16 | brianwong | nDuff: i see your point |
| 17:16 | brianwong | nothing is using the lazy sequence |
| 17:17 | nDuff | Exactly. |
| 17:17 | nDuff | brianwong: (btw, it's generally "during" rather than "after") |
| 17:17 | nDuff | ...and actually, can even be before with chunked sequences |
| 17:19 | hyPiRion | The only promise is that the side effects will be done before the element is realized. |
| 17:19 | gtrak | brianwong: also, seqs are read in chunks ##(first (for [x (range 4)] (println x))) |
| 17:19 | lazybot | ⇒ 0 1 2 3 nil |
| 17:20 | gtrak | notice first makes all four happen |
| 17:20 | gfredericks | gtrak: only chunked seqs |
| 17:20 | gtrak | gfredericks: sure :-), the point is to foster a healthy paranoia |
| 17:20 | gfredericks | phew |
| 17:21 | brianwong | interested |
| 17:21 | brianwong | interesting |
| 17:22 | brianwong | thanks for the help guys |
| 17:22 | gtrak | ##(first (for [x (range 50)] (println x))) |
| 17:22 | lazybot | ⇒ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 nil |
| 17:23 | gfredericks | por eso estamos |
| 17:30 | thalassios_xelon | heloo guys:))) |
| 17:30 | thalassios_xelon | ,(+ 1 2) |
| 17:30 | clojurebot | 3 |
| 17:30 | holo | maybe some girls are present too |
| 17:31 | thalassios_xelon | girls are not clever :P |
| 17:31 | thalassios_xelon | hello holo :) |
| 17:31 | holo | hi! |
| 17:31 | thalassios_xelon | holo u girl? |
| 17:31 | nDuff | ...eh, easier to /ignore |
| 17:31 | brianwong | hahah |
| 17:32 | holo | i'm a male |
| 17:32 | gfredericks | don't treed the folls |
| 17:33 | thalassios_xelon | holo are you blond and sexy clojure geek? |
| 17:33 | holo | >.>" |
| 17:33 | tmciver | thalassios_xelon: I'm a blond and sexy geek . . . but I'm a guy. ;) |
| 17:33 | thalassios_xelon | bye :* |
| 17:34 | gtrak | (votekick thalassios_xelon) |
| 17:34 | thalassios_xelon | gtrak, dont be evil |
| 17:34 | gfredericks | (dec thalassios_xelon) |
| 17:34 | lazybot | ⇒ -1 |
| 17:34 | TimMc | C'mon, don't feed. Just /ignore. |
| 17:34 | gfredericks | TimMc: good point. done. |
| 17:34 | nDuff | (inc TimMc) |
| 17:34 | lazybot | ⇒ 34 |
| 17:35 | holo | (inc holo) |
| 17:35 | TimMc | (And if you're an op, kick.) |
| 17:35 | lazybot | You can't adjust your own karma. |
| 17:36 | TimMc | gtrak: I think I've heard of IRC clients where /ignore is broadcast/made available to other clients. |
| 17:36 | arohner | given defrecord foo, is there an existing way to find its (map->Foo) fn? |
| 17:36 | brianwong | (brianwong) |
| 17:36 | TimMc | A quorum makes compliant clients auto-ignore. |
| 17:36 | gfredericks | arohner: find it? |
| 17:36 | technomancy | inc |
| 17:36 | ivan | )/whois thalassios_xelon |
| 17:36 | brianwong | ##(inc 1) |
| 17:36 | lazybot | ⇒ 2 |
| 17:36 | gtrak | TimMc: ah, fun, it's like git vs svn |
| 17:36 | brianwong | ##brianwong |
| 17:36 | amalloy | TimMc: i would want that so hard |
| 17:36 | brianwong | i guess i have no value |
| 17:37 | brianwong | that makes me sad |
| 17:37 | xeqi | $karma brianwong |
| 17:37 | lazybot | brianwong has karma 0. |
| 17:37 | arohner | gfredericks: I want a fn like (resolve-map-fn Foo) that returns the result of (resolve 'map->Foo) |
| 17:37 | gtrak | can we build a git repo for /ignores and have a web of trust? |
| 17:37 | arohner | but I want to pass arbitrary records in |
| 17:37 | arohner | it looks possible using (.getName record) and (.getSimpleName record), but that's a total hack |
| 17:37 | gfredericks | arohner: you want to pass in an instance? or the class? |
| 17:37 | arohner | the class |
| 17:37 | sjl | Do Leiningen and Drip work together yet? I followed the instructions but I'm not really seeing any speed boost |
| 17:37 | holo | $karma holo |
| 17:37 | lazybot | holo has karma 0. |
| 17:38 | nDuff | gtrak: Hmm. There'd have to be standards established in terms of tolerance. I've got a lot of entries on my /ignore list from time-wasters as opposed to outright trolls, for instance, but others might not want that. |
| 17:38 | gfredericks | arohner: yeah I'm not sure there's anything for that beyond what you're doing |
| 17:38 | gfredericks | nDuff: we could say /troll |
| 17:38 | TimMc | nDuff: Another problem is that ignores make you blind to a problem, they don't remove it. |
| 17:38 | gtrak | nDuff: easily solved with an int rating |
| 17:38 | aaelony | hyPiRion: fyi, figured out the command i needed earlier for profiling. java -agentpath:/path/to/YourKit_Java_Profiler_12.0.2.app/bin/mac/libyjpagent.jnilib -jar my-uberjar.jar |
| 17:39 | technomancy | sjl: they're supposed to, but I've seen reports of non-workage. are you on lein 2.0.0 final? |
| 17:39 | ivan | jcowan/Chouser/rhickey can add people to the access list |
| 17:39 | ravster | what would a credential-fn look like for the http-basic workflow in 'friend'? |
| 17:39 | thalassios_xelon | good night room :) |
| 17:40 | sjl | technomancy: http://paste.stevelosh.com/51142d5509b5f60007000001 |
| 17:40 | sjl | I think that means 2.0.0 final? |
| 17:40 | sjl | just says 2.0.0 |
| 17:40 | technomancy | sjl: yeah, that's the latest |
| 17:40 | amalloy | and 0.2.3 is latest drip, i'm fairly sure |
| 17:40 | technomancy | sjl: sorry; haven't used drip myself, but I saw some patches go in right before lein 2.0.0 landed. |
| 17:40 | sjl | it does seem to start the extra JVM: http://paste.stevelosh.com/51142d2109b5f60007000000 |
| 17:41 | hyPiRion | aaelony: oh, sweet. |
| 17:41 | arohner | gfredericks: I just wrote: https://gist.github.com/arohner/4734884 |
| 17:41 | sjl | doesn't really speed up much though |
| 17:41 | aaelony | :) |
| 17:41 | amalloy | sjl: looks like https://github.com/flatland/drip/issues/57 |
| 17:42 | amalloy | ninjudd is out of the country for the week, and i'm not really qualified to fix anything, so this will probably get fixed less quickly than usual |
| 17:42 | sjl | so the answer is no, they still don't work together |
| 17:42 | sjl | hah |
| 17:44 | technomancy | there is also https://github.com/technomancy/leiningen/issues/968 |
| 17:44 | technomancy | which doesn't exist yet |
| 17:44 | technomancy | actually I think I have a stash for that; I should at least put it on a branch |
| 17:45 | amalloy | sjl: what if you time lein trampoline test? |
| 17:45 | amalloy | i'm thinking that lein test should be using two JVMs (right, technomancy?), and only one of them is being controlled by drip |
| 17:45 | technomancy | amalloy: yeah |
| 17:46 | sjl | amalloy: same thing -- user time drops but real time is (roughly) the same |
| 17:46 | technomancy | sjl: `export LEIN_FAST_TRAMPOLINE=y` should allow trampoline calls to avoid launching Leiningen's own JVM entirely for trampolined invocations. |
| 17:46 | gfredericks | arohner: coo |
| 17:46 | jweiss | is there a better way to split a list of ints at the max value, other than using map-indexed (or otherwise producing a structure that contains indices)? |
| 17:46 | technomancy | there's also my eshell launcher that avoids the bash script entirely and uses nrepl |
| 17:46 | technomancy | which doesn't work either |
| 17:47 | hyPiRion | jweiss: Is there only one max value? |
| 17:47 | technomancy | anyway, the point is there are a bunch of ways to do it and none of them work all that well, in conclusion yay open source |
| 17:47 | amalloy | jweiss: i don't think that's possible lazily |
| 17:47 | jweiss | hyPiRion: no, there could be more than 1, but it should be split at the first. |
| 17:47 | sjl | technomancy: no difference |
| 17:47 | technomancy | sjl: sorry, I meant repeated calls should be faster |
| 17:48 | technomancy | with LEIN_FAST_TRAMPOLINE |
| 17:48 | sjl | oh |
| 17:48 | sjl | yes they are, a bit |
| 17:48 | sjl | like 1s instead of 3 |
| 17:48 | technomancy | repeated calls to the exact same command anyway |
| 17:48 | sjl | yeah |
| 17:48 | sjl | technomancy: what's the downside to setting this var? |
| 17:48 | technomancy | it memoizes the resulting form to call from that task |
| 17:48 | technomancy | sjl: it's not well tested |
| 17:48 | sjl | ah |
| 17:48 | technomancy | at some point it should default to on though |
| 17:48 | hyPiRion | ,(let [orig (repeatedly 6 #(rand-int 4000)), m (reduce max orig)] [orig (split-with (partial not= m) orig)]) |
| 17:48 | clojurebot | [(3109 1760 1057 2537 1965 ...) [(3109 1760 1057 2537 1965) (3144)]] |
| 17:49 | jweiss | hyPiRion: thanks! |
| 17:49 | technomancy | sjl: there are probably some cache invalidation issues with it where the memoized command would end up being out of date |
| 17:49 | hyPiRion | jweiss: Not sure if it's better, per se. |
| 17:49 | sjl | technomancy: makes sense |
| 17:49 | hyPiRion | But it's at least without indices |
| 17:49 | technomancy | if that happens; `lein clean` will take care of it |
| 17:49 | jweiss | hyPiRion: i think that traverses the list twice though. |
| 17:49 | technomancy | but changes to project.clj should get picked up |
| 17:49 | sjl | cool |
| 17:49 | technomancy | but (for instance) new versions of a snapshot won't |
| 17:49 | amalloy | jweiss: you can't help but traverse the list twice |
| 17:50 | technomancy | because project.clj doesn't change, but the proper command does |
| 17:50 | hyPiRion | yeah, you have to find the max. |
| 17:50 | technomancy | Fraught with Peril™ |
| 17:50 | jweiss | amalloy: can't you split a vector at an index without traversing it? |
| 17:51 | jweiss | find the max should be the only traversal |
| 17:52 | hyPiRion | jweiss: is it a vector we're talking about? |
| 17:52 | amalloy | unless your first traversal is to put it into something random-accessible |
| 17:52 | amalloy | eg, you could reduce over the sequence, putting it into a vector and finding the max element; then split up the resulting vector with two subvec calls |
| 17:52 | amalloy | actually, i tell a lie. of course you can do this in one pass |
| 17:52 | amalloy | jweiss: that's what i just said. if you put it into something random-accessible |
| 17:53 | jweiss | ok thanks |
| 17:54 | gfredericks | twiceish |
| 17:55 | gfredericks | use split-at and do it in 3 traversals! |
| 17:56 | amalloy | jweiss: https://www.refheap.com/paste/abcc0036c84dc85622b0f69ce is one way that's interesting, if not necessarily good |
| 17:56 | gfredericks | I guess split-with has that property too |
| 17:56 | hyPiRion | &(first (reduce-kv (fn [[i max :as init] j v] (if (< max v) [j v] init)) [-1 -1] [1 2 10 3 4])) |
| 17:56 | lazybot | ⇒ 2 |
| 17:56 | hyPiRion | then do subvec from there. |
| 17:58 | amalloy | but really in a lazy language thinking about the number of times you traverse something is very confusing |
| 17:58 | dnolen | unifier in core.logic is getting fancy - http://gist.github.com/swannodette/4735012 |
| 17:58 | gfredericks | we need a contest where we try to maximize CPU-cycles / source-char |
| 17:59 | gfredericks | it'd be like clojure golf but with an anti-performance component |
| 17:59 | amalloy | gfredericks: that'd be a short contest |
| 17:59 | gfredericks | amalloy: sleeping doesn't count |
| 17:59 | amalloy | (#(recur)) |
| 17:59 | gfredericks | hrm |
| 17:59 | gfredericks | amalloy: also you have to solve the problem at hand |
| 17:59 | gfredericks | like splitting a list at the max element |
| 18:00 | ppppaul | i have a destructuring issue that i would like help with. https://gist.github.com/boxxxie/4735021 :D |
| 18:00 | gtrak | (dotimes [x 1000] (future (recur))) |
| 18:00 | gtrak | 999, rather |
| 18:01 | gfredericks | ppppaul: ah ha |
| 18:01 | gfredericks | ppppaul: so line 7 |
| 18:01 | gfredericks | wait are you trying to make something equilavent to line 2? |
| 18:01 | ppppaul | gfredericks, yes |
| 18:02 | gfredericks | ppppaul: okay remove the curly braces around {:keys [body content-length]} |
| 18:02 | amalloy | gfredericks: you might find http://en.wikipedia.org/wiki/Busy_beaver entertaining, then |
| 18:02 | gfredericks | amalloy: man I gave a lightning talk on that |
| 18:02 | gfredericks | I don't think I did it well though |
| 18:03 | ppppaul | gfredericks, can you post on my gist? |
| 18:03 | gfredericks | specifically it was about the "busy beaver sequences grows faster than any computable sequence" part |
| 18:03 | gfredericks | ppppaul: yeah |
| 18:03 | dnolen | lynaghk: pretty much done w/ vector & set syntax |
| 18:04 | ppppaul | thanks gfredericks |
| 18:04 | gfredericks | np |
| 18:06 | amalloy | i apparently don't even know what noncomputable really means |
| 18:06 | lynaghk | dnolen: awesome! |
| 18:07 | gfredericks | amalloy: is it mentioned in the article? |
| 18:07 | lynaghk | dnolen: I've been in meetings and haven't had a chance to look yet =/ |
| 18:07 | amalloy | gfredericks: yes |
| 18:07 | gfredericks | amalloy: any sequence of numbers you can write a function to compute will provably grow slower than the busy beaver sequence |
| 18:07 | dnolen | lynaghk: the biggest change is that unifier only really takes 1 or 2 args now. in 1 arg case no options - just sequences of terms to unify. 2 args case first arg is the options. |
| 18:08 | dnolen | lynaghk: set & vector syntax both support giving a single constraint, or a seq of constraints |
| 18:08 | gfredericks | amalloy: the proof is a one-line reduction to the halting problem |
| 18:08 | dnolen | lynaghk: there are tests for these different cases - let me know if they don't make sense. |
| 18:09 | lynaghk | dnolen: okay, will do. |
| 18:22 | gfredericks | json with cheshire should be a faster serialization than pr-str/read-edn, right? |
| 18:23 | hiredman | gfredericks: I don't think there is an inherent reason it should be so, but I believe it is |
| 18:23 | dxeh | _veer, |
| 18:23 | dxeh | super_? |
| 18:23 | clojurebot | contribute is http://clojure.org/contributing |
| 18:23 | hiredman | e.g. someone should write a high performance edn codec |
| 18:24 | gfredericks | I wonder if rhickey still wants tools.edn since he added read-edn? |
| 18:24 | _veer | dxeh: ? |
| 18:24 | mrb_bk | dnolen: oooh nice unifying |
| 18:24 | dxeh | do you have another alias "super_" |
| 18:24 | technomancy | sjl: highly experimental: https://github.com/technomancy/leiningen/issues/968 |
| 18:25 | dnolen | mrb_bk: yes, should make the unifier a lot more useful. |
| 18:25 | _veer | dxeh: why? |
| 18:25 | dxeh | cause if you do then maybe you know me _veer :P |
| 18:26 | _veer | okay |
| 18:29 | mrb_bk | dnolen: we should grab a beer and talk about how i can help with some documentation stuff soon |
| 18:30 | dnolen | mrb_bk: hey, that sounds like a great idea! |
| 18:31 | mrb_bk | dnolen: awesome, I'll drop you an email |
| 18:32 | mrb_bk | i made my first proper minikanren goal in core.logic and almost jumped out the window in excitement |
| 18:32 | dnolen | mrb_bk: haha, it's pretty great when it clicks. |
| 18:35 | technomancy | wow, vimclojure ships with vim now |
| 18:36 | technomancy | that should help a lot considering installation has been somewhat involved from what I hear |
| 18:36 | mrb_bk | technomancy: confirmed |
| 18:37 | technomancy | I guess that means vim doesn't have a CA policy; good for them =) |
| 18:37 | technomancy | clojure-mode will never ship with Emacs unfortunately due to that |
| 18:40 | bawr | CA? |
| 18:40 | clojurebot | CA is Contributor Agreement: http://clojure.org/contributing |
| 18:41 | bawr | Oh, that's useful. |
| 18:50 | rasmusto | if I turn a map into a seq, what's the good way to turn that back into a map? I'm mapping a function to my map, returning a seq of k/v vectors, then wanting to turn that into a map |
| 18:50 | amalloy | (into {} kvs) |
| 18:51 | rasmusto | amalloy: ok, thanks |
| 18:56 | DerGuteMoritz | ok I think I found a way to hit the potential bug |
| 18:57 | DerGuteMoritz | now I wonder how to test my patch |
| 18:57 | DerGuteMoritz | i.e. how do I run the cljs test suite? |
| 18:58 | DerGuteMoritz | does anyone know? |
| 18:58 | DerGuteMoritz | ah, script/test I guess |
| 19:03 | Raynes | In case anyone wonders why refheap suddenly has 11k pastes vs the 9k it used to have, it's because someone spammed the crap out of it recently, apparently. https://www.refheap.com/paste/11032 is the last 1000 or so pastes. |
| 19:04 | Raynes | And congratulations to whoever did this act of elite hackery, pat yourself on the back for spamming the most un-ratelimited pastebin in history. |
| 19:05 | technomancy | mad skillz |
| 19:06 | Raynes | Unless of course, as amalloy just pointed out, it could be unintentional. If that's the case, please let me know and complain about there not being a sandbox for testing API stuff so I can point you to the sandbox for testing API stuff. |
| 19:07 | technomancy | it doesn't look spammy spam |
| 19:08 | amalloy | yeah, it looks like someone is running https://github.com/killswitch/dunn/blob/master/plugins/git.js and has it configured to automatically refheap exceptions |
| 19:09 | shaunxcode | someone asked earlier if graph supported clojurescript - mid way down the readme: "Also, stay tuned for a ClojureScript version of Graph, coming soon." |
| 19:09 | Raynes | Hrm |
| 19:09 | amalloy | Raynes: https://github.com/killswitch/dunn/blob/master/libs/irc.js#L90 |
| 19:09 | Raynes | I see. |
| 19:09 | Raynes | So this is a totally valid usage. |
| 19:10 | amalloy | well, valid usage run amok by him having too many errors. i'd get in touch with him and ask him to chill out |
| 19:10 | technomancy | depends on your TOS =) |
| 19:10 | Raynes | I mean, maybe not sending 1k pastes. |
| 19:10 | abp | technomancy: In Emacs, can I open the readme.md of a dependency of a Clojure-project I'm working on? M-. let's me jump to a symbols definition. But then from there, I can't further navigate in the jars context apparently. |
| 19:10 | Raynes | But I don't have any rules. |
| 19:10 | technomancy | abp: M-. into a file in a jar will open both that file and the jar itself |
| 19:11 | technomancy | so look in your buffer list |
| 19:11 | technomancy | abp: that said, we don't include readmes inside the jars right now. there's an open issue for it though. |
| 19:12 | abp | technomancy: Oh ok. Also the jar isn't in my buffer list. But this is on windows.. |
| 19:12 | technomancy | shouldn't matter. are you sure you've opened a .clj file in a jar? |
| 19:13 | technomancy | if so C-x C-f would default to being deep inside .m2/repository |
| 19:14 | abp | technomancy: yes, buffer-list points into .m2/.. C-x C-f is in there too |
| 19:14 | abp | technomancy: But C-x C-f context being right is enough. I somehow got the impression thats not the case. |
| 19:15 | dxeh | clojure seems quite the interesting language, coming from c/java programming its quite the switchup which is nice |
| 19:15 | dxeh | syntax wise, that is |
| 19:15 | technomancy | huh... I guess that might vary by OS then; that is surprising to me. |
| 19:16 | abp | technomancy: Should the jar be opened like a dired buffer..? |
| 19:16 | technomancy | abp: yeah, that's how it works here |
| 19:16 | ravster | abp: jars in emacs open automatically for me. |
| 19:16 | technomancy | you can see all the .class files and stuff |
| 19:16 | ravster | I don't need to do anything special |
| 19:19 | abp | technomancy: I'm fine with it, I can walk into the jar from the files context, dired-like. |
| 19:19 | technomancy | ok, cool |
| 19:20 | technomancy | feel free to chime in here on the topic of including readmes: https://github.com/technomancy/leiningen/issues/880 |
| 19:21 | ravster | I'm trying to make a credential-fn for 'friend' for the project I'm working on, but I'm getting 'wrong number of args passed [0]' errors. How do I make sure that the cred-fn gets the map of user and password thats coming in from the request? I'm using http-basic workflow. |
| 19:21 | abp | technomancy: Using emacs for two days now, preceded by a few days of reading the tutorial, memoizing basic bindings, reading .emacs.d's, now using emacs-live. I'm extremely impressed and addicted. :) |
| 19:22 | technomancy | cool; have fun =D |
| 19:23 | brehaut | waitaminute, you read the documentation‽ thats not doing it right! |
| 19:24 | technomancy | brehaut: you're supposed to write documentation, not read it. |
| 19:24 | brehaut | technomancy: wait, you sure you are in the right community? |
| 19:25 | dxeh | what is reading? |
| 19:25 | technomancy | brehaut: sorry, "you're supposed to chide people for not writing documentation, not for not reading it" |
| 19:25 | Raynes | You guys sound like antares all of a sudden. |
| 19:25 | technomancy | now I'm just confused |
| 19:25 | brehaut | technomancy: PHEW |
| 19:26 | tanzoniteblack | shaunxcode: the clojurescript comment was obviously way too unclear...I mean it's in its own paragraph in the readme, how could someone possibly notice it? |
| 19:27 | abp | Readme's being way to long with more then one sentence will be all the rage soon. |
| 19:27 | dxeh | is it true there is a "clojurescript" which compiles clojure to js rather than java lmao |
| 19:28 | technomancy | lol its true |
| 19:28 | shaunxcode | tanzoniteblack: hah I read the whole thing as it is absolutely solving a problem I face |
| 19:29 | tanzoniteblack | shaunxcode: I'm doing the same; less because it solves a problem I currently face, but more because it might be useful in the future and my brain hurts from debugging all day |
| 19:29 | tanzoniteblack | https://github.com/Prismatic/plumbing in case anyone is wondering what readme we're referring to |
| 19:29 | dxeh | technomancy, you wrote leiningen? |
| 19:30 | technomancy | dxeh: guilty as charged |
| 19:30 | craigbro | as transcribed to him by aiwas |
| 19:30 | craigbro | rather, whispered into his ear |
| 19:30 | dxeh | impressive technomancy |
| 19:30 | craigbro | just like Aleister Crowley |
| 19:30 | abp | shaunxcode: Something related to your datomic workspace? |
| 19:31 | dxeh | technomancy, i was just like lets look up some random people on github and i laughed so hard when i typed in your name and saw leiningen |
| 19:34 | amalloy | i think he's calling you random, technomancy |
| 19:34 | dxeh | the world is a random place |
| 19:34 | tommo | what does a : denote before something in clojure, e.g. [:a :b] |
| 19:35 | brehaut | tommo: keyword literal |
| 19:35 | tanzoniteblack | tommo: http://clojure.org/data_structures#Data%20Structures-Keywords |
| 19:35 | brehaut | (a keyword is a symbol that refers to itself rather than something else) |
| 19:38 | ravster | cemerick: how should I go about making a credential-fn for http-basic that hooks into a function that I already have that checks usernames & passwords against those in a DB? |
| 19:38 | shaunxcode | abp: yes actually, I have actually started working on feature enhancements in the coffeescript branch whilst I wait til I am happy with "best practice" in cljs branch |
| 19:39 | cemerick | ravster: you just need to create a fn that calls what you already have, and returns an authentication map on success |
| 19:40 | cbp | howdy |
| 19:40 | headshot | howdy |
| 19:40 | cbp | anyone here preparing or planning to prepare for google codejam? |
| 19:41 | dxeh | cbp, google codejam? |
| 19:41 | ravster | I'm trying that, the code I have is at https://www.refheap.com/paste/11034 , but I'm getting a 'wrong number of args passed [0]' error. |
| 19:41 | headshot | coding competition |
| 19:42 | hyPiRion | cbp: Yeah |
| 19:42 | cbp | dxeh: http://code.google.com/codejam/ |
| 19:42 | abp | shaunxcode: Sounds reasonable. Getting a satisfying cljs-environment in terms of libs etc. is a lot of work. |
| 19:43 | dxeh | cbp, reverse engineering? |
| 19:43 | DerGuteMoritz | http://dev.clojure.org/jira/browse/CLJS-467 <- if anyone is interested in my findings with regards to the bug I mentioned earlier |
| 19:43 | hyPiRion | dxeh: algorithm and data structures |
| 19:44 | cbp | I just solved a problem that was taking me over 2 hours with (memoize fn) and got excited |
| 19:44 | cbp | I was considering using a more iterative language for the contest but now I think i'll stick to clojure |
| 19:44 | ravster | cemerick: this function should return a map with {:name, :identity, :roles, etc}. That counts as a valid authentication map, right? |
| 19:45 | xeqi | ravster: are you useing `:credentials-fn friend-authenticate` ? |
| 19:45 | dxeh | im just picking up clojure, heard about it a year or 2 ago and have seen code snippets but never really looked into it |
| 19:45 | hyPiRion | cbp: I'd recommend going polyglot. I go Java for things like Floyd-Warshall and Dijkstra, but Clojure if there's combinatorics or permutations |
| 19:45 | dxeh | seems quite cool though |
| 19:45 | shaunxcode | abp: yeah, I am definitely heavily devoted to building the cljs ecosystem but I also want to "ship" features as I do that. |
| 19:46 | hyPiRion | Though I've realized you can get very far with just Clojure. |
| 19:46 | dnolen | DerGuteMoritz: thanks looks right to me, I've assigned the Michal to confirm |
| 19:46 | dnolen | assigned to |
| 19:46 | DerGuteMoritz | dnolen: alright, thank you! |
| 19:46 | ravster | xeqi: arrghh, no. I had that inside parens. |
| 19:46 | dnolen | DerGuteMoritz: please do send in your CA ;) |
| 19:46 | dnolen | DerGuteMoritz: that's a good catch, could use more of those. |
| 19:46 | ravster | xeqi: thanks :$ thats embarrassing |
| 19:47 | xeqi | ravster: np, happens to everyone at some point |
| 19:47 | cbp | hyPiRion: yes I'll probably do that |
| 19:52 | DerGuteMoritz | dnolen: yeah I'll try to do that as soon as possible, might take a moment though coming from Germany. on a different note, do you happen to know what license restrictions apply when I port code from cljs core to another language? |
| 20:14 | abp | Now there's an opportunity to beat the shit out of everyone who took the read*-issue lightly (like me): (alter-var-root #'*read-eval* (constantly :unknown)) on the top-level of every public ns of your libraries. :D |
| 20:15 | technomancy | abp: `lein new app mythingy` already includes that =) |
| 20:15 | amalloy | technomancy: i think you missed the joke there |
| 20:16 | abp | technomancy: read closely, and have a look at richs latest commits. :P |
| 20:16 | technomancy | uh oh |
| 20:16 | abp | Hm, I can't resist joking in here. |
| 20:17 | amalloy | abp: i'm not clear on how that's a more interesting "attack" than putting (/ 1 0) at the top level of all your namespaces, though |
| 20:17 | xeqi | I prefer ziping everything in src/ and sending it to a web server |
| 20:17 | abp | amalloy: Not attack, more in spirit of teaching a lesson. Secure your reads, a* |
| 20:18 | abp | amalloy: Via explicit *read-eval*-binding like loudly proposed |
| 20:31 | abp | Any pointers on how to start learning git, preferably with magit, if that makes any sense? |
| 20:32 | hiredman | abp: http://mirror.linux.org.au/pub/linux.conf.au/2013/ogv/Git_For_Ages_4_And_Up.ogv |
| 20:32 | technomancy | abp: magit has a screencast that's good |
| 20:34 | abp | hiredman: technomancy Thanks! |
| 20:59 | charlietanksley | abp: I don't know about learning git, but the magit user manual is pretty thorough: http://philjackson.github.com/magit/magit.html |
| 21:00 | charlietanksley | abp: I try to pick some random thing I find myself doing on via the cli every week or so, looking it up there, and trying to add just that to my magit workflow. |
| 21:05 | lynaghk | charlietanksley, abp: whenever I get into a new mode in emacs I always "C-h m" to see what commands are available. (I do pretty much everything in magit now.) |
| 21:07 | abp | charlietanksley: Sounds good, since I'm new to Emacs I try to learn it as broad of an replacement as possible. I haven't done much with git on the console anyway, so going magit from the beginning will work or not. |
| 21:08 | charlietanksley | lynaghk: good call. |
| 21:09 | charlietanksley | abp: I'm not sure how that will work. Good luck with it! |
| 21:09 | abp | lynaghk: sam is crazy, he's rebound C-h to delete in emacs live. |
| 21:10 | technomancy | eep |
| 21:11 | abp | Oh and made it M-h |
| 21:13 | abp | lynaghk: Thanks, thats really cool! |
| 21:13 | lynaghk | abp: yeah, no problem. it's the only emacs trick I really know, but you can use it to find out all of the other tricks =) |
| 21:13 | abp | Still can't believe I've procrastinated on learning Emacs until now... |
| 21:14 | cemerick | lynaghk: welcome back :-) |
| 21:14 | lynaghk | abp: you have taken the first step on the journey of a lifetime... |
| 21:14 | abp | Actually, people I've pushed into Clojure pushed me into Emacs in return. |
| 21:14 | lynaghk | cemerick: thanks! I'm so happy to be back in PDX. The Internet is now on a screen larger than 10 inches |
| 21:14 | technomancy | returning the favour =) |
| 21:15 | cemerick | lynaghk: were you gone long enough to start going a bit bonkers? |
| 21:19 | lynaghk | cemerick: yeah, especially in the more rural parts of New Zealand |
| 21:20 | lynaghk | cemerick: also traveling with the same person for six weeks, that was a bit intense. I did swing by SF on the way back for a week though and got to visit a lot of folks there |
| 21:20 | brehaut | lynaghk: whats 'more rural'? |
| 21:21 | lynaghk | cemerick: in San Francisco the Internet is, like, a real thing. With billboards and everything |
| 21:21 | lynaghk | brehaut: Riwaka on the South Island, which is a suburb of Moteuka |
| 21:21 | brehaut | lynaghk: i am from the south island ;) |
| 21:21 | lynaghk | brehaut: sorry I didn't get in touch, by the way. We were pretty busy for the days when we were in Auckland |
| 21:21 | brehaut | lynaghk: thats no problem at all |
| 21:21 | cemerick | brehaut: dude, don't trip over the village's internet wire |
| 21:22 | lynaghk | brehaut: ah, cool. Are you coming out to Clojure/west by any chance? A lot of the stuff I saw in the South Island reminded me a lot of Oregon. |
| 21:22 | brehaut | cemerick: theres only one. we are all very careful with it |
| 21:22 | brehaut | lynaghk: sadly no. way too far to travel |
| 21:22 | brehaut | i might make it to YOW!/Lambda Jam |
| 21:22 | cemerick | brehaut: my mental image is too hilarious for words |
| 21:23 | brehaut | cemerick: until kim dotcom builds a second cable, there is literally only one internet cable |
| 21:23 | brehaut | part of the reason everythign down here is slow as molasses |
| 21:23 | cemerick | really? I thought there was a whole aws region in NZ? |
| 21:24 | lynaghk | brehaut: I was talking with some nerds in Wellington and they said there was plenty of capacity, but that the provider basically just charged a ton for everything---whenever there is a credible threat that someone will build another cable the Internet cost mysteriously goes down |
| 21:25 | brehaut | lynaghk: yeah providers charging insane amounts is basically par for the course here |
| 21:25 | brehaut | not enough demand to create real competition |
| 21:25 | cemerick | oh, the AP region is in Sydney, my bad |
| 21:26 | tommo | what does # denote for example infront of a set? |
| 21:26 | brehaut | lynaghk: im not surprised riwka / moteka reminded you of oregan |
| 21:26 | brehaut | thats hops country |
| 21:27 | brehaut | (and riwaka is also a variety of hop) |
| 21:28 | brehaut | tommo: in front of a set? ##{:a :b}? |
| 21:28 | lazybot | ⇒ {:a :b} |
| 21:28 | lynaghk | brehaut: re: beer, I'm tempted to buy a case of Moa's St. Joseph. That stuff was awesome |
| 21:28 | tommo | brehaut: yeah |
| 21:28 | cemerick | tommo: #{} *is* a set |
| 21:28 | cemerick | {} is a map |
| 21:28 | brehaut | lynaghk: its pretty good eh, i quite like their five hops in mid summer too |
| 21:29 | tommo | cemerick: ohh ok, i thought i seen them used elsewhere, that makes sense, ty |
| 21:31 | brehaut | lynaghk: did you get a chance to try any renaissance or 8wired beers there? |
| 21:39 | gfredericks | TimMc: hyPiRion: if neither of you are going to be at clojure/west I will submit a lightning talk on swearjure. |
| 21:43 | craigbro | new AUtechre album! |
| 21:46 | gfredericks | lein will not let me create a project in an existing directory? :/ |
| 21:55 | TimMc | gfredericks: You have my blessing. |
| 21:55 | abp | O R G |
| 21:57 | abp | When I memoized those org-todo key-bindings ST2 travels into trash and everything's E |
| 21:57 | technomancy | =D |
| 21:58 | abp | brb, sleepersisting those bindings. |
| 23:44 | cemerick | bizarre; I think a particular rev of firefox is what was causing my ff/browser-repl problems a few weeks ago |