2011-01-04
| 00:18 | jfkw | \quit |
| 00:22 | auser | hah |
| 01:44 | amalloy | $source into-array |
| 01:44 | sexpbot | into-array is http://is.gd/k44VO |
| 02:01 | _na_ka_na_ | how do I get clojure-contrib 1.3alpha4 from lein ? |
| 02:38 | LauJensen | Derander_: Did you solve your problem? |
| 02:49 | Derander_ | LauJensen: no, but I haven't put any more work into it since then |
| 02:49 | Derander_ | I've gotten sidelined |
| 02:49 | Derander_ | I'll figure it out tomorrow |
| 02:52 | LauJensen | ok, it should be like amalloy said. You can inspect ClojureQLs own project.clj to see artifacts for mysql, postgres and sqlite |
| 03:19 | Derander_ | LauJensen: good idea. thank you. |
| 04:35 | ejackson | morning all |
| 04:54 | LauJensen | Morning ejackson |
| 04:57 | ejackson | LauJensen: my apologies for not taking a look at ClojureQL yet. I opted to use redis instead of SQL for the current piece of work. I will use SQL at some point, but not just yet. |
| 04:57 | LauJensen | ejackson: I'll forgive you if you write a Redis compiler for ClojureQL (it has pluggable compilers) |
| 04:58 | ejackson | is that a fact.... |
| 04:58 | ejackson | very interesting indeed |
| 04:58 | ejackson | ,(swap! edmunds-todo-list inc) |
| 04:58 | clojurebot | java.lang.Exception: Unable to resolve symbol: edmunds-todo-list in this context |
| 04:58 | ejackson | :) |
| 05:00 | ejackson | actually clojurebot, the correct Exception is numeric overflow |
| 05:04 | Fossi | shameless plug: http://the-deadline.appspot.com |
| 05:04 | Fossi | all clojure ;) |
| 05:04 | Fossi | and also nice for keeping your todos |
| 05:04 | bobo_ | Fossi: what did you use? |
| 05:04 | Fossi | as in? |
| 05:05 | Fossi | a lot of coffee |
| 05:05 | ejackson | Fossi: nice ! |
| 05:06 | LauJensen | bobo_: Theres a nice talk on Hack Fwd about the deadline |
| 05:13 | bobo_ | Fossi: as in libraries for the web =) |
| 05:13 | bobo_ | LauJensen: ah il check |
| 05:14 | LauJensen | bobo_: I think they used all the wrong libraries, but their architecture idea was great |
| 05:14 | bobo_ | :-p |
| 05:17 | Fossi | it's been changed a whole lot |
| 05:17 | bobo_ | i dont think the site is for me. way to much stuff |
| 05:18 | bobo_ | im still to find a todolist that beats postit notes |
| 05:18 | Fossi | there are actually quite a few really simple ones |
| 05:18 | mids | LauJensen: what is Hack Fwd? (got an url?) |
| 05:19 | Fossi | hackfwd.com |
| 05:19 | mids | oh that just seemed to be some random site, guess I got to look deeper |
| 05:20 | Fossi | it's a vc-group, by lars hinrichs (xing founder) |
| 05:20 | Fossi | they also have quite a few tech talks |
| 05:20 | mids | thanks |
| 05:21 | mids | ah, http://hackfwd.com/companies#thedeadline |
| 05:23 | bobo_ | cant find any talk there though? |
| 05:25 | Fossi | http://passionmeetsmomentum.com/ |
| 05:25 | Fossi | i think |
| 05:26 | LauJensen | Yea I think that was the name. Just stay clear of passionmeetsfashion.com :) |
| 05:32 | companion_cube | is there a way to change the way to compare objects in a set ? |
| 05:33 | ejackson | companion_cube: yes, a custom comparator function |
| 05:35 | ejackson | companion_cube: if you use sorted-set-by you just pass in a comparator and it uses that to compare elements in the set |
| 05:35 | companion_cube | oh, ok, thanks |
| 07:09 | ejackson | when destructuring a map is there a way to use the :keys directive to pull out *all* the keys, rather than list them individually ? |
| 07:11 | mduerksen | ejackson: how would you know which keys are in your map? |
| 07:12 | mduerksen | when you want to use the keys, i mean |
| 07:13 | ejackson | its fixed. in this case the map is a bunch of parameters for another function, so I know at design time what's going to be there, and I'm just coding that using the keys of the map. |
| 07:14 | ejackson | oh bollkcs |
| 07:14 | ejackson | i see what you mean, the compiler won't know the symbols when it tries to compile the funciton |
| 07:15 | ejackson | too much dynamics, i'm beginning to believe in miracles :) |
| 07:16 | mduerksen | ^^ |
| 07:19 | ejackson | mduerksen: well, I know what the keys are, as I would need to in order to write {:keys k1 k2 k3}, so if I could magically write {:all-keys} I could then use call k1 k2 k3 in the code. However, the compiler wouldn't know where those vars/locals and couldn't work. |
| 07:19 | ejackson | at least, that's what I think, i'm reliably wrong though. |
| 07:25 | LauJensen | user> (defmacro destructured [m & body] |
| 07:25 | LauJensen | `(let [~@(interleave (map (comp symbol name) (keys m)) (vals m))] |
| 07:25 | LauJensen | (do ~@body))) |
| 07:25 | LauJensen | #'user/destructured |
| 07:25 | LauJensen | user> (destructured {:a 5 :b 10} (+ a b)) |
| 07:26 | LauJensen | 15 |
| 07:26 | LauJensen | |
| 07:26 | LauJensen | ejackson: its a hack, but its there :) |
| 07:27 | ejackson | LauJensen: nicely done, thanks :) |
| 07:28 | LauJensen | np |
| 07:28 | ejackson | really illustrative code actually. |
| 07:30 | LauJensen | It just occured to me, that it should simply be named let-map... :) |
| 07:30 | ejackson | that's exactly correct, it captures the semantics |
| 07:31 | ejackson | with the usual confusion over the overloading of map |
| 07:34 | mfex | ejackson, note that the destructure macro is only different syntax for (let [a 1 b 2] ..) it will not work with (let [m {:a 1}] (destructure m (inc a))) etc. |
| 07:40 | ejackson | mfex: I see that (at the repl), and am trying to figure out why... |
| 07:40 | LauJensen | ejackson: because macros dont evaluate their arguments, so it just sees the literal symbol m, does not resolve it |
| 07:40 | ejackson | ~m ? |
| 07:40 | clojurebot | slime-install is an automated elisp install script at http://github.com/technomancy/emacs-starter-kit/blob/2b7678e9a331d243bf32cd8b591f826739dad2d9/starter-kit-lisp.el#-72 |
| 07:42 | ejackson | sorry what I meant was, my first guess was exactly that, and was then confused by ~m didn't resolve it |
| 07:44 | ejackson | but i get it now, thanks. |
| 08:23 | serp__ | if I understand things correctly, when using multimethods the function to use is picked based on the result of a function passed to defmulti. I want to do select which function to use based on the result of a predicate applied to the arguments. something like (defn print-type [arg] (is-number? arg) (println "a number!")) (defn print-type (constantly true) (println "something other than a number!")) where the first thing af |
| 08:24 | serp__ | (print-type 4) would then print "a number!" and (print-type "abc") wouldn't... is there something like this in clojure already, or am I approaching the problem in a weird way? |
| 08:32 | chouser | serp__: the main benefit of using a multimethod instead of an if or case is that it is "open" |
| 08:32 | chouser | that is, you can define several conrete functions now, but you or others can add more later |
| 08:33 | chouser | if your dispatch function is a predicate, there are only two possible concrete functions, one for true and one for false, so your set of functions is essentially closed anyway. |
| 08:34 | serp__ | I want it to keep trying until it finds a true predicate |
| 08:34 | chouser | so, there's less reason to use a multimethod in that case, but I suppose that doesn't necessarily mean you shouldn't. |
| 08:34 | chouser | ah... |
| 08:34 | chouser | yeah, that's not how multimethods work. |
| 08:35 | bsteuber | serp__: probably you need to build your own dispatch facility then |
| 08:35 | bsteuber | with an atom holding a map from predicates to functions |
| 08:35 | chouser | but order is going to matter |
| 08:36 | serp__ | there won't ever be two true predicates |
| 08:36 | bsteuber | ok so not a map |
| 08:36 | bsteuber | serp__: not even a default catch-all? |
| 08:36 | serp__ | no |
| 08:37 | chouser | serp__: you're sure you can't map those predicates into values in a heirarchy? You can define your own heirarchies that are independant of Java classes. |
| 08:38 | serp__ | hm... I don't know how multimethods and hierarchies are related |
| 08:39 | chouser | serp__: you provide a single dispatch function whose return value may be an item in a heirarchy, say ::Number or ::EnglishText |
| 08:40 | chouser | then you define methods, each of which handles one branch of the heirarchy, so either ::Number or, say, ::String |
| 08:40 | serp__ | aha.. so the method for ::String will handle ::EnglishText, unless there is a method for ::EnglishText ? |
| 08:40 | chouser | if you declare that ::EnglishText is derived from ::String, then if your dispatch fn returns ::EnglishText, your ::String handler ... exactly. |
| 08:40 | serp__ | (why two : btw?) |
| 08:41 | chouser | serp__: keywords in a heirarchy must be namespaced |
| 08:41 | chouser | two : gives you that for cheap |
| 08:41 | serp__ | hmm |
| 08:41 | serp__ | neat trick this hierarchy business |
| 08:42 | serp__ | it will do fine :) |
| 08:42 | serp__ | thanks |
| 08:43 | chouser | you can also tie your own namespaced keywords into the main heirarchy that includes Java classes, if that's at all helpful. |
| 08:44 | serp__ | I am doing pure clojure for now |
| 08:44 | serp__ | maybe one day I'm ready for mixing in java |
| 08:46 | chouser | ,(derive ::EnglishText java.lang.String) |
| 08:46 | clojurebot | java.lang.ClassCastException: java.lang.Class cannot be cast to clojure.lang.Named |
| 08:46 | chouser | oops, ignore that. |
| 08:46 | chouser | ,(derive java.lang.String ::Value) |
| 08:46 | clojurebot | nil |
| 08:46 | chouser | ,(isa? (class "hello") ::Value) |
| 08:46 | clojurebot | true |
| 08:47 | serp__ | ,(derive java.lang.String :lala) |
| 08:47 | clojurebot | java.lang.AssertionError: Assert failed: (namespace parent) |
| 08:47 | chouser | serp__: two : please. :-) |
| 08:47 | chouser | or :serp/lala |
| 08:47 | serp__ | ,(derive java.lang.String :serp/lala) |
| 08:47 | clojurebot | nil |
| 08:47 | serp__ | hm |
| 08:48 | chouser | so now Strings are ::Values, :serp/lalas, and Objects, among other things. |
| 08:48 | serp__ | :) |
| 09:22 | markskilbeck | Coming from PHP... I'd like to say thank-you. |
| 09:22 | markskilbeck | So very much. |
| 09:23 | markskilbeck | Programming has become enjoyable again. |
| 09:24 | chouser | I suppose most "non-main-stream" language communities are made up primarily of grateful refugees of other languages. |
| 09:24 | chouser | Anyway, welcome. :-) |
| 09:24 | LauJensen | great, one less PHP programmer out there, please accept our thanks as well markskilbeck :) |
| 09:24 | markskilbeck | \o/ |
| 09:25 | Dranik | markskilbeck, do you develop web-sites with clojure? |
| 09:30 | rsenior | I was reading in a JSON doc this morning with contrib.json, where the key of a JSON map happend to be a URI, such as {"http://clojure/reader":1}. This gets turns into {:http://clojure/reader 1}, and calling (name :http://clojure/reader) just yields "reader" |
| 09:30 | rsenior | I found this a little unexpected, though reading the rules for symbols it makes sense now |
| 09:31 | rsenior | is there something that can/should be done to be smarter about this? |
| 09:33 | chouser | rsenior: good question. Clojure symbols and keywords are designed to allow their prefix part be partials URLs such as in your example. |
| 09:34 | rsenior | chouser: right, I was looking at the source and it looks like the goal is stripping out the ns prefix |
| 09:34 | chouser | for symbols, 'str' will rebuild the original string, but I'm not aware of a similar function for keywords |
| 09:34 | rsenior | that worked for keywords as well |
| 09:34 | rsenior | however I had typically been using name to get the string representation of the keyword |
| 09:35 | chouser | but for keywords, 'str' will return a string that begins wth : |
| 09:35 | rsenior | oh right, I was thinking about a straight symbol |
| 09:36 | chouser | hm... since json keys don't generally use / to indicate a namespace in a key, perhaps the clojure json lib should explicitly build keywords with no namespace. |
| 09:37 | chouser | ,(name (keyword "" "http://foo/bar")) |
| 09:37 | clojurebot | "http://foo/bar" |
| 09:38 | rsenior | oh, so it's the combo of it having the namespace and the URL for the value |
| 09:51 | rsenior | yeah, looks like calling keyword with a single string arg, that has a slash in that string causes this: "return new Symbol(nsname.substring(0, i).intern(), nsname.substring(i + 1).intern());" |
| 09:51 | rsenior | meaning it's treating the left half of the url as the namespace |
| 09:52 | rsenior | ,(namespace (keyword "http://foo/bar")) |
| 09:52 | clojurebot | "http://foo" |
| 09:52 | rsenior | ,(name (keyword "http://foo/bar")) |
| 09:52 | clojurebot | "bar" |
| 09:54 | chouser | exactly |
| 09:55 | rsenior | is this a bug report sort of thing? filed in contrib.json? |
| 09:55 | rsenior | seems like it's a pretty easy fix |
| 09:59 | chouser | rsenior: I'd say it's probably worth an email to the maintainer. This is probably a situation he hadn't considered. |
| 09:59 | rsenior | alright, will do |
| 10:22 | ejackson | i'm sad not to be able to make a financial contribution to Clojure this year :( |
| 10:22 | lpetit | me too |
| 10:28 | StartsWithK | same here |
| 10:29 | chouser | these are for economic reasons? |
| 10:30 | lpetit | Maybe Rich's decision is irreversible, maybe not. In either case, I think he must hear testimonies like these. |
| 10:30 | fyuryu | lpetit: what decision? |
| 10:31 | chouser | oh, there's a ggroup thread |
| 10:31 | StartsWithK | we need a petition/pledge for this |
| 10:31 | lpetit | to stop requiring community funding for 2011, see If I'm less communicative now, it is only because I am trying to attain that level of focus once again. |
| 10:31 | lpetit | argh, bad copy'paste |
| 10:32 | lpetit | see http://clojure.org/funding |
| 10:32 | mikejs | if the development of clojure can be adequately funded w/o individual contributions then why reverse the decision? |
| 10:37 | lpetit | mikejs: those seem to be 2 orthogonal topics, wrt to the decision motivating http://clojure.org/funding |
| 10:39 | lpetit | mikejs: what I mean is. Not every people has the ability/time etc. to "contribute" back to clojure (Rich) by sending patches, etc. Those people had the opportunity to show their commitment, faith, etc. via the funding effort. |
| 10:39 | ejackson | The last thing I want to do is second guess Rich - its his project, and his reasoning has been shown to impeccable. I'm just saddened that misunderstanding or mean-spiritedness on the part of some has caused what I thought of as a great funding model to be overturned. |
| 10:40 | ejackson | lpetit: exactly |
| 10:52 | fyuryu | another reason to hate trolls... |
| 10:53 | lpetit | fyuryu: beware of "duck-trolling" too rapidly, though ;-) (it's not ruby, it's clojure :-D) |
| 11:02 | danlarkin | ' |
| 11:03 | danlarkin | whoops |
| 11:04 | raek | ooh! an U+0027 APOSTROPHE! *yoink* |
| 11:32 | TobiasRaeder | hey :) |
| 11:33 | TobiasRaeder | anyone ever used custom cake tasks that had some dependencies (as in some .jar file)? |
| 11:38 | stevep | sorry, lein here |
| 11:55 | lpetit | sorry, just POMU (Poor Old Maven User) here |
| 11:55 | lpetit | s/Poor/Plain/ :-) |
| 12:08 | S11001001 | shell & curl, who needs that fancy dep fetching stuff |
| 12:27 | ejackson | lpetit: s/Poor/Productive/ :) |
| 12:36 | stevep | http://tech.puredanger.com/2011/01/04/forkjoin-clojure/ |
| 13:03 | markskilbeck | Do any of you guys have experience using nailgun & VimClojure? |
| 13:05 | Raynes | TobiasRaeder: There is a channel dedicated to cake over in #cake.clj. If you don't get any cake answers here, you'll probably get some answers in a little while there when activity is up. |
| 13:05 | TobiasRaeder | @Raynes alright, i will try that. thanks |
| 13:10 | Berengal_ | Is there a nice way to define a way of combining records based on fields? |
| 13:11 | raek | what does "combining" mean in this case? |
| 13:11 | Berengal | raek: Adding them together, in a general sense |
| 13:11 | duncanm | a question about API design: is there a reason why merge and concat need to exist separately from conj? |
| 13:12 | Berengal | raek: Given two records, return a new one that's the "sum" of the input |
| 13:13 | mrBliss | Berengal: merge or merge-with |
| 13:13 | mrBliss | or into |
| 13:13 | Berengal | mrBliss: That assumes the data is homogenus. |
| 13:14 | Berengal | mrBliss: Consider merging records with fields [:word-count :word-list] |
| 13:15 | Berengal | It's no big deal writing the function myself. I just wondered if there was a builder-function for this already |
| 13:16 | Berengal | Something like (reduce (merge-fields {:word-count +, :word-list concat} record-list) |
| 13:17 | Berengal | Lost a paren there, after the map... |
| 13:19 | mrBliss | Berengal: I'll think you'll have to come up with a function. rename-keys or select-keys seem to be good functions to start from. |
| 13:19 | Berengal | mrBliss: Got it |
| 13:19 | mrBliss | (btw: rename-keys lives in clojure.set) |
| 13:20 | duncanm | mrBliss: in a similar topic, any ideas about conj/concat/merge? |
| 13:21 | duncanm | automatically, i go to 'conj', but it's bit me a few times, took me a while to realize that i should be using merge or concat instead |
| 13:27 | mrBliss | duncanm: I don't quite understand your question. But I can say that what conj does, depends on the coll it is passed (vector, list or map). I use conj when I know how many elements I'm gonna add to a collection (1 to 3). I use into when I want to 'conj' 2 collections together. Merge is solely used for maps and records. I use concat to join multiple collections together, knowing that the order will be preserved (unlike into used with |
| 13:27 | mrBliss | lists). I hope this helps a bit :-) |
| 13:28 | mids | markskilbeck: tried it but didn't like it. I am back to using slime.vim |
| 13:30 | markskilbeck | mids: slime.vim was being a pain for me - it complained about not being able to open a file in /tmp/blahblah |
| 13:30 | markskilbeck | Going to try vimclojure and see if it plays nice. |
| 13:31 | mids | markskilbeck: slime.vim or slimv.vim? |
| 13:31 | markskilbeck | slime.vim, mids. |
| 13:31 | mids | (I am using the one that just pipes stuff to screen |
| 13:31 | markskilbeck | mids: yeah, that'n. |
| 13:31 | kryft | I'm going to try emacs with vimpulse when I have the time. |
| 13:33 | markskilbeck | kryft: seems like emacs is the de facto and best tool to use for clojure dev, though I CANNOT be bothered learning how to use it. |
| 13:35 | mids | tbh since I started using an autotest loop I stopped using all the fancy stuff |
| 13:36 | kryft | markskilbeck: Well, with vimpulse you shouldn't have to. =) |
| 13:36 | scode | Which repository is clojure-maven-plugin supposed to be in? |
| 13:36 | scode | It seems to be missing from central, but I thought it was there before. I just noticed because I cleaned out my ~/.m2/repository on purpose to make sure dependencies would resolve. |
| 13:37 | markskilbeck | kryft: I saw "emacs" and stopped reading >< |
| 13:38 | mids | scode: http://repo2.maven.org/maven2/com/theoryinpractise/clojure-maven-plugin/ still there? |
| 13:38 | scode | mids: Sorry, yes |
| 13:38 | scode | I just realized... |
| 13:38 | scode | I had -SNAPSHOT for historical reasons. |
| 13:38 | scode | I presumably didn't realize that because I did a local 'mvn install'. |
| 13:38 | scode | Sorry for the noise. |
| 13:40 | Raynes | markskilbeck: You're going to see a lot of "emacs" 'round these parts. |
| 13:40 | cemerick | markskilbeck: Many use the eclipse plugin, FWIW. |
| 13:41 | kryft | If vimpulse works well enough, emacs+vimpulse should be the best of both worlds: the cool modes and extensibility of emacs with the editing interface of vim. |
| 13:42 | programble | <markskilbeck> kryft: I saw "emacs" and stopped reading >< |
| 13:42 | programble | that kind of attitude will get you nowhere in life |
| 13:43 | kryft | Erm, best for me, that is; I'm well aware of the hordes of people that would rather gnaw their hand off than use a vi-style editor. :) |
| 13:43 | kryft | Well, it got him to #clojure, so how bad can it be? |
| 13:44 | Raynes | Hehe. |
| 13:44 | markskilbeck | programble: my apologies for not being interested in emacs, right now. But I can only do so much. |
| 13:45 | programble | even if you aren't, ignoring anything pertaining to something you are not interested in will not get you far |
| 13:45 | markskilbeck | It was a small sentence. |
| 13:45 | programble | that would be illegal |
| 13:45 | programble | don't give alcohol to minors :P |
| 13:46 | programble | better |
| 13:46 | kryft | I think IRC counts as international waters. |
| 13:47 | chouser | virtual beers are legal for all ages |
| 13:47 | programble | dom96: you have a bad habit of doing that |
| 13:47 | dom96 | huh? |
| 13:49 | amalloy | i would be willing to use vi if the alternative were gnawing off a hand |
| 13:49 | Raynes | amalloy: o/ |
| 13:49 | dom96 | amalloy: That statement offends me. |
| 13:50 | amalloy | Raynes: but when the alternative was spending two hours looking up how to configure tramp to use ssh+sudo, i chose that instead :P |
| 13:50 | Raynes | amalloy: Tramp is unnecessarily difficult to use, I think. |
| 13:53 | Luyt | Would it also try to redefine the language it's written in? |
| 13:54 | chouser | Luyt: you mean as rails does to ruby? |
| 13:54 | devn | Tramp isn't so bad... |
| 13:54 | devn | Luyt: That's part of the language, is it not? |
| 13:54 | Raynes | devn: Have you ever tried to set it up so that you could edit files with root? |
| 13:55 | cemerick | devn: I've not had the same thoughts, simply because rails doesn't do much I'm interested in. *shrug* |
| 13:55 | devn | Raynes: :D hahaha oh right |
| 13:55 | devn | I gave up on that |
| 13:55 | Luyt | A friend of mine who is into conspiracy theories, suggested that the ongoing monkeypatching of Ruby by the rails developers set some angry blood in Japan, that's why they refuse to open their process to the english-speaking world, and introduce unicode incompatibilities. I think he's a bit weird. |
| 13:55 | cemerick | There is a rails-inspired framework out there... |
| 13:55 | cemerick | https://github.com/macourtney/Conjure maybe? |
| 13:55 | devn | cemerick: I've played with it |
| 13:56 | cemerick | hrm, hiccup, nevermind :-| |
| 13:56 | devn | I've been toying with the idea of building my own |
| 13:56 | chouser | I think there are lots of people who want something that could be named InstaCRUD |
| 13:56 | Luyt | I'd be a killer app ;-) |
| 13:56 | cemerick | devn: there's your name ^^ ;-P |
| 13:57 | devn | hahaha I will not be naming it InstaCRUD |
| 13:57 | chouser | I'm probably one of them |
| 13:57 | devn | but yeah chouser that's the idea |
| 13:57 | cemerick | If it could have a couch backend, that might be interesting. |
| 13:58 | chouser | cemerick: don't see why not |
| 13:58 | devn | I think it will come with time -- I'm already starting to see a number of people toying with ways of doing templating in Clojure |
| 13:58 | devn | slim, haml-macro, hiccup, enlive, etc. |
| 13:58 | devn | ring is well on its way, and so on |
| 13:58 | stevep | yeah, seen enlive mentioned a few places |
| 13:59 | stevep | haven't looked at it yet |
| 13:59 | cemerick | chouser: AFAICT, Rails ≈ CRUD ≈ RDBMS |
| 13:59 | devn | enlive is a brilliant piece of software but it certainly isn't for someone who just wants to get up and running and start doing stuff |
| 13:59 | cemerick | Just conceptually of course, not technically. |
| 13:59 | stevep | *nods* |
| 14:01 | devn | ive showed people insanely simple clojure code next to their ruby code and they are dumbfounded -- granted we don't want to pander to the LCD, but I think there needs to be more of a focus on making life easy (at least at first) for people who just want to build a little dynamic website |
| 14:02 | stevep | hiccup + ring get you pretty far |
| 14:03 | Luyt | But is it web scale? http://mongodb-is-web-scale.com/ |
| 14:05 | chouser | cemerick: I simply mean that someone doing CRUD generally doesn't care if it's RDBMS underneath or not. Many of them use MySQL, after all. |
| 14:35 | ssideris | devn: was the insanely simple code written with enlive? |
| 14:47 | hiredman | http://clojure.org/funding god damn it lau |
| 14:47 | Raynes | I'll second that notion. |
| 14:47 | LauJensen | ? |
| 14:48 | Raynes | Isn't it obvious? You've destroyed the world. Cursed us all. Turned all that was good and holy to evil. Water to poison; etc. ;p |
| 14:48 | LauJensen | hiredman: Im not sure I can take credit for that :) |
| 14:49 | qbg | More fallout from LauGate |
| 14:49 | LauJensen | hehe |
| 14:50 | benreesman | hey can anyone point me in the right direction for the idiomatic way to get a lazy sequence that takes it's contents from a LinkedBlockingQueue? |
| 14:50 | qbg | I'd write a function that uses lazy-seq |
| 14:50 | chouser | benreesman: probably (repeatedly #(.take lbq)) |
| 14:50 | qbg | Not sure if there is a better way |
| 14:50 | hiredman | there is no single way to do it, if you want the contents without blocking or removing stuff you can just call seq |
| 14:51 | benreesman | i want it to block |
| 14:51 | hiredman | then chouser's repeatedly will work |
| 14:51 | benreesman | excellent, thanks guys |
| 14:51 | qbg | (inc chouser) |
| 14:51 | sexpbot | ⟹ 3 |
| 15:00 | devn | (some #(and (= (mod % 5) 0) (= (mod % 7) 0)) (range 1 100)) |
| 15:00 | devn | (1..100).detect {|i| i % 5 == 0 and i % 7 == 0 } |
| 15:01 | devn | These don't work alike, perhaps I meant to use filter:? |
| 15:01 | chouser | rough count of syntax rules employed: 2, 5 |
| 15:02 | qbg | chouser: ? |
| 15:02 | chouser | ,(some #(and (= (mod % 5) 0) (= (mod % 7) 0) %) (range 1 100)) |
| 15:02 | clojurebot | 35 |
| 15:02 | amalloy | qbg: not syntax-rules, but "rules of syntax" for ruby/clojure code just posted |
| 15:03 | qbg | Ah |
| 15:03 | chouser | qbg: to understand the clojure you need 2 rules, (foo x y) calls a function, #(mod % x) defines a function |
| 15:04 | chouser | for the ruby, () .. . {} |i| |
| 15:05 | qbg | ,(some #(= (mod % 5) (mod % 7) 0) (range 1 100)) |
| 15:05 | clojurebot | true |
| 15:05 | chouser | of course that's only rough. both use whitespace, some non-alpha for equality, etc. |
| 15:05 | qbg | ,(some #(and (= (mod % 5) (mod % 7) 0) %) (range 1 100)) |
| 15:05 | clojurebot | 35 |
| 15:05 | chouser | devn: so either be explicit about what your fn returns, or use (first (filter ...)) |
| 15:08 | amalloy | chouser: the first/filter idiom annoys me: i wish (some) behaved that way; surely it's a more common usage than the way it currently behaves, which i guess is (first (filter identity (map f coll))) |
| 15:10 | chouser | I think some is meant as a correlary to every? not-every? and not-any?, but with a bit more power |
| 15:10 | qbg | ,(first (filter #(apply = 0 (map (partial mod %) [5 7])) (range 1 100))) |
| 15:10 | clojurebot | 35 |
| 15:12 | amalloy | chouser: ##(some even? (range)) reads like "some even integer", not "is there an even integer?" |
| 15:12 | sexpbot | ⟹ true |
| 15:12 | amalloy | i'd be happy to have a (some?) function that fits in with every? and family |
| 15:12 | chouser | I think it'd be called 'any?' |
| 15:12 | qbg | Maybe example is a good name for (first (filter ...)) |
| 15:13 | amalloy | sure, any? is good. better to avoid overloading "some" |
| 15:13 | chouser | but surely there's not much value in having 'any?' or 'some?' when we have 'some' |
| 15:14 | chouser | ,(->> (range 1 100) (filter #(zero? (mod % 5))) (filter #(zero? (mod % 7))) first) |
| 15:14 | clojurebot | 35 |
| 15:15 | devn | thanks -- i ended up just making it a filter and taking first |
| 15:15 | chouser | isn't there another way to say (iterate inc 0) ? |
| 15:16 | amalloy | chouser: if 'some' were redefined to be first/filter, then there might be a desire for 'any?': ##(first (filter #(instance? Boolean %) [1 false])) |
| 15:16 | sexpbot | ⟹ false |
| 15:16 | devn | ,(type (filter #(and (= (mod % 5) 0) (= (mod % 7) 0)) (range 1 100))) |
| 15:16 | clojurebot | clojure.lang.LazySeq |
| 15:16 | devn | Is there a function to return that it is a "vector"? |
| 15:17 | amalloy | devn: it's not a vector |
| 15:17 | devn | err im sorry that's not what i meant |
| 15:17 | qbg | ,(vec (range 10)) |
| 15:17 | clojurebot | [0 1 2 3 4 5 6 7 8 9] |
| 15:18 | devn | qbg: yeah that's not my question -- im interested in having it tell me if it's a vector, a set, etc. instead of returning clojure.lang.LazySeq |
| 15:18 | devn | is that possible with any of the core fns? |
| 15:18 | chouser | amalloy: I do find some ...dissonance? around 'some' and (first (filter identity ...)), but I'm don't really like most of the proposed solutions. |
| 15:18 | qbg | ,(vector? [1 2 3]) |
| 15:18 | clojurebot | true |
| 15:19 | devn | again, that's not the question im asking |
| 15:19 | chouser | amalloy: I'd be happy if calling (filter foo) were like (filter identity foo) |
| 15:19 | chouser | but that's a small improvement |
| 15:19 | chouser | maybe we need a ffilter |
| 15:19 | chouser | I'd use that much more often than I use ffirst |
| 15:20 | amalloy | chouser: true that |
| 15:20 | devn | i want to ask whether "it" (where "it" could be [1 2 3], {:a 1}, or (1 2 3)) |
| 15:20 | qbg | devn: A clojure.lang.LazySeq is a seq, not a vector nor a set |
| 15:20 | devn | so i'd like to have it return 'seq' |
| 15:21 | amalloy | devn: so you want some function f of a collection, so that (f (range)) is seq, and (f [10]) is vector? |
| 15:21 | chouser | devn: what would you like it to return when given a PersistentList, which is a seq but also a list and a stack? |
| 15:22 | devn | honestly im just looking for a "pretty" way of printing its type without all of the java.lang.Foo |
| 15:22 | devn | I could write this, sure -- but I'm wondering if anything in core already does this |
| 15:22 | hiredman | the type is really some set of interfaces |
| 15:23 | amalloy | &(-> [] class .getName)? |
| 15:23 | sexpbot | ⟹ "clojure.lang.PersistentVector" |
| 15:23 | amalloy | hrm |
| 15:23 | hiredman | but the concrete jvm type name is a detail |
| 15:24 | devn | it's not the end of the world or anything, but I'm trying to mimic how Ruby acts when you say "foo".class? => String |
| 15:24 | devn | I want to "sell" clojure to some friends of mine and am looking for a pretty way of displaying this |
| 15:24 | qbg | Is it really that different? |
| 15:24 | hiredman | that just because ruby doesn't have packages |
| 15:24 | devn | Rubyists hate things that even casually resemble java |
| 15:24 | qbg | ,(supers (type (range 10))) |
| 15:24 | clojurebot | #{clojure.lang.Seqable java.util.List clojure.lang.Sequential clojure.lang.IMeta java.io.Serializable java.lang.Iterable clojure.lang.Obj clojure.lang.ISeq java.lang.Object clojure.lang.IObj ...} |
| 15:25 | devn | I'm just trying to get rid of any hints of java where possible |
| 15:26 | S11001001 | find-first in clojure.contrib.seq-utils |
| 15:26 | Raynes | devn: If they're that opposed to Java in any form, I seriously doubt your efforts will be rewarded. Clojure is a JVM language, and thus you don't really get away from Java. |
| 15:26 | mikejs | devn: they're going to have to get over that if they consider using clojure |
| 15:27 | Raynes | If they aren't willing to accept the JVM as a platform, then there isn't much hope for them. |
| 15:27 | chouser | ,(map #(symbol (.getSimpleName %)) (supers (type (range 10)))) |
| 15:27 | clojurebot | (Seqable List Sequential IMeta Serializable Iterable Obj ISeq Object IObj ...) |
| 15:27 | chouser | that's a bit less messy, though it obscures some important details. |
| 15:27 | stevep | @Raynes +1 |
| 15:28 | amalloy | (inc Raynes) |
| 15:28 | sexpbot | ⟹ 2 |
| 15:28 | amalloy | stevep: ^ :) |
| 16:26 | kjeldahl | Hm. ring.middleware.reload isn't found by cake. Anybody know what it's called these days? |
| 16:27 | raek | kjeldahl: ring/ring-devel "0.3.5" |
| 16:34 | kjeldahl | raek: Thanks. I suspect a dependency declaration wasn't needed. |
| 16:45 | BufferUnderpants | Hi. |
| 16:46 | BufferUnderpants | I'm toying with lein-war and I'm wondering how would one put an arbitrary file in the resulting WEB-INF folder. |
| 16:49 | raek | BufferUnderpants: looks like everything in src/html/ ends up in / in the jar, so maybe you can put the stuff in src/html/WEB-INF/ |
| 16:49 | raek | (this is what I can tell from https://github.com/alienscience/leiningen-war) |
| 16:49 | BufferUnderpants | Yeah, some other helpful fellow suggested it on the #leiningen channel too, thanks |
| 16:49 | BufferUnderpants | (how didn't I think of that) |
| 17:47 | rata_ | hi |
| 17:48 | rata_ | is there a fn like nth that takes the number first, then the coll? |
| 17:49 | tonyl | not that i know of. seems a bit unidiomatic. why? |
| 17:50 | raek | rata_: #(nth %2 %1) ;; <-- now there is :-) |
| 17:51 | rata_ | tonyl: because (nth (big-expression) n) is less easier to read than (nth n (big-expression)) |
| 17:52 | raek | this is why -> was invented |
| 17:52 | raek | (-> (big-expression) (nth n)) |
| 17:53 | rata_ | raek: (#(nth n %) (big-expression)) and (-> (big-expression) (nth n)) are harder to read imo |
| 17:53 | amalloy | rata_: -> is very nice once you get used to it |
| 17:53 | rata_ | I use it a lot, but here it's ugly |
| 17:53 | raek | well, regarding the first one, I agree |
| 17:54 | rata_ | btw, it's a pity there's no third, fourth, etc |
| 17:54 | S11001001 | named-nths.lisp |
| 17:54 | raek | I thought you needed to pass the fn to some other higher order fn that expects the args in the other order |
| 17:54 | raek | I usually use destructuring in those cases |
| 17:56 | rata_ | raek: yes, using destructuring gets better |
| 18:06 | ossareh | lo all |
| 18:06 | auser | ola |
| 18:53 | ossareh | reasonable? (defn within? [key coll] (not (empty? (drop-while #(not= key %) coll)))) |
| 18:53 | ossareh | I feel like this is already in core but I don't know what the name is likely to be. |
| 18:54 | amalloy | ossareh: (some) does this |
| 18:54 | amalloy | &(some #{4} [1 2 3]) |
| 18:54 | sexpbot | ⟹ nil |
| 18:54 | amalloy | &(some #{4} [1 2 3 4 5]) |
| 18:54 | sexpbot | ⟹ 4 |
| 18:55 | amalloy | (this takes advantage of the fact that sets act like predicates testing for their contents) |
| 18:55 | ossareh | ye, I actually use that elsewhere. |
| 18:56 | ossareh | thanks amalloy |
| 18:57 | amalloy | welcome! |
| 19:07 | ossareh | (inc amalloy) |
| 19:07 | sexpbot | ⟹ 1 |
| 19:28 | _Vi | Usual Clojure is for JVM and easily mixed with Java code. I also heard about .NET and JS versions. Will there be Clojure that can be easily mixed with Perl code? (e.g. clojure for Parrot VM) |
| 19:29 | qbg | _Vi once the Clojure complier is ported to Clojure and core data structures are rewritten in clojure, that sort of port will be easier |
| 19:29 | _Vi | qbg, Is it moving to that "self-hosted"-ness? |
| 19:29 | qbg | Some progress has been made |
| 19:30 | qbg | Protocols/types introduced in 1.2 will help with the data structures |
| 19:30 | qbg | The gvec stuff is already implemented using them |
| 19:30 | _Vi | In general, is it expected that there will be Clojure for many things (parrot, Qt, python) in future or clojure.net and clojure for JS will die out and it will be locked to JVM? |
| 19:31 | qbg | It'll be a while though before clojure is rewritten in terms of itself |
| 19:32 | _Vi | (It's good to write lispy things using convenient libraries and with possibility to just implement things in low-level language in case of problems with Clojure) |
| 19:32 | qbg | The downside of ports to other platforms is the lack of the ability to use java libs |
| 19:33 | _Vi | qbg, Compensated with ability to use that native things (.NET libraries, JS libraries, Qt libraries, etc.) |
| 19:33 | qbg | Sure, you could in theory have clojure on <your favorite vm>, but a lot of existing code won't transfer over that easily |
| 19:33 | _Vi | qbg, I think they should be as easy to use in clojure ports as Java libraries in common Clojure. |
| 19:33 | qbg | They depend on java though |
| 19:34 | _Vi | qbg, "<your favorite vm>", So don't wait for things like "Clojure4Qt", right? |
| 19:35 | qbg | Its going to be a while |
| 19:35 | qbg | Right now, a lot of Clojure is still written in Java |
| 19:35 | _Vi | (let [q (QWidget. nil)] (.add (QLabel. "qweqe")))... |
| 19:36 | qbg | I'm not sure how much of that will be easy to do on a non-JVM |
| 19:36 | qbg | or java-like vm |
| 19:37 | _Vi | s/or java-like vm/or non-java-like vm/? |
| 19:37 | qbg | Correct |
| 19:37 | hiredman | there alread was a js port, but it hasn't been kept up be cause clojure was developing so fast it was hard to keep pace with |
| 19:38 | qbg | Also, I can imagine running Clojure in a C++ native land to be very painful |
| 19:38 | _Vi | May be Clojure would inspire creating similar things (lispy, immutable, STM, easy native lib calls) for other frameworks. |
| 19:40 | _Vi | qbg, I don't expect "Clojure++" to integrate that well with any C/C++ code, but expect it to integrate well with Qt and GObject things (which provides reflection and other things). |
| 19:41 | qbg | Good GC support and dynamic code loading should be there too |
| 19:42 | _Vi | qbg, There are GC for C code. Dynamic code loading? Should be possible (at least as saving temp lib and dlopen-ing it). |
| 19:42 | qbg | ECL does it, so in theory it isn't a problem |
| 20:08 | devn | so am I crazy or is using camelCaseForVarNamesCompleteInsanity? |
| 20:10 | devn | I suppose my next question is: Would I be a huge jerk if I took someone's library and submitted a pull request with proper source formatting and renamed vars to be foo-bar instead of fooBar |
| 20:11 | qbg | camelCase = not good |
| 20:11 | lancepantz | this is known as github trolling |
| 20:11 | lancepantz | and yes, you should do it |
| 20:19 | devn | pull request coming |
| 20:19 | qbg | If code had blood, it would be everywhere right now |
| 20:21 | devn | i love clojure, but people with no aesthetic value tend to make awful messes |
| 20:23 | devn | https://gist.github.com/765778 -- Check out this dandy... |
| 20:24 | qbg | Did that person come from Haskell? |
| 20:26 | devn | yes. |
| 20:26 | qbg | Knew it |
| 20:26 | devn | obviously a really smart guy, but this syntax is...not clojure |
| 20:26 | qbg | The let-bind and >>== gave it away |
| 20:28 | devn | actually, I just realized that this library I'm playing with was built off of another library he wrote that is likely bigger and even worse |
| 20:29 | qbg | What does this library do? |
| 20:30 | hiredman | looks like a parser |
| 20:43 | ossareh | qbg: what is the haskell give away? |
| 20:43 | ossareh | ignore ^ |
| 20:44 | devn | qbg: the >>= |
| 20:44 | devn | err ossareh |
| 20:44 | devn | I found another haskell give away: <|> |
| 20:44 | devn | (defn <|> ...) |
| 20:55 | devn | it's just a little jolting to see someone write code where they don't even seem to be looking at examples of other people's code for guidance on style and idioms |
| 20:55 | qbg | Who wrote this? |
| 20:55 | KirinDave | devn: Not so unusual for lisp-haskell expats. |
| 20:55 | KirinDave | devn: CommonLisp folks do what they want, when they want. It's sort of a thing. |
| 21:09 | devn | qbg: It'd be rude to say |
| 21:09 | qbg | I hope they are not currently on this channel |
| 21:10 | devn | KirinDave: Yeah, that's not something I guess I'm very familiar with. It seems like all of the languages I've learned I always cared a great deal about style. |
| 21:10 | devn | qbg: they aren't. |
| 21:12 | qbg | The patient has survived their first surgery; it can now rest before its next one |
| 21:17 | chett`` | Programming Clojure refers to clojure.contrib.repl-utils/show to enumerate fields of Java Objects. |
| 21:17 | chett`` | O can't find this method in clojure.contrib 1.2 |
| 21:18 | qbg | Should still be there: http://clojure.github.com/clojure-contrib/repl-utils-api.html#clojure.contrib.repl-utils/show |
| 21:24 | amalloy | chett``: it's there. i had a lot of trouble finding it when i was new to clojure because i couldn't figure out the ns/use/require forms |
| 21:24 | amalloy | you want (use '[clojure.contrib.repl-utils :only [show]]) for standalone, or within an ns form (:use [clojure.contrib.repl-utils :only [show]]) |
| 21:27 | chett`` | amalloy: thanks, I thought I had it covered by including it in the project dependencies |
| 21:27 | chett`` | minor oversight |
| 21:27 | amalloy | chett``: that makes the library available, but you have to require it for use in a given source file |
| 21:31 | chett`` | I also need to read an erc tutorial as my evil twin and his evil twin chett` and chett`` are in here too |
| 21:31 | amalloy | chett``: no, only chett`` is in #clojure |
| 21:31 | chett`` | thanks |
| 21:32 | amalloy | but you probably need to read that tutorial just the same, since i bet you want chett :) |
| 21:38 | cemerick | HTTP/REST/HATEOS fans: what response code best indicates a situation where content at some URI isn't available yet, but will be eventually? My best guess at the moment is a straight 300, with perhaps an indication of an expected ETA in the response body. |
| 21:41 | amalloy | cemerick: 307 looks right to me? |
| 21:42 | amalloy | 300 afaict implies that there are multiple near-equivalent copies of the same resource |
| 21:42 | cemerick | amalloy: except the requested URI is right, just not yet… |
| 21:43 | hiredman | 418 |
| 21:43 | amalloy | cemerick: it's a temporary redirect to the "nothing here yet" uri |
| 21:45 | amalloy | hiredman: lol. i like 418 |
| 21:45 | cemerick | 419 Godot |
| 21:46 | amalloy | hiredman: almost as entertaining as 500 The Bees They're In My Eyes |
| 21:47 | cemerick | here I am looking at the HTTP/1.1 RFC, but the perfect one was waiting for me in the webdav spec |
| 21:47 | cemerick | 102 Processing – This code indicates that the server has received and is processing the request, but no response is available yet. |
| 21:47 | amalloy | cemerick: that doesn't sound anything like what you want |
| 21:48 | cemerick | amalloy: that describes the situation exactly, actually |
| 21:48 | cemerick | Maybe my initial description was poor… |
| 21:48 | amalloy | cemerick: 1xx (in http 1.1, anyway) is for "informational content" while the server is working on creating a real 200+ response |
| 21:49 | cemerick | amalloy: Right -- perfect. The content for the URI in question is being generated, but isn't available yet. |
| 21:50 | amalloy | cemerick: so you expect it to be available in a few seconds, not a few weeks? |
| 21:50 | cemerick | Yeah, seconds, minutes maybe, not hours or weeks. |
| 21:50 | amalloy | ah. then 1xx sounds fine |
| 21:51 | bridgethillyer | 102 implies actual processing is going on |
| 21:51 | bridgethillyer | ie by a CPU :) |
| 21:52 | amalloy | cemerick: or maybe 202? |
| 21:52 | cemerick | bridgethillyer: exactly right -- thing's in the oven, will be out shortly. |
| 21:52 | bridgethillyer | I think 404 is really the best option even though it would be cool to have something like what you suggest |
| 21:52 | amalloy | i'm not sure 102 is allowed for plain http |
| 21:53 | dale | Given a Reader in Clojure, is there a nice way to say "read N bytes into a String" other than just doing (.read ...) with a char[]? |
| 21:56 | cemerick | amalloy: doesn't 202 imply that that request is what started the processing? |
| 21:56 | amalloy | cemerick: it doesn't look that way to me from the rfc, but it's not clear |
| 21:57 | qbg | ,(let [sr (java.io.StringReader. "hello, world!")] (apply str (repeatedly 5 #(.read sr)))) |
| 21:57 | clojurebot | "104101108108111" |
| 21:57 | qbg | ,(let [sr (java.io.StringReader. "hello, world!")] (apply str (repeatedly 5 #(char (.read sr))))) |
| 21:57 | clojurebot | "hello" |
| 21:57 | dale | Heh. |
| 21:57 | qbg | Not sure I'd recommend that... |
| 21:58 | dale | Agreed. |
| 21:58 | hiredman | better to use a bytearrayinputstream |
| 21:58 | qbg | (slurp (java.io.StringReader. "hello, world!")) |
| 21:58 | qbg | ,(slurp (java.io.StringReader. "hello, world!")) |
| 21:58 | clojurebot | "hello, world!" |
| 21:58 | qbg | Use that |
| 21:58 | qbg | If you want all of it |
| 21:59 | dale | qbg: I need to read N bytes, not the whole file. |
| 22:00 | dale | hiredman: That only reads from a byte array though, right? I have an InputStream from a Socket. |
| 22:01 | hiredman | dale: was in response to StringReader |
| 22:01 | dale | OK. |
| 22:02 | hiredman | dale: inputstreams don't read chars regardless |
| 22:03 | hiredman | in that case (byte-array n) is a great way to do what you want |
| 22:04 | dale | hiredman: Given s/want/have to do/, it is. Thanks. :) |
| 22:05 | dale | I'm just chafing against java.io. I'll eventually get used to its regular beatings. |
| 22:07 | cemerick | amalloy: yikes, I see what 102 means by "prevents the client from timing out": curl sits and waits for a "real" response. |
| 22:07 | cemerick | 202 it is |
| 22:07 | hiredman | file and copy from clojure.java.io are great for that, but I can't speak for the quality of anything else in there |
| 22:07 | amalloy | cemerick: muahaha |
| 22:08 | hiredman | last time I tried to use a function from either there or contrib (back when it was in contrib) for reading a file into a byte array it did it via a Reader, very bad |
| 22:08 | dale | Readers are for characters, InputStreams for bytes, right? |
| 22:09 | amalloy | dale: yeah |
| 22:09 | hiredman | inputstreams for everything unless I need a reader |
| 22:09 | dale | clojure.java.io looks suspiciously like clojure.contrib.io looks suspiciously like clojure.contrib.duck-streams. |
| 22:09 | hiredman | correct |
| 22:10 | hiredman | in the process of a lot of duck-streams stuff being promoted from contrib to clojure the namespace was renamed and juggled around |
| 22:11 | dale | I see. |
| 22:14 | amalloy | what's the clojure naming convention for type conversions? eg what to name a function that takes lisp-named-strings and turns them into lispLikeStrings? |
| 22:14 | hiredman | thats not a type conversion |
| 22:14 | hiredman | String in, String out |
| 22:14 | amalloy | hiredman: yes, sorry |
| 22:15 | amalloy | i figured it would follow the same convention since it's a translation of sorts |
| 22:16 | hiredman | I like a->b |
| 22:43 | devn | what is >== in Haskell? <|> ? |
| 22:59 | hiredman | >>= is bind |
| 23:06 | devn | hiredman: ah of course, thanks |
| 23:26 | clizzin | is there a difference between (require '[foo :as f]) and (use '[foo :as f]) ? |
| 23:28 | devn | clizzin: http://stackoverflow.com/questions/871997/use-vs-require-in-clojure |
| 23:30 | clizzin | devn: that doesn't cover if there's a difference when i have the :as keyword in my call to use |
| 23:31 | devn | clizzin: right you are. im not sure the answer to your question. i read a post that i could swear had some info on this exact problem but im having trouble finding it. |
| 23:32 | clizzin | devn: interesting, let me know if you find it |
| 23:32 | devn | clizzin: is there any reason in particular you're asking? |
| 23:33 | devn | my wild guess here is that require is preferred |
| 23:33 | clizzin | devn: no, just curious. it does seem silly to have two ways of doing the exact same thing |
| 23:33 | devn | clizzin: im trying to imagine the use case myself :) |
| 23:36 | devn | clizzin: you understand that use accepts extra opts right? |
| 23:36 | clizzin | devn: yeah, although the only ones i'm familiar with are :only and :exclude |
| 23:37 | devn | clizzin: there's also a :rename |
| 23:38 | devn | clizzin: but i think it's probably best to look at hosw similar require and use are under the covers |
| 23:39 | clizzin | devn: gotcha. thanks for the info |
| 23:39 | devn | 'use is (defn use [& args] (apply load-libs :require :use args) |
| 23:40 | devn | 'require is (defn require [& args] (apply load-libs :require args)) |
| 23:48 | devn | clizzin: it seems like they're the same thing in that case, but in one case you have access to the extra options, but someone smarter than me will likely correct my mistake at any moment |
| 23:51 | clizzin | devn: cool thanks |
| 23:53 | dale | I suspect the difference between use and require there is that use will (refer) to foo, require will not? |
| 23:53 | dale | And the fact that use accepts :as is probably just a side-effect of the fact that it's implemented as a superset of require's functionality? |
| 23:54 | devn | clizzin: heh, ill quit talking at you now, but skim the 1.2.0 source (or search) for load-one, load-all, load-lib, load-libs, require, use, defmacro ns, refer-clojure, and alias |
| 23:54 | dale | I guess (use '[foo :as f :only y]) might be useful to only bring y into scope while leaving the rest of the namespace accessible through f. |
| 23:54 | devn | dale: yeah it's a chisel where use is a machete |
| 23:54 | devn | i think that you're explanation is correct |
| 23:58 | clizzin | dale, devn: pretty sure that's not what (use '[foo :as f :only y]) does; see http://clojuredocs.org/clojure_core/clojure.core/use#example_170 for a counterexample |
| 23:59 | clizzin | actually, that's the code snippet that first alerted me to the fact that you can have :as with use |