2012-09-04
| 02:48 | AustinYun | can someone tell me what the target directory that leiningen creates does? |
| 02:50 | michaelr525 | AustinYun: probably for compiled java classes, no? |
| 02:51 | AustinYun | oh |
| 03:25 | michaelr525 | can i import symbols using (use) and rename them in the current namespace? |
| 03:27 | michaelr525 | something like this (:use [clojure.string :only [split :as sp]]) |
| 03:29 | tomoj | (:use [clojure.string :only [split] :rename {split sp}]) |
| 03:30 | tomoj | see docs for use/require/refer |
| 03:31 | michaelr525 | cool |
| 03:31 | michaelr525 | :) |
| 03:32 | michaelr525 | tomoj: i actually looked up the doc for use, but didn't read everything just skimmed over the examples and there is no example for rename :) |
| 03:36 | tomoj | I don't remember why I believe this, but I think :use :only is going out of style in favor of :require :refer |
| 03:41 | kral | namaste |
| 03:47 | michaelr525 | tomoj: in :refer's docs I've seen this: "Use :use in the ns macro in preference to calling this directly." |
| 03:49 | michaelr525 | err |
| 03:49 | michaelr525 | it's written that use is like require+refer |
| 03:51 | michaelr525 | what use does refer have without require? |
| 03:52 | hyPiRion | ,(doc refer) |
| 03:52 | clojurebot | "([ns-sym & filters]); refers to all public vars of ns, subject to filters. filters can include at most one each of: :exclude list-of-symbols :only list-of-symbols :rename map-of-fromsymbol-tosymbol For each public interned var in the namespace named by the symbol, adds a mapping from the name of the var to the var to the current namespace. Throws an exception if name is already mapped to somethin... |
| 03:55 | michaelr525 | hyPiRion: but in which case would i use refer without a require? |
| 04:01 | tomoj | I can't think of any reason |
| 04:03 | tomoj | other than like (:refer-clojure :exclude [replace]) |
| 04:05 | michaelr525 | hmm |
| 04:05 | michaelr525 | so why :use goes out of style? looks like :use should be the most used of these forms.. |
| 04:07 | tomoj | I hardly ever use :use |
| 04:07 | tomoj | except at the repl |
| 04:07 | tomoj | some believe that :use is only acceptable when paired with :only |
| 04:08 | tomoj | but :require :refer works for that, and works in clojurescript too |
| 04:08 | noidi | michaelr525, it's easier to :use all names in a namespace without thinking about it too much |
| 04:08 | noidi | :require makes you explicitly state that it's really what you want |
| 04:08 | noidi | with (:require foo :refer :all) |
| 04:09 | noidi | I guess that's the reason |
| 04:09 | alex_baranosky | what are you all using to manage your SQL schema migrations? |
| 04:09 | michaelr525 | noidi: oh |
| 04:09 | michaelr525 | i see |
| 04:10 | michaelr525 | that's what i did when I started actually, just imported everything with use. now I usually specify what I need with :only/ |
| 04:13 | samrat | what's the way to do background task queueing in Clojure? |
| 04:13 | noidi | samrat, you could use agents or futures |
| 04:14 | michaelr525 | samrat: i use langohr |
| 04:14 | michaelr525 | with rabbitmq |
| 04:16 | samrat | thanks, I'll look those up |
| 04:16 | samrat | anything based on redis, I did find resque-clojure, but that doesn't seem to have been updated in a while |
| 04:20 | michaelr525 | ,(doc require) |
| 04:20 | clojurebot | "([& args]); Loads libs, skipping any that are already loaded. Each argument is either a libspec that identifies a lib, a prefix list that identifies multiple libs whose names share a common prefix, or a flag that modifies how all the identified libs are loaded. Use :require in the ns macro in preference to calling this directly. Libs A 'lib' is a named set of resources in classpath whose contents... |
| 04:22 | michaelr525 | noidi: was the :refer options added to :require in clojure 1.4? |
| 04:23 | michaelr525 | noidi: it's mentioned in the docs in the source but not mentioned int the docs at clojuredocs.org (the version there is 1.3) |
| 04:24 | amalloy | michaelr525: yes |
| 04:25 | michaelr525 | ah, now everything is clear ;) |
| 04:25 | michaelr525 | amalloy: what |
| 04:27 | michaelr525 | amalloy: err ignore that what |
| 04:47 | AustinYun | wow |
| 04:47 | AustinYun | circle ci and travis ci both work with datomic |
| 05:00 | muhoo | https://www.refheap.com/paste/4864 i give up |
| 05:01 | muhoo | amazon s3 requires jackson 1.9.9. cheshire 4.0.0 requires jackson 2.0.0 and i'm just screwed |
| 05:01 | clgv | muhoo:is one compatible with the other? |
| 05:02 | clgv | muhoo: in that case you could specify :exclusions in the project.clj |
| 05:03 | muhoo | they don't appear to be. |
| 05:04 | muhoo | java.lang.ClassNotFoundException: org.codehaus.jackson.smile.SmileFactory |
| 05:04 | clgv | muhoo: maybe a slightly older version of cheshire then? |
| 05:04 | muhoo | noir depends on 4.0.0. the tree i posted shows the tangle |
| 05:04 | muhoo | sleepy now, must sleep. tired, dependency hell, no work getting done, only pain. |
| 05:05 | clgv | muhoo: well maybe noir is fine with a slightly older version? |
| 05:05 | clgv | muhoo: "amazon s3" is a lib for the equal named service of amazon? or is their runtime env? |
| 05:06 | muhoo | it's all here: https://www.refheap.com/paste/4864 |
| 05:06 | tomoj | the latest aws sdk seems to depend on an even older version of jackson |
| 05:06 | clgv | ok, I didnt play with any amazon services yet ;) |
| 05:07 | muhoo | (+ clj-aws-s3 noir) => trouble |
| 05:07 | tomoj | a kludge to get it working might be jarjar |
| 05:07 | clgv | muhoo: does amazon also throw an exception if you use 2.0.0? |
| 05:08 | muhoo | the api has changed. |
| 05:08 | clgv | ok. damn |
| 05:08 | muhoo | i'll look into jarjar, thanks |
| 05:09 | clgv | binx? :P |
| 05:09 | muhoo | no, not elmo-in-space. the library |
| 05:09 | clgv | just kidding. go get some sleep - that often helps^^ |
| 05:09 | tomoj | I can't find the example but I think e.g. storm uses jarjar to rewrite the package names of thrift so that storm's thrift won't conflict with user code thrift |
| 05:10 | tomoj | well that won't help you much |
| 05:10 | tomoj | cus you'd have to write the classnames in clj-aws-s3 or cheshire |
| 05:11 | tomoj | er, in aws-java-sdk or cheshire :( |
| 05:11 | muhoo | i might throw this to weavejester and see if he has any ideas |
| 05:12 | weavejester | What's the problem? |
| 05:12 | muhoo | but he depends on the amazon library, and they're the ones digging their heels in with old jackson smile |
| 05:12 | muhoo | weavejester: https://www.refheap.com/paste/4864 |
| 05:13 | muhoo | clj-aws-s3 wants jackson 1.9.9, noir wants cheshire 4.0.0 which wants jackson 2.0.0 |
| 05:13 | tomoj | (and latest aws-java-sdk wants jackson 1.8.9, it seems) |
| 05:14 | weavejester | Is jackson 1.9.9 incompatible with jackson 2.0.0? |
| 05:14 | muhoo | end result is this: https://www.refheap.com/paste/4865 |
| 05:14 | muhoo | java.lang.ClassNotFoundException: org.codehaus.jackson.smile.SmileFactory |
| 05:14 | weavejester | Have you tried forcing both to use 2.0.0? |
| 05:15 | muhoo | weavejester: i did, some time ago. i don't remember the exact result, but it didn't help |
| 05:15 | weavejester | On the dependency tree Cheshire is further away from base than clj-aws-s3, so maybe it you added the jackson classes to your deps tree directly to use 2.0.0 |
| 05:17 | muhoo | i didn't |
| 05:17 | muhoo | perhaps noir did |
| 05:17 | weavejester | ? |
| 05:17 | muhoo | sorry, cheshire did |
| 05:18 | weavejester | Have you tried adding the jackson classes directly to your project deps? |
| 05:18 | muhoo | also, it's a bit different. clj-aws wants jackson-core-asl, etc, but cheshire wants jackson-core, etc |
| 05:18 | muhoo | and i don't understand the differences, not being an expert on jackson |
| 05:19 | muhoo | it looks to my naive eyes like the api and library structure changed a lot between those versions |
| 05:20 | weavejester | Hm… they're different package families too. |
| 05:20 | muhoo | right. so that's why i'm stuck atm. |
| 05:20 | weavejester | Do they produce the same library? |
| 05:21 | muhoo | i don't know |
| 05:21 | muhoo | jackson is a black box to me. cheshire is quite nice though. |
| 05:22 | tomoj | hmm "Differences from Jackson 1.x" "Java package is now com.fasterxml.jackson.core (instead of org.codehaus.jackson)" |
| 05:22 | tomoj | (about 2.0) |
| 05:22 | tomoj | so it should work fine?? |
| 05:22 | lazybot | tomoj: What are you, crazy? Of course not! |
| 05:22 | muhoo | hehe |
| 05:22 | muhoo | tomoj: it didn't last i tried, but no harm in trying again. here come :exclusions, let's see |
| 05:23 | weavejester | Okay, so have you actually tried forcing all deps to 2.0.0? |
| 05:23 | weavejester | That seems a simple thing to try to see if it works. |
| 05:23 | tomoj | muhoo: I mean, if the libraries are in different packages, it should work fine to exclude nothing |
| 05:24 | tomoj | shouldn't it? |
| 05:24 | weavejester | Different Maven packages, not necessarily different Java packages |
| 05:24 | muhoo | weavejester: trying now |
| 05:25 | weavejester | So exclude the 1.9.9 version I guess |
| 05:26 | tomoj | if you exclude the 1.9.9, org.codehaus.jackson.smile.SmileFactory would not be found |
| 05:26 | muhoo | java.lang.ClassNotFoundException: org.codehaus.jackson.JsonFactory |
| 05:26 | tomoj | since jackson 2.0 moved from org.codehaus to com.fasterxml |
| 05:27 | weavejester | So they even changed the namespaces? |
| 05:27 | muhoo | the ns looks the same, just the artifact changed |
| 05:28 | tomoj | 1.9.9 is entirely contained in org.codehaus |
| 05:28 | tomoj | 2.0.0 in com.fasterxml |
| 05:28 | tomoj | what is the symptom when you don't exclude anything and specify just clj-aws-s3 and noir? |
| 05:29 | tomoj | maybe the problem is jackson's deps ? |
| 05:29 | tomoj | doesn't seem to have any deps |
| 05:29 | muhoo | tomoj: without exclusions, i get java.lang.ClassNotFoundException: org.codehaus.jackson.smile.SmileFactory |
| 05:30 | muhoo | with exclusions, i get java.lang.ClassNotFoundException: org.codehaus.jackson.JsonFactory |
| 05:31 | muhoo | i should post a minimal project which fails, might help if anyone wants to try to repro. |
| 05:32 | tomoj | bizarre |
| 05:33 | tomoj | add [org.codehaus.jackson/jackson-smile "1.9.9"] ? |
| 05:33 | tomoj | (with no exclusions) |
| 05:34 | muhoo | ok |
| 05:36 | muhoo | tomoj: nice, that worked |
| 05:36 | muhoo | but but but |
| 05:36 | tomoj | doesn't make sense |
| 05:36 | muhoo | why wouldn't that dependency be included in clj-aws-s3? |
| 05:36 | tomoj | I wouldn't guess clj-aws-s3/aws-java-sdk make use of smile |
| 05:37 | tomoj | old cheshire would require that codehaus SmileFactory class though.. |
| 05:38 | tomoj | pre 3.1.0 |
| 05:38 | muhoo | even weirder https://www.refheap.com/paste/4866 that's what results |
| 05:39 | muhoo | adding that dependency explicitly, makes stuff disappear |
| 05:39 | tomoj | well the jackson-core-asl just got moved down as a dep to jackson-smile, right? |
| 05:40 | muhoo | oh it's not under clj-aws-s3 anymore, but still there, i see it |
| 05:40 | kral | anyone knows if EuroClojure videos can be downloaded (maybe via torrent?) |
| 05:41 | muhoo | tomoj: i have to wonder if other stuff will break now. will try a lein check and see |
| 05:42 | tomoj | would be nice if you could see who asked for that missing class |
| 05:44 | dhofstet | kral: yes, they can be downloaded http://vimeo.com/euroclojure |
| 05:46 | muhoo | tomoj: it's in that stacktrace. gotta love errors on line 1 of a file :-/ |
| 05:47 | tomoj | so it's coming from cheshire |
| 05:48 | muhoo | looks that way. that's why... i'm suspicious that other things will break |
| 05:48 | tomoj | but you have cheshire 4.0.0 in deps, which specifies com.fasterxml |
| 05:48 | muhoo | *i* don't have cheshire 4.0.0 in deps, noir does. and yes, it wants the com.fasterxml package version of the same library |
| 05:52 | tomoj | fwiw, with [clj-aws-s3 "0.3.2"] [cheshire "4.0.0"], I get no error requiring cheshire.core |
| 05:54 | tomoj | the only explanation I can think of is that one of your transitive deps has an old version of cheshire AOT'd .. but that seems unlikely |
| 06:01 | kral | dhofstet: oh, thanks |
| 06:27 | clgv | ui new vids to view :) |
| 06:28 | michaelr525 | what? |
| 06:28 | clojurebot | what is exceptions |
| 06:28 | michaelr525 | err |
| 06:28 | clgv | clojurebot: botkick ;) |
| 06:28 | clojurebot | No entiendo |
| 06:29 | michaelr525 | a function may return 1 item or a collection of items, i would like to map this function over a collection and concatenate the results. mapcat won't work since concat requires all arguments to be a collection. |
| 06:30 | clgv | can't you make sure that your functions always returns collections? |
| 06:30 | michaelr525 | should I make my function return only a collection and use mapcat ? |
| 06:31 | michaelr525 | i can but i'm not sure that I want to... |
| 06:31 | clgv | michaelr525: do you need lazy? otherwise implement the combining logic via reduce that chooses between conj and concat |
| 06:32 | michaelr525 | hmm |
| 06:32 | michaelr525 | suppose that i need lazy.. |
| 06:33 | michaelr525 | i don't really need lazy, but i don't like writing that reduce - i'd rather make my function return only collections |
| 06:33 | clgv | thats probably better |
| 06:34 | clgv | I know one example where it is really annoying that the function returns a value if there is only one but a collection if there are many |
| 06:34 | michaelr525 | i think that once someone here wrote some neat solution using (into) |
| 06:34 | clgv | incanter's selection of columns does (maybe did) that |
| 06:35 | clgv | michaelr525: humm but into needs a collection as well |
| 06:37 | michaelr525 | yeah |
| 06:50 | clgv | michaelr525: you could also use (apply concat (map #(let [r (apply f %&)] (if (sequential? r) r [r])) coll)) |
| 06:55 | michaelr525 | clgv: yeah, i think that I'll take that route |
| 06:56 | michaelr525 | now the problem is to find a suitable name for that function ;) |
| 06:56 | michaelr525 | maybe (mapcat-always)? |
| 06:56 | michaelr525 | (mapcat-anyway) |
| 06:56 | clgv | your choice ;) |
| 06:56 | michaelr525 | (mapcat-everything) |
| 06:57 | michaelr525 | (map-my-cat) |
| 06:58 | clgv | then you need an additional (map-my-dog) ;) |
| 06:58 | michaelr525 | heh |
| 06:59 | michaelr525 | i think it'll be something like this: (mapcat #(ensure-seq (my-function)) col) |
| 07:00 | clgv | I have assure-coll somewhere in my projects ;) |
| 07:00 | clgv | or even assure-vec? |
| 07:04 | michaelr525 | settled on (mapcatz) :) |
| 07:04 | clgv | I demand (mapdogz) as well ;) |
| 07:05 | michaelr525 | you are barking at the wrong tree ;) |
| 07:56 | iDesperadO | how to read clojure's doc. Is there any guid for it? like (doc clojure.set/project) => clojure.set/project ([xrel ks]) Returns a rel of the elements of xrel with only the keys in ks |
| 07:57 | iDesperadO | I read this doc time and time again, with no idea what project indents to do |
| 07:58 | S11001001 | iDesperadO: rel means set |
| 07:58 | iDesperadO | how rel means set? |
| 07:58 | S11001001 | a set relates its elements to each other |
| 07:59 | iDesperadO | and there's xrel |
| 07:59 | S11001001 | iDesperadO: try reading the docs of functions you're familiar with |
| 07:59 | iDesperadO | what a irony...I don't need to read the doc that I've already familiar with... only ones I'm not |
| 08:00 | S11001001 | why is that? |
| 08:01 | tomoj | some of the clojure.set docs are just confusing |
| 08:01 | tomoj | a rel is a set of maps ##(clojure.set/project #{{:foo 1 :bar 2} {:foo 3 :bar 4}} #{:foo}) |
| 08:01 | lazybot | ⇒ #{{:foo 1} {:foo 3}} |
| 08:01 | S11001001 | thanks tomoj |
| 08:02 | S11001001 | relational algebra ahoy |
| 08:03 | iDesperadO | tomoj: where can I find that a rel is a set of maps? |
| 08:05 | iDesperadO | tomoj: I mean if I can't understand the doc of a function, where can I turn to? |
| 08:05 | clgv | iDesperadO: I think there is some more doc in the namespace docs |
| 08:06 | clgv | iDesperadO: clojuredocs.org has often some examples on the usage |
| 08:06 | iDesperadO | ah... |
| 08:07 | iDesperadO | clgv: then how to find namespace doc? like some docs about the namespace clojure.set? |
| 08:08 | clgv | iDesperadO: http://clojure.github.com/clojure/ but there is none for clojure.set - seems I read it somewhere else |
| 08:08 | iDesperadO | clgv: I often miss python's help function which can tell me something like list/dictionary `help(list)/help(dict)` |
| 08:10 | tomoj | iDesperadO: http://clojuredocs.org/clojure_core/clojure.set/project |
| 08:10 | iDesperadO | I'm reading it |
| 08:11 | clgv | iDesperadO: in case you wanted project entries from a map - this is named select-keys |
| 08:12 | iDesperadO | so, other from clojuredocs.org I will have no idea project deals with a set of maps...why they can't tell this in the doc??? |
| 08:12 | lazybot | iDesperadO: How could that be wrong? |
| 08:13 | tomoj | they probably should |
| 08:13 | iDesperadO | I find clojure's doc is not friendly to newbies, at least to someone like me |
| 08:23 | clgv | iDesperadO: out of curiosity do you really need `project`? I have not needed it, yet. I think there are some questionable function in clojure.set - all those dealing with relations |
| 08:27 | iDesperadO | clgv: no, I just happen to pick project as an example to show that sometimes I don't understand the doc and wonder to know guys here have better way to teach me how to lean a function on repl |
| 08:29 | iDesperadO | clgv: at first I'm confused by tokens like "x" "xs"...and after I get used to I find more doc that I can't understand... |
| 08:30 | clgv | iDesperadO: ah ok. I think in clojure.core the docs are better. |
| 08:33 | iDesperadO | clgv: do clojure has some way to know something about a namespace? |
| 08:33 | clgv | iDesperadO: you have to be more specific for a helping answer ;) |
| 08:34 | clgv | iDesperadO: otherwise my generic answer is that the clojure cheat sheet has a section on namespace related functiosn |
| 08:34 | iDesperadO | like if I don't know nrepl is something like swank-clojure, but if I want to know more what's nrepl is, the only way is to look on the web? |
| 08:35 | clgv | iDesperadO: nrepl is a third-party library. you'll have to find its project page and read the docs overthere |
| 08:35 | pandeiro | iDesperadO: i've seen (ns..) declarations annotated with :doc metadata |
| 08:36 | pandeiro | but i'm not sure how to retrieve that at the repl |
| 08:36 | clgv | clgv: most clojure projects have their source and documentation hosted on github |
| 08:36 | clgv | ,(doc clojure.core) |
| 08:36 | clojurebot | #<ExecutionException java.util.concurrent.ExecutionException: java.lang.RuntimeException: java.lang.ClassNotFoundException: clojure.core> |
| 08:36 | gfredericks | ,(-> "clojure.core" find-ns meta :doc) |
| 08:36 | clojurebot | #<ClassCastException java.lang.ClassCastException: java.lang.String cannot be cast to clojure.lang.Symbol> |
| 08:36 | clgv | humm shouldnt that work with 1.4? |
| 08:36 | gfredericks | ,(-> "clojure.core" symbol find-ns meta :doc) |
| 08:36 | clojurebot | "Fundamental library of the Clojure language" |
| 08:37 | gfredericks | ,(-> "clojure.walk" symbol find-ns meta :doc) |
| 08:37 | clojurebot | nil |
| 08:37 | Bronsa | ((comp :doc meta find-ns) 'clojure.core) |
| 08:37 | gfredericks | yep, lots of docs there |
| 08:37 | Bronsa | ,((comp :doc meta find-ns) 'clojure.core) |
| 08:37 | clojurebot | "Fundamental library of the Clojure language" |
| 08:39 | iDesperadO | seems only ((comp :doc meta find-ns) ns) can find doc only for clojure.core |
| 08:39 | clgv | ,((comp :doc meta find-ns) 'clojure.test) |
| 08:39 | clojurebot | nil |
| 08:39 | iDesperadO | mostly it just returns nil |
| 08:39 | clgv | ,(-> "clojure.test" symbol find-ns meta :doc) |
| 08:39 | clojurebot | nil |
| 08:39 | iDesperadO | right |
| 08:40 | clgv | clojure.test should have some |
| 08:40 | clgv | cf. http://clojure.github.com/clojure/clojure.test-api.html |
| 08:41 | iDesperadO | clgv: I need to read the Overview part there |
| 08:41 | iDesperadO | right now I just want to read on my repl |
| 08:41 | iDesperadO | no to read it on the wed |
| 08:41 | iDesperadO | web |
| 08:42 | clgv | iDesperadO: then you are stuck with `doc` for function docstrings |
| 08:42 | iDesperadO | the Overview part tells me what the ns is for and maybe some examples about the usage |
| 08:42 | clgv | iDesperadO: probably, you should read one of the introductory books on clojure if you are serious about learning it - that'll speed you up |
| 08:42 | iDesperadO | I'm reading it |
| 08:43 | iDesperadO | clgv: clojure programming |
| 08:43 | iDesperadO | clgv: but...but I hope clojure's doc can be at least as good as python:) |
| 08:46 | iDesperadO | clgv: just my wishes:) |
| 08:46 | wmealing_ | is there any ssl client/server certificate libraries for clojure, i'm not getting much luck with the google |
| 08:46 | iDesperadO | I'd better to finish my reading and start writing something |
| 08:46 | clgv | iDesperadO: in the 1.4 release they did a lot of doc writing afair |
| 08:46 | hyPiRion | iDesperadO: It's going to be better... I hope. |
| 08:46 | clgv | wmealing_: try java libs? |
| 08:47 | wmealing_ | clgv: might have to |
| 08:47 | hyPiRion | At least Clojure developers are aware that the doc is bad, so it should be on a prioritized list. |
| 09:05 | jcromartie | I am torn over wether it's a good thing or a bad thing, that there is no standard command called "clojure" |
| 09:06 | jcromartie | a la scala, python, ruby, perl |
| 09:06 | jcromartie | alias clojure="lein repl" # goo enough |
| 09:06 | jcromartie | s/goo/good/ |
| 09:11 | jcromartie | ,default-data-readers |
| 09:11 | clojurebot | {inst #'clojure.instant/read-instant-date, uuid #'clojure.uuid/default-uuid-reader} |
| 09:12 | jcromartie | ,(println #uuid 1234) |
| 09:12 | clojurebot | #<ExecutionException java.util.concurrent.ExecutionException: java.lang.RuntimeException: java.lang.AssertionError: Assert failed: (string? form)> |
| 09:12 | jcromartie | this quits my REPL |
| 09:12 | jcromartie | ,(println "I'm still here") |
| 09:12 | clojurebot | I'm still here |
| 09:12 | gfredericks | ,(println #uuid "1234") |
| 09:12 | clojurebot | #<ExecutionException java.util.concurrent.ExecutionException: java.lang.IllegalArgumentException: Invalid UUID string: 1234> |
| 09:13 | jcromartie | I'm not trying to read a valid UUID :) |
| 09:13 | jcromartie | I just noticed it quit the REPL ("Bye for now!") |
| 09:14 | jcromartie | looks like it works in the latest leiningen though |
| 09:16 | wilfredh | is there any easy way to convert [:1 :2 :3] to [1 2 3] ? |
| 09:16 | wilfredh | rather than converting to a string, stripping the colon, then parsing the string as a number |
| 09:19 | gfredericks | wilfredh: name instead of str will save you a step |
| 09:20 | gfredericks | ,(mapv (comp read-string name) [:1 :2 :3]) |
| 09:20 | clojurebot | [1 2 3] |
| 09:20 | jcromartie | I'd imagine read-string is slower than Integer/parseInt |
| 09:21 | S11001001 | jcromartie: yeah, but it works with all the integers fit to print |
| 09:21 | jcromartie | true |
| 09:22 | S11001001 | we had a prod bug caused by parseInt where we should have been read-stringing once |
| 09:22 | gfredericks | ,(read-string "372824723724728477417915793579237952973479234375373733000N") |
| 09:22 | clojurebot | 372824723724728477417915793579237952973479234375373733000N |
| 09:23 | wilfredh | gfredericks: thanks. |
| 09:23 | S11001001 | wilfredh: in this case, though, you want to ##(-> :3 name first int (- (int \0))) |
| 09:23 | lazybot | ⇒ 3 |
| 09:24 | jcromartie | there should be a better way to coerce a string into an integer number :) |
| 09:24 | jcromartie | without read-string |
| 09:24 | jcromartie | read-string is not eval, but it's close enough to make me nervous |
| 09:24 | jcromartie | maybe I should relax |
| 09:25 | S11001001 | wilfredh: I'm assuming your keywords are one digit each |
| 09:25 | wilfredh | afraid not |
| 09:25 | jcromartie | S11001001: why would you assume one digit? |
| 09:25 | jcromartie | oh, you're being silly :) |
| 09:25 | xeqi | heh, bind *read-eval* to false and you might be safe reading |
| 09:26 | gfredericks | jcromartie: read-string is perfectly awesome if you have read-eval off |
| 09:26 | gfredericks | it's just like reading json |
| 09:26 | S11001001 | I guard it with [0-9]+ for integer reading |
| 09:27 | wilfredh | ,(mapv (comp Integer/parseInt name) [:1 :2 :3]) |
| 09:27 | clojurebot | #<CompilerException java.lang.RuntimeException: Unable to find static field: parseInt in class java.lang.Integer, compiling:(NO_SOURCE_PATH:0)> |
| 09:27 | jcromartie | Where is "#=" documented? |
| 09:27 | jcromartie | it's not in http://clojure.org/reader |
| 09:27 | jcromartie | or is it |
| 09:27 | gfredericks | ,(doc *read-eval*) |
| 09:27 | clojurebot | "; When set to logical false, the EvalReader (#=(...)) is disabled in the read/load in the thread-local binding. Example: (binding [*read-eval* false] (read-string \"#=(eval (def x 3))\")) Defaults to true" |
| 09:27 | jcromartie | yeah |
| 09:27 | jcromartie | but #= itself |
| 09:27 | wilfredh | why can't I use comp with Integer/parseInt? |
| 09:27 | jcromartie | why in the world would *read-eval* be true by default anyway |
| 09:27 | jcromartie | who uses #= |
| 09:27 | wilfredh | (sorry for novice questions...) |
| 09:28 | S11001001 | wilfredh: it's not a function; the gods of clojure are interfering with your repl to encourage you to use read-string instead :] |
| 09:28 | gfredericks | jcromartie: I think it's a lot less necessary now that there are data readers; I hope it gets defaulted to off |
| 09:29 | jcromartie | wilfredh: because it's a Java class method, not a Clojure fn |
| 09:29 | jcromartie | when Clojure sees Integer/parseInt by itself, it tries to access it as a static field |
| 09:29 | babilen | wilfredh: You can use (memfn Integer/parseInt) |
| 09:29 | jcromartie | the source code of memfn is instructuve |
| 09:29 | gfredericks | ,Integer/parseInt |
| 09:29 | wilfredh | ,(mapv (comp (memfn Integer/parseInt) name) [:1 :2 :3]) |
| 09:29 | clojurebot | #<CompilerException java.lang.RuntimeException: Unable to find static field: parseInt in class java.lang.Integer, compiling:(NO_SOURCE_PATH:0)> |
| 09:29 | clojurebot | #<IllegalArgumentException java.lang.IllegalArgumentException: No matching method found: parseInt for class java.lang.String> |
| 09:30 | chouser | There's really no point in memfn now that we have #() |
| 09:30 | babilen | wilfredh: Or just use an anonymous function such as #(Integer/parseInt %) ... |
| 09:30 | gfredericks | chouser: point-free nerds! |
| 09:31 | babilen | chouser: Right, I use #(Foo/bar %) more often anyway. |
| 09:31 | jcromartie | (memfn Integer/parseInt) should work locally… I think clojurebot is doing something clever |
| 09:31 | S11001001 | ,(doc memfn) |
| 09:31 | clojurebot | "([name & args]); Expands into code that creates a fn that expects to be passed an object and any args and calls the named instance method on the object passing the args. Use when you want to treat a Java method as a first-class fn." |
| 09:31 | stain | chouser: unless it takes many arguments (unlikely for typical functional uses of memfn though) |
| 09:32 | S11001001 | jcromartie: I think memfn makes member method calls |
| 09:32 | jcromartie | ,((memfn Integer/parseInt) "1234") |
| 09:32 | clojurebot | #<IllegalArgumentException java.lang.IllegalArgumentException: No matching method found: parseInt for class java.lang.String> |
| 09:33 | jcromartie | weird |
| 09:33 | jcromartie | oh right |
| 09:33 | hyPiRion | jcromartie: Works only on methods, not static methods. |
| 09:33 | S11001001 | ugh, I can't believe I said "member methods" |
| 09:34 | hyPiRion | ,((memfn parseInt) 1 "1234") |
| 09:34 | clojurebot | #<ArityException clojure.lang.ArityException: Wrong number of args (2) passed to: sandbox$eval55$fn> |
| 09:34 | S11001001 | *instance*, S11001001, *Instance* |
| 09:34 | hyPiRion | ,((memfn parseInt) "1234") |
| 09:34 | clojurebot | #<IllegalArgumentException java.lang.IllegalArgumentException: No matching method found: parseInt for class java.lang.String> |
| 09:34 | jcromartie | anyway |
| 09:34 | hyPiRion | ,((memfn parseInt) (Integer. 1) "1234") |
| 09:34 | clojurebot | #<ArityException clojure.lang.ArityException: Wrong number of args (2) passed to: sandbox$eval111$fn> |
| 09:34 | jcromartie | use #(Integer/parseInt %) |
| 09:34 | hyPiRion | yeah - seems to be no way out of it. |
| 09:35 | hyPiRion | Eventually, you could just fire off #(Integer. %) |
| 09:35 | hyPiRion | ,(#(Integer. %) "1234") |
| 09:35 | clojurebot | 1234 |
| 09:35 | S11001001 | sure there is, resurrect clojure.contrib.import-static and (import-static (java.lang.Integer read-string)) :] |
| 09:35 | chouser | memfn only supports instance methods |
| 09:35 | S11001001 | hyPiRion: badness, no sharing instances of small nums |
| 09:36 | hyPiRion | S11001001: hm? |
| 09:36 | hyPiRion | ,(identical? (Integer. "10") (Integer. "10")) |
| 09:36 | clojurebot | false |
| 09:36 | S11001001 | ,[(identical? (Integer/valueOf "1") (Integer/valueOf "1")) (identical? (Integer. "1") (Integer. "1"))] |
| 09:36 | clojurebot | [true false] |
| 09:36 | jcromartie | Interesting |
| 09:37 | S11001001 | very annoying that deserialize doesn't exploit the shared pools |
| 09:38 | chouser | memfn also still requires points, as far as I understand the definition |
| 09:38 | chouser | ,((memfn substring x y) "hello" 3 5) |
| 09:38 | clojurebot | "lo" |
| 09:40 | chouser | So again, how is that better? |
| 09:40 | chouser | (#(.substring %1 %2 %3) "hello" 3 5) |
| 09:41 | chouser | ,(#(.substring %1 %2 %3) "hello" 3 5) |
| 09:41 | clojurebot | "lo" |
| 10:09 | nz- | ,(identical? (Integer/valueOf "1234567") (Integer/valueOf "1234567")) |
| 10:10 | clojurebot | false |
| 10:10 | nz- | ,(identical? (Integer/valueOf "12") (Integer/valueOf "12")) |
| 10:10 | clojurebot | true |
| 10:11 | jeremyheiler | Integer caches the first 128 Integers, I think. |
| 10:11 | casion | 256 |
| 10:11 | hyPiRion | jeremyheiler: The cache is from -128 to 127 |
| 10:12 | hyPiRion | I believe. |
| 10:12 | casion | hyPiRion is correct |
| 10:12 | jeremyheiler | yep, you're correct, just found it |
| 10:12 | casion | I spent an hour figuring out that same thing last night |
| 10:18 | S11001001 | java FindBugs warns against using new Integer et al for this reason |
| 10:21 | casion | ,(identical? (int 13) (int 13)) |
| 10:21 | clojurebot | true |
| 10:21 | casion | ,(identical? (int 313) (int 313)) |
| 10:21 | clojurebot | false |
| 10:25 | S11001001 | this is pretty ordinary for lisp; standard common lisp and most schemes have some such cutoff, though the lisps typically bit-twiddle instead of maintaining an in-memory cache |
| 10:26 | technomancy | usually that's done through fixnums though, which the JVM unfortunately lacks |
| 10:27 | casion | with boxing ints to Integers in 1.4, I think it becomes a bit silly |
| 10:27 | nvy | ,(identical? 1311 1311) |
| 10:27 | clojurebot | false |
| 10:27 | S11001001 | because some implementor decided to have separate value and reference types instead of a unified value model |
| 10:27 | nvy | man what |
| 10:28 | nvy | ,(identical? (- 1311 1311) (- 1311 1311)) |
| 10:28 | clojurebot | true |
| 10:28 | S11001001 | nvy: that's nothing, this is allowed in r5rs scheme: (let ((x #\a)) (eq? x x)) => false |
| 10:28 | nvy | I've never heard of R5RS before |
| 10:29 | jeremyheiler | S11001001: Why? |
| 10:29 | arrdem | S11001001: what in the seven hells... |
| 10:29 | technomancy | nine |
| 10:29 | arrdem | %s/seven/nine/g |
| 10:30 | samrat | in Noir-async, how do I do a push on the completion of a future? |
| 10:30 | technomancy | seven is purgatory =) |
| 10:31 | S11001001 | jeremyheiler, arrdem: to allow lexical binding strategies that don't necessarily map to the object-identity space |
| 10:32 | S11001001 | I wonder... |
| 10:32 | S11001001 | ,(let [x 12343] (identical? x x)) |
| 10:32 | clojurebot | false |
| 10:32 | hyPiRion | Well, I mean |
| 10:32 | S11001001 | thought so |
| 10:32 | hyPiRion | Yeah. |
| 10:33 | arrdem | ,(doc identical?) |
| 10:33 | clojurebot | "([x y]); Tests if 2 arguments are the same object" |
| 10:33 | casion | I think I'm just going to avoid all lisps forever now |
| 10:33 | arrdem | ah. |
| 10:33 | hyPiRion | ,(let [x (atom 12343)] (identical? x x)) |
| 10:33 | clojurebot | true |
| 10:33 | arrdem | (dec casion) ; shun the non-beleiver |
| 10:33 | lazybot | ⇒ -1 |
| 10:33 | casion | lol :) |
| 10:33 | gfredericks | wait why the non-identical 12343's? |
| 10:33 | S11001001 | casion: it makes perfect sense. Forbidding you from making assumptions that aren't very useful in reality allows the implementation strategies to be more creative. |
| 10:34 | chouser | first, let's be clear that identical? often lets you see implementation details. "Equality" in any reasonable sense is implemented in = or == |
| 10:34 | S11001001 | it's certainly somewhat surprising that this can happen, but it's not actually ever useful to test identity in cases where your references are tautologically the same |
| 10:35 | weavejester | technomancy: ping |
| 10:35 | hyPiRion | ,(let [a (Integer. "1000")] (identical? a a)) |
| 10:35 | clojurebot | true |
| 10:35 | arrdem | see... the (identical?) I can understand I guess. The (eq?) hacks me off a bit. |
| 10:35 | S11001001 | arrdem: eq? is identical? |
| 10:35 | arrdem | S11001001: srs5 eq? as mentioned above |
| 10:35 | casion | S11001001: it doesn't make any sense to me atm at all |
| 10:35 | S11001001 | casion: you saw the recent discussion on clojure about how take-while requires its pred be pure? |
| 10:36 | arrdem | (inc hyPiRion) |
| 10:36 | lazybot | ⇒ 3 |
| 10:36 | S11001001 | arrdem: what? |
| 10:36 | arrdem | hang on I'm having a revalation |
| 10:36 | casion | S11001001: no |
| 10:37 | S11001001 | casion: okay, ##(doc take-while) why make that restriction on pred? |
| 10:37 | lazybot | ⇒ "([pred coll]); Returns a lazy sequence of successive items from coll while (pred item) returns true. pred must be free of side-effects." |
| 10:38 | casion | S11001001: I don't know. I've never understood the use of 'must' in that sentence |
| 10:39 | S11001001 | casion: it's a requirement about the pred you pass in |
| 10:39 | hyPiRion | ,(let [eq? (fn [a] (identical? a a))] (eq? 1000)) |
| 10:39 | clojurebot | true |
| 10:39 | S11001001 | casion: must has the meaning from rfc 2119, if you want further documentation :) |
| 10:39 | nvy | great |
| 10:40 | chouser | ,(keep #(when-not (identical? (read-string %) (read-string %)) %) (map str (range -130 130))) |
| 10:40 | clojurebot | ("-130" "-129" "128" "129") |
| 10:40 | casion | S11001001: one moment |
| 10:42 | casion | S11001001: yeah, I have no idea |
| 10:43 | chouser | so, the numbers between -128 and 127 (inclusive) when *read* are taken from a cache instead of creating new objects on the heap), and identical? is letting you see that. |
| 10:43 | djanatyn | hmm. records and protocols are kind of cool. |
| 10:43 | S11001001 | casion: The requirement that pred must be pure means that `take-while' is free to change how it calls `pred'. It could call it more often, or less, or change the order of calls, or change the mix of lazy-seq value production and pred calls. |
| 10:44 | djanatyn | is there anything that makes them very different from regular classes and generic methods? |
| 10:44 | hyPiRion | The reason why identical? doesn't return true for values outside -128 to 127 is because they are wrapped in a Long when identical? is called. |
| 10:44 | hyPiRion | As far as I can understand. |
| 10:44 | djanatyn | I've used CLOS and I'm trying to get used to clojure's version of OOP so that I can follow along in my java class |
| 10:45 | gfredericks | hyPiRion: so it is a primitive long before being passed in as args? |
| 10:45 | casion | S11001001: is this to avoid things breaking if/when take-while is changed, or does it apply to the current implementation? |
| 10:45 | S11001001 | casion: take-while sacrifices predictability of pred calls for creativity in its own implementation. It's the same with this identical? thing; by making identical? counterintuitive (but still correct), the implementation can get more creative |
| 10:46 | S11001001 | And yes, identical? is giving the right answer here. Intuitiveness is not only unnecessary for correctness, it can sometimes lead you down the wrong path. |
| 10:47 | jeremyheiler | &(let [x 1234] (identical? x x)) ; even for this? |
| 10:47 | lazybot | ⇒ false |
| 10:48 | hyPiRion | gfredericks: Well, it certainly seems like it. |
| 10:49 | nvy | jeremyheiler: I'm a newbie, but I think in your case, x is not an object before it reaches identical? |
| 10:49 | hyPiRion | ,(let [eq? (fn [a] (let [b a] (identical? a b))) c 1000] (eq? c)) |
| 10:49 | clojurebot | true |
| 10:49 | jeremyheiler | ah... makes sense |
| 10:49 | nvy | it is a primitive |
| 10:49 | casion | gfredericks: I was discussing that with you yesterday I think, when I was asking if there was a better way to avoid using unchecked-int everywhere |
| 10:49 | casion | since clojure seems to promote to long quite liberally |
| 10:49 | casion | and early |
| 10:50 | gfredericks | casion: promoting to long is slightly different from boxing |
| 10:51 | gfredericks | boxing is the issue here I think |
| 10:52 | casion | gfredericks: I thought boxing only every happened with similar types in clojure, int->Integer, long->Long etc.. |
| 10:52 | casion | ever* |
| 10:52 | hyPiRion | So it's boxed in a Long when sent as a parameter to a function. |
| 10:52 | gfredericks | casion: in 1.3 it started promoting to longs as well |
| 10:53 | casion | ah ok |
| 10:53 | technomancy | weavejester: hi |
| 10:53 | casion | well, it's all very confusing to someone who's used to C ;) |
| 10:53 | weavejester | technomancy: Hey there! I was wondering if you could release clj-stacktrace 0.2.5, since I've just ran into a bug that was fixed after 0.2.4 |
| 10:55 | technomancy | weavejester: I was waiting for chouser's patches to do the next release, but at this point I've probably waited long enough |
| 10:55 | weavejester | technomancy: Thanks :) |
| 10:56 | chouser | technomancy: sorry :-( |
| 10:56 | chouser | weavejester: sorry :-( |
| 10:56 | technomancy | chouser: well it's been an convenient excuse |
| 10:57 | weavejester | I just want mva's NPE fix :) |
| 10:57 | technomancy | I'll see if I can push it out later today |
| 10:58 | weavejester | No real hurry. I forked the repo and pushed a version to a custom group in clojars in the meantime. |
| 11:26 | naeg | would be great if someone could help me with a bit-fiddling code in clojure: http://bpaste.net/show/deSQBXgSWer59qAqshCM/ |
| 11:26 | clgv | can I use (derive :a :b) without namespace qualification of :a? |
| 11:27 | naeg | it's a neat algorithm for checking whether a player has won a connect four game |
| 11:30 | clgv | ah, I need an own hierarchy... |
| 11:31 | chouser | clgv: keywords in hierarchies must all be namespaced, iirc |
| 11:31 | scriptor | naeg: does >> have a higher or lower precedence? |
| 11:31 | scriptor | *higher or lower than * |
| 11:31 | clgv | chouser: nope. only in the global one afair |
| 11:31 | clgv | ,(doc derive) |
| 11:32 | clojurebot | "([tag parent] [h tag parent]); Establishes a parent/child relationship between parent and tag. Parent must be a namespace-qualified symbol or keyword and child can be either a namespace-qualified symbol or keyword or a class. h must be a hierarchy obtained from make-hierarchy, if not supplied defaults to, and modifies, the global hierarchy." |
| 11:32 | scriptor | ah, looks like its lower |
| 11:34 | naeg | scriptor: I'm fiddling around with the code, but it always returns 0 where it should return 1 afaik |
| 11:34 | naeg | e.g. for number 15 |
| 11:46 | canweriotnow | did something change recently with clojure.java.jdbc? |
| 11:47 | chouser | clgv: sure enough. Interesting. |
| 11:47 | clgv | chouser: it's not in the docstring but in the assert in the source |
| 11:48 | clgv | should be mentioned in the docstring though |
| 11:48 | lispnik | hi, i signed a CA and it has been received, so I requested to join the clojure-dev mailing list. membership to that group is still pending after about a week though |
| 11:48 | pjstadig | canweriotnow: why do you ask? |
| 11:49 | pjstadig | are you on 1.3/1.4? |
| 11:49 | pjstadig | (clojure that is) |
| 11:50 | pjstadig | there are some "unexpected" interactions between clojure 1.3/1.4 and databases containing bigint columns |
| 11:50 | canweriotnow | I'm getting IllegalArgumentException (missing a required parameter) for my db-spec, and I don't think my code changed… I also can't figure out what I'm missing. |
| 11:50 | canweriotnow | I'm on 1.3. |
| 11:50 | canweriotnow | I'm not even connecting at this point... |
| 11:50 | canweriotnow | and I don't think any of the columns are bigint, anyway :-/ |
| 11:52 | canweriotnow | I've got classname, subprotocol, sub name, user, password keys in the db spec hash… can't figure out what's missing. |
| 11:57 | lispnik | canweriotnow: can you paste the db spec? (sans credentials) |
| 11:58 | lispnik | canweriotnow: and a stack trace |
| 12:01 | canweriotnow | lispnik: yeah, one sec, working on two machines, thx :) |
| 12:07 | canweriotnow | (defn bbts-dev [] |
| 12:07 | canweriotnow | { :classname (get-property "acedia.bbts") |
| 12:07 | canweriotnow | :subprotocol (get-property "acedia.bbts.subprotocol") |
| 12:07 | canweriotnow | :subname (str "@" (get-property "acedia.bbts.dev.host") ":" (get-property "acedia.bbts.dev.port") ":" (get-property "acedia.bbts.dev.sid")) |
| 12:07 | canweriotnow | :user (get-property "acedia.bbts.dev.user") |
| 12:07 | canweriotnow | :password (get-property "acedia.bbts.dev.password")}) |
| 12:07 | canweriotnow | eh, lemme do a gist, sorry... |
| 12:08 | canweriotnow | lispnik: https://gist.github.com/2a2e87c24e495cf340f5 |
| 12:08 | lispnik | canweriotnow: have you checked the return values of each of those get-property calls? |
| 12:08 | canweriotnow | yup… all correct. |
| 12:10 | lispnik | what db is this for? |
| 12:10 | lispnik | oh oops |
| 12:10 | lispnik | just saw you have that in your gist |
| 12:12 | canweriotnow | lispnik: having the same problem with MSSQL, though (multi-db app;ication) |
| 12:13 | canweriotnow | Thinking of trying it with my postgres system just to be sure, but… yeah, I don't get it. this all worked previously. |
| 12:13 | muhoo | is there a way to specify in lein/nrepl that a form be executed 1) whenever the project starts and 2) whenever a new repl is started ? |
| 12:14 | muhoo | in other words, 1) whenever the repl starts, and 2) whenever the user connects to it. |
| 12:14 | technomancy | muhoo: for 1) you can put an :injections key in the :repl profile |
| 12:14 | technomancy | you might need to copy the :dependencies from Leiningen's :repl profile since the one in your project will shadow Leiningen's |
| 12:15 | muhoo | they don't merge? |
| 12:15 | technomancy | no, profiles of the same name shadow existing ones |
| 12:15 | unlink | Is there an if form that wraps its else block in an implicit do? |
| 12:15 | muhoo | thanks. any idea about (2)? |
| 12:15 | technomancy | otherwise there's no way to support removing things that Leiningen brings in implicitly |
| 12:16 | technomancy | muhoo: that'd be more of an nrepl question |
| 12:17 | muhoo | ok |
| 12:17 | lispnik | canweriotnow: sorry i got nothing… perhaps in the full stack trace there is an indication on what param it's complaining about |
| 12:18 | canweriotnow | lispnik: okay, thanks anyhow. |
| 12:25 | uvtc | I'm using mustache (clostache) and am looking for a good way to have it "include" header and footer content in a template. I'm currently using partials, but `slurp` to get the actual header and footer content from those template files... anyone have any ideas for a better way to do this? |
| 12:27 | uvtc | What I'd like is to just put `{{> header}}` at the top of my this-page.mustache template and have it "include" header.mustache right there, but that doesn't seem to be the way clostache/mustache operates. |
| 12:35 | samflores | uvtc, I'm using something like this: https://gist.github.com/3623177 |
| 12:36 | samflores | it's basically what your are doing |
| 12:36 | samflores | *you |
| 12:40 | uvtc | samflores: Thanks. Why are you using `clojure.java.io/resource` instead of just having `slurp` grab the file? |
| 12:46 | uvtc | What is the purpose of clojure.java.io/resource? |
| 12:47 | gfredericks | get a fileish thing on the classpath without having to worry about if you're in an FS project or a jar or etc? |
| 12:48 | austinh | Does anyone have an example of using virtual hosts with Clojure/Jetty? |
| 12:49 | austinh | I'm getting a ClassNotFoundException when importing org.eclipse.jetty.servlet.ServletContextHandler and I can't figure out how to proceed. |
| 12:52 | mrb_bk | dnolen: are there any decent technical book stores in NYC |
| 12:53 | dnolen | mrb_bk: hmm ... I always order everything online. |
| 12:53 | mrb_bk | dnolen: same, i wish there was a great used store though |
| 12:53 | dnolen | mrb_bk: oh right, yeah I get most of my of used books off amazon |
| 12:54 | mrb_bk | dnolen: i want a copy of bratko's AI book |
| 12:55 | duck1123 | austinh: you're trying to run multiple hosts in the same application? |
| 12:57 | dnolen | mrb_bk: there's a newer 4th edition now w/ quite a bit of new material it seems. |
| 12:57 | austinh | duck1123: yes |
| 12:57 | xeqi | uvtc: clojure.java.io/resources will read resources inside of jar files |
| 12:57 | uvtc | gfredericks: Ok, looks like io/resource gets the java.lang.ClassLoader for this thread (which is used for loading classes and resources (from somewhere on the classpath)), and calls its getResource method which returns a java.net.URL. Not exactly sure why it returns a URL instead of a File though. I suppose because resources can be found in places other than local files. :) |
| 12:58 | S11001001 | uvtc: like in jars |
| 12:58 | mrb_bk | dnolen: hmm, will look into that, thanks! |
| 12:58 | xeqi | oh, gfredericks already said that |
| 12:58 | S11001001 | as xeqi said |
| 12:59 | uvtc | xeqi S11001001 : Thanks. So, it could return a URL that points into a jar? What would that look like? |
| 12:59 | S11001001 | uvtc: ask for clojure/core__init.class and find out :) |
| 12:59 | duck1123 | austinh: I'm affraid I don't know much about Jetty WRT virtual hosts. Just wanted to make sure you weren't simply trying to run two domains on the same machine. (which is different) |
| 13:00 | TimMc | It is? |
| 13:01 | uvtc | ,(str (clojure.java.io/resource "clojure/core__init.class")) |
| 13:01 | clojurebot | "" |
| 13:01 | uvtc | Give me results on my system though. Thanks, S11001001 . |
| 13:01 | uvtc | "jar:file:/home/john/.lein/self-installs/leiningen-2.0.0-preview10-standalone.jar!/clojure/core__init.class" |
| 13:02 | duck1123 | TimMc: If he was just trying to run two domains, I would suggest having 2 apps with a common frontend http server |
| 13:03 | uvtc | gfredericks: tanks. |
| 13:03 | uvtc | gfredericks: also, *thanks. |
| 13:08 | austinh | How do you know which Java classes can be imported? Is it determined by the JVM that I'm running, or by a jar that is packaged with Clojure, or something else? |
| 13:10 | S11001001 | austinh: you a leiningen user? |
| 13:10 | austinh | S11001001: Yes, but I currently run everything using clojure-jack-in and evaluating in the buffer. |
| 13:10 | nDuff | austinh: ...in terms of the _details_, it's determined by your classloader, but in the general case, anything accessible to your JVM -- packaged by it, added to your classpath, etc etc |
| 13:11 | uvtc | austinh: you can import any java classes on your classpath. |
| 13:11 | nDuff | austinh: (there are things that can be done to artificially restrict what classes you can see, or enable download/install/access of new packages within a running instance, or so forth, but if we're just sticking to the general case...) |
| 13:12 | S11001001 | austinh: then, as nDuff said |
| 13:12 | clojurebot | Excuse me? |
| 13:12 | nDuff | austinh: ...generally, the easiest thing to do is to let leiningen manage it all for you -- adding a description of anything you need to your project.clj, and letting it download those and make sure they're on the classpath. |
| 13:13 | austinh | Ok, so are classes under org.eclipse.jetty available because ring-jetty-adapter depends on org.eclipse.jetty/jetty-server? |
| 13:13 | nDuff | austinh: ...if you use "lein swank", you can then attach a running emacs instance to it; I don't know the details of what clojure-jack-in does. |
| 13:13 | nDuff | austinh: org.eclipse.jetty is just where jetty-server comes from |
| 13:13 | nDuff | austinh: it doesn't guarantee that it gives you all of org.eclipse.jetty |
| 13:13 | austinh | Right. That's what I thought. |
| 13:13 | nDuff | austinh: ...you'd have to look at the docs for jetty-server to know exactly what is and isn't included |
| 13:13 | uvtc | austinh: Oh, if you're talking about getting them onto your classpath to begin with, then as the others are pointing out, you just add them to the dependencies in your project.clj and let lein get them for you. |
| 13:14 | austinh | I was wondering why some classes under org.eclipse.jetty can be imported, but others are not found. |
| 13:14 | nDuff | *nod* -- you'll have to find out which packages the ones you need that aren't there come from and add them. |
| 13:14 | austinh | I see. Thank you all. |
| 13:14 | nDuff | If you were in an OSGi container, the explanation would be longer and much more complicated, but if you were, you'd probably know. :) |
| 13:15 | austinh | I don't even want to know. |
| 13:16 | uvtc | austinh: You find the packaged-up libs you want at http://search.maven.org/ , then add the "coordinates" you find there to the dependencies in your project.clj. |
| 13:17 | austinh | uvtc: Thank you. |
| 13:18 | uvtc | austinh: y/w. |
| 13:24 | austinh | Is 'lein search' deprecated? |
| 13:24 | technomancy | austinh: you need to be running preview10 for it to work properly |
| 13:25 | technomancy | since maven moved the index location for central |
| 13:25 | technomancy | s/maven/sonatype/ |
| 13:25 | austinh | Ok, I just updated. Thanks. |
| 13:33 | cemerick | technomancy: unbelievable |
| 13:33 | cemerick | no redirect? |
| 13:33 | technomancy | cemerick: err--they changed the format too |
| 13:34 | cemerick | awesome |
| 13:34 | technomancy | supposedly the old indices were the "legacy" ones |
| 13:35 | technomancy | probably there's a mailing list I should be on so I would find out about these things before they happen? dunno |
| 13:35 | cemerick | Seems like something like central shouldn't break APIs/paths until the heat death. |
| 13:36 | xeqi | does the same hold for clojars? |
| 13:36 | technomancy | cemerick: I have a bit of sympathy since the old indices were huge, monolithic, and crazy slow. |
| 13:36 | technomancy | and the new format allows for incremental updates |
| 13:36 | canweriotnow | technomancy: does lein2 change any behavior re: loading libs from the system class path, i.e., jdbc drivers? |
| 13:37 | technomancy | canweriotnow: yeah, we now ignore $CLASSPATH |
| 13:37 | cemerick | Sure. I'm all for improvements, but when the underlying data is the same, and you're just providing different manifestations of it, the marginal cost of leaving prior revs in place is marginal. Or, it is compared to the pain that can be caused by breaking tools that depend on centralized services. |
| 13:37 | technomancy | we've never explicitly supported anything that could be called the "system class path", but $CLASSPATH was an undocumented way to do certain sketchy things |
| 13:38 | technomancy | cemerick: I think it's more a problem of bandwidth costs |
| 13:38 | canweriotnow | technomancy: Is there a proper way to make sure proprietary jars (oracle, mssql) get loaded (i.e., from /usr/lib/jvm/*version*/jre/lib/ext)? |
| 13:38 | technomancy | canweriotnow: you need to get them into a repository |
| 13:39 | canweriotnow | so, e.g., lein-localrepo should solve it? |
| 13:39 | cemerick | xeqi: Dunno. How many tools depend upon clojars APIs? Is the population depending on them growing, shrinking, or flat? |
| 13:40 | cemerick | (rhetorical questions there) |
| 13:40 | technomancy | canweriotnow: if you're just working on the project solo that's fine |
| 13:40 | canweriotnow | I have to say, Clojure's stack traces (well, really jvm's) make me miss the CL REPL :) |
| 13:40 | technomancy | canweriotnow: otherwise you'll want to set up a private repository, which can be just a pile of files served over HTTP |
| 13:41 | canweriotnow | technomancy: Yeah, I'm the only one on this for the moment, we're going to set up maven or sonatype locally for some stuff once it needs sharing. Thanks! :D |
| 13:49 | technomancy | cemerick: we used to consume the simple indices with raw lucene, but now the index structure is so complicated we have to use their indexer API |
| 13:49 | technomancy | so on the bright side if they have any more incompatible index changes, it'll be a simple version bump on our dependency to fix it =) |
| 14:01 | Moses | I'm getting bugs when trying to use Marginalia, anyone have any experience using it? |
| 14:02 | Moses | Specifically its telling me I can't create an ISeq from a clojure.lang.Symbol |
| 14:04 | dnolen_ | Moses: does your own code compile? |
| 14:04 | Moses | Yes |
| 14:05 | hiredman | are you sure? |
| 14:05 | Moses | Shit, I just figured it out |
| 14:05 | Moses | I apologize |
| 14:05 | Moses | In Defproject, I had :dev-dependencies [lein-marginalia "0.7.1"] |
| 14:06 | Moses | Should have been :dev-dependencies [[lein-marginalia "0.7.1"]] |
| 14:06 | technomancy | :plugins [[lein-marginalia "0.7.1"]] actually |
| 14:07 | Moses | Oh @@ |
| 14:08 | Moses | BTW, to anyone that hasn't played with it yet, I just got it working, and I'm already in love with it!!! |
| 14:08 | Moses | Thanks :technomancy |
| 14:08 | technomancy | np |
| 14:17 | amalloy | seancorfield: you around? stackoverflow noticed an issue with data.priority-map |
| 14:18 | pandeiro | cemerick: is there a way i can use vars from another ns referring to javascript fns as strings with clutch/view-server-fns? |
| 14:19 | cemerick | pandeiro: Not sure what you mean. |
| 14:19 | cemerick | Oh, you just want to push some code-as-strings to the server? |
| 14:19 | pandeiro | cemerick: yup |
| 14:19 | pandeiro | it seems to be just taking the symbol and converting to string |
| 14:20 | pandeiro | instead of resolving it |
| 14:20 | pandeiro | maybe just don't use view-server-fns but update-document instead? |
| 14:21 | ToxicFrog | This marginalia thing looks neat. |
| 14:25 | cemerick | pandeiro: or force the resolution of the var at read-time with syntax-quote |
| 14:27 | pandeiro | cemerick: gotcha, but view-server-fns really isn't nec for my case i'm thinking |
| 14:27 | pandeiro | i do love how easily you can write :cljs views |
| 14:27 | cemerick | pandeiro: sure, if you're comfortable with the expected layout of view docs, then have at it with update-document |
| 14:27 | pandeiro | but the compilation time is killing me every time i restart the server while i am developing |
| 14:28 | pandeiro | cemerick: thanks, sorry to bother |
| 14:28 | cemerick | no bother :-) |
| 14:28 | cemerick | I think there's an issue for that; the cljs (or other language) source could be stored in the view doc, and only recompiled when it changes |
| 14:29 | SegFaultAX|work2 | Anyone else having trouble submitting solutions on 4clojure? |
| 14:32 | amalloy | argh, what do i need to put in my project.clj to get snapshots of clojure contrib projects? i've added :repositories [["sonatype-oss-public" "https://oss.sonatype.org/content/groups/public/"]], and have a dependency on [org.clojure/data.priority-map "0.0.2-SNAPSHOT"], and if i navigate to that URL in my browser i see that version; but leiningen seems to only be checking the default repos |
| 14:44 | whitaker | Anyone here familiar with issues using noir.util.test to drive noir-async related tests? |
| 14:45 | whitaker | Background... |
| 14:46 | whitaker | Relevant lein deps: [noir-async "1.1.0-beta9"] and [aleph "0.3.0-beta2"] |
| 14:46 | whitaker | :use'ing noir.util.test |
| 14:47 | whitaker | (and midje.sweet, though errors are the same with noir.test/deftest versions, I checked) |
| 14:47 | juhu_chapa | Hi all! Why the following expr returns false: (case "A" Class/staticValueEqualsToA true false) |
| 14:47 | whitaker | Example: |
| 14:47 | hiredman | ,(doc case) |
| 14:47 | whitaker | (facts "about 'GET /server-name'" |
| 14:47 | whitaker | (:status (send-request "/server-name")) => 200) |
| 14:47 | clojurebot | "([e & clauses]); Takes an expression, and a set of clauses. Each clause can take the form of either: test-constant result-expr (test-constant1 ... test-constantN) result-expr The test-constants are not evaluated. They must be compile-time literals, and need not be quoted. If the expression is equal to a test-constant, the corresponding result-expr is returned. A single default expression can foll... |
| 14:48 | whitaker | In core: |
| 14:48 | whitaker | (na/defpage-async [:get "/server-name"] [] conn |
| 14:48 | whitaker | (na/async-push conn (str server-name "\n"))) |
| 14:48 | whitaker | Works fine in the browser and on the command line |
| 14:48 | whitaker | But: |
| 14:49 | whitaker | java.lang.IllegalArgumentException: No implementation of method: :subscribe of protocol: #'lamina.core.result/IResult found for class: nil |
| 14:49 | whitaker | I have RTFM'd for days on this issue |
| 14:49 | whitaker | The 'na', by the way: required [noir-async.core :as na] |
| 14:50 | hiredman | whitaker: most likely noir's automatic code reloading is breaking lamina's protocols |
| 14:50 | whitaker | Ah |
| 14:50 | whitaker | Hmm |
| 14:51 | whitaker | Any suggested workaround? Lemme break out my -main, one sec... |
| 14:51 | hiredman | whitaker: please don't |
| 14:51 | whitaker | ok |
| 14:51 | whitaker | ? |
| 14:52 | hiredman | whitaker: I'd suggest not using noir, but generally by the time I do that people have there code so entangled in noir they resist the idea |
| 14:52 | whitaker | I'm not emotionally tied to it |
| 14:52 | Moses | Just curious, what's wrong with noir? |
| 14:52 | hiredman | don't use noir, and don't use automatic code reloading |
| 14:52 | whitaker | I'm open to suggestions |
| 14:53 | whitaker | hiredman: what do you prefer? |
| 14:53 | whitaker | And is there a flag I can pass to disable auto code reloading? |
| 14:53 | hiredman | Moses: it is stateful and doesn't compose, is full of all kinds of (add-whatever calls) that need to happen in a certain order etc |
| 14:53 | hiredman | I use ring and compojure |
| 14:53 | Moses | Ah, thanks. |
| 14:54 | technomancy | compojure's route definitions are a lot nicer |
| 14:54 | technomancy | it's easy to see everything in one place, but also easy to follow things if you do need to spread them out |
| 14:54 | whitaker | In the last day, I've gotten the sense that noir isn't as… clean as its promoters might claim it to be. |
| 14:54 | hiredman | I haven't written anything with noir, but the few places I've seen it used the project would have been better served with ring+compojure |
| 14:56 | whitaker | I'm certainly at wits' end, and am perfectly willing to rip out all the noir code and try that approach. |
| 14:57 | whitaker | Problem for me is this, though: I need to be able to do websockets. |
| 14:57 | technomancy | part of the problem is that protocols don't play well with reloading, but at least if you're invoking the reloading manually it's a lot easier to do damage control. |
| 14:57 | whitaker | I found noir-async, and was trying to make it work, defining defpage-async where necessary and defaulting to defpage elsewhere. |
| 14:58 | Apage43 | aleph has websocket built in, no? |
| 14:58 | whitaker | yes |
| 14:58 | whitaker | noir-aysnc is written on top of aleph |
| 14:59 | whitaker | s/noir-aysnc/noir-async |
| 15:00 | Moses | What tech stack do you guys use for compojure sites? Just compojure and ring, do you use a templating language? Is there anything else that's generally in your web development toolkit when using compojure? |
| 15:00 | Apage43 | whitaker: you can use aleph with compjure directly with wrap-ring-handler/wrap-aleph-handler http://ztellman.github.com/aleph/aleph.http-api.html#aleph.http/wrap-aleph-handler |
| 15:00 | Apage43 | as long as you wrap in both places it should work asyncly |
| 15:01 | Raynes | Moses: Compojure is just the routing portion of things. It is very specific and you definitely need other stuff to build a complex website. |
| 15:01 | whitaker | Apage43: much obliged, thanks |
| 15:01 | technomancy | Moses: I've taken to always pulling in environ and drawbridge as a matter of course. for templating you'll need to pick between hiccup and enlive based on how much tolerance for cleverness you have and the skillset of the people who'll be needing to write templates. |
| 15:01 | weavejester | Moses: I use Ring/Compojure/Hiccup with Environ for handling the config and Lein-Ring for running/testing. |
| 15:02 | Raynes | Moses: There is Hiccup, Enlive, and Stencil (mustache) for templating. |
| 15:02 | weavejester | I've also been working on Ragtime for migrations, and it's about ready for use. |
| 15:02 | Raynes | technomancy: Eh, if Hiccup or Enlive were my only options for templating I'd probably write websites in Haskell. |
| 15:02 | weavejester | Ouch! :) |
| 15:02 | kingtim | kingtim, D#scu3v3 |
| 15:02 | Moses | Thank you all very much, I've been using Noir, but I recognize many of your names, and would prefer to just copy what you're all using, again, thanks very much. |
| 15:02 | Raynes | weavejester: Not that there is anything wrong with Hiccup! |
| 15:03 | SrPx | Is it possible to make macros so #(1% etc) can feature nested functions? |
| 15:03 | weavejester | Haha :) |
| 15:03 | technomancy | Hiccup is a joy for me to use but a bitter pill to swallow if you have non-clojurists working on a project. |
| 15:03 | Raynes | technomancy: Hiccup just got messy for me with larger projects, and it got harder for things to grow. |
| 15:03 | technomancy | I want to like Enlive, but I get lost working with it so easily =( |
| 15:04 | TimMc | Just needs a different API, I think. |
| 15:04 | technomancy | likely |
| 15:04 | whitaker | As for my own application, I have no need for templating: I'm doing a very thin, very simple JSON/plaintext RESTful interface for network device status polling. |
| 15:04 | Raynes | I still use hiccup for tryclj, though people have sought to change that (TimMc), but I have persevered. |
| 15:04 | dnolen_ | whitaker: I looked around at the source - noir doesn't seem to expose a simple way to turn off reloading without disabling :dev. That said, seems like a simple patch. |
| 15:04 | technomancy | that's kind of indicative of the problems with noir in general |
| 15:04 | TimMc | I want to carve out some time to write relying code against that non-existent better Enlive API. |
| 15:05 | technomancy | orthogonal things aren't exposed orthogonally; everything's bundled together |
| 15:05 | dnolen_ | technomancy: it's complected for sure. But decomplecting is often an incremental affair. |
| 15:05 | whitaker | dnolen_: thanks. And to technomancy's point, it might not be worth the bother to fork/pull request a fix. |
| 15:06 | dnolen_ | whitaker: sure, which I'm sure you'll figure out soon enough ;) |
| 15:06 | Urthwhyte | While you guys are on the topic of web dev stuff, could you suggest a sinatra-esque clojure framework? |
| 15:06 | Raynes | technomancy, dnolen_: If you decomplect Noir you get Compojure. |
| 15:06 | technomancy | actually my other complaints I were thinking of were with korma now that I think about it |
| 15:06 | Raynes | I recently came to that realization. |
| 15:06 | Urthwhyte | I'm a Python/Ruby guy who learned Scheme as his first language and is trying to get back into lisp |
| 15:06 | whitaker | dnolen_: heh… "complected"… I just yesterday listed to Rich Hickey's talk wherein he (re)introduces that archaicism into the language |
| 15:06 | dnolen_ | Raynes: having things decomplected doesn't mean sugar ain't good. |
| 15:06 | Raynes | dnolen_: But there isn't really any sugar there. |
| 15:07 | Raynes | It's just a slightly different syntax for routes with mutability tying them together instead of an outer defroutes. |
| 15:07 | Raynes | And because of that, a whole host of issues with doing interesting things with middleware and such. |
| 15:08 | dnolen_ | Raynes: noir *is* sugar over compojure+ring - a few more knobs would be nice. in anycase I don't really have that strong of an opinion about it. people seem happy w/ noir since you don't have to go sniffing around in the source quite as much. |
| 15:08 | SegFaultAX|work2 | amalloy: I'm sorry. I just had to hammer the API endpoint for 4clojure for about 30 seconds. |
| 15:08 | whitaker | Urthwhyte: similar career arc myself. Read SICP years ago, couldn't use it vocationally, did the usual C/Perl/C++/Java/Python/Ruby/Rails thing for years, recently found Clojure, now working with it. At work. Yay me. |
| 15:09 | Raynes | SegFaultAX|work2: You reduced amalloy's health bar to half! |
| 15:09 | Urthwhyte | work for me right now is Java :/ |
| 15:09 | SegFaultAX|work2 | Raynes: :D |
| 15:09 | Urthwhyte | well, internship |
| 15:09 | Raynes | amalloy: Quick, quaff a health potion! |
| 15:09 | SegFaultAX|work2 | Raynes: I was making this: https://gist.github.com/3607101 |
| 15:09 | Urthwhyte | so much boilerplate :( |
| 15:09 | SegFaultAX|work2 | Raynes: All my solutions. Need to collect the title and difficulty for each problem I've solved. |
| 15:10 | amalloy | SegFaultAX|work2: why would i care? hammer away; i don't think a single computer can generate enough traffic to do much damage |
| 15:10 | Raynes | SegFaultAX|work2: You should make a little website for extracting solutions like that for other people. |
| 15:10 | Raynes | I'm sure people would find it useful. |
| 15:10 | SegFaultAX|work2 | Raynes: I talked to amally about extending the API to allow fetching of solutions. |
| 15:10 | Raynes | amalloy: I think people get wrong ideas about the fragility of our infrastructure because of how 4clojure goes down all the time. |
| 15:10 | SegFaultAX|work2 | Raynes: To do this I had to ask for a dump right from mongo. |
| 15:10 | ivaraasen | whitaker: somewhat similar situation here. I study petroleum engineering. lots of Matlab and Java spaghetti code. |
| 15:11 | pandeiro | i am a newb compared to all of you but i think the answer to the noir issue are more specialized compojure templates for general webapp categories |
| 15:11 | pandeiro | that is what i myself have resorted to |
| 15:11 | Urthwhyte | I've been tempted to write a book wrapped around 4clojure |
| 15:11 | amalloy | well yes, i suppose that's a fair assumption for them to make. because our infrastructure is rubbish |
| 15:11 | Raynes | pandeiro: That's basically my idea. |
| 15:11 | technomancy | pandeiro: yeah, I wrote a template for heroku compojure apps that adds stacktrace middleware, environ, and drawbridge |
| 15:11 | Raynes | amalloy: Well, not really. We can handle a huge load (lol), it just goes down because we allow code eval in a shitty sandbox. |
| 15:11 | pandeiro | kind of like compojure already has 'api' and 'site'... a few more middleware bundles and lein templates for slightly more specialized use cases and voila |
| 15:12 | technomancy | pandeiro: the great thing about templates is that they expose the composition of orthogonal components in really visible ways |
| 15:12 | SrPx | Wow is it me or this channel is way more active than when I first came in? |
| 15:12 | SegFaultAX|work2 | SrPx: That depends on what you first came in I think. |
| 15:12 | whitaker | ivaraasen: Matlab… ugh. Of course, I'm having to use Octave for Andrew Ng's Machine Learning course, so I'm having to deal with it again (I'd thought I'd left Matlab when I left academia) |
| 15:12 | SrPx | 4 months ago SegFaultAX|work2 |
| 15:12 | amalloy | right. so we do a lot of things well, and a few things terribly that brings the whole site down. sounds like a rubbish infrastructure to me! |
| 15:12 | Urthwhyte | whitaker, ivaraasen: It's better than sage ;) |
| 15:12 | hiredman | win 15 |
| 15:13 | SegFaultAX|work2 | amalloy: Did you see the output of the dump you gave me? |
| 15:13 | amalloy | yeah, it's pretty |
| 15:13 | amalloy | i command you! add an API endpoint to expose user solutions! |
| 15:13 | SegFaultAX|work2 | I feel ashamed, though. I did it in Python. |
| 15:13 | SegFaultAX|work2 | I don't know the json, HTTP, and file IO APIs yet. |
| 15:14 | SrPx | Anyway, nobody answered. Can I somehow use macros or something to make this kind of syntax: ((#(a? b?') {a:1 b:2}) {a:3 b:4}), output: (1 3) . |
| 15:14 | amalloy | cheshire, slurp, and clojure.java.io, respectively, probably solve your problems |
| 15:15 | SegFaultAX|work2 | amalloy: Yea, I'm just not quite there yet. |
| 15:15 | SegFaultAX|work2 | amalloy: My additions to 4clojure API might be my first actually beneficial addition in Clojure :) |
| 15:15 | SegFaultAX|work2 | Scrum time, bbl. |
| 15:16 | amalloy | SrPx: the code you pasted makes no sense at all. i can't figure out what meanings you would assign to get the output you expect |
| 15:16 | shaungilchrist | SrPx: it sounds like you want type based "apply" |
| 15:17 | ivaraasen | whitaker: granted, gradient descent and all that is somewhat of a pretty thing in Matlab. but my professors tend to obfuscate even the simplest of code anyway |
| 15:17 | whitaker | Huh… dammit, looks like I'd been wasting my time fighting with noir-async, when I could have used this approach: https://gist.github.com/656227 |
| 15:19 | whitaker | ivaraasen: Octave's support for gradient descent (i.e. gradient ascent for minimization, sign-flipped ;-)) is pretty sweet. I was thinking of finding its Clojure/Incanter equivalent and playing with it. |
| 15:20 | lnostdal | hi guys, this pops up from time to time, but perhaps things have changed now (a new library or something new in git?) .. but is it possible to do inheritance the "old way" in clojure somehow? |
| 15:21 | TimMc | inheritance? |
| 15:21 | clojurebot | multiple inheritance is http://www.piratejesus.com/nerdcore/nerdcore017.gif |
| 15:21 | whitaker | Someone mentioned a few weeks ago at a San Francisco Clojure Meetup I attended that he'd "done Ng's machine learning course in Clojure"; I've been meaning to track him down and ask about it |
| 15:21 | TimMc | not helpful, clojurebot |
| 15:21 | SrPx | amalloy: #(a% b%') would mean a function that receives a hash, gets the 'a' value on that hash (Ill call it x), and returns a function that receives another hash, gets the 'b' element of that hash (Ill call it y), and returns (x y). Or, in JavaScript (I dont know Clojure well enough to write that): (function(x){ return function(y){ return [x.a,y.b]; }})({a:1,b:2})({a:3,b:4}); |
| 15:21 | dnolen_ | lnostdal: not really. wouldn't be hard to construct something from scratch if you really want it. otherwise just use delegation. |
| 15:21 | weavejester | The drawbridge example could probably be more concisely expressed with the context macro |
| 15:21 | SrPx | amalloy: or, in other words, a short syntax for lambdas which allows nested functions |
| 15:22 | ivaraasen | whitaker: just found a small implementation of SGD in Clojure myself |
| 15:22 | lnostdal | ok, thanks |
| 15:22 | weavejester | e.g. (context "/repl" [] (cemerick.drawbridge/ring-handler)) |
| 15:22 | whitaker | ivarassen: in the Incanter libs? |
| 15:22 | ivaraasen | whitaker: no, it's this small repo on github |
| 15:23 | whitaker | url pls? |
| 15:23 | dnolen_ | lnostdal: I'm surprised no one's done a Tiny / Medium CLOS, seems like everything you would need to build it is there - and it could probably even be really fast. |
| 15:25 | lnostdal | dnolen_: hm, yeah .. just single dispatch would at least (jvm limitation i think) |
| 15:26 | lnostdal | but even that would be good enough for many cases .. |
| 15:28 | whitaker | OK, for those who care, it was Terje Norderhaug, the maintainer of MCLIDE, who'd mentioned at http://www.meetup.com/The-Bay-Area-Clojure-User-Group/events/47874302/ that he'd done Ng's ML course "in Clojure"; not sure what that means in respect of auto grading code & such (only starting the 3rd week of the course today) |
| 15:28 | ro_st | is there a way to have ring force no-cache on all the stuff it serves? |
| 15:29 | weavejester | ro_st: Add some middleware to add a no-cache Cache-Control header? |
| 15:29 | ro_st | simple as that? |
| 15:29 | ro_st | will that work for static resources, too? i'm using noir |
| 15:31 | Urthwhyte | if your static resources are being served through ring there's no reason it wouldn't |
| 15:35 | pandeiro | weavejester: where is the drawbridge example you were referring to? |
| 15:36 | weavejester | pandeiro: Oh, on it's README. When I Github-searched, I got technomancy's repo first, so I mistook who was maintaining it. |
| 15:36 | weavejester | pandeiro: Github search could be better :/ |
| 15:37 | ro_st | this should do it, right? https://www.refheap.com/paste/4872 |
| 15:38 | pandeiro | weavejester: np, found it; re: github i do like the repo filter box on individual users' pages tho |
| 15:40 | ro_st | that middleware breaks static stuff |
| 15:41 | cemerick | weavejester: I would have used context, but I didn't want to require compojure. |
| 15:42 | weavejester | cemerick: I just meant on the example in the README, not in the library |
| 15:42 | cemerick | Sure. s/require/presume, then |
| 15:42 | pandeiro | weavejester: i am putting together an api with (context "/api" [] api/endpoints) and now i want to break the api into a few categories (different namespaces) - can i do that composably? |
| 15:43 | ro_st | pandeiro: what does multiple (context "/" …) do? |
| 15:44 | ro_st | if that allows all of them to operate, perhaps api/endpoints could do this internall |
| 15:44 | ro_st | y |
| 15:44 | pandeiro | ro_st: i am still clunky with ring handlers at the rEPL, gonna try to see that though |
| 15:45 | ro_st | in api, (defroutes endpoints (context "/" (composed1/endpoints)) (context "/" (composed2/endpoints)) |
| 15:46 | ro_st | i'm also a compojure noob so that could blow up |
| 15:46 | weavejester | context tables a set of bindings |
| 15:46 | weavejester | tables=takes |
| 15:46 | pandeiro | ro_st: i'm wondering if i can just do (context "/api" [] auth/endpoints user/endpoints document/endpoints) or similar |
| 15:46 | weavejester | And there's no point in doing (context "/" …) :) |
| 15:47 | weavejester | pandeiro: That's valid, if all the endpoints are handlers |
| 15:47 | pandeiro | right i understood context is just to avoid having to retype an internal part of the path |
| 15:47 | ro_st | how would pandeiro compose multiple defroutes into a single context, weavejester? |
| 15:47 | ro_st | ah |
| 15:47 | weavejester | Right |
| 15:47 | pandeiro | weavejester: all the endpoints are defroites |
| 15:47 | SrPx | As nobody answered: can I use macros to somehow enable a syntax like this: (%a %b') . That would be an anonymous function that receives an object, gets object.a, then returns a function that receives another object, gets object.b and returns. |
| 15:47 | pandeiro | defroutes |
| 15:47 | ro_st | super! |
| 15:48 | weavejester | ro_st: It's routes all the way down. defroutes (or routes) just combines multiple routes into one. |
| 15:48 | ro_st | neat |
| 15:48 | pandeiro | it is a pleasure learning compojure |
| 15:48 | SrPx | ro_st: ? ;s |
| 15:49 | ro_st | weavejester: using noir, why would https://www.refheap.com/paste/4872 cause all my static files to 404 instead? |
| 15:49 | ro_st | forgive my laziness in asking you this. been a long day :-( |
| 15:49 | amalloy | SrPx: that syntax is not possible, and as an uninvited editorial it sounds like an awful thing to have if it were possible |
| 15:49 | cemerick | SrPx: No. |
| 15:50 | SrPx | amalloy: why? |
| 15:50 | shaungilchrist | it does not really make sense why %a would refer to one application and %b to the next |
| 15:51 | shaungilchrist | or is that what the single quote after b is meant to denote? |
| 15:51 | weavejester | ro_st: I can't see anything wrong with that middleware. Could it be something else? Perhaps where you apply it? |
| 15:51 | amalloy | it's an absurdly over-specialized syntax for a very rare thing to want to do |
| 15:51 | SrPx | shaungilchrist: %b would refer to the next because of the '. It could be anything else |
| 15:51 | SrPx | shaungilchrist: yes |
| 15:51 | weavejester | ,(assoc-in nil [:headers "Foo"] "Bar") |
| 15:51 | clojurebot | {:headers {"Foo" "Bar"}} |
| 15:51 | SrPx | (%a %b'' %c') would get a, then c, then b, of hashes, in order of application |
| 15:51 | weavejester | ro_st: If (handler request) returns nil, then the assoc-in would change it into a map. |
| 15:52 | SrPx | So bad it is not possible }: |
| 15:52 | SrPx | but oaky |
| 15:52 | shaungilchrist | well such a thing could be done but with a normal macro e.g. (craziness [:a :b']) etc. |
| 15:52 | SrPx | thanks |
| 15:52 | ro_st | ah, that's good to know |
| 15:53 | amalloy | entertainingly, ro_st, monads don't have anything to do with SrPx's problem, but a maybe monad would have avoided yours |
| 15:54 | ro_st | ok i'm doing something basically wrong. the headers i'm adding aren't the issue |
| 15:54 | ro_st | amalloy: -grin- i just read about monads in Marick's fp-oo book. i'm an utter noob at this stuff. makes my brain fizz. love learning about it |
| 15:54 | SrPx | shaungilchrist: sorry, I dont understand this? Im pretty much asking if macros could be used to transform something like (make-my-fun (%a %b')) into (I guess, not sure if this is right): (fn [o1] (fn [o2] [o1.a o1.b])) |
| 15:55 | dnolen_ | SrPx: it's possible |
| 15:56 | shaungilchrist | SrPx: yes it could but in your example you just had (#(%a %b') ...) and (without hackery) that is not something you can control via macro (symbols in an anon func) |
| 15:57 | SrPx | shaungilchrist: yes. I was not sure people were saying it was not possible because of the syntax or because macros couldnt do the job |
| 15:57 | SrPx | (the problem is that my syntax was conflicting with clojures, right?) |
| 15:58 | dnolen_ | SrPx: you can't override the meaningof #. and yes the macro can take whatever follows unevaluated, so you can embed whatever language you want. |
| 15:58 | shaungilchrist | yes, you just need to examine the symbols |
| 16:00 | ro_st | hey dnolen_! how's the source map quest going? |
| 16:01 | ro_st | ah. some middleware running after my own is seeing a blank response and then doing a filesystem search. and since i'm writing headers, the response isn't blank, and it doesn't look on disk any more |
| 16:02 | ro_st | Raynes! help! :-) |
| 16:02 | SrPx | dnolen_: Nice! |
| 16:02 | SrPx | Just another question |
| 16:03 | dnolen_ | ro_st: OK, can decode the GClosure source map, I have rough plan for how to emit source map info from the compiler. Next step writing some source map generating code. |
| 16:03 | SrPx | Is it possible to make a 'macro' or something that will affect everything in a clojure program? For example, could I somehow make a rule that would change every string ever created with the a format like '15...190' into (range 15 190)? Or a macro that would change any hash containing this keyval pair: a:1 into something else? |
| 16:03 | ro_st | you mean from cljs compiler |
| 16:03 | dnolen_ | ro_st: after that it'll be figuring what the best way to merge that info is. |
| 16:04 | dnolen_ | SrPx: no |
| 16:04 | ro_st | SrPx: that's the clojure reader's job. rhickey has the keys to that. |
| 16:04 | shaungilchrist | SrPx: "yes" but with the caveat that it would in fact be a preparser step |
| 16:05 | shaungilchrist | so you'd be creating .clsrpx files |
| 16:05 | ro_st | github.com/lynaghk/cljx for a fun example of that |
| 16:05 | kenneth | hey what happens if a thread throws an exception |
| 16:06 | ro_st | you wanna narrow that question down some, kenneth? some folks might get wordy on you |
| 16:06 | ro_st | -grin- |
| 16:07 | solussd | Does anyone have any idea what this means? (clojurescript is throwing it: uncaught exception: No dispatch macro for m |
| 16:07 | hiredman | you have #m somewhere |
| 16:07 | hiredman | ,#m |
| 16:07 | clojurebot | #<ExecutionException java.util.concurrent.ExecutionException: java.lang.RuntimeException: EOF while reading> |
| 16:07 | hiredman | clojurebot: jerk |
| 16:07 | clojurebot | you cut me deep, man. |
| 16:08 | hiredman | ,#m foo |
| 16:08 | clojurebot | #<ExecutionException java.util.concurrent.ExecutionException: java.lang.RuntimeException: No reader function for tag m> |
| 16:08 | abalone | ~loop |
| 16:08 | clojurebot | LOOP is complect complected |
| 16:08 | solussd | oh geez. |
| 16:09 | abalone | if i want to poll for a condition, is there something i should use instead of loop? |
| 16:09 | TimMc | abalone: Have you looked at while? |
| 16:09 | amalloy | hiredman, solussd: he has #m, but is probably using a version of clojure before 1.4, where i think the error message for #m f changed |
| 16:09 | kenneth | alright, say i'm launching a thread using (.start (Thread. …)) and i'm catching exceptions inside the main thread but i don't have any try/catches inside the launched thread |
| 16:09 | hiredman | amalloy: he is using clojurescript |
| 16:09 | solussd | hiredman: afaict i do not… :/ hmm… I'll keep looking I guess |
| 16:09 | kenneth | will the main thread catch them, will they crash the program, crash just the thread? |
| 16:09 | TimMc | ,# m foo |
| 16:09 | hiredman | solussd: don't worry, you do, you'll find it |
| 16:09 | clojurebot | #<ExecutionException java.util.concurrent.ExecutionException: java.lang.RuntimeException: No reader function for tag m> |
| 16:10 | amalloy | $google java thread uncaughtexceptionhandler |
| 16:10 | lazybot | [Thread.UncaughtExceptionHandler (Java 2 Platform SE 5.0)] http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Thread.UncaughtExceptionHandler.html |
| 16:10 | TimMc | solussd: Look for /#\s+m/ |
| 16:10 | TimMc | you probably have whitespace between the two |
| 16:10 | amalloy | TimMc: no good; it's probably being generated by some code somewhere, and he's barfing when he reads it |
| 16:11 | solussd | oh, space after the #, got it.. |
| 16:11 | kenneth | oh, also, is there a way to pretty-print an exception from the object |
| 16:11 | solussd | second the "must be generated".. |
| 16:12 | SrPx | shaungilchrist: but wait. with that you mean it would not be a dynamic behaviour, right? |
| 16:13 | SrPx | shaungilchrist: I could not expect to implement a rule that would update every hash containing x > 10 into x = 10 and hope it would work if some hash happened to have x > 10 mid execution, right? This would just be impossible in clojure? (and I guess any language) |
| 16:13 | solussd | ,#m blah |
| 16:13 | clojurebot | #<ExecutionException java.util.concurrent.ExecutionException: java.lang.RuntimeException: No reader function for tag m> |
| 16:13 | solussd | ,# m ldsfkj |
| 16:13 | clojurebot | #<ExecutionException java.util.concurrent.ExecutionException: java.lang.RuntimeException: No reader function for tag m> |
| 16:13 | abalone | TimMc: is there something like while which lets me refer to the result of the test? |
| 16:13 | SrPx | ro_st: reading about that brb |
| 16:13 | solussd | yeah, that was it-- "serialized" record being fed to clojurescript |
| 16:14 | solussd | or, printed record, rather |
| 16:14 | abalone | TimMc: that is, while polling and not getting the desired value, i'd like to report what the current offending value is and when i use 'while' instead of loop i lose the value |
| 16:16 | whitaker | dnolen_ technomancy & others: thanks for help earlier, looks like ring + compojure works fine for me. |
| 16:19 | TimMc | abalone: loop is probably better, then. |
| 16:19 | TimMc | Make a let-while or something. |
| 16:19 | TimMc | *while-let |
| 16:20 | amalloy | abalone: what condition are you polling? |
| 16:30 | bergelmir | is there something special i need to do to install :dev-dependencies? |
| 16:31 | bergelmir | i have "lein-conjure" in :dev-dependencies but it won't be installed by "lein deps" |
| 16:31 | clojurebot | lein deps is the equivalent of taking the cartridge out and blowing on it |
| 16:31 | technomancy | bergelmir: :dev-dependencies are deprecated; they're only used in lein 1.x |
| 16:31 | technomancy | conjure, huh? is that still around? |
| 16:32 | TimMc | technomancy: Oho, "deprecated". Is lein 2.x released? |
| 16:32 | technomancy | TimMc: it's released enough. |
| 16:32 | TimMc | heh |
| 16:32 | bergelmir | i have lein 2.0.0-p7 installed |
| 16:32 | technomancy | bergelmir: yeah, whatever docs told you to put something in :dev-dependencies must be pretty old |
| 16:33 | technomancy | are you just getting started with clojure? |
| 16:33 | bergelmir | yep :) |
| 16:33 | technomancy | conjure might not be the best bet for that; it's pretty obscure |
| 16:33 | technomancy | I recommend reading up on compojure and ring |
| 16:34 | technomancy | clojurebot: google brehaut ring compojure |
| 16:34 | clojurebot | First, out of 19 results is: |
| 16:34 | clojurebot | A Lazy Sequence: A Brief Overview of the Clojure Web Stack - Brehaut |
| 16:34 | clojurebot | http://brehaut.net/blog/2011/ring_introduction |
| 16:34 | technomancy | ^ good place to start |
| 16:34 | rbxbx | technomancy I know peeps were just talking about how noir is a mixed bag with too much coupling, but I think noir is a nice place to get your feet wet... |
| 16:34 | amalloy | technomancy: ughhh, $google doesn't waste nearly as many newlines |
| 16:34 | technomancy | amalloy: heh; noted for next time =) |
| 16:35 | uvtc | I see Conjure listed at the Clojure Toolbox along with some others. |
| 16:36 | technomancy | uvtc: see, in my eyes that's an indictment of the manually-curated approach as a whole =) |
| 16:36 | technomancy | compare http://clojuresphere.herokuapp.com/conjure/conjure vs http://clojuresphere.herokuapp.com/compojure/compojure |
| 16:36 | uvtc | technomancy: I think manually curated works when the community as a whole is doing the curating. Getting people involved is another problem though. |
| 16:38 | technomancy | uvtc: agreed |
| 16:38 | technomancy | it's possible if everyone's on board; it's just incredibly difficult to get there |
| 16:39 | jkkramer | technomancy: FYI there's clojuresphere.com now. do you know if there's a way to redirect *.herokuapp.com? |
| 16:39 | bergelmir | okay, will have a look at compojure and ring and thanks for the link ;) |
| 16:39 | cemerick | curation vs. bubbling are good at different things, of course |
| 16:40 | uvtc | cemerick: By "bubbling" do you mean the clojuresphere approach? |
| 16:40 | cemerick | yes |
| 16:40 | cemerick | maybe "statistical methods" is a better term |
| 16:41 | technomancy | jkkramer: off the top of my head I'd do it in a middleware; not sure if there's a platform-level feature for that |
| 16:41 | amalloy | jkkramer: is clojuresphere.com pointing to the heroku IP, or is it a different server? |
| 16:41 | technomancy | I'll look into it |
| 16:41 | technomancy | because I really should know this =) |
| 16:42 | jkkramer | amalloy: pointing to heroku |
| 16:42 | technomancy | amalloy: CNAME usually |
| 16:42 | SegFaultAX|work2 | ClojureSphere is pretty neat. |
| 16:42 | amalloy | jkkramer: 4clojure has a middleware for redirecting 4clojure.org to www.4clojure.com, if you're looking for something to steal |
| 16:42 | jkkramer | I figured it could be done in-app…wasn't sure if heroku had another way |
| 16:43 | technomancy | jkkramer: at least with SSL redirects they're done in userland |
| 16:43 | jkkramer | amalloy: I will do that. I already stole your gzip middleware fork |
| 16:44 | amalloy | start with https://github.com/4clojure/4clojure/blob/develop/src/foreclojure/ring.clj#L57 but it's kinda messy as it is now; if you happen to clean it up while you're in there i'd be happy to take a pull request |
| 16:45 | jkkramer | amalloy: k will see, thanks |
| 16:49 | SegFaultAX|work2 | amalloy: Did you know that /datatable/users 500's on 4clojure? |
| 16:50 | abalone | amalloy: i'm polling the state of a windows service using sc.exe |
| 16:50 | SegFaultAX|work2 | I'm assuming that's the end-point that drives the user listing. Should it return some default page? |
| 16:52 | amalloy | passing it no arguments is an error |
| 16:52 | amalloy | if you want to know how to use that page you'll have to read up on the datatables server-side processing language/protocol/whatever |
| 16:52 | SegFaultAX|work2 | amalloy: I'm working my way through the source now. |
| 16:52 | bergelmir | https://github.com/weavejester/compojure/wiki/Getting-Started --> lein compojure new hello-world --> "compojure is not a task" |
| 16:53 | weavejester | bergelmir: Are you using Lein 2? |
| 16:53 | bergelmir | weavejester: Leiningen 2.0.0-preview7 on Java 1.7.0_05 Java HotSpot(TM) 64-Bit Server VM |
| 16:53 | weavejester | bergelmir: Oh, you've just got the "new" and "compojure" the wrong way round |
| 16:54 | weavejester | bergelmir: lein new compojure hello-world |
| 16:54 | bergelmir | hmpf :) |
| 16:57 | bergelmir | why aren't there any packages available at repo1.maven.org/maven2? lein is always trying to get the packages from that repo but there aren't any packages... |
| 16:57 | uvtc | bergelmir: lein always checks there first, before clojars. |
| 16:58 | bergelmir | uvtc: yeah but i am always getting "could not find artifact ..." for that repo. why don't they change the order? |
| 16:59 | xeqi | because maven central was around first, and is the canonical place to looks for jars |
| 17:00 | technomancy | there's an open issue for decreasing the verbosity |
| 17:00 | bergelmir | localhost:3000 --> Hello World |
| 17:00 | technomancy | you're just seeing the behaviour of the underlying libraries that we haven't figured out how to change yet |
| 17:00 | bergelmir | yay :) |
| 17:01 | xeqi | * spent time to |
| 17:05 | uvtc | Maybe if the successful clojars download messages were colored green in my terminal I wouldn't mind seeing all those "could not find at maven repo!" messages. :) |
| 17:06 | amalloy | uvtc: just switch your whole terminal to green on black. then everything looks successful! very soothing |
| 17:07 | technomancy | preferably with the glastty font |
| 17:08 | amalloy | what is it you like about glasstty? |
| 17:09 | uvtc | technomancy: I read that as "ghastly" font. |
| 17:09 | amalloy | does it just remind you of ye good olde days? it looks terribly illegible to me, but i'm willing to accept that maybe that's my fault for not seeing well |
| 17:09 | tanzoniteblack | uvtc: you might as well have read that correctly :) |
| 17:09 | technomancy | amalloy: here's the problem; computers are too small. you can't go running around the console's blinkenlights making things happen like when the doctor is flying the tardis. so you need alternate methods to add a theatrical flair. |
| 17:10 | uvtc | Well, anyway, when a terminal-based program gives me colored output, color me pleasantly surprised. |
| 17:11 | scriptor | technomancy: so…movieOS? |
| 17:11 | amalloy | uvtc: always withold your pleasant surprise until you check whether it produces reasonable output when you redirect it to a file as well |
| 17:11 | technomancy | scriptor: yes, precisely. |
| 17:11 | amalloy | (or to a pipe, or whatever). if it inserts ansi control characters even when it's not going to a terminal, murder the author |
| 17:12 | uvtc | amalloy: yup, it certainly should be careful to check if it's being used interactively. |
| 17:24 | unlink | I'm often tempted to do something like (update-in some-map [just-one-key] a-fn) just so that I don't have to name the map again (as I would with assoc). Is there a version of update-in that just takes one key? |
| 17:27 | amalloy | no |
| 17:30 | unlink | what's the idiomatic way of doing this, then: (let [... headers (update-in (:headers response) ["content-length"] #(Integer/parseInt %)) ...] ...) |
| 17:32 | gfredericks | I think that's it :( |
| 17:32 | gfredericks | I end up defining my own update function half the time |
| 17:32 | gfredericks | if I do that more than once in a file |
| 17:32 | jeremyheiler | &(update-in {:a {"b" 1}} [:a "b"] inc) |
| 17:32 | lazybot | ⇒ {:a {"b" 2}} |
| 17:33 | unlink | It's very tempting to use ->, because then I wouldn't need to wrap Integer/parseInt in an anonymous function. |
| 17:33 | gfredericks | how would you do it with ->? |
| 17:33 | jeremyheiler | Integer/parseInt isn't a function, so you still need to wrap it. |
| 17:35 | hyPiRion | ,(update-in {"content-length" "1000"} ["content-length"] read-string) |
| 17:35 | clojurebot | #<CompilerException java.lang.RuntimeException: Unable to resolve symbol: ?? in this context, compiling:(NO_SOURCE_PATH:0)> |
| 17:35 | hyPiRion | ,(update-in {"content-length" "1000"} ["content-length"] read-string) |
| 17:35 | clojurebot | {"content-length" 1000} |
| 17:36 | hyPiRion | But I'd go for #(Integer/parseInt %) if I were you. |
| 17:36 | unlink | (let [... headers (assoc (:headers response) "content-length" (-> response :headers (get "content-length") (Integer/parseInt))) ...] ...) |
| 17:37 | amalloy | unlink: baaaarrrrf. use update-in for sure |
| 17:37 | unlink | right, naming response twice is not nice. |
| 17:37 | gfredericks | not to mention "content-length" |
| 17:37 | unlink | I have a slight allergic reaction to anonymous functions, though. |
| 17:37 | gfredericks | use read-string then |
| 17:38 | unlink | read-string is worse, though, because then I need to ensure *read-eval* is bound to false. |
| 17:38 | hyPiRion | unlink: Well, you could do (defn read-int [string] (Integer/parseInt string)) |
| 17:38 | hyPiRion | then it's not anonymous anymore. |
| 17:38 | gfredericks | dammit when can we get rid of read-eval |
| 17:38 | gfredericks | it's scaring everybody off |
| 17:39 | unlink | heh, that's true, but I think #(Integer/parseInt %) is more idiomatic. |
| 17:39 | unlink | (with (-> ... (Integer/parseInt)) being the most idiomatic of all, when it's possible) |
| 17:39 | unlink | (that is to say, not here.) |
| 17:40 | hyPiRion | Well, it's more or less idiomatic because of java interop. You'd generally prefer some Clojure variant if that existed. |
| 17:40 | amalloy | gfredericks: i wouldn't be astonished to see it gone in, say, clojure 1.6 |
| 17:40 | gfredericks | amalloy: at the very least defaulted to false |
| 17:40 | amalloy | meh. defaulted to false isn't useful at all. nobody will ever turn it on |
| 17:41 | hyPiRion | Stuff will break regardless, won't it? |
| 17:41 | technomancy | wouldn't be the first time stuff was intentionally broken in a minor release |
| 17:42 | technomancy | though to be fair, breaking undocumented behaviour is less of a problem |
| 17:43 | hyPiRion | ,(doc *read-eval*) |
| 17:43 | clojurebot | "; When set to logical false, the EvalReader (#=(...)) is disabled in the read/load in the thread-local binding. Example: (binding [*read-eval* false] (read-string \"#=(eval (def x 3))\")) Defaults to true" |
| 17:44 | gtrak | weavejester: re lein-ring issue 45, I'm willing to fix it if you think it's a good idea, otherwise I'll use my hand-rolled stuff |
| 17:44 | weavejester | gtrak: I managed to miss that one. Let me take a look. |
| 17:45 | gtrak | I just put it in a second ago |
| 17:46 | weavejester | gtrak: That would explain it :) |
| 17:46 | gtrak | I kinda just assumed that would work |
| 17:46 | gtrak | it didn't :-) |
| 17:48 | weavejester | gtrak: Let me think about it. It could be implemented in ring-server in a ring.server.webxml namespace… or perhaps ring.server.legacy :) |
| 17:48 | weavejester | gtrak: What custom stuff do you have in web.xml? |
| 17:49 | weavejester | In general I like to steer people away from Java web dev when possible :) |
| 17:49 | gtrak | we need it right now for jetty's CrossOriginFilter, I tried to use ring-cors and it wasn't apparent why it didn't work, but I'd just like to have the option to use servlet stuff when necessary. |
| 17:52 | gtrak | for instance, previously I had a whole 'nother servlet app embedded into the clojure app, but I got rid of that when my coworkers decided I should just reimplement it in clojure |
| 17:53 | gtrak | meanwhile, having the option in the first place let our UI guy get started immediately instead of having to wait |
| 17:55 | weavejester | I think it's reasonable to have as a last resort… for when you really really need to stoop to using web.xml. |
| 17:55 | gtrak | yea, a .legacy ns should inform people they need to feel dirty while doing it |
| 17:55 | weavejester | Perhaps the presence of a manual web.xml would trigger it. |
| 17:58 | gtrak | yea, I can imagine a scenario where you don't want a web.xml during development either, I'd be comfortable with a flag |
| 18:03 | unlink | Using read-string when you mean Integer/parseInt is simply less robust. It's much easier to do it wrong that way. |
| 18:03 | unlink | read-string isn't going to throw a NumberFormatException on "abc123" |
| 18:03 | unlink | sorry, "abc" |
| 18:03 | Frozenlock` | js/cljs question: I'm trying to use the google datepicker, following this example: http://closure-library.googlecode.com/svn/trunk/closure/goog/demos/datepicker.html. Nothing too fancy, should be easy enough... but I was wrong! I expected this to at least show me the datepicker: (.render (goog.ui.DatePicker.) (domina/by-id "date")). Yet I get this error: #<TypeError: object is not a function>. Did I call js in a bad way? |
| 18:04 | hiredman | Frozenlock`: are you sure you didn't forget the . in thr constructor? |
| 18:04 | hiredman | (goog.ui.DatePicker) vs. (goog.ui.DatePicker.) |
| 18:05 | Frozenlock` | Yes, I pasted exactly what I typed in my REPL. |
| 18:06 | S11001001 | unlink: I've had a prod bug due to using Integer/parseInt instead of read-string, where read-string was the fix. |
| 18:07 | auser | hola |
| 18:08 | unlink | S11001001: You probably didn't mean Integer/parseInt, then. |
| 18:08 | S11001001 | unlink: I meant parse an integer |
| 18:09 | unlink | How was parseInt failing |
| 18:09 | S11001001 | unlink: overflow |
| 18:11 | Raynes | &(Long. "123424354524657567457665") |
| 18:11 | lazybot | java.lang.NumberFormatException: For input string: "123424354524657567457665" |
| 18:11 | Raynes | Heh |
| 18:11 | gtrak | tooo long |
| 18:11 | gtrak | long is shorter |
| 18:25 | Frozenlock` | Ok now I'm really confused. (def dp (goog.ui.DatePicker.)), (.render (goog.ui.DatePicker.) (domina/by-id "date")) --> #<TypeError: object is not a function> Ok, no surprise here. However, if I do it again: (.render (goog.ui.DatePicker.) (domina/by-id "date")) --> #<TypeError: object is not a function> AAAAND the goog-date-picker div is added in my DOM. |
| 18:26 | Frozenlock` | So I get an error buuuuut the object is added. o_O |
| 18:26 | Frozenlock` | I still don't see any in the browser, but in the dom explorer it's there. |
| 18:33 | nDuff | Frozenlock: Have you looked at the generated javascript (and the stack trace it throws) to figure out exactly where the error is? |
| 18:33 | nDuff | Frozenlock: ...generally speaking, that's where I've tended to start (without advanced-mode compilation, of course) when successfully debugging cljs. |
| 18:36 | Frozenlock` | Yes, but I don't see anything enlightening (keep in mind that I have but a very basic understanding of js) |
| 18:37 | Frozenlock` | https://www.refheap.com/paste/4875 |
| 18:37 | Frozenlock` | (first 3 lines) |
| 18:37 | nDuff | That's not very helpful without having the generated javascript next to it. |
| 18:39 | Frozenlock` | er... How do I get the generated javascript from the repl? |
| 18:40 | nDuff | Use a browser that shows it to you in the debugger? :) |
| 18:40 | nDuff | Chrome does that out-of-the-box. |
| 18:41 | nDuff | (once you know where the break-on-exception button is, anyhow) |
| 18:42 | Frozenlock` | I'm sure I can find that, please don't go away :p |
| 18:51 | Frozenlock` | oh wow, that was long |
| 18:54 | Frozenlock` | https://www.refheap.com/paste/4876#L-10 |
| 18:54 | mdeboard | Anyone here have overwhelmingly positive experience developing Clojure using an IDE instead of emacs/vim? |
| 18:54 | nvy | mdeboard: *which* IDE? |
| 18:54 | mdeboard | nvy: Any. |
| 18:55 | nvy | I thought emacs was an IDE |
| 18:55 | mdeboard | Nah, not IMO. Though to what degree it isn't an IDE depends on the mode I guess. |
| 18:56 | nvy | good point |
| 18:56 | technomancy | pedantically, it's hard to come up with a definition of IDE that excludes Emacs |
| 18:57 | kenneth | (let [head-match #(.equals (String. %2 0 (min (.length %2) (count %1))) %1 )] |
| 18:57 | kenneth | hey so i'm defining head-match as a function to that takes two args, a string and a byte array |
| 18:58 | kenneth | right now it crashes on .length, i thought that byte arrays had a length function? |
| 18:58 | hiredman | technomancy: I think you could if you said "does X well" instead of just |
| 18:58 | xeqi | &(.length (byte-array 3)) |
| 18:58 | hiredman | does X" |
| 18:58 | mdeboard | zing |
| 18:58 | technomancy | oh snap |
| 18:58 | mdeboard | true though |
| 18:58 | xeqi | ,(.length (byte-array 3)) |
| 18:58 | clojurebot | #<IllegalArgumentException java.lang.IllegalArgumentException: No matching field found: length for class [B> |
| 18:58 | mdeboard | It's hard to come up with a definition of "IRC client" that excludes emacs |
| 18:59 | technomancy | "An IDE is a thing that is designed to let you write Java." |
| 18:59 | mdeboard | lol |
| 18:59 | hiredman | hahah |
| 18:59 | mdeboard | ANYWAY |
| 18:59 | brehaut | technomancy: Or compile a MS language project |
| 18:59 | mdeboard | My original question was if anyone would recommend using Intellij/emacs/etc over emacs/vim for writing Clojure |
| 19:00 | mdeboard | er |
| 19:00 | mdeboard | IntelliJ/Emacs |
| 19:00 | tanzoniteblack | technomancy: so coincidentally doing that excludes it since it wasn't designed for it? Hm...similarly, does that mean that my mousepad isn't a coaster since it wasn't designed for that? |
| 19:00 | mdeboard | GOD DAMMIT |
| 19:00 | mdeboard | IntelliJ/eclipse |
| 19:00 | mdeboard | Pardon my language. |
| 19:00 | hiredman | I've explored a lot of java codebases using emacs, but written very little java in emacs |
| 19:00 | kenneth | xeqi: right, so what's up with that? |
| 19:00 | nDuff | mdeboard: Personally, I've tried the available IDEs, and my answer is a resounding "no" |
| 19:00 | nDuff | mdeboard: ...that said, given the survey results, there certainly are people who disagree. |
| 19:00 | nDuff | ~survey |
| 19:00 | clojurebot | survey is http://cemerick.com/2012/08/06/results-of-the-2012-state-of-clojure-survey/ |
| 19:00 | technomancy | tanzoniteblack: Emacs grudgingly allows you to write java |
| 19:00 | xeqi | it sounds like the eclipse w/ counterclockwise is the best of them |
| 19:00 | mdeboard | nDuff: Yeah but most people are very bad programmers. |
| 19:01 | xeqi | having never used any |
| 19:01 | mdeboard | I ask because I've been using MonoDevelop with a C# application we have at work and it's been pretty nice. |
| 19:01 | tanzoniteblack | mdeboard: I use Eclipse for most Java projects at work, but couldn't stand using it for Clojure |
| 19:01 | mdeboard | Also because I'm giving a "Why CLojure" talk at the local Scala meetup next week. |
| 19:01 | mdeboard | tanzoniteblack: Why is that |
| 19:01 | nDuff | ...right tool for the right job and such. |
| 19:03 | SegFaultAX|work2 | mdeboard: Are you going to subtitle it "... is better than Scala"? |
| 19:03 | tanzoniteblack | mdeboard: Only real benefit I've seen to use Eclipse is if you're working with a large code base that's not yours, then eclipse gives intelligent completion options for methods/fields. the clojure plugins didn't seem to give me that very well (or maybe I just wasn't working with a large code base...or maybe I just prefer Emacs, which is what I use for IRC, Python, org-mode, etc. etc.) |
| 19:04 | cemerick | Any from #{emacs vim eclipse} will do. Use what you're comfortable with and what you know. |
| 19:04 | nDuff | tanzoniteblack: Emacs Live does a pretty decent job of that too out-of-the-box (re: method/field completion) |
| 19:04 | tanzoniteblack | mdeboard: i.e. I might be a bit biased towards emacs anyways; especially since it's what I used for common lisp before hand |
| 19:04 | technomancy | it's a shame enclojure seems to have disappeared because it had a really great logo |
| 19:05 | tanzoniteblack | nDuff: I will go check that out now |
| 19:05 | xeqi | kenneth: hmm, I read something that the bytecode to invoke it is different, wonder if thats the issue |
| 19:05 | xeqi | ,(count (byte-array 3)) |
| 19:05 | clojurebot | 3 |
| 19:05 | mdeboard | SegFaultAX|work2: No, I've never used Scala. It's not a either/or talk. The Scala meetup is basically a "make us smarter" meetup, you can talk about anything relevant. |
| 19:05 | xeqi | kenneth: could do something like ^, but its probably calling seq on it underneath |
| 19:05 | mdeboard | cemerick: I'll accept that as a response to my tweet at you earlier then |
| 19:06 | cemerick | mdeboard: oh, did I miss one? |
| 19:06 | cemerick | Ah, right. |
| 19:06 | mdeboard | :D |
| 19:06 | cemerick | mdeboard: Not sure what you mean by 'inline REPL' though. |
| 19:09 | tanzoniteblack | nDuff: you know, I wish I knew about Overtone and emacs-live when I was working with Super Collider last year...that would've made my life a lot easier |
| 19:10 | amalloy | xeqi: it's not calling seq, it's using reflection to discover the type of the array |
| 19:22 | dnolen | kenneth: (.length foo) doesn't work on arrays. Just use count or alength. |
| 19:42 | austinh | Reporting back: it took me about 8 hours to figure out how to implement virtual hosts. |
| 19:42 | austinh | That was not fun, but it works, and I honed my interop chops a little. |
| 19:44 | seneth | whats the best IDE for clojure, I am thinking about using eclipse's plugin? |
| 19:44 | aniero | seneth: vim! :D |
| 19:44 | seneth | >_> |
| 19:44 | nDuff | emacs! |
| 19:44 | nDuff | (no, really, emacs) |
| 19:44 | aniero | nDuff: thank you! |
| 19:44 | nDuff | ~survey |
| 19:44 | clojurebot | survey is http://cemerick.com/2012/08/06/results-of-the-2012-state-of-clojure-survey/ |
| 19:44 | nDuff | seneth: See the survey for numbers on what folks use re: environments |
| 19:44 | seneth | thanks |
| 19:45 | nDuff | seneth: If you don't already have a preferred emacs setup for LISP, I'd suggest looking at Emacs Live, by the Overtone folks |
| 19:45 | nDuff | seneth: ...there's a nice video available showing off the features. |
| 19:47 | nDuff | seneth: If what you're doing is experimenting with the language, by the way, you might have fun with Light Table, though it isn't ready for real work yet. |
| 19:47 | technomancy | use what you already know; it's hard enough learning a new language without throwing in a bunch of unrelated crap. |
| 19:48 | technomancy | unless it's like textmate or something |
| 19:48 | gfredericks | the more things you are learning at the same time the harder it is to blame something when you don't know what just happened |
| 19:50 | amalloy | there's no hard evidence that there's a better way to learn to swim than being ejected from a submarine on the ocean floor |
| 19:51 | mdeboard | Kind of a weird question here but I'm looking for a venn diagram image that I swore was used in this talk http://www.infoq.com/presentations/Functional-Architecture, but I can't find it. It was labeled the "sweet spot for functional programming", and the overlapping circles were concurrency, DSL, and something else that I can't recall. Does anyone happen to know what graphic I'm referring to? I want to use it in thi |
| 19:51 | mdeboard | s talk. |
| 19:51 | mdeboard | google works, I'm an idiot. |
| 19:52 | hiredman | submarines are for poseurs, just grab a big rock and take a long walk off a short pier |
| 19:52 | mdeboard | nm, no I'm not. |
| 19:52 | Urthwhyte | whoa |
| 19:53 | mdeboard | Make like a tree and get outta here |
| 19:54 | Urthwhyte | mdeboard: I have three irrsi sessions going at the same time and thought your message was from work's and was very confused as to how an FP q got into my gwt-ffffuuuuu rant |
| 19:54 | Urthwhyte | channel |
| 19:54 | mdeboard | I see |
| 19:57 | mdeboard | I believe the third domain was math ops |
| 19:57 | austinh | Here is my code for setting up virtual hosts with Clojure/Ring/Jetty: https://gist.github.com/3628228 |
| 19:58 | seneth | I am experimenting. For the last two days I was looking for a new language, because i am tring to move away from verboseness of java. And the languages I am interested in now are Scala and Clojure. I am kinda familliaer with recursion and s-expressions type syntax. I would use it for my own projects. Any suggestions? |
| 19:59 | gfredericks | ~scala |
| 19:59 | clojurebot | Unfortunately the standard idiom of consuming an infinite/unbounded resource as a stream can be problematic unless you're really careful -- seen in #scala |
| 19:59 | technomancy | seneth: you mean suggestions on whether to choose Clojure or Scala? |
| 19:59 | technomancy | this might be the wrong channel for that |
| 19:59 | weavejester | austinh: Compojure should be able handle virtual hosts by setting routes with absolute URLs |
| 19:59 | Urthwhyte | technomancy: Presumably he's asking the same thing in #scala |
| 19:59 | seneth | yes |
| 20:00 | Urthwhyte | (and getting nothing in there, considering how dead it is) |
| 20:00 | seneth | I am not |
| 20:00 | hiredman | weavejester: interesting fact |
| 20:00 | weavejester | e.g. (GET "http://api.myproject.com/" [] …) |
| 20:00 | amalloy | Urthwhyte: and in here we'll suggest clojure, while in there they'll suggest scala. which i think was technomancy's point |
| 20:00 | technomancy | hooray, we win by default then? |
| 20:00 | weavejester | And if Clout 1.1.0 is explicitly included, you can also do: |
| 20:00 | weavejester | (GET "//api.myproject.com/" [] …) |
| 20:00 | technomancy | jkkramer: ^ possibly of interest for clojuresphere |
| 20:01 | gfredericks | maybe he will forward the arguments back and forth and conduct an indirect fight |
| 20:01 | Urthwhyte | it'll be like the good ol' #ruby v. #python days |
| 20:01 | Urthwhyte | or #noun1 v. #noun2 |
| 20:02 | gfredericks | well this may surprise you but I would recommend clojure. |
| 20:02 | seneth | Let me put it differently. Is clojure practical for every day projectS, like Building guis, db acess, etc..? |
| 20:02 | austinh | weavejester: Good to know! (But I'm not using compojure). |
| 20:03 | weavejester | austinh: You could also use middleware that dispatches off the "Host" header |
| 20:04 | weavejester | austinh: Because that's all there is to virtual hosts. |
| 20:05 | austinh | weavejester: middleware would've been a good idea. Initially, I was trying to keep the two applications separated, and I was hoping to be able to start/stop them independently. |
| 20:06 | weavejester | (defn virtual-hosts [& {:as handlers}] (fn [req] ((handlers (get-in req [:headers "host"])) req))) |
| 20:06 | austinh | Now I hate you. |
| 20:06 | weavejester | austinh: :) |
| 20:06 | austinh | :) |
| 20:07 | weavejester | nginx is often a good choice if you want a webapp to be made of multiple processes |
| 20:07 | gfredericks | seneth: yes. |
| 20:07 | weavejester | Whether you're using Clojure or Ruby or whatever |
| 20:08 | weavejester | anyway goodnight :) |
| 20:08 | austinh | Good night! |
| 20:09 | austinh | I can't believe I didn't think of middleware. Middleware rules my world right now. |
| 20:10 | mdeboard | Anyone know what Akamai uses Clojure for? |
| 20:12 | mdeboard | Aha. "mobile adaptation product" |
| 20:13 | mdeboard | Or more completely, "real-time content transformation from a customer's desktop website and to present the data in a format suitable for a mobile phone, all while requiring minimal changes to the site by a customer. The main strength of our technique is that we directly consume their HTML and Javascript in the live system. The resulting application required a complex, many-layered architecture, including multiple DS |
| 20:13 | mdeboard | L's, parsers, and DOM query tools" |
| 20:14 | technomancy | definitely couldn't pull that off with a single DSL; no sir =) |
| 20:15 | casion | so I'm converting an int to a float in range of -1.0/1.0, is (float (/ int 0x7fffffff)) is the most reasonable way? casting the ratio to float seems slow |
| 20:16 | gfredericks | &(float 0x7fffffff) |
| 20:16 | lazybot | ⇒ 2.14748365E9 |
| 20:16 | gfredericks | why not divide by that directly? |
| 20:16 | hiredman | ,(* 1 1.0) |
| 20:16 | clojurebot | 1.0 |
| 20:17 | casion | gfredericks: I think I tried that… let me check again |
| 20:17 | gfredericks | casion: it would sidestep ratios at least |
| 20:18 | casion | it's faster on its own, but not in this function |
| 20:18 | casion | which I guess means there's something else going on that I'm missing |
| 20:18 | mdeboard | technomancy: can't tell if serious |
| 20:18 | casion | let me put it up, sec |
| 20:19 | technomancy | mdeboard: I have a hard time taking the term "DSL" seriously. |
| 20:19 | gfredericks | technomancy: you wouldn't understand, it's too domain specific |
| 20:19 | mdeboard | Yeah I always associate it with a much more crude acronym too |
| 20:19 | technomancy | mdeboard: "Metaprogramming in Lisp is like Chinese food in China; they just call it food there." |
| 20:19 | mdeboard | oh |
| 20:19 | mdeboard | that too |
| 20:19 | whitaker | ok, I'm now absolutely convinced to stay away from noir/noir-async, after having successfully ripped it out this (PST) afternoon, reverting to Ring + Compojure + Aleph |
| 20:19 | technomancy | clojurebot: Metaprogramming in Lisp is like Chinese food in China; they just call it food there. |
| 20:19 | clojurebot | Alles klar |
| 20:20 | amalloy | i've heard that what's served as chinese food in america isn't easily recognized in china |
| 20:20 | jballanc | what's it take to add a task to lein 2.0? |
| 20:20 | mdeboard | whitaker: Why so |
| 20:20 | technomancy | jballanc: typically write a plugin, though there are other ways too; what do you need? |
| 20:21 | Sgeo | I should make an expr function |
| 20:21 | whitaker | mdeboard: see the day's log :) |
| 20:21 | jballanc | I'm trying to update ClojureScript One for lein 2.0 |
| 20:21 | jballanc | but it has a "bootstrap" task defined in the project |
| 20:21 | shaungilchrist | you're-gonna-have-a-bad-time |
| 20:21 | whitaker | I had reloading issues which made my noir-async app untestable |
| 20:21 | technomancy | jballanc: if you just need to run application code, you can use a partial alias to the run task |
| 20:21 | jballanc | not strictly necessary to carry it over...but I got curious |
| 20:21 | shaungilchrist | get lein1.6 for now |
| 20:21 | casion | https://www.refheap.com/paste/4877 |
| 20:21 | mdeboard | whitaker: I don't have the whole day's log, I use a bouncer that only retains the diff between my logins. tl;dr version? |
| 20:22 | casion | to convert a collection of bytes (little-endian) to a 32-bit float in range -1.0/1.0 |
| 20:22 | jballanc | shaungilchrist: is there an effort to port to lein 2.0 underway? |
| 20:22 | technomancy | jballanc: if you're adapting a legacy codebase it's probably simplest to echo "tasks" > .lein-classpath and make tasks/leiningen/bootstrap.clj |
| 20:22 | jballanc | I couldn't find anything |
| 20:22 | jballanc | technomancy: ah, yeah...that might work :) |
| 20:22 | casion | maybe I'm doing something else wrong that I'm not noticing in there |
| 20:22 | shaungilchrist | I do not know - I was just in same boat a week ago |
| 20:22 | whitaker | mdeboard: http://clojure-log.n01se.net/ - CTL-F/grep for 'whitaker', first instance of subthread on the matter starts from there |
| 20:22 | technomancy | I doubt clojurescript one is doing anything that actually justifies a custom task, but that would get you going the quickest |
| 20:23 | gfredericks | man #clojure hasn't been this noisy since they first announced they were adding parentheses |
| 20:23 | jballanc | it isn't |
| 20:23 | jballanc | bootstrap is just "deps + git-deps" |
| 20:23 | technomancy | oh man... git deps =( |
| 20:23 | mdeboard | whitaker: huh |
| 20:23 | technomancy | welp |
| 20:23 | jballanc | not really worth it...like I said...was more curious than anything |
| 20:23 | technomancy | jballanc: :aliases {"bootstrap" ["do" "deps," "git-deps"]} |
| 20:23 | mdeboard | gfredericks: |
| 20:23 | mdeboard | \(。◕‿◕。)/ |
| 20:24 | jballanc | yeah, that's much simpler |
| 20:24 | technomancy | jballanc: it should probably be ported to lein-cljsbuild, but that would probably be pretty involved. |
| 20:25 | jballanc | technomancy: well...I'm looking to build on this, so it might just be worth my effort |
| 20:25 | technomancy | mdeboard: noir has weird top-level non-var forms |
| 20:25 | whitaker | mdeboard: noir was my punishment as a Ruby/Rails guy trying to replicate the "give me an entire opinionated stack dammit" experience unnecessarily. |
| 20:25 | jballanc | (and by build, I mean organizationally, not just code-wise) |
| 20:26 | mdeboard | whitaker: ah yeah, you have to unclench your fist |
| 20:26 | mdeboard | you know, the fist of your mind. |
| 20:27 | mdeboard | (◎_◎) |
| 20:27 | whitaker | Maybe noir was a Gom Jabbar test for me. |
| 20:28 | mdeboard | I see |
| 20:29 | whitaker | I almost got pricked by the needle |
| 20:30 | technomancy | clojurebot: recite the litany against cons |
| 20:30 | clojurebot | eventual consistency is for losers |
| 20:30 | technomancy | =( |
| 20:30 | technomancy | clojurebot: litany against cons |
| 20:30 | 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." |
| 20:30 | gfredericks | ~conso |
| 20:30 | clojurebot | excusez-moi |
| 20:30 | jballanc | poor clojurebot...the things you all make him remember |
| 20:31 | hoover_damm | seriously |
| 20:31 | gfredericks | ~botsnack |
| 20:31 | clojurebot | Thanks! Can I have chocolate next time |
| 20:31 | technomancy | ~scoobysnack |
| 20:31 | clojurebot | Titim gan ?ir? ort. |
| 20:32 | gfredericks | clojurebot: scoobysnack is botsnack |
| 20:32 | clojurebot | Roger. |
| 20:32 | gfredericks | ~scoobysnack |
| 20:32 | clojurebot | scoobysnack is botsnack |
| 20:32 | gfredericks | ~scoobysnack |
| 20:32 | clojurebot | Thanks! Can I have chocolate next time |
| 20:32 | gfredericks | what a smot bot |
| 20:32 | whitaker | ~chocolate |
| 20:32 | clojurebot | excusez-moi |
| 20:32 | technomancy | gfredericks: have a scoobysnack |
| 20:32 | whitaker | ~42 |
| 20:32 | clojurebot | 42 is forget (+ 2 3) |
| 20:33 | gfredericks | technomancy: Thanks! Can I have chocolate next time |
| 20:33 | whitaker | ~cheezburger |
| 20:33 | clojurebot | It's greek to me. |
| 20:33 | whitaker | ~cheeseburger |
| 20:33 | clojurebot | It's greek to me. |
| 20:33 | whitaker | I see clojurebot lacks felid lol mode |
| 20:34 | whitaker | but has a canid mode |
| 20:37 | whitaker | In light of my day's experience's with noir, I am gratified that yesterday I listened to an hour-long talk by Rich Hickey on "complection" |
| 20:38 | gfredericks | "Rich Hickey and Makeup" |
| 20:38 | frio | whitaker: link :)? |
| 20:39 | whitaker | gfredericks: amusing Google result from that phrase: "How do I fake a hickey with makeup? | ChaCha" |
| 20:40 | wmealing_ | i knew he was a robot |
| 20:40 | whitaker | frio: lemme look… I was listening to it on my iPad as a car passenger yesterday |
| 20:40 | rbarraud | Any Wellington clojurists in here? |
| 20:41 | rbarraud | I am in town visiting family |
| 20:41 | rbarraud | Well, in Upper Hutt... |
| 20:42 | whitaker | Wellington where? UK? Canada? Australia? NZ? |
| 20:42 | mdeboard | One oughtn't find oneself in Lower Hutt after sundown |
| 20:42 | rbarraud | Definitely ;-) |
| 20:42 | frio | whitaker: i just found it :) |
| 20:43 | frio | and im guessing NZ's wellington, if there's hutts in it |
| 20:43 | rbarraud | NZ |
| 20:43 | frio | im in auckland rbarraud :) |
| 20:43 | rbarraud | Yup |
| 20:43 | rbarraud | Hi frio ... That's my usual domicile... Greenhithe to be precise :-) |
| 20:43 | frio | haha |
| 20:43 | frio | the horrible horrible north shore :p |
| 20:44 | whitaker | frio: cool, because I couldn't find it in the history on my iPhone or iPad. URL for others here (and The Historical Record)? |
| 20:44 | mdeboard | Is Korma looked upon with similar disdain as Noir |
| 20:44 | mdeboard | @ hiredman |
| 20:44 | rbarraud | According to some twisted views of the universe, perhaps so ;-) |
| 20:44 | frio | whitaker: http://www.infoq.com/presentations/Simple-Made-Easy |
| 20:45 | whitaker | While we're on the topic of "Are there any NNNN clojurists here," I'll ask too: any San Francisco / SF Bay Area clojurists here? |
| 20:45 | whitaker | frio: that's the one, thanks much |
| 20:46 | whitaker | Anyone else seen the 2011 "Skills Matter" talk by "Uncle Bob" on "The Last Programming Language"? |
| 20:48 | Sgeo | How does = on functions work? |
| 20:48 | mdeboard | whitaker: Dude, Twitter is based in the bay area |
| 20:48 | Sgeo | ,(= + +) |
| 20:48 | clojurebot | true |
| 20:49 | Sgeo | I take it it's identity-based? |
| 20:49 | Sgeo | ,(= (fn [x] (+ x 1)) (fn [x] (+ x 1))) |
| 20:49 | clojurebot | false |
| 20:49 | dnolen` | Sgeo: identity |
| 20:49 | mdeboard | ,(identity +) |
| 20:49 | clojurebot | #<core$_PLUS_ clojure.core$_PLUS_@72ab19c0> |
| 20:50 | Sgeo | mdeboard, not what I meant >.> |
| 20:50 | mdeboard | (╯°□°)╯︵ ┻━┻ |
| 20:50 | whitaker | mdeboard: I know Twitter is based here. I meant clojurists _here and now_ on this channel |
| 20:50 | mdeboard | whitaker: Oh, good god no |
| 20:50 | whitaker | ? |
| 20:50 | whitaker | Please be more cryptic. |
| 20:51 | mdeboard | I've said too much |
| 20:51 | frio | hahahahaha |
| 20:51 | whitaker | mdeboard: was that somehow addressed to the "clojurists in the Bay area" thing, or? |
| 20:52 | whitaker | Guys, did I just miss an inside joke by mdeboard, who exited? |
| 20:52 | mdeboard | no |
| 20:52 | whitaker | What was the "Oh, good god no" then? |
| 20:52 | mdeboard | Poor brain-mouth filter. |
| 20:55 | whitaker | Anyway, I'll take the resounding silence as meaning I'm the only Bay area clojurist on channel who happens to be paying attention at the moment. |
| 20:56 | gfredericks | ain't it quittin time in the bay area at the moment? |
| 20:58 | arohner | whitaker: me |
| 20:58 | phao | Hi... This is a bit offtopic, but since "value oriented" is sort of a big deal here, maybe someone may be able to answer it... Isn't it problematic, in terms of performance, to be value oriented? |
| 20:58 | arohner | gfredericks: no, it's coding time, because all the emails have finally stopped! |
| 20:58 | phao | I mean, won't it spend lots of memory, or cause huge network traffic... or ... ? |
| 20:58 | gfredericks | phao: also problematic to have a GC |
| 20:58 | gfredericks | phao: what specific case are you thinking of? |
| 20:59 | phao | the networking thing looks huge... |
| 20:59 | gfredericks | sending JSON over the wire? |
| 20:59 | whitaker | gfredericks: not at my office in San Francisco, where I'm waiting for dinner to be delivered |
| 20:59 | whitaker | arohner: do you attend any of the local Clojure meetups? |
| 21:00 | phao | gfredericks, tbh, I really don't quite know... |
| 21:00 | gfredericks | phao: I must not understand what you mean by "the networking thing" |
| 21:00 | arohner | whitaker: sometimes. I've probably been to 3-4 since January |
| 21:01 | arohner | phao: the JVM is pretty good at GC'ing garbage that doesn't last one generation |
| 21:01 | whitaker | mdeboard: re: Korma, I'd be surprised if it were held in the same disregard as noir, given "Copyright © 2011 Chris Granger. All rights reserved." |
| 21:01 | whitaker | http://sqlkorma.com/ |
| 21:02 | arohner | so if your problem can handle be written in Java, it can probably handle being value oriented |
| 21:02 | mdeboard | whitaker: Chris Granger was inventor of Noir as well |
| 21:02 | ibdknox | Someone rang? |
| 21:03 | mdeboard | ibdknox: I was asking about how people would rate Korma given the recent bad eperience with noir that was discussed at length earlier |
| 21:03 | ibdknox | say what? |
| 21:03 | Sgeo | Bad experience with Noir? |
| 21:04 | ibdknox | What bad experience? |
| 21:04 | whitaker_ | ibdknox: see log: http://clojure-log.n01se.net/ |
| 21:04 | whitaker_ | CTRL-F for 'whitaker', first occurrence, read from there |
| 21:06 | ibdknox | to be very clear |
| 21:06 | ibdknox | I have nothing to do with noir-async |
| 21:06 | ibdknox | moreover |
| 21:07 | ibdknox | meh, not worth it |
| 21:08 | ibdknox | apparently people like speaking ill of my work while I'm away lol |
| 21:10 | rbxbx | ibdknox I'm sure people speak positively of your work while you're away as well, just not so much today. |
| 21:10 | shaungilchrist | well to add balance to the force - I like noir. The examples actually work and the documentation is clear |
| 21:13 | mdeboard | I think ibdknox's ego is safe given that he sleeps on a pile of Kickstarter funds every night and is very well-regarded for his contributions to the Clojure community (and aforementioned Kickstarter-funded Light Table, which is awesome) |
| 21:13 | mdeboard | Scrooge McDuck-style |
| 21:13 | whitaker | I spent several days trying to get noir.util.test/send-request to play nice with noir-async/defpage-async, and gave up today in frustration |
| 21:14 | ibdknox | whitaker: I know *nothin* about noir-async |
| 21:14 | ibdknox | chances are if you just use aleph directly |
| 21:14 | ibdknox | it would've been fine |
| 21:14 | whitaker | who is ibdknox? I thought Light Table was Chris' project |
| 21:14 | TimMc | ... |
| 21:14 | ibdknox | I'm Chris Granger |
| 21:14 | ibdknox | lol |
| 21:14 | whitaker | ! |
| 21:14 | whitaker | heh |
| 21:14 | whitaker | hi Chris |
| 21:15 | ibdknox | hola |
| 21:15 | whitaker | (we met in SF a few weeks ago at Climate Corp.) |
| 21:15 | mdeboard | lol |
| 21:15 | whitaker | Love Light Table, always talking it up to friends |
| 21:15 | ibdknox | haha that was a couple months ago ;) |
| 21:15 | whitaker | temps fugit and all that. |
| 21:15 | whitaker | arg |
| 21:15 | ibdknox | Sorry you had a bad experience with noir :( |
| 21:15 | whitaker | damned autocorrect |
| 21:15 | whitaker | Not noir |
| 21:16 | whitaker | noir-async, sorry to conflate them |
| 21:16 | whitaker | wasn't noir's fault |
| 21:16 | whitaker | "tempus fugit" |
| 21:16 | whitaker | there |
| 21:16 | ibdknox | If it were me, I would intentionally separate the async part to another process anyways, unless you can guarantee you're never going to have to scale it |
| 21:16 | ibdknox | fwiw, LT actually uses noir on top aleph |
| 21:17 | whitaker | Oh, I did go back to straight Aleph |
| 21:17 | Sgeo | Aleph? |
| 21:17 | ibdknox | Sgeo: https://github.com/ztellman/aleph |
| 21:17 | TimMc | $google aleph clojure |
| 21:17 | lazybot | [ztellman/aleph · GitHub] https://github.com/ztellman/aleph |
| 21:17 | whitaker | I, er, "decomplected" things a bit |
| 21:17 | mdeboard | Every time I think I need a macro it turns out a function is fine. |
| 21:18 | whitaker | ibdknox: makes since that LT sits on top of Aleph |
| 21:18 | rbxbx | mdeboard thankfully you're trying first instead of jumping straight to the macro like so many do ;_; |
| 21:18 | whitaker | I like Aleph the more I learn about it |
| 21:18 | mdeboard | rbxbx: I'm actually turning a macro into a function atm |
| 21:18 | whitaker | "makes sense" |
| 21:18 | whitaker | I really need to find the preference in my irc client that keeps doing that... |
| 21:19 | mdeboard | Oh, wait, I remember now. |
| 21:19 | ibdknox | fwiw here's a little gist I made for it: https://gist.github.com/1257857 |
| 21:19 | mdeboard | I DO need a macro. I should document this. |
| 21:19 | ibdknox | lol |
| 21:20 | Sgeo | The thing that used to be in clojure.contrib for monads uses a macro unnecessarily |
| 21:20 | whitaker | ibdknox: thanks Chris |
| 21:21 | Sgeo | (You'd need a macro in Haskell, but Clojure is not Haskell) |
| 21:21 | ibdknox | whitaker: though to be honest, you're probably better off just using lib-noir with compojure or whatnot - depending on what you're doing |
| 21:21 | ibdknox | whitaker: lib-noir has most of the middleware for noir in it, and is designed to be used with any ring project |
| 21:22 | ibdknox | so that the people who will never accept anything short of raw ring or maybe compojure can get some of the niceness too :) |
| 21:23 | mdeboard | Wait, DO I need a macro here? https://gist.github.com/3628843 I didn't write enough documentation. |
| 21:23 | whitaker | ibdknox: I have to do websockets, which was my reason for trying out noir-async in the first place; does lib-noir address that need? |
| 21:23 | mdeboard | I think this is one of htose instances where I was pounding my head against something that I lost sight of what was the actual goal |
| 21:24 | ibdknox | whitaker: nah, you use aleph for that. lib-noir just provides the stuff you'll probably want if you intend to server webpages from that same server. e.g. sessions, cookies, etc |
| 21:25 | whitaker | ibdknox: thanks for making the distinction |
| 21:27 | whitaker | Thanks guys! G'nite. |
| 21:29 | mdeboard | Ah right... https://gist.github.com/3628877 ... the reason I used a macro there was because afaik you can't use a variable in the 1st arg to (proxy) |
| 21:30 | mdeboard | Now that I mention it, why the heck doesn't that worK? |
| 21:30 | emezeske | mdeboard: Because proxy is a macro itself |
| 21:31 | mdeboard | Ahhhhh right. |
| 21:31 | rbxbx | ,(doc proxy) |
| 21:31 | clojurebot | "([class-and-interfaces args & fs]); class-and-interfaces - a vector of class names args - a (possibly empty) vector of arguments to the superclass constructor. f => (name [params*] body) or (name ([params*] body) ([params+] body) ...) Expands to code which creates a instance of a proxy class that implements the named class/interface(s) by calling the supplied fns. A single class, if provided, mus... |
| 21:31 | emezeske | mdeboard: It looks at its arguments at compile time, so they have to be set then |
| 21:31 | rbxbx | :( |
| 21:32 | emezeske | mdeboard: That's IMHO the best reason to avoid macros if possible -- they sort of leak macro-ness to their users |
| 21:32 | mdeboard | emezeske: Indeed, I had gone through all this before but I failed to write it down. |
| 21:33 | emezeske | mdeboard: Heh, I know how that goes! :) |
| 21:35 | technomancy | mdeboard: korma has a few similar issues but the situation is different because raw clojure.java.jdbc is a lot less pleasant to work with than raw compojure. |
| 21:36 | technomancy | nobody has found the right level of abstraction primitives for DB queries yet |
| 21:42 | samrat | anyone here using noir-async? |
| 21:42 | mdeboard | samrat: There was just a guy here |
| 21:43 | mdeboard | so, no |
| 21:44 | arohner | technomancy: because there isn't a right level of abstraction over SQL? |
| 21:45 | arohner | the problem is SQL, IMO |
| 21:45 | hoover_damm | arohner, I would argue the right solution is going to be opinionated |
| 21:46 | arohner | hoover_damm: I have an opinionated solution. Don't use SQL :-p |
| 21:46 | arohner | or, don't expect an ORM to work 100% on top of SQL |
| 21:46 | hoover_damm | arohner, I was sold on that pattern back in 2008 |
| 21:46 | hoover_damm | arohner, I tried explaining that to my peers (i'm an ops person) and the blank looks I got was amazing |
| 21:47 | arohner | http://arohner.blogspot.com/2009/04/db-rant.html |
| 21:47 | hoover_damm | arohner, sometimes people know so little that they don't know how to work outside of their box |
| 21:47 | hoover_damm | and yet they will hold steadfast to their ignorance |
| 21:49 | dysinger | where did clojure.contrib.reflect run off to ? I've been out of the game for a while |
| 21:50 | xeqi | $seen kingtim |
| 21:50 | lazybot | kingtim was last seen quitting 1 hour and 42 minutes ago. |
| 21:50 | xeqi | ~contrib |
| 21:50 | clojurebot | Monolithic clojure.contrib has been split up in favor of smaller, actually-maintained libs. Transition notes here: http://dev.clojure.org/display/design/Where+Did+Clojure.Contrib+Go |
| 21:51 | xeqi | looks like no one has moved it forward |
| 21:51 | dysinger | thanks lazybot! |
| 21:52 | dysinger | bummer I need that get-field fun |
| 21:56 | Sgeo | I think the whole macros infecting users so that they tend to need to be macros thing is a very good argument for doing things in a Tcl-style way |
| 21:57 | emezeske | Sgeo: Well you can of course do that in clojure with eval |
| 21:58 | Sgeo | Isn't eval generally discouraged? |
| 21:58 | emezeske | Who cares if it's discouraged? |
| 21:58 | emezeske | You can still use it |
| 21:59 | emezeske | There are good reasons for it to be discouraged, anyway. They're the same reasons that evaling code in Tcl is painful |
| 21:59 | amalloy | dysinger: clojure.java.reflect |
| 22:00 | mindbender1 | an appeal to clojure lib writers. Please document your apis in the manner of elisp |
| 22:00 | dysinger | amalloy: |
| 22:00 | dysinger | thanks |
| 22:00 | Sgeo | Hmm, how is evaling code in Tcl painful? Tcl at least is an environment where eval (well, uplevel usually) is an ordinary practice |
| 22:01 | emezeske | Efficiency is a decent reason. Making your code understandable is a better one. |
| 22:03 | Sgeo | I wonder if a delay monad would make sense |
| 22:03 | Sgeo | It wouldn't make sense in Haskell because everything is lazy by default, but that's not the case in Clojure |
| 22:03 | Sgeo | *non-strict |
| 22:05 | mindbender1 | imagine this https://gist.github.com/3629127, no matter how the author tried to explain the fn, nothing beats knowing what the arguments are and what is returned |
| 22:10 | rbarraud | Us antipodeanz iz pays teh attentions ;-) Whitaker |
| 22:13 | dysinger | argh. leiningen includes jars that are marked :scope "provided" in the uberjar |
| 22:17 | xeqi | dysinger: yeah, they need to be in the :provided profile |
| 22:20 | mpan | I'm calling assoc on a hash-map and getting back a lazy sequence. How can I get a hash-map? |
| 22:21 | dnolen | mpan: that doesn't sound right. |
| 22:21 | mpan | in particular, I'm using reduce to assoc a bunch of stuff into an empty map |
| 22:21 | dnolen | ,(assoc {} :foo 1) |
| 22:21 | clojurebot | {:foo 1} |
| 22:21 | mpan | and I'm... idk somehow I get back a lazy seq |
| 22:22 | dnolen | mpan: paste your example somewhere. |
| 22:22 | mpan | (reduce #(assoc %1 (%2 0) (%2 1)) listens (hash-map)) |
| 22:22 | mpan | listens is a seq of 2-length vectors |
| 22:22 | mpan | which I'm trying to convert into the key-val pairs of a map |
| 22:22 | mpan | and uh... I get something strange out |
| 22:23 | xeqi | (doc reduce) |
| 22:23 | clojurebot | "([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 as well, and reduce returns the result of calling f with no arguments. If coll has only 1 item, it is returned and f is not called. If val is supplied, returns the resu |
| 22:23 | xeqi | that passes listen as the initial value |
| 22:23 | TimMc | clojurebot, y u so verbose |
| 22:23 | clojurebot | because the parentheses grow lonely if their closing brackets are all kept separated and segregated. |
| 22:23 | dnolen | mpan: the problem is your initial value. generally the type of the intial value will be type of the final value. |
| 22:23 | mpan | eek |
| 22:23 | mpan | how am I doing it backwards and getting seemingly sane results? |
| 22:23 | mpan | or at least, far less insane than doing something backwards usually gets |
| 22:24 | mpan | but wow thanks guys |
| 22:24 | dnolen | mpan: assoc is polymorphic |
| 22:24 | xeqi | ,(into {} [[:a 1] [:b 2] [:c 3]] |
| 22:24 | clojurebot | #<ExecutionException java.util.concurrent.ExecutionException: java.lang.RuntimeException: EOF while reading> |
| 22:24 | xeqi | ,(into {} [[:a 1] [:b 2] [:c 3]]) |
| 22:24 | clojurebot | {:a 1, :b 2, :c 3} |
| 22:25 | xeqi | mpan: might consider into ^ |
| 22:25 | dnolen | ,(assoc [1 2 3] 1 :foo) |
| 22:25 | clojurebot | [1 :foo 3] |
| 22:25 | mpan | (doc into) |
| 22:25 | clojurebot | "([to from]); Returns a new coll consisting of to-coll with all of the items of from-coll conjoined." |
| 22:25 | dnolen | mpan: ^, vectors support assoc |
| 22:26 | mpan | btw, semi-related, why do a lot of the data types support (collection index) but lazy seqs don't? |
| 22:27 | TimMc | mpan: seqs are not associative data structures. |
| 22:27 | TimMc | vectors and maps are, so they are functions of their keys |
| 22:28 | mpan | all right, thanks! |
| 22:29 | dnolen | mpan: a lot of operations w/ the notable (an probably suprising) exception of nth & count are organized around computational complexity. |
| 22:29 | technomancy | arohner: insufficient data to make a conclusion =) |
| 22:29 | technomancy | but that's certainly a possibility |
| 22:30 | arohner | given the number of failed ORMs, and none of the active ones are 100%, I claim the evidence is on my side :-) |
| 22:30 | mpan | dnolen: do you mean that they don't want people getting the nth of just an arbitrary seq if it can be avoided? |
| 22:30 | technomancy | I'm sure you can do better than strings of SQL if for no other reason than you don't get syntax highlighting in that case |
| 22:31 | technomancy | and monochrome code has serious usability concerns |
| 22:31 | technomancy | but maybe that's a tooling issue |
| 22:31 | TimMc | Part of the issue is certainly SQL's variability between DBs. |
| 22:31 | dnolen | mpan: yes |
| 22:32 | arohner | I agree tooling is a problem. I'm reasonably convinced the problem can't be solved with an ORM on top of SQL though. It can't be abstracted away 100% |
| 22:33 | technomancy | yes, I agree that an ORM is not the solution |
| 22:34 | TimMc | create table kvstore (`key` text primary key, `value` text); -- done |
| 22:35 | imeredith | arohner: in scala people have made typesafe query generators, but that only works if you dont have any bugs in the generators |
| 22:35 | TimMc | arohner, technomancy: Has either of you used datalog to any appreciable degree? |
| 22:36 | arohner | not yet. I'm really interested in datomic, haven't had time yet |
| 22:36 | technomancy | not yet |
| 22:37 | TimMc | I'm eager to read up on it and see if it is something I can use instead of SQL. :-) |
| 22:37 | arohner | it's supposed to be |
| 22:37 | arohner | I've heard of people using it in production already |
| 22:37 | mpan | what does it mean to get a NullPointerException when compiling? |
| 22:38 | arohner | probably a syntax error |
| 22:38 | mpan | if I break the statement down, I get different errors |
| 22:38 | TimMc | and the syntax in error could be a macro usage |
| 22:38 | dnolen | mpan: also easily possible if you have executable stuff at the top level. |
| 22:39 | mpan | so I def something, and a line later, it says the symbol can't be resolved |
| 22:39 | mpan | and I dunno what I did wrong |
| 22:39 | dnolen | mpan: use a paste service - gist, refheap, lisppaste if you want people to help you w/ your problem. |
| 22:40 | mpan | as in, put the relevant source in a paste-bin service? |
| 22:40 | dnolen | mpan: yep |
| 22:41 | mpan | http://pastie.org/4665896 at the very bottom it tells me it can't resolve lines |
| 22:41 | mpan | which I def'd just right before |
| 22:41 | mpan | not sure if the rest of the file is any relevant |
| 22:42 | TimMc | Doing work at compile time isn't usually a great idea. |
| 22:42 | mpan | I only put it in for testing this part |
| 22:42 | mpan | and running it at the repl has the same issue |
| 22:43 | TimMc | mpan: If that get-lines call fails, then #'lines will be unbound. |
| 22:45 | mpan | I'm digging further into it and it does seem like another part had failed |
| 22:45 | mpan | Is there some way to get like a stack trace? |
| 22:45 | dnolen` | optimized printing landings in CLJS http://github.com/clojure/clojurescript/commit/c8bc05ca8e3c7e30a85148dd67398aa4d0e6b468 |
| 22:45 | dnolen` | s/landings/lands |
| 22:47 | dnolen` | mpan: what dev environment are you using? |
| 22:47 | mpan | eclipse + counterclockwise |
| 22:48 | mpan | I've traced the error up to an error in my regex which caused me to feed something invalid to parseInt |
| 22:48 | dnolen` | mpan: hmm I would think CCW should show you the trace. |
| 22:49 | dnolen` | mpan: perhaps someone that uses CCW can tell you how to get a trace. In the meantime *e always hold the last exception in the REPL. You can print it by using clojure.repl/pst (don't forget to require it first) |
| 22:50 | mpan | thanks |
| 22:50 | rbarraud | Grraarrrg.... Anyone recommend an iPad IRC client that doesn't lose conversation history on disconnect? :-( |
| 22:51 | mpan | Is (require '(clojure repl)) the statement I'm looking for? |
| 22:52 | zerokarmaleft | rbarraud: iSSH + screen/tmux + irssi? |
| 22:53 | dnolen` | mpan: (require '[clojure.repl]) |
| 22:53 | dnolen` | mpan: or (require '[clojure.repl :as repl]), which make it less tedious |
| 22:53 | dnolen` | (repl/pst *e) |
| 22:53 | rbarraud | Zerokarmaleft thanks |
| 22:54 | rbarraud | Heh |
| 22:54 | zerokarmaleft | rbarraud: it's a valid option :D |
| 22:55 | mpan | does this require some special external jars? |
| 22:55 | rbarraud | Yeah ... Given a suitable Linux host :-) |
| 22:55 | rbarraud | Might try It actually |
| 22:55 | dnolen` | mpan: not for clojure.repl |
| 22:55 | mpan | I'm still getting RuntimeException java.io.FileNotFoundException: Could not locate clojure/repl/pst__init.class or clojure/repl/pst.clj on classpath: |
| 22:55 | dnolen` | mpan: pst is a function, you want to require a library |
| 22:56 | dnolen` | mpan: what are you entering into the REPL? |
| 22:56 | mpan | (require '[clojure.repl]) which appears to succeed |
| 22:56 | dnolen` | mpan: and how are you trying to use it? |
| 22:56 | mpan | then (clojure.repl/pst *e) which fails as above |
| 22:57 | dnolen` | mpan: hmm just tried that and it seems to work. |
| 22:58 | mpan | I did find what I broke in the other place, though, and this is almost absurd... I accidentally used a built-in with a similar name to something I had but an entirely different meaning |
| 22:59 | emezeske | dnolen`: thanks for merging CLJS-340! |
| 22:59 | mpan | which gets me back to the earlier problem of, I'm definitely not doing my regexes correctly, but that's something different at least |
| 22:59 | dnolen` | emezeske: np! |
| 23:18 | mrevil | i'm doing interop with java and it's forcing me to obtain a lock before iterating through a collection. Is there a way to wrap a map so that I can return a lazy collection, and when the collection goes out of scope or is consumed something similar to a finally block is called allowing me to release the lock? |
| 23:25 | emezeske | mrevil: AFAIK that is not possible. The same question comes up regarding the use of with-open around a lazy-seq, and the answer is always that you have to manage the resource (file open or in your case lock) yourself. |
| 23:25 | mrevil | hmmm |
| 23:26 | emezeske | mrevil: There's no way for clojure to know that your program is done using the lazy-seq. The closest you could come would be to release the lock in a Java finalizer, but that's a bad idea |
| 23:27 | mrevil | sometimes I wish I had shared_ptr or auto_ptr from c++ |
| 23:28 | emezeske | Well what you really want are scoped destructors from c++, but Java just doesn't have that. |
| 23:28 | emezeske | That's life in a garbage-collected world. |
| 23:30 | mrevil | backing away from a rant, but i'm registering my annoyance and shaking my fist at the pedantic and arrogant java world view |
| 23:32 | emezeske | Not allocating objects on the stack is pedantic? |
| 23:33 | devth | what's a nice way of filtering out a specific specific character from a string? i tried clojure.contrib.string/replace-char, but don't know of an empty character to replace it with. |
| 23:34 | emezeske | devth: Caveat: I have no idea how (in)efficient this is: (apply str (remove #(= % "z") "abczzzdef")) |
| 23:34 | devth | ah, nice. thx |
| 23:35 | mrevil | i think that the garbage collector doesn't really solve problems, and in fact introduces all sorts of new problems. i resent the we know better than you, we're going to take away the pointy scissors, you slow bumbling little child. |
| 23:36 | emezeske | mrevil: What? It's not like the Java authors took away your ability to write C or C++ |
| 23:36 | emezeske | mrevil: You resent them for giving you another option that you may freely choose not to use? |
| 23:37 | nsxt | is clojurecheck the "definitive" quickcheck implementation for clojure? |
| 23:37 | mrevil | just because I like some feature (clojure) of an environment doesn't mean I have to be happy with all of the baggage that comes with it |
| 23:37 | xeqi | nsxt: theres also test.generative |
| 23:40 | emezeske | mrevil: Well, it's silly to resent the design of Java. And I doubt any of the Java authors claim to "know better than you". Lots of people consider garbage collection useful. You're certainly entitled to think otherwise, but it's ridiculous to call Java's design "arrogant" because it does not agree with your preferences. |
| 23:44 | iDesperadO | ,(def m {:hello 1, :world 2}) ,(map :hello m) |
| 23:44 | clojurebot | #<Exception java.lang.Exception: SANBOX DENIED> |
| 23:44 | mpan | it doesn't want you to def :/ |
| 23:44 | mpan | it's happy with let though |
| 23:44 | mpan | (or so I hope) |
| 23:44 | emezeske | ,(let [m {:hello 1 :world 2}] (map :hello m)) |
| 23:44 | clojurebot | (nil nil) |
| 23:44 | mpan | ,(let [x 1] x) |
| 23:44 | clojurebot | 1 |
| 23:44 | emezeske | iDesperadO: workaround ^ |
| 23:45 | iDesperadO | (let [m {:hello 1 :world 2} (map :hello m)) |
| 23:45 | iDesperadO | ,(let [m {:hello 1 :world 2} (map :hello m)) |
| 23:45 | clojurebot | #<ExecutionException java.util.concurrent.ExecutionException: java.lang.RuntimeException: Unmatched delimiter: )> |
| 23:45 | mpan | um, close your ] |
| 23:45 | iDesperadO | ,(let [m {:hello 1 :world 2}] (map :hello m)) |
| 23:45 | clojurebot | (nil nil) |
| 23:45 | iDesperadO | ,(let [m {:hello 1 :world 2}] (map :hello [m])) |
| 23:45 | clojurebot | (1) |
| 23:45 | iDesperadO | why's that? |
| 23:46 | mpan | map expects certain arguments |
| 23:46 | mpan | (doc map) |
| 23:46 | clojurebot | "([f coll] [f c1 c2] [f c1 c2 c3] [f c1 c2 c3 & ...]); Returns a lazy sequence consisting of the result of applying f to the set of first items of each coll, followed by applying f to the set of second items in each coll, until any one of the colls is exhausted. Any remaining items in other colls are ignored. Function f should accept number-of-colls arguments." |
| 23:46 | mpan | specifically, it wants something it can call and something that's a coll |
| 23:47 | mpan | I'm afraid to get the details wrong so I'll be quiet here :( |
| 23:47 | iDesperadO | :hello is function {:hello 1 :world 2} is collection...I use function :hello to call {:hello 1 :world 2}. I'm afraid it's supposed to be right |
| 23:47 | iDesperadO | ,(:hello {:hello 1 :world 2}) |
| 23:47 | clojurebot | 1 |
| 23:48 | iDesperadO | ,(let [m {:hello 1 :world 2}] (map :hello m)) |
| 23:48 | clojurebot | (nil nil) |
| 23:48 | mpan | it calls 1st arg to /each elem in/ 2nd arg |
| 23:48 | mpan | not to 2nd arg directly |
| 23:49 | mpan | so when you wrap it in vector, it calls it to each elem in the vector, namely, m |
| 23:49 | mpan | once again, I'm new and afraid I might be giving you wrong details |
| 23:50 | iDesperadO | mpan: ah..it helps |
| 23:50 | iDesperadO | :) |
| 23:52 | jparishy | Hi! Is there a best practice for wrapping a C library for use in Clojure? |
| 23:55 | jparishy | I found this library https://github.com/Chouser/clojure-jna but it's pretty old |
| 23:57 | casion | I've just used JNA directly |
| 23:58 | uvtc | I wonder if clojurebot has any wisdom to spread on this topic? |
| 23:58 | uvtc | ~c |
| 23:58 | clojurebot | ClojureBooks is http://clojure.org/books |
| 23:58 | uvtc | Hm. |
| 23:58 | casion | using C from java seems a bit counter to the purpose of using java in the first place though |
| 23:58 | casion | I' |
| 23:59 | casion | I've only used it to check my work against known working libraries that I"m familiar with |
| 23:59 | jparishy | Yep, but I'd like to use the Clojure parser along with a C library (llvm api) so you kinda have to go in that direction me thinks |
| 23:59 | wmealing_ | casion: seen that clojureC work ? |