2012-01-04
| 00:05 | amalloy | someone did something like that. but it's very dangerous territory: you're abstracting over stuff that you really need to know/care about |
| 00:41 | technomancy_ | man, there's a lot of potential in clojuresphere |
| 00:43 | wingie | are there some cool products created with clojure? |
| 00:43 | wingie | and how do you think clojure compares to scala? |
| 00:44 | technomancy_ | clojurebot: scala? |
| 00:44 | clojurebot | {((x: Any, y: Any) => (f: Function2[Any, Any, Any]) => f(x, y))(1, 2)((x: Any, y: Any) => x)} |
| 00:44 | wingie | whats that? |
| 00:46 | technomancy_ | scala |
| 00:47 | wingie | dont get the example .. it's demonstrating the verbosity of it? |
| 00:47 | amalloy | i think the dramatic illegibility. like, i get haskell type signatures, but i can't even begin to guess what this means |
| 00:47 | technomancy_ | yeah, I have no idea |
| 00:48 | technomancy_ | my take-away is that scala is easier for Java people to learn because it lets them mix imperative OO and FP. |
| 00:48 | technomancy_ | and for some reason, some people think that's a good thing. |
| 00:48 | wingie | are there times you need oop in clojure? |
| 00:48 | wingie | its like js embracing oop and fp |
| 00:49 | wingie | could be a good thing? |
| 00:49 | wingie | who said fp fits for every situation |
| 00:49 | wingie | also if all langs were fp we would have missed oop :) |
| 00:49 | wingie | so good to be able to use whatever we want whenever we want perhaps |
| 00:49 | technomancy_ | well... if you can't see why that's bad maybe you should spend some time doing scala. |
| 00:50 | technomancy_ | or JS for that matter |
| 00:50 | wingie | im spending quite of an amount on js |
| 00:50 | wingie | but im still very new to programming in general |
| 00:50 | wingie | its due to the mutable states in objects? |
| 00:51 | wingie | *reading programming clojure* |
| 00:51 | technomancy_ | OO is a bunch of concepts bundled up together |
| 00:51 | wingie | perhaps it will give me some more hints |
| 00:51 | technomancy_ | some of them are good, but there's no reason to take them as a whole |
| 00:52 | wingie | couldnt you say that they make more sense for our mind? |
| 00:52 | fryguy | wingie: no |
| 00:52 | wingie | when you have robot .. he has a name .. he can do things etc |
| 00:52 | amalloy | you can say anything you want. the english language is very expressive |
| 00:52 | wingie | kinda like theatre |
| 00:52 | technomancy_ | OO is definitely more intuitive to people who have been trained in OO. |
| 00:53 | amalloy | same thing applies to mutable state. SICP goes forever without introducing any mutability and then is like "okay look, you can change things if you want. see how many of our existing concepts/rules this breaks?" |
| 00:55 | amalloy | but if you grew up thinking of programming as "do this, do that, now do this" then it feels "natural" to use mutation, and "restrictive" not to; as opposed to "natural" to program functionally and "world-breaking" not to |
| 00:55 | skelternet | wasn't OO's birth in SmallTalk supposed to be more around so-called message-passing and not so much function calls? That seemed like a big deal |
| 00:56 | amalloy | one of the things OO originally emphasized was immutability |
| 00:57 | wingie | amalloy: the former is imperative programming and the latter is functional programming? |
| 00:57 | amalloy | yes |
| 00:57 | technomancy_ | amalloy: eh? you mean kay? |
| 00:57 | amalloy | technomancy_: yeah |
| 00:58 | wingie | are there more styles than ip and fp? |
| 00:58 | amalloy | am i wrong? i've had trouble re-discovering his quote about that |
| 00:59 | technomancy_ | that's new to me |
| 01:01 | technomancy_ | oh dang |
| 01:01 | technomancy_ | I never realized what fnil was for |
| 01:01 | technomancy_ | but it's for implementing safe-inc |
| 01:02 | technomancy_ | whenever I do map-reduces to do counts I always have to (defn safe-inc [x] (inc (or x 0))), which is what fnil is for |
| 01:02 | technomancy_ | this concludes me being an idiot; back to your regularly-scheduled #clojure. |
| 01:02 | alexbaranosky | wingie, I've done a decent amount of Scala at work - I like Clojure better for various reasons, but you could do a lot worse than being "stuck" with Scala |
| 01:02 | amalloy | yeah, i love (fnil inc 0) |
| 01:04 | wingie | alexbaranosky: could you just name some of the reasons? |
| 01:06 | technomancy_ | I've only seen one person go the other way, (clojure -> scala) but that could also be explained by the relative size of the communities, so whatever. |
| 01:06 | alexbaranosky | wingie, I day try them both. |
| 01:06 | amalloy | technomancy_: http://programmers.stackexchange.com/questions/81197/what-did-alan-kay-mean-by-assignment-in-the-early-history-of-smalltalk is a pretty good thing on that topic |
| 01:06 | alexbaranosky | technomancy_, also the company you keep affects that perception I'm sure |
| 01:07 | technomancy_ | yeah, definitely |
| 01:07 | amalloy | right, probably anyone going from clojure->scala will have their relationship with technomancy_ degrade first, so that he never notices them leave |
| 01:07 | technomancy_ | amalloy: nah gnuvince still has the gall to hang out in #emacs; can you believe it |
| 01:07 | alexbaranosky | wingie, Scala is not dynamically typed, so depending on which side of the stat/dynamic argument you live you may like Scala or Clojure more, for example |
| 01:07 | technomancy_ | thanks for the link |
| 01:07 | amalloy | (cause how could you leave while you're still buddies with phil) |
| 01:08 | alexbaranosky | wingie, Scala is very object oriented - you could say 60% oo, 40% functional |
| 01:08 | amalloy | yeah, i feel the same. hindley-milner makes static types totally un-irritating |
| 01:08 | technomancy_ | alexbaranosky: wouldn't you say that is more a function of the codebase than the language? |
| 01:09 | alexbaranosky | wingie, Clojure is much less OO centric, maybe like 10% or something |
| 01:09 | wingie | alexbaranosky: oh thought it was not oo at all |
| 01:09 | technomancy_ | alexbaranosky: from what I gather there are lots of people trying to write Java in Scala and some people trying to write Haskell in Scala |
| 01:09 | alexbaranosky | technomancy_, to a degree, but in Scala even functions are objects |
| 01:09 | alexbaranosky | so I counted that :) |
| 01:09 | hiredman | https://twitter.com/#!/timbray/status/153996532952203264 |
| 01:09 | technomancy_ | heh |
| 01:10 | alexbaranosky | there's nothing in Scala keeping you from using simple collections: seqs, sets, maps etc |
| 01:10 | alexbaranosky | wingie, Scala even has a Haskell -like extension library called Scalaz that is pretty interesting to read through |
| 01:11 | technomancy_ | alexbaranosky: right; it seems like whether you do FP or OO in scala depends largely on what circles you find yourself in |
| 01:11 | amalloy | https://twitter.com/#!/dibblego/status/124946563494719488 is one of the ones i feel guilty for liking |
| 01:11 | wingie | i wished i had more time to delve into all these langs |
| 01:11 | alexbaranosky | wingie, I personally prefer Clojure because it is more concise, more lazy (in the man Im a lazy sunofabitch today way), easier to write more concise code with less duplication -- and I hate duplication |
| 01:12 | alexbaranosky | technomancy_, definately, at my work the code is OO in Scala |
| 01:12 | wingie | alexbaranosky: yeah im already in love with lisp |
| 01:12 | wingie | i have no reason at all using clojure over node.js atm but i can't stop reading and learning about it |
| 01:13 | amalloy | hiredman: wow, that list surely is a sign of disease |
| 01:13 | alexbaranosky | node js is js, so that's a reason :) |
| 01:13 | wingie | JS really sucks compared to Clojure |
| 01:13 | wingie | thats also a reason for using it =) |
| 01:14 | wingie | but then you would use CoffeeScript and a lot of uglyness is solved |
| 01:14 | wingie | and you quite enjoy writing it |
| 01:14 | technomancy_ | wingie: if you haven't read http://clojure.org/state you should at some point |
| 01:14 | wingie | i actually have |
| 01:14 | technomancy_ | oh, cool |
| 01:14 | alexbaranosky | oh yeah - Scala is more complicated than Clojure |
| 01:14 | technomancy_ | and then somewhere down the line you'll definitely want to read Out of the Tarpit as well |
| 01:14 | alexbaranosky | :) |
| 01:15 | wingie | is it worth learning Scala just to confirm Clojure is more pretty/concise? |
| 01:15 | hiredman | s/more complicated/less maintainable/ |
| 01:15 | technomancy_ | wingie: if you're interested in static types, it makes way more sense to pick up ocaml or haskell |
| 01:15 | technomancy_ | static types on the JVM are just not much fun. |
| 01:15 | wingie | technomancy_: in a way im fond of the jvm |
| 01:16 | technomancy_ | well, I mean if you're more interested in learning a good type system than Getting Stuff Done |
| 01:16 | wingie | im more to the latter |
| 01:16 | technomancy_ | to a lisper, the JVM just means giving up tight posix integration and fast boot time, but to a static typing fan it means giving up full type inference, which is huuuuuge. |
| 01:16 | wingie | i have some requirements a lang must "pass" to be worth learning it |
| 01:16 | amalloy | i've dabbled in haskell, and read several chapters of a scala book (serious credentials there). haskell just seems to have way fewer special cases and a more consistent worldview |
| 01:17 | wingie | one of them is it must be deployable .. preferable in Heroku |
| 01:17 | alexbaranosky | Scala's type system is really nice, but its type inference isn't as good as Haskell/Ocaml |
| 01:17 | wingie | and Heroku has support for Clojure, Scala, Ruby, Java, Node.js, Groovy and Python |
| 01:17 | wingie | no Haskell |
| 01:17 | technomancy_ | gonna need to lick my wounds a bit more before I revisit that one. =\ |
| 01:17 | amalloy | technomancy_: that's an ocaml thing? |
| 01:18 | technomancy_ | amalloy: yeah |
| 01:18 | alexbaranosky | amalloy, yeah, because Haskell isn't doing any OO so the language can be simpler |
| 01:18 | wingie | not even Cloud9ide has support for Haskell highlughting .. it seems that it's not that widely used they bothered to support it quickly .. perhaps later on |
| 01:18 | wingie | or not that hyped i should say? |
| 01:18 | amalloy | alexbaranosky: it actually has a ton of OO, it just can afford to think about it differently than java does; scala has to embrace java *and* pile on its own ideas |
| 01:18 | technomancy_ | wingie: these days you can deploy pretty much anything on heroku provided the compiler doesn't need to be installed on a systemwide level |
| 01:19 | technomancy_ | wingie: I've got an emacs lisp webapp at http://commodore-night-vision.herokuapp.com |
| 01:19 | technomancy_ | ocsigen's build is just batshit insane; it's definitely an outlier |
| 01:19 | alexbaranosky | amalloy: hasells got records, and typeclases, so it has polymorphism, butnot the kind of OO you see in Scala |
| 01:19 | alexbaranosky | not saying Im voting for Scala's OO :) |
| 01:20 | alexbaranosky | or maybe I'm forgetting something.... |
| 01:20 | amalloy | no, that's basically what i meant |
| 01:20 | wingie | technomancy_: hm how do you do that? |
| 01:20 | amalloy | i'm just saying that it's a mistake to say "OO" and mean "how java implements OO" |
| 01:21 | technomancy_ | wingie: here's the trick for elisp: https://github.com/technomancy/heroku-buildpack-emacs |
| 01:21 | technomancy_ | oh, apparently you can run ocaml: https://github.com/markpundsack/heroku-buildpack-opa just not ocsigen |
| 01:21 | amalloy | i guess inheritance is a fairly key part of OO, which haskell is kinda missing. but it does have interface inheritance in typeclasses |
| 01:23 | Twey | Haskell can do subtyping too, with HList |
| 01:23 | wingie | technomancy_: it's kinda a hack? |
| 01:23 | wingie | does original lisp implement oo? |
| 01:24 | wingie | i recall someone from lisp said he chose haskell since he wanna use oo sometimes |
| 01:24 | Twey | Enhh |
| 01:25 | Twey | You can do OO (for any of the many and poorly-defined values of ‘OO’) in Haskell, but generally you wouldn't, because it's just not something that makes a lot of sense in the programming model Haskell primarily enables |
| 01:25 | Twey | Not that it's not possible, it's just not very useful |
| 01:25 | Twey | Common Lisp, OTOH, has a great OO system |
| 01:25 | amalloy | wingie: http://www.winestockwebdesign.com/Essays/Lisp_Curse.html has an interesting point about object-orientedness in lisp, in the first few paragraphs |
| 01:25 | amalloy | the rest of the article is worth reading too, but isn't really relevant to your current questions |
| 01:26 | wingie | amalloy: seems like an intresteing read |
| 01:27 | wingie | ill read it before bed time |
| 01:27 | wingie | which is very soon |
| 01:28 | wingie | one thing that seems weird is the way it destructures a map |
| 01:29 | wingie | so I have this map: {:last-name "Vinge" :first-name "Vernor"} |
| 01:29 | wingie | and it is passed to this function: (defn greet-author-2 [{fname :first-name}] |
| 01:29 | wingie | wouldn't it be better doing: (defn greet-author-2 [{:first-name fname}] |
| 01:29 | wingie | coffeescript is doing like that |
| 01:30 | Twey | amalloy: That's a neat article |
| 01:30 | wingie | but i guess i could agree to the way clj is doing it |
| 01:31 | wingie | or no |
| 01:31 | wingie | it feels more natural with the coffeescript approach |
| 01:59 | wingie | what's the diff between (ns foo) and (in-ns 'foo) |
| 02:00 | raek | wingie: ns is a convenience macro for callin use, require, and import, but it also calls in-ns and refer-clojure for you |
| 02:01 | raek | but basically you use 'ns' to create a new namespace and 'in-ns' to enter an existing one |
| 02:02 | wingie | raek: ah thnaks |
| 02:02 | wingie | thanks |
| 02:03 | raek | not that if you have (ns foo (:refer-clojure :exclude [replace])) in foo.clj, require it and then use (ns foo) to enter the namespace in the repl, you will mess up replace in foo |
| 02:04 | wingie | seems to much info for me right now .. have to absorb it slowly by reading the book |
| 02:04 | raek | since (ns foo) does something like (ns foo (:refer-clojure :exclude [])) |
| 02:04 | wingie | but i know if there are same names they will be replaced |
| 02:05 | raek | wingie: this is a good guide: http://blog.8thlight.com/colin-jones/2010/12/05/clojure-libs-and-namespaces-require-use-import-and-ns.html |
| 02:06 | raek | I rarely use 'ns' in the repl at all, but I use it in every source file |
| 02:07 | raek | in emacs I can press C-c C-k followed by C-c M-p to load a namespace and cause the repl to be in it |
| 02:08 | raek | the equivalent clojure repl invokation would be (require 'foo :reload) (in-ns 'foo) |
| 02:15 | amalloy | or: (doto 'foo (require :reload) (in-ns)) |
| 02:16 | wingie | raek: thanks ill have a look in it |
| 03:34 | tsdh | Is it a bug (with no practical implications) that (= (gensym) 'G__1737) returns true for a wisely chosen symbol? |
| 03:44 | CmdrDats | hey guys, I need to connect to a server running swank with emacs from the outside - any pointers on how I should handle some kind of authentication/security so that it's not just an open port? |
| 03:47 | tsdh | CmdrDats: Why not ssh to the server and only connect locally? Then you can forbid connections from outside to the swank port. |
| 04:07 | CmdrDats | found this : http://a1k0n.net/2005/11/04/lisp-using-slime-over-ssh.html :D |
| 04:07 | CmdrDats | looks like i can make that work with clojure just fine |
| 04:12 | notsonerdysunny | CmdrDats: would you be able to post what you come up with on using slime over ssh? |
| 04:13 | CmdrDats | sure |
| 04:13 | notsonerdysunny | thanks CmdrDats |
| 04:15 | amalloy | tsdh: IMO yes. i wish gensyms worked like they do in CL |
| 04:16 | amalloy | notsonerdysunny: easy. call the two hosts Server and Client. on Server, lein swank. on Client: ssh -NfL 4006:localhost:4005 Server; (slime-connect localhost 4006) |
| 04:17 | amalloy | the tricky part is getting filename translation right when you do stuff like C-c C-k. i haven't really worked out how to do that, but there are definitely articles about it that appear to make some sense |
| 04:18 | tsdh | amalloy: Thanks, I agree. It might even get a real issue if one clojure process generates code that is loaded by another process later on... |
| 04:19 | amalloy | well you're never going to make that work |
| 04:20 | amalloy | there's a reason the CL reader barfs when it tries to read a form containing a gensym - it refuses because it might create a collision |
| 04:21 | tsdh | Really? I can read gensym-like looking symbols just find with SBCL. |
| 04:22 | notsonerdysunny | thx amalloy |
| 04:23 | amalloy | tsdh: hmmmmm. the behavior seems to be more complicated than i thought |
| 04:24 | amalloy | for example, (let ((#:G9518 1)) #:G9518) gives me an error on clisp |
| 04:24 | amalloy | but it's not a reader error, because i can evaluate '#:G9518 |
| 04:25 | tsdh | amalloy: Indeed, that doen't evaluate in SBCL, too. |
| 04:26 | tsdh | amalloy: (eq '#:G111 '#:G111) => NIL, which somehow explains it. |
| 04:27 | amalloy | ah. so when it reads them in it refuses to let them be eq to anything else |
| 04:27 | tsdh | Ok, so my code generation argument doesn't make sense with CL, anyway. |
| 04:29 | amalloy | right. if you want to serialize code as a string, you have to settle on names for the gensyms, and those can conflict |
| 04:30 | Fossi | either that or they would have to be more unique ;) |
| 04:30 | amalloy | but if you want to preserve the gensyms you can just write your own. instead of serializing '(fn [foo_1029] (inc foo_1029)), you can serialize it as '(let [foo (gensym)] `(fn [~foo] (inc ~foo))) |
| 04:30 | Fossi | afaik erlang creates unique identifiers even across machines |
| 04:31 | amalloy | you have to eval in any case, so all you have to do is be more explicit about the gensyms in the output code |
| 04:34 | tsdh | amalloy: Right. But in that case, the reading process will generate unique gensyms again, so that it's again only an issue if a user decides to use vars like G__1713. (I've heard rumors that programming physicists like to have hundreds of variables that are simply numbered. :-)) |
| 04:47 | fbru02 | hey guys ! what's the best way to eliminate for a vec the previous to last element ? |
| 04:55 | AWizzArd | fbru02: maybe subvec is what you want |
| 04:57 | fbru02 | AWizzArd: thanks let me tcheck that |
| 05:27 | blackbit | Are there any plans to add core.match to clojure? |
| 05:31 | jaley | hey guys. sorry... i've been reading the migration guide and i can't find the answer anywhere... where are the libraries formerly in contrib that didn't migrate to a modular library now? i'm looking for what was repl-utils |
| 05:34 | ejackson | jaley: a lot of that went into clojure.repl |
| 05:34 | ejackson | i think |
| 05:38 | fbru02 | what's the best way to cons something into a vector and get a vector back ? |
| 05:41 | jaley | ejackson: oh.. there's a clojure.repl... thanks! |
| 05:41 | ejackson | fbru02: conj |
| 05:42 | fbru02 | ejackson: and then reverse it ? |
| 05:42 | ejackson | fbru02: to do that you need to go via a seq |
| 05:43 | fbru02 | ejackson: yeah the thing is I want a vector and i want to add sth at the front |
| 05:43 | ejackson | fbru02: concat then |
| 05:44 | ejackson | ,(into [] (concat [1] [2 3 4])) |
| 05:44 | clojurebot | [1 2 3 4] |
| 05:44 | fbru02 | ejackson: awesome, thanks |
| 05:44 | ejackson | fbru02: careful about letting that get too long though, concat is dangerous |
| 05:45 | fbru02 | ejackson: no it will be small always |
| 05:45 | ejackson | you're good then |
| 05:48 | tscheibl | ,(concat [1] [2 3 4]) |
| 05:48 | clojurebot | (1 2 3 4) |
| 05:48 | ejackson | tscheibl: he wanted a vector back |
| 05:48 | tscheibl | yep I'm just testing |
| 05:48 | ejackson | :) |
| 05:49 | tscheibl | although I could do it in my own repl ;) |
| 05:49 | tscheibl | ,(apply conj [1] [2 3 4 5]) |
| 05:50 | clojurebot | [1 2 3 4 5] |
| 05:51 | tsdh | tscheibl: BTW, I've seen that clojure 1.4 added some eager, vector-returning variants of map, filter, reduce (mapv, filterv, reducev)... |
| 05:51 | tscheibl | tsdh: hey, cool |
| 05:51 | ejackson | that's interesting |
| 05:51 | tscheibl | ejackson: btw, the apply conj version is almost double speed of the into variant |
| 05:52 | ejackson | seriously ? |
| 05:52 | tsdh | tscheibl: Really? What clojure version? |
| 05:52 | tscheibl | yep.. just tried it out using (time) |
| 05:52 | tscheibl | 1.3 |
| 05:52 | tscheibl | ,(time (dotimes [c 10000] (into [] (concat [1] [2 3 4 5])))) |
| 05:52 | clojurebot | "Elapsed time: 133.842 msecs" |
| 05:53 | tscheibl | ,(time (dotimes [c 10000] (apply conj [1] [2 3 4 5]))) |
| 05:53 | clojurebot | "Elapsed time: 144.392 msecs" |
| 05:53 | tscheibl | hmm |
| 05:53 | tscheibl | at least in my repl on 1.3 |
| 05:53 | tsdh | tscheibl: Hm, in that version, into will use transients if possible. But the conversion from persistent to transient and back again doesn't make sense if the vector is that small... |
| 05:53 | tscheibl | ,(time (dotimes [c 100000] (into [] (concat [1] [2 3 4 5])))) |
| 05:53 | clojurebot | "Elapsed time: 485.379 msecs" |
| 05:53 | tscheibl | ,(time (dotimes [c 100000] (apply conj [1] [2 3 4 5]))) |
| 05:53 | clojurebot | "Elapsed time: 263.549 msecs" |
| 05:54 | tscheibl | ha |
| 05:55 | tsdh | tscheibl: Try into with some larger structures, and then it should be much faster than conjoining every item separately. |
| 05:55 | tscheibl | the difference in speed gets bigger the more repetitions I use |
| 05:55 | tscheibl | tsdh: ok |
| 05:59 | tscheibl | tsdh: hmm.. I've tried it with vectors of maps instead of scalars now... the apply version is still significantly faster |
| 06:01 | tsdh | tscheibl: Try this |
| 06:01 | tsdh | ,(let [v1 (vec (take 10000 (iterate inc 0))), v2 v1] (time (dotimes [_ 1000] (into v1 v2)))) |
| 06:01 | clojurebot | "Elapsed time: 1061.225 msecs" |
| 06:01 | tsdh | ,(let [v1 (vec (take 10000 (iterate inc 0))), v2 v1] (time (dotimes [_ 1000] (apply conj v1 v2)))) |
| 06:02 | clojurebot | "Elapsed time: 5778.755 msecs" |
| 06:02 | tsdh | Six times slower. |
| 06:04 | tscheibl | tsdh: ok.. so it depends on the size of the vector that becomes applied |
| 06:05 | tscheibl | anyway, the "into" version looks cleaner :) |
| 06:06 | tsdh | tscheibl: Yep. into creates a mutable (transient) vector for its first argument, into which additions can be performed more efficient. |
| 06:06 | tscheibl | and more concise |
| 06:06 | zilti | I have a problem with clj-time... I want to "(parse (formatters :date) (now))" but that doesn't work... :( |
| 06:11 | tscheibl | zilti: why would you want to do that? |
| 06:11 | zilti | tscheibl: I want to format the current date |
| 06:11 | tsdh | When chunking a seq in order to process chunks in parallel, is there some rule of thumb how many chunks to generate depending of the number of processors? |
| 06:12 | zilti | tsdh: One per virtual core I'd say would be the most efficient |
| 06:13 | tscheibl | zilti: wouldn't it be 'unparse' then? (unparse (formatters :date) (now)) |
| 06:14 | zilti | Oh. Indeed |
| 06:14 | tsdh | zilti: Hm, but then, if one chunk is processed earlier, its thread cannot pick up another chunk. |
| 06:15 | tsdh | zilti: So I'd say, it might be something like (* 2 N) or so... Well, I'll run some benchmarks... |
| 06:15 | zilti | tsdh: Yes, but a solution to that isn't that trivial... Maybe you'd have to look which other chunk is the longest and "cut" it... But it definitely will slow it down if you run the processing of two chunks on one core |
| 06:16 | zilti | because of the swapping |
| 06:18 | tsdh | zilti: I don't intend to activate more workers than I have cores. I just want to have enough chunks so that workers finishing early may pick up another one. |
| 06:19 | zilti | tsdh: Oh I see. |
| 07:01 | dbushenko | how is android support in clojure 1.3? |
| 07:41 | Fossi | dbushenko: i guess the same as before |
| 07:41 | dbushenko | :-) |
| 07:42 | Fossi | the bigger problem back then was clojure support for android |
| 07:42 | Fossi | ie functional languages that create loads of objects |
| 07:42 | Fossi | but i only tried the last time before the bigger garbage collection and jit improvements |
| 07:43 | Fossi | maybe also creating a 3d game in clojure wasn't such a great idea ;) |
| 07:44 | Fossi | as even java struggles a lot with garbage collection in that area |
| 07:44 | Fossi | basically the evengalist said: NEVER give the gc a chance to run, except inbetween levels :> |
| 07:59 | rabbler | I totally forgot the name of the unix tool to use instead of JLine… Can anyone remind me? Man, leave for vacation for a couple weeks and you forget a lot of stuff. |
| 07:59 | ejackson | emacs ? |
| 07:59 | ejackson | :P |
| 08:00 | rabbler | no. command line stuff. I'm not an emacs person, I've given up on that one for quite a while. |
| 08:00 | clgv | rabbler: try rlwrap |
| 08:00 | rabbler | that's it! |
| 08:00 | rabbler | thanks! |
| 08:00 | clgv | rabbler: see the clojure wikibook for an advanced setup |
| 08:01 | rabbler | And yeah, that's the site I was at before. It's all comin' back. |
| 08:01 | rabbler | 2 Clojure-Conj, 2 years and I still haven't done any dev with Clojure. Kick me. |
| 08:20 | tsdh | rabbler: Was that ok? |
| 08:20 | ejackson | tsdh: I was gonna too, but it seemed rude to add injury to insult |
| 08:21 | tsdh | :-) |
| 08:24 | rabbler | Heh, yeah. |
| 08:24 | rabbler | Been trying. I'm in my java, objective-c world. |
| 08:24 | rabbler | I want to dump the Java as much as possible. Can't really dump the Obj-C though. |
| 08:25 | AWizzArd | Emacs 24 with Slime under Windows: I have problems with german umlauts. For example (println (char 252)) ==> Debugger entered--Lisp error: (end-of-file) byte-code("\302\30\"\210\303\304\"\210\300\30\"\207" [error process debug slime-net-close t "net-read error: %S"] 3) see http://paste.lisp.org/display/126859 for the full output. |
| 08:25 | AWizzArd | Ideas? |
| 08:26 | AWizzArd | I can not continue to work. I first have to M-x slime-disconnect and then M-x slime-connect RET RET again. |
| 08:42 | solussd | where did clojure.contrib.io go? |
| 08:42 | AWizzArd | solussd: try clojure.java.io |
| 08:42 | solussd | thanks |
| 08:57 | TimMc | ~where did contrib go? |
| 08:57 | clojurebot | well... it's a long story: http://dev.clojure.org/display/design/Where+Did+Clojure.Contrib+Go |
| 08:57 | TimMc | solussd: ^ |
| 08:57 | TimMc | That's as complete a list as you'll find. |
| 08:57 | solussd | thanks- I've been looking for that. |
| 09:11 | ejackson | what do I need to be able to refer to a protocol from another namespace ? |
| 09:16 | TimMc | ejackson: You should be able to just require/use it, yeah? |
| 09:16 | TimMc | Unless there's also something to import. Does a protocol create a Java interface? |
| 09:17 | ejackson | i know you have to import records, and thats working |
| 09:17 | ejackson | unsure about protocols |
| 09:20 | mcrittenden | would someone mind giving me a hint on http://www.4clojure.com/problem/23 ? I got here https://gist.github.com/1560238 but it throws an error and I just realized conj doesn't always add to the beginning anyway |
| 09:20 | ejackson | its weird, I can extend my type, it finds the protocol in the other namespace, but then when I try to use it, it says there's no implementation |
| 09:21 | rabbler | mcrittenden: conj will add to the tail on vectors and the head on lists. |
| 09:21 | mcrittenden | rabbler right, so I feel like conj must not be the right solution here |
| 09:22 | rabbler | if you want it at the head, all the time, you can use cons. |
| 09:22 | rabbler | but, that is not efficient on vectors… but, again, if you want it, you have it. |
| 09:23 | ejackson | aaah, I see, when you call the method from the other namespace, you need to fully qualify it (using :require not :use for that namespace) |
| 09:25 | mcrittenden | hmm ok so now it's just an issue of debugging the error. thanks |
| 09:25 | mcrittenden | rabbler: I'm not very concerned with efficiency on a puzzle like this |
| 09:26 | rabbler | mcrittenden, I understand. Just throwing it out there. |
| 09:26 | mcrittenden | rabbler: oh sure thing, I appreciate the tip for sure |
| 09:26 | rabbler | I've only done 70 problems on 4clojure so far. |
| 09:27 | rabbler | mcrittenden Really makes me feel like a moron when I am doing those problems! |
| 09:27 | mcrittenden | rabbler: haha that makes me feel better. i'm just getting started with clojure but I figured I'd at least make it past the "easy" questions without getting stumped |
| 09:29 | rabbler | mcrittenden, hint: You are trying to call a function when you do this: (coll) |
| 09:30 | mcrittenden | rabbler: that plus i had the params reversed for (cons ...). this worked: https://gist.github.com/1560282 |
| 09:31 | mcrittenden | thanks again for the help! |
| 09:32 | rabbler | mcrittenden: cool. |
| 09:51 | clgv | mcrittenden: you can have that shorter with one reduce only ;) |
| 09:52 | mcrittenden | clgv how do you mean? |
| 09:52 | clgv | you might have a look at my solution overthere ;) |
| 09:53 | mcrittenden | clgv whoa, interesting |
| 09:54 | mcrittenden | amalloy's solution is just: into() |
| 09:54 | mcrittenden | into () |
| 09:54 | mcrittenden | weird stuff |
| 09:54 | clgv | mcrittenden: in fact I could skip the anonymous function for a better golf score |
| 09:54 | clgv | mcrittenden: lol yeah, I didnt know the into was implemented like that at this time ;) |
| 10:07 | minikomi | hi there |
| 10:10 | minikomi | I'm working through 4clojure .. I keep using loop/recur eg. https://gist.github.com/1560424 |
| 10:12 | clgv | minikomi: you could do that very concise the lazy way as well. |
| 10:12 | minikomi | oh? do you mind editing the gist to give me nudge in the right direction? |
| 10:12 | koeien | i used a solution that iterates the function fn [[x y]] [y (+ x y)] |
| 10:13 | minikomi | haven't wrapped my head around laziness yet |
| 10:13 | clgv | minikomi: did you solve it already? |
| 10:13 | minikomi | well, that gist was my solution and it gave me all green |
| 10:14 | clgv | minikomi: the you can just "follow" me (click at the users list) to see my solutions. |
| 10:14 | minikomi | ok, no problem |
| 10:14 | minikomi | same user name ? |
| 10:14 | clgv | yes |
| 10:16 | minikomi | hmm. will have a play with it in the REPL. Thanks! |
| 10:18 | clgv | minikomi: if the problem has something sequency then there is a chance the lazy way (map&co, lazy-seq) is the best choice |
| 10:18 | koeien | lazy-seq automatically interleaves the computation? |
| 10:18 | koeien | even if i use a tail-recursive function? |
| 10:19 | minikomi | thanks. |
| 10:20 | clgv | koeien: with lazy-seq you can return the "current" seq element and do the a <- b, b <- a+b switch in the function call that is used for the next seq element |
| 10:20 | minikomi | map / reduce I have some bearing of coming from ruby, but i often fall back on loops when I get stuck |
| 10:20 | koeien | clgv: i'll play around with it, i come from haskell so it's a bit confusing to see what's strict and what's lazy |
| 10:21 | clgv | koeien: only seqs are lazy ;) |
| 10:27 | zilti_ | Is there a page which lists the contents of *request* from Ring? |
| 10:29 | bsteuber | any cljs experts here? I got similar problems to http://groups.google.com/group/clojure/msg/13048df8108e3f64 |
| 10:30 | bsteuber | only :optimizations nil works for me |
| 10:46 | flashingpumpkin | hey guys. I'm curious if someone went to the lengths to port penumbra to clojure 1.3. I can't really find something on the list and github doesn't look like it too. |
| 10:48 | flashingpumpkin | it's making use of a lot of contrib packages - I guess refactoring that is the biggest hurdle, non? |
| 11:26 | Kvaks | Newb-question here: I want to use a str-utils function, and have added 'org.clojure/clojure-contrib "1.2.0"' to dependencies and run 'lein deps'. The contrib jar gets downloaded to lib/ and I can see some contrib-stuff in the repl, but no str-utils. Any idea what I'm doing wrong? (I'm using emacs/slime/swank/leiningen.) |
| 11:27 | zilti_ | ~where did contrib go? |
| 11:27 | zilti_ | ~where did contrib go? |
| 11:27 | clojurebot | well... it's a long story: http://dev.clojure.org/display/design/Where+Did+Clojure.Contrib+Go |
| 11:28 | Kvaks | Thanks, I'll look at that. |
| 11:33 | Raynes | Kvaks: What function from str-utils do you want? |
| 11:34 | Raynes | The old Clojure Contrib was deprecated in favor of splitting the libraries into individual libraries, so you don't want to use clojure contrib like that anymore. However, str-utils was deprecated long before that. There is a new namespace built into Clojure with most of the things from the old string utility libraries. clojure.string. Chances are what you want is there. |
| 11:37 | Kvaks | Raynes: I'm realizing that the book/tutorial I'm reading is slightly outdated, yes. :-) |
| 11:42 | wingie | Kvaks: what bootk ar you reading? |
| 11:43 | wingie | im reading "Programming Clojure" from 2009 and I can't include the re-split |
| 11:43 | Kvaks | wingie: Same book here. |
| 11:44 | wingie | Kvaks: what page are you at? |
| 11:44 | wingie | we can do "pair learning" |
| 11:44 | wingie | :) |
| 11:44 | Kvaks | Hehe. :) |
| 11:44 | Kvaks | Page 50-60. |
| 11:46 | wingie | im at 65 =) |
| 11:47 | solussd | are there clojure conj videos from this year? |
| 11:48 | Bronsa | not yet AFAIK |
| 11:48 | wingie | http://blog.8thlight.com/colin-jones/2010/12/05/clojure-libs-and-namespaces-require-use-import-and-ns.html |
| 11:48 | wingie | why doesn't (require 'clojure.string) works? |
| 11:48 | wingie | as in the example |
| 11:50 | wingie | oh it works now .. i messed up my repl and had to restart it |
| 11:53 | wingie | are there times you are using java libs from clojure? |
| 11:53 | wingie | and what kind of libs/classes are you using then? |
| 11:55 | jodaro | wingie: are you asking in general? |
| 11:55 | wingie | yeah |
| 11:56 | wingie | wanna know what kind of java code i would wanna use |
| 11:56 | cgray | there's lots and lots of java code out there... it's kind of a hard question to answer |
| 11:56 | jodaro | yeah, depends on what you are trying to do |
| 11:57 | jodaro | but if you happen to have a problem that is already solved by some java library or framework |
| 11:57 | jodaro | often you can either use it directly or write a thin clojure wrapper over it |
| 11:57 | jodaro | thats one of the main strengths of the language |
| 11:57 | jodaro | you don |
| 11:57 | jodaro | 't have to start from scratch |
| 11:58 | jodaro | (though sometimes its more fun to) |
| 11:59 | wingie | jodaro: could you give me some examples of java code that are good to use |
| 11:59 | cgray | really stateful java can be tough to use, and I've seen some java that calls System.exit() on error, which is obviously pretty bad |
| 11:59 | wingie | if someone asked me why coffeescript is js compatible i would for example say now you can use ExtJS, Sproutcore, Underscore, Mocha, Vowsjs and some other js libs |
| 12:00 | zilti | clojurescript! |
| 12:00 | wingie | cgray: seems not that beautiful to use java from clojure |
| 12:01 | zilti | wingie: It's as beautiful as possible |
| 12:01 | zilti | imo |
| 12:01 | wingie | perhaps another strength is that it could be run in jvm |
| 12:01 | jodaro | i think you get used to it |
| 12:01 | joly | I've seen Clojure code using Swing, logging frameworks, etc. Most Java libraries should be usable from Clojure. |
| 12:01 | wingie | so performance boosts in jvm to speed up other langs would benefit clojure as well |
| 12:01 | jodaro | and like i said, you can always wrap your java usage up and put it in a dark corner of the codebase |
| 12:01 | jodaro | so no one has to see/smell it |
| 12:02 | wingie | yeah |
| 12:02 | wingie | wrap it up! |
| 12:05 | koeien | i would like to parse a file format in clojure. what is the recommended way / library of doing this? |
| 12:06 | TimMc | koeien: Binary format? |
| 12:06 | koeien | no, text-based |
| 12:06 | koeien | use ANTLR and java bindings? or is there a reasonably efficient port of Parsec? |
| 12:07 | TimMc | OK, there are several parsing libs out there. fnparse and parsley come to mind, although you'll have to check on their maturity/maintenance activity. |
| 12:07 | zilti | There is a jparsec |
| 12:10 | koeien | thank you for your pointers. |
| 12:13 | wingie | a var is a global variable with a value. a var is bound to a symbol to access it's value? |
| 12:14 | wingie | please confirm that |
| 12:14 | wingie | a local is a local variable. just like the above one but just for a local scope? |
| 12:19 | vivekn | Hi, is there any good VoIP library for clojure? I want to implement audio conferencing between multiple clients. |
| 12:20 | pbuckley | wingie: I think you have that right, but I'm far from an expert |
| 12:21 | rabbler | wingie: Just to clarify locals aren't 'variables'. They cannot change. |
| 12:21 | rabbler | but you can change a def. |
| 12:23 | zilti_ | vivekn: You'll have to use a java library |
| 12:23 | vivekn | oh,do you have any suggestions? |
| 12:24 | pbuckley | rabbler: but you can re-use and change the value of a local within a let binding, correct? |
| 12:25 | pbuckley | ,(let [f (+ 3 4) |
| 12:25 | clojurebot | #<ExecutionException java.util.concurrent.ExecutionException: java.lang.RuntimeException: EOF while reading> |
| 12:25 | rabbler | That doesn't change the value. The value cannot change in that scope. |
| 12:25 | pbuckley | ,(let [f (+ 3 4) f (+ f 5)] (println f)) |
| 12:25 | rabbler | So, you set the value. But you cannot alter it. |
| 12:25 | clojurebot | 12 |
| 12:25 | pbuckley | I can set it multiple times, referring to the old one |
| 12:25 | Raynes | It looks like change, but in reality you're just creating a new thing. |
| 12:25 | pbuckley | right, but I'm always referring to the newest thing |
| 12:26 | pbuckley | the old thing can't be referred to once the new thing is there |
| 12:26 | Raynes | So? |
| 12:26 | zilti_ | vivekn: No, I'm sorry. |
| 12:26 | pbuckley | so it looks like it changed |
| 12:26 | Raynes | That's because you can't refer to two things by the same name in the same scope. |
| 12:26 | wingie | rabbler: right |
| 12:27 | pbuckley | it just seems like meaningless semantics in the context of setting a symbol to a new value in the same let binding |
| 12:27 | pbuckley | for all intents and purposes, the value the symbol points to, "has changed" |
| 12:28 | wingie | isn't it true for a var too? you are just setting a new value and it's unchanged? |
| 12:28 | pbuckley | even though under the covers where you can't access anything, it hasn't actually "changed" |
| 12:28 | pbuckley | wingie: I think so |
| 12:28 | jcrossley3 | what's the recommended clojure library for rabbitmq? google's telling me to use the java one. |
| 12:28 | wingie | but why is it called variable then? |
| 12:28 | wingie | if it cannot change |
| 12:28 | wingie | since someone said local can't be changed, i assumed that a variable is changeable then |
| 12:28 | antares_ | jcrossley3: I am obviously biased but https://github.com/michaelklishin/langohr is probably by the fast best right now |
| 12:29 | rabbler | wingie: its not called a variable. It's called a local. It's a val, not a var. |
| 12:29 | pbuckley | rabbler: he's asking about vars now, set with def |
| 12:29 | antares_ | jcrossley3: "the best" as in, feature-complete, well maintained, developed by someone who has been using rabbitmq for 3 years |
| 12:29 | Raynes | rabbler: He isn't talking about locals. |
| 12:29 | pbuckley | like, why are they called vars, if they can't change |
| 12:29 | rabbler | sorry. |
| 12:29 | rabbler | heh. |
| 12:30 | wingie | np |
| 12:30 | wingie | anyone knows the answer for that one? |
| 12:30 | Raynes | http://clojure.org/vars |
| 12:31 | Raynes | A var is mutable. You change it *in place*. You don't create a new one. |
| 12:31 | jcrossley3 | antares_: thanks. do you think that's the one most people use? |
| 12:32 | antares_ | jcrossley3: there is no single Clojure client that most people use |
| 12:32 | zilti_ | ,(.split "Hello World" " ") |
| 12:32 | clojurebot | #<String[] [Ljava.lang.String;@171c6d6> |
| 12:32 | zilti_ | huh |
| 12:32 | pbuckley | Raynes: so if the locals aren't mutable, when I set "f" twice in a let binding, I'm taking up two slots in memory, is that the impact? |
| 12:32 | antares_ | jcrossley3: and as congomongo demonstrates, what most people use can actually be quite crappy :) |
| 12:32 | zilti_ | ,(println (.split "Hello World" " ")) |
| 12:32 | clojurebot | #<String[] [Ljava.lang.String;@1add89d> |
| 12:33 | Raynes | zilti_: That's a Java array. You can work with it like a normal seqable object. If you want to look at it in a pretty way in the REPL, you can do ##(seq (.split "Hello, World!" " ")) |
| 12:33 | lazybot | ⇒ ("Hello," "World!") |
| 12:33 | antares_ | zilti_: maybe use (vec …) |
| 12:33 | zilti_ | What am I doing wrong? All I know is that I did it right five minutes ago |
| 12:33 | cgray | ,(clojure.string/split "Hello world" #" ") |
| 12:33 | jcrossley3 | antares_: ha! is it fair to say most people use the java client directly from clojure? (just based on what google tells me) |
| 12:33 | clojurebot | #<ExecutionException java.util.concurrent.ExecutionException: java.lang.RuntimeException: java.lang.ClassNotFoundException: clojure.string> |
| 12:33 | cgray | ,(require 'clojure.string) |
| 12:33 | clojurebot | nil |
| 12:33 | cgray | ,(clojure.string/split "Hello world" #" ") |
| 12:33 | clojurebot | ["Hello" "world"] |
| 12:34 | Raynes | pbuckley: I imagine the old value would be garbage collected, since it isn't used anymore after you've created the new binding. |
| 12:34 | pbuckley | Raynes: thanks |
| 12:34 | Raynes | But I'm not the one to talk to about memory semantics. |
| 12:34 | antares_ | jcrossley3: many people do and langohr is actually a really small library that makes that easier. It very much follows Java client API conventions and AMQP model in general (http://rubyamqp.info/articles/amqp_9_1_model_explained/) |
| 12:35 | antares_ | jcrossley3: but the fact of the matter is, there is a dozen of incomplete rabbitmq clients that seemingly were developed by people who did not understand AMQP 0.9.1 very well, so they invented all kinds of weird APIs and terminology that confuses everyone on the mailing list |
| 12:36 | jcrossley3 | antares_: understood. thanks for the perspective! |
| 12:36 | Vinzent | Hi. Why this line of code (-> url (client/get {:as :byte-array}) :body ByteArrayInputStream. xml/parse) doesn't work? client is clj-http.client and xml is clojure.xml. With standard parser it just hangs forever |
| 12:37 | Raynes | pbuckley: I mean, there is a meaningful difference here. You have a value bound to x. You create a new value and bind it to x. This value is completely independent of the old value of x, but there can't be two of them so the newer one shadows the first one, simulating change. You can't (set! x "newval") or anything like that. You can't loop over it and change it in place (unless it is bound to something mutable like a ref, atom, etc) |
| 12:37 | Raynes | for example. |
| 12:37 | zilti | Oh I love broken routers |
| 12:40 | pbuckley | Raynes: I think I get it - there is meaningful difference beyond the semantics, but in my limited time using clojure, I haven't needed to go beyond simulating change, and so the semantic difference is my "childish" understanding at this point |
| 12:40 | antares_ | jcrossley3: if you decide to use langohr, I am in #rabbitmq to answer your questions |
| 12:45 | wingie | what are the use cases for threading? |
| 12:47 | wingie | i wanna know when i benefit from using clojure (support for multi threading) instead of node.js (single threaded) as backend server for my web app |
| 12:49 | licenser | wingie: node.js is no fun (my 2 cent) closures biggest benefit is that you write lisp instead of JS |
| 12:50 | zilti | Ok so what's the recommended way of splitting a string, since (.split "Hello World" " ") doesn't work correctly (even if it should)? |
| 12:50 | wingie | the weakest point of js is also the strongest |
| 12:50 | Raynes | zilti: That works fine. |
| 12:50 | Raynes | zilti: Why do you think it isn't working? |
| 12:50 | licenser | wingie: horrible variable scoping? |
| 12:50 | zilti | ,(println (.split "Hello World" " ")) |
| 12:50 | wingie | using node.js i am using js full stack |
| 12:50 | clojurebot | #<String[] [Ljava.lang.String;@4fe2b3> |
| 12:50 | cgray | ,(clojure.string/split "Hello world" #" ") |
| 12:50 | clojurebot | #<ExecutionException java.util.concurrent.ExecutionException: java.lang.RuntimeException: java.lang.ClassNotFoundException: clojure.string> |
| 12:50 | cgray | ,(require 'clojure.string) |
| 12:50 | clojurebot | nil |
| 12:50 | cgray | ,(clojure.string/split "Hello world" #" ") |
| 12:50 | clojurebot | ["Hello" "world"] |
| 12:50 | Raynes | zilti: It is a Java method. It returns a Java array. There is nothing wrong with that. |
| 12:50 | licenser | wingie: with noir and noir-cljs you can too with clojure :) |
| 12:50 | wingie | but that was not the question .. how do i benefit from multithreading? |
| 12:50 | licenser | which is pretty amazing |
| 12:51 | wingie | in a web server |
| 12:51 | zilti | Used inside Java, String.split doesn't return an _array_ |
| 12:51 | technomancy | clojurebot: same language on client and server? |
| 12:51 | clojurebot | No entiendo |
| 12:51 | licenser | wingie: if you run only one instance of node.js and it really only runs 1 thread you benefit hugely |
| 12:51 | licenser | but I am not a expert on node.js's inner workings |
| 12:51 | licenser | more threads mean more core can in parallel answer more requests |
| 12:51 | technomancy | clojurebot: using the same language on the client and server is not a big deal: http://blog.ianbicking.org/2011/03/30/js-on-server-and-client-is-not-a-big-deal/ |
| 12:51 | clojurebot | In Ordnung |
| 12:51 | licenser | it is a no tradeoff scaling |
| 12:51 | Raynes | zilti: http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/String.html#split(java.lang.String) |
| 12:52 | TimMc | zilti: It absolutely does. |
| 12:52 | Raynes | zilti: You're splitting a string. You need a collection of the split pieces. That's what you've got. The problem is that you're trying to print a Java object, but it doesn't look the way you expect it to because it is a Java object. If you want to look at it in the Clojure seqy way, call seq on the result. In practice, unless you plan on printing it for some reason, you don't need to. |
| 12:52 | Raynes | &(first (.split "Hello, World" " ")) |
| 12:53 | lazybot | ⇒ "Hello," |
| 12:53 | licenser | but wingie I would imagine that node.js will spawn multiple acceptors for your cores right? |
| 12:53 | Raynes | &(seq (.split "Hello, World" " ")) |
| 12:53 | lazybot | ⇒ ("Hello," "World") |
| 12:53 | Raynes | It is doing exactly what you want. |
| 12:53 | cgray | Raynes: what's wrong with clojure.string/split ? |
| 12:54 | TimMc | &(apply str (interpose " " (.split "Hello, world!" " "))) |
| 12:54 | lazybot | ⇒ "Hello, world!" |
| 12:54 | Raynes | cgray: It is utterly unnecessary. |
| 12:54 | zilti | That's what happens if you haven't programmed for two months |
| 12:54 | licenser | Raynes: i disagree |
| 12:54 | licenser | I find calling object functions the last resort |
| 12:55 | Raynes | There is nothing wrong with it if you already have clojure.string imported or have some other reason for using it, but there is no good reason to use it over .split in this case. |
| 12:55 | Raynes | Especially in this case, since he didn't understand what was going on. clojure.string dances around the problem. |
| 12:56 | wingie | technomancy: that author just knows nothing about it |
| 12:56 | wingie | "I’ve used it a little" |
| 12:56 | wingie | it seems like that |
| 12:56 | Raynes | Didn't you recently point out that you are new to programming? |
| 12:57 | wingie | but i have used node.js pretty long |
| 12:57 | wingie | and am building a serious web app with it .. i just hate posts when people write since they are biased |
| 12:57 | licenser | wingie: will node js spawn multiple 'workers' for all of your cores? |
| 12:57 | TimMc | zilti: Haha, sorry to jump on you. |
| 12:57 | technomancy | he has a really good point that the difficulty is not in learning a new language, it's in learning a new runtime. |
| 12:57 | wingie | licenser: chill im not tryng to start a war |
| 12:57 | wingie | but we can all be more objective |
| 12:57 | licenser | wingie: no I am seriously curios |
| 12:57 | technomancy | I know Clojure backwards and forwards, but I can't do crap in ClojureScript because I don't know anything about the browser or node. |
| 12:58 | mcrittenden | wingie what's a situation where it's useful to use the same language client-side and server-side? curiousity question |
| 12:58 | licenser | I don't know the answer hence me asking :) |
| 12:58 | wingie | licenser: no it wont |
| 12:58 | wingie | or |
| 12:58 | TimMc | mcrittenden: It's fantastic for enforcing input constraints. |
| 12:58 | technomancy | whereas even though I didn't know Mirah at all, it was super-easy for me to code up a couple apps in it since I knew the JVM already. |
| 12:58 | wingie | js is single threaded .. so i guess its not the same as using clojure |
| 12:58 | licenser | I see but the benefit you get from clojure is that you get this kind of scaling for free instead of needing to do it by hand |
| 12:58 | TimMc | mcrittenden: Ever run into a site that had different notions of how a credit card field should be formatted in its server and client code? |
| 12:59 | wingie | but what i reacted on that post was that he just said "it won't help you" .. it _really_ helps you to share code |
| 12:59 | licenser | wingie: for 95% of all web apps the app itself is single threaded more threads only mean more req/s but spawning more servers does the same more or less (plus some memory overhead) |
| 12:59 | mcrittenden | TimMc usually in that case you use a jquery form validation lib with a custom vali rule client-side, and that doesn't help you much server-side, no? |
| 12:59 | wingie | and obviosuly he doesnt know how/why to share code |
| 12:59 | technomancy | TimMc: the article makes a really good point about how server-side validation is all about security and enforcing a formal model, while client-side validation is purely a UX concern |
| 13:00 | technomancy | the overlap is superficial |
| 13:00 | TimMc | mcrittenden: The problem is keeping the two consistent so you don't piss off your users. |
| 13:00 | TimMc | making it easy to be correct, not just possible. |
| 13:01 | wingie | mcrittenden: same general libs that don't care about server or client side envs eg underscore and sugarjs .. those don't have to be changed at all since they are pure functions |
| 13:01 | technomancy | if you want to talk about validation, we already have the same language running client-side and server side: regular expressions. |
| 13:02 | wingie | then there are libs that have same code base but behave differently .. eg. testing suites like mocha |
| 13:02 | mcrittenden | wingie: you've been in a situation where it was useful to use those libs both client-side and server-side? |
| 13:02 | TimMc | technomancy: "Sorry, your field did not match the regex. Please try again." |
| 13:02 | wingie | in node.js you run the tests in cli .. in browser it uses the dom .. but the testing code is the same .. means reusablility |
| 13:02 | TimMc | and they're still dual-homed. |
| 13:02 | technomancy | TimMc: did you read the article? the purpose of server-side validation is totally different from client-side |
| 13:03 | wingie | mcrittenden: yeah .. im using underscore on client and server |
| 13:03 | TimMc | technomancy: Yes, I've read the article, and I think that point is misleading. |
| 13:03 | mcrittenden | wingie: interesting. not open source by any chance is it? |
| 13:03 | TimMc | technomancy: Server requirements trickle down to the client and need to be communicated. |
| 13:03 | Raynes | I <3 validation. I remember trying to get a redbox kiosk to accept my raynes.me email address. Apparently it doesn't understand those kinds of emails. |
| 13:04 | wingie | one unconvenient way was to serve a js file to browser and then npm install it for node.js |
| 13:04 | wingie | but a trend is now to use browserify |
| 13:04 | wingie | you npm install it..and it will be used on both browser and server .. no more file split |
| 13:04 | technomancy | "this field needs to match this pattern" is data, you don't need to share a turing-complete language to share it. |
| 13:05 | wingie | you update it with npm and the browser will get the new version too |
| 13:05 | TimMc | technomancy: Your grandparents are gonna have a fun time using your websites. |
| 13:05 | wingie | technomancy: yeah i agree on reg exps |
| 13:05 | wingie | keep it simple is good |
| 13:05 | wingie | but there are more |
| 13:05 | wingie | benefits from sharing the same lang |
| 13:05 | licenser | TimMc: I don't think his grandparents will know the internet as we know it |
| 13:05 | wingie | another is that you can move forward fast |
| 13:06 | TimMc | "Your username did not match /[a-z0-9_-]{3,20}/i, please try again." |
| 13:06 | zilti | npm? browserify? *confused* |
| 13:06 | wingie | eg. just remembering one lang syntax, eco system .. which gives you focus and speed .. (i know you wanna learn more langs but we are talking about dev speed for you app now) |
| 13:06 | mcrittenden | npm = node package manager, sort of like leiningen for node |
| 13:07 | wingie | and if you are hiring people you can just hire good js people |
| 13:07 | technomancy | one language, two runtimes |
| 13:07 | wingie | not having to have an add "we need js devs .. would be good if you knew clojure" |
| 13:07 | technomancy | guess which is more difficult to learn? |
| 13:07 | TimMc | complecting some topics here |
| 13:08 | zilti | technomancy: JS? |
| 13:08 | wingie | technomancy: just saying that post was not very fair at all .. a typical post i wouldn't even post in irc .. gives no value |
| 13:08 | technomancy | zilti: JS or Clojure/Clojurescript; the fact remains. it's much easier to learn a new language on the same runtime than a new runtime for the same language. |
| 13:08 | wingie | you could attack it more objectively |
| 13:08 | licenser | probably your add 'need closure devs' will spawn less but more skilled results then 'we need js devs' (not saying bad things about them but there are way more want-to-be people in the JS world I think) |
| 13:09 | wingie | eg. if clojure could be used on both ends .. would people that loved clojure say it was a bad thing? |
| 13:09 | wingie | no |
| 13:09 | TimMc | technomancy: What does "a new language on the same runtime" have to do with the price of tea in China? |
| 13:09 | licenser | wingie: it can ^^ look at clojurescript |
| 13:09 | wingie | if you don't like js then its better to just say js sucks and i dont want to work with it .. but don't attack the benefits of using the same lang on both ends |
| 13:09 | wingie | its powerful and saves time |
| 13:10 | zilti | technomancy: I'd say it's harder to switch from one programming paradigm to another |
| 13:10 | TimMc | I don't know what you;re trying to compare. |
| 13:11 | wingie | licenser: yeah yyou are right .. that is a good thing about clojure .. but there are kick ass devs using node.js too |
| 13:12 | wingie | licenser: im doing a serious web app with extjs and sproutcore .. need to use js for it |
| 13:12 | licenser | wingie: don't say they aren't but there is a bigger pool of people meaning also a wider spread, clojure is pretty esoteric compared to JS, and that in my experience attracts the upper scale of devs (or the crazy ones :P) |
| 13:13 | wingie | yeah i agree |
| 13:13 | wingie | why im here =) |
| 13:13 | licenser | ^^ crazy? :P |
| 13:13 | licenser | just kidding mate |
| 13:13 | wingie | just saying node.js/browser is a good fit .. but that's that |
| 13:14 | licenser | I personally aint' a big fan of javascript, I find it ends up in a mess most of a time but hey that just as well can be my lack of experience |
| 13:14 | licenser | fortunately I found my way out of the mess ^^ |
| 13:15 | wingie | its solid to say clojure > js |
| 13:15 | licenser | I won't go so far I'd say for me clojure > js |
| 13:15 | wingie | nah it is |
| 13:16 | wingie | js was created in 10 days |
| 13:16 | wingie | just to give more flashy experience |
| 13:16 | TimMc | Created under a marketing deadline. Bad news. |
| 13:16 | mcrittenden | ad hominem! |
| 13:16 | licenser | I've seen people do amazing things with js, so one situation where my dislike for js was solidified was when a friend of me showed me some of his code and was all like 'look how beautiful and pure this code is' and I was close to vomiting, I still don't understand all of it since it is so spagetified |
| 13:16 | TimMc | Not terrible for what it is, though. |
| 13:17 | wingie | yeah .. people need to learn proper programming before writing big apps |
| 13:17 | wingie | (me) |
| 13:18 | wingie | talking about langs are okay but saying same lang on both ends is bad just because you dont like js is chilidsh |
| 13:18 | mcrittenden | anyone feel like giving me a hint on http://www.4clojure.com/problem/52 ? specifically, I don't understand what that let is doing, with the (range) in there |
| 13:18 | technomancy | wingie: I'm not saying it's unique to JS |
| 13:18 | licenser | today I tried to help a colleague with a bit of JS for a web fronted he used jQuery and was generating a table that was like 50 rows with combo boxes in each row and some stuff and it took between 1 and 0.5s to build that |
| 13:18 | licenser | it really shocked me |
| 13:18 | technomancy | I'm saying the same thing applies to clojure/clojurescript |
| 13:18 | cgray | for me, the worst thing about the linked article is how general it is. since he's talking about js, everyone assumes client means browser and server means web server, but imagine if client meant ssh client and server meant ssh server. why on earth would you not want to write both of them in the same language? |
| 13:19 | wingie | technomancy: yeah its not ideal .. yet |
| 13:19 | wingie | some problems before in node.js/browser land is now slowly going away |
| 13:19 | TimMc | I mostly agree with technomancy's broader point: A language is designed for a runtiome, and the same code may not be sane for both runtimes at the same time. |
| 13:19 | technomancy | that doesn't mean clojurescript is useless; it's not just some magic code-sharing dust you can sprinkle on your app to not have to think differently in different contexts |
| 13:19 | licenser | clojurescripts biggest downside is the complexity to get it to work properly |
| 13:19 | wingie | its still very new |
| 13:19 | licenser | but that was the same with clojure before technomancy laied his hands on it and created lein ;P |
| 13:19 | TimMc | but there's no reason a validation lib cannot be transpiled for great benefit. |
| 13:19 | licenser | technomancy: I want leinjs |
| 13:20 | clj_newb | I have a dream. I have a dream that one day, my Clojure code will be judged by what it's meant to do, not on whether the platform it runs on is Java or JavaScript. |
| 13:21 | TimMc | clj_newb: JVM, you mean. Clojure doesn't run on Java. |
| 13:21 | hroarke | mcrittenden: the range constructs an infinite (lazy) sequence of integers. destructuring in the let takes that sequence apart into elements. |
| 13:22 | technomancy | it's funny that the directory in the clojure repository that contains the .java source files is called src/jvm. |
| 13:22 | technomancy | and then we complain about people not understanding the distinction. =) |
| 13:22 | TimMc | indeed |
| 13:22 | TimMc | technomancy: Maybe that was from back when the .NET project was a bigger goal? |
| 13:23 | technomancy | must have been |
| 13:23 | clj_newb | I have a dream. I have a dream that one day, when Clojure programmers are writing Clojure code, they ask "what is this code menat to do" rather than "does this code run on the JVM or V8." <-- there we go, does this work? |
| 13:23 | TimMc | much better :-) |
| 13:24 | mcrittenden | hroarke: so a is 0 and b is 1, etc? |
| 13:24 | TimMc | although there may be some quibbling with your dream itself. |
| 13:24 | hroarke | mcrittenden: Yep |
| 13:25 | wingie | i have a dream |
| 13:25 | TimMc | &(let [[[a b] c] [[1 2] 3]] [a b c]) |
| 13:25 | lazybot | ⇒ [1 2 3] |
| 13:25 | wingie | that one day we don't need to have js only in browser |
| 13:25 | wingie | doesn't java plugin come along with all browsers? |
| 13:26 | wingie | or do you have to install it manually? |
| 13:26 | clj_newb | didn't sun write abrowser back in the day? why did it fail? |
| 13:26 | TimMc | wingie: Wake up, we're there. |
| 13:26 | licenser | wingie: TimMc is right there are clojurescript (named firced cause it matches the channel name partially :P), coffee script and probably others |
| 13:27 | wingie | licenser: but its compiled all down to js |
| 13:27 | licenser | so that isn't a big issue for me |
| 13:27 | wingie | is java plugin installed on all browser by default? |
| 13:27 | licenser | nope |
| 13:27 | wingie | wouldn't that be nice? |
| 13:27 | zilti | wingie: It's still supplied with most PCs when you buy one |
| 13:28 | wingie | if jvm was installed on all browsers you could run clojure! |
| 13:28 | RickInGA | Google is working on building a sandbox for native code in a browser (C++ I assume), but Mozilla has said they won't support it. |
| 13:28 | Raynes | Applets are so 2002. |
| 13:28 | zilti | Next-gen-Applets are so 2012 |
| 13:28 | pandeiro | Don't forget about Dart |
| 13:28 | wingie | no no no |
| 13:28 | wingie | i have a dream... |
| 13:28 | TimMc | wingie: I misunderstood you, I thought you were annoyed that JS was limited to the browser, not that the browser be limited to JS. |
| 13:28 | TimMc | grammar fail, too much lag |
| 13:28 | zilti | RickInGA: Yes, because it's stupid. Then you need to supply a version for ARM and one for x86 or what? |
| 13:29 | licenser | wingie: I don't think it would, java is a huge beast compared to js I think |
| 13:29 | gf3 | hey guys, so I have a function that should optionally take some sort of configuration, is it better to explicitly pass in a config map, or have some sort of global dynamic map? |
| 13:29 | wingie | ...i wished that the web we see it today (web browsers) disappeared and apps (as client) took over |
| 13:30 | wingie | having watched a Steve Jobs interview I feel that is the future we don't see it quite yet |
| 13:30 | wingie | but its evolving .. and computers like Asus Transformer Prime is one big step towards that |
| 13:30 | TimMc | gf3: It kind of depends on how many levels that option map would have to be passed through, and whether binding is appropriate. |
| 13:31 | zilti | wingie: Since the next Windows will have an app store we might get one step closer to that one (simplifying application installation) |
| 13:31 | wingie | iPhone/Android phones -> iPad/Android tablets -> computers like Transformer |
| 13:31 | zilti | Unfortunately technologies like Web Start have pretty much failed for consumers |
| 13:32 | licenser | zilti: for the reason that it is hugely complicated |
| 13:32 | wingie | Steve Jobs believed in the future laptops and desktops will be really rare and the mainstream will be computers like Transformer with "app" OSes |
| 13:32 | licenser | also the advantage of web apps is that they pretty much run everywhere |
| 13:32 | zilti | Is it? I don't think so. It's dead-easy |
| 13:32 | gf3 | TimMc: 2 or 3 levels, I'll be using the data for translating request URIs to file paths |
| 13:32 | pandeiro | Raynes: is there any way I can inspect the noir errors map while my app is running? Relatedly can the app be run from and interacted with from the REPL? |
| 13:32 | zilti | click link -> get app |
| 13:32 | zilti | not even the need to launch an "app store" or whatever |
| 13:33 | zilti | And automatic updates on each launch |
| 13:33 | licenser | zilti: you have worked often with them? I have to deal with some of the buggers at work and it is always a pain |
| 13:33 | zilti | Web Start? What's the pain with it? All you basically need is an XML file |
| 13:33 | licenser | then they don't like the old IE we have to use, or don't run at all on the linux we have on other hosts |
| 13:33 | licenser | or the XML isn't correctly linked to the java thingy |
| 13:33 | pbuckley | wingie: have you read that article about why apps can't replace the web, because they don't have a standard for linking? (i.e. HTML?) - seemed convincing to me that the browser and web pages are still superior to a bunch of disconnected and mostly impossible/improbable to connect apps |
| 13:33 | Raynes | gf3: As in the validation *errors* map? |
| 13:34 | pandeiro | Raynes: yessir |
| 13:34 | licenser | zilti: might be that I had a particularly nasty combination of enviromentatl conditions but I only have bad experiences |
| 13:34 | zilti | I never had problems, especially not since they provide that js library for launching webstart and applets |
| 13:34 | Raynes | gf3: That var is only ever bound inside of requests. As such, the code looking at it has to be underneath a defpage (you know, a route). |
| 13:34 | wingie | pbuckley: they could link in another way like with JSON sent to another app |
| 13:34 | Raynes | Outside of requests, it isn't bound at all. |
| 13:35 | TimMc | Raynes: You mean pandeiro |
| 13:35 | wingie | and it will give you what you wanted to check out |
| 13:35 | Raynes | Yeah, I do. |
| 13:35 | Raynes | TimMc: I'm sitting like 6 feet away from my monitor. :p |
| 13:35 | pandeiro | Raynes: I see, and what about the general case of somehow interacting with the app through the REPL? Not possible, right? |
| 13:35 | pandeiro | (Sorry to make you squint) |
| 13:35 | Raynes | :p |
| 13:35 | pbuckley | wingie: they could, but that would take effort and standardization, and we already have the web which does a good enough job and which is improving with HTML5 etc |
| 13:35 | pandeiro | I CAN USE ALL CAPS IF YOU LIKE :-P |
| 13:35 | gf3 | Raynes: no, I actually don't touch the req/resp |
| 13:36 | gf3 | Raynes: I just use the URI to do some other work |
| 13:36 | Raynes | pandeiro: You can run the whole thing in the repl and interact with it if you want. |
| 13:36 | wingie | so i guess that would be a platform standard .. eg. iOS would say .. you can open another app by doing X Y Z |
| 13:36 | Raynes | pandeiro: Just run the server inside of a repl session. |
| 13:36 | wingie | and imo way better than web standards .. takes an eternity to imeplement |
| 13:37 | pandeiro | Raynes: just by calling the app.server/main fn, yes? |
| 13:37 | wingie | look at from "iPhone to Tablets" evolution |
| 13:37 | Raynes | gf3: I was actually responding to pandeiro. I got a bit confused for a moment there. |
| 13:37 | Raynes | pandeiro: Yep. |
| 13:37 | gf3 | Raynes: haha, no worries |
| 13:37 | TimMc | gf3: Go for dynamic, I guess. Just beware of lazy seqs yo ucreate in that scope! |
| 13:37 | wingie | just a couple of years it has gained popularity from 0 .. the speed is enourmous |
| 13:37 | pbuckley | right, but the web standards are already here - not that it couldn't be done, it just would take a bunch of work to make happen |
| 13:37 | pbuckley | sure, tablets are cheap toys, of course they sell well |
| 13:37 | gf3 | TimMc: thank you |
| 13:38 | pbuckley | but if anything, they're becoming less standardized as they increase in popularity |
| 13:38 | TimMc | pbuckley: Cheap toys? In my day, all we had was a squireel and a stick, and we had to *buy* the stick ourselves! |
| 13:38 | pbuckley | TimMc: LOL :-) |
| 13:38 | pandeiro | I think I am confusing things by moving the valid? functions for my data to the models... I see Chris has them in the views... I am still trying to grasp the separation of concerns |
| 13:38 | zilti | lol |
| 13:38 | licenser | TimMc: but they were quality squirrels! |
| 13:38 | wingie | pbuckley: yeah of course its here .. (almost) but Steve Jobs noticed on mobile phones people are actually using apps more than browser .. it just fits better and gives a smoother experience |
| 13:39 | TimMc | damn straight |
| 13:39 | pandeiro | like where would data processing/mapping happen, in the view or the model? |
| 13:39 | licenser | that were better times *sigh* |
| 13:39 | wingie | we use facebook.. twitter etc .. very specific about what we wanna use |
| 13:39 | zilti | wingie: But mostly, those "apps" are just embedded browsers |
| 13:39 | licenser | they were no cheep china squirrels like you get today ... |
| 13:39 | TimMc | These modern squirrels fall apart if you so much as look at them. |
| 13:39 | wingie | that will come into the mainstream computers one day .. then JS wouldn't have that much of monopoly |
| 13:39 | solussd | are type hints supported for return values now? I don't see it documented on clojure.org (that site needs some serious updating) |
| 13:39 | wingie | or importance compared to today .. which will make me happy =) |
| 13:40 | wingie | zilti: yeah they are hacks right now |
| 13:40 | wingie | phonegap etc |
| 13:40 | solussd | e.g. (defn ^Type blah [arg] thingOfType) |
| 13:40 | cgray | solussd: yes, type hints are supported for return values |
| 13:40 | licenser | wingie: but the apps were pre fared because they were more tailored to the over all user experience of the device |
| 13:40 | licenser | if you just plug the same apps on a windows phone 7 device they probably wouldn't be enjoyed that much |
| 13:41 | wingie | licenser: yeah .. the user experience will get better .. but i think it has already opened users mind about how you do things |
| 13:41 | licenser | wingie: I agree that apps are the better way if they are 1) portable and 2) provide a native user experience on all platforms |
| 13:42 | licenser | it starts that AquaMacs on OS X behaves horribly different from Emacs on windows or console-emacs on linux |
| 13:42 | licenser | the same app but I feel like they are three entirely different ones |
| 13:43 | technomancy | aquamacs is a fork |
| 13:43 | wingie | like Steve Jobs believed .. i believe too .. the user experience in computers we know today (dekstop/laptops) will be dinousaurs maybe in 10 years .. just like the floppy disks .. just a possibility nice to have in mind if you are a developer (so it can guide you through your choices) |
| 13:43 | technomancy | it shouldn't be surprising that it behaves differently; it's just like how firefox behaves differently from the Mozilla suite. |
| 13:44 | wingie | perhaps it will not longer be about web sites .. but apps! |
| 13:44 | TimMc | Oh man, is that still around? |
| 13:44 | technomancy | probably not; I had a hard time picking an analogy. =\ |
| 13:44 | licenser | wingie: or it might be all about web apps but no apps any more :P |
| 13:45 | wingie | licenser: impossible |
| 13:45 | licenser | not at all |
| 13:45 | wingie | we are actually heading the other direction |
| 13:45 | wingie | arent we? |
| 13:46 | wingie | people mimich apps using web |
| 13:46 | licenser | I think we are currently more heading into the web apps direction |
| 13:46 | wingie | yes |
| 13:46 | wingie | because its just a mimick |
| 13:46 | wingie | eg. Sproutcore has already begun a cool project |
| 13:46 | licenser | doesn't mean that if someone comes up with a good solution for apps |
| 13:46 | licenser | it won't change |
| 13:46 | pandeiro | did fogus ever release any results of his survey on Clojure users? |
| 13:46 | wingie | you write once and its deployed in all platforms .. web is just one of them .. just another platform |
| 13:47 | wingie | not "the one" |
| 13:47 | wingie | iOS, Android, Web .. its 3 different platforms |
| 13:47 | wingie | that is how they think of it |
| 13:48 | zilti | And they think: "Let's make it for the web, so it runs on every device and we save a lot of money" |
| 13:49 | wingie | yeah the web platform is huge .. app platforms is evolving |
| 13:49 | wingie | i personally hope app platforms will win |
| 13:49 | wingie | web wasn't meant to do these things |
| 13:50 | zilti | I hope that, too |
| 13:50 | wingie | it's a good transportation layer though |
| 13:50 | zilti | Besides I don't like the cloud that much. It's useful sometimes, but I want to control my data |
| 13:50 | wingie | so now i have another reason to learn other langs like clojure |
| 13:51 | wingie | zilti: just because your are using an app doesn't mean thats its not in the cloud |
| 13:51 | wingie | your data that is |
| 13:51 | wingie | browser is just a client for consuming things |
| 13:51 | wingie | like an app |
| 13:51 | wingie | so it would still be data in cloud (i believe that is a good model) |
| 13:51 | zilti | Yes, but usually if you have a "desktop app" you have a possibility to store the data on your device |
| 13:51 | wingie | right |
| 13:52 | wingie | offline data |
| 13:52 | wingie | thats a good solution |
| 13:52 | zilti | I rarely see this on web apps |
| 13:52 | zilti | logically |
| 13:52 | wingie | yeah its emerging |
| 13:52 | wingie | cloud9ide supports it |
| 13:52 | wingie | but i feels apps are the way to go .. ahh .. we are lucky to live in this time |
| 13:52 | wingie | so much happening |
| 13:53 | RickInGA | wingie /agree |
| 13:53 | rabbler | Anyone know if the "Clojure in Clojure" initiative is still under development? Just curious. |
| 13:53 | wingie | (and in percentage not many knows about this) |
| 13:53 | wingie | like looking into the future .. and create it today |
| 13:53 | wingie | $$$ |
| 13:54 | RickInGA | I just installed clooj... when I type (+ 1 2) in the input, I get (+ 1 2) in the REPL output, was expecting 3 |
| 13:54 | jodaro | Raynes figured out a way to time travel with Clojure |
| 13:54 | jodaro | so we could probably do that right now |
| 13:55 | Raynes | &(clojure.string/reverse "2012") |
| 13:55 | lazybot | ⇒ "2102" |
| 13:55 | Raynes | Welcome to the future. |
| 13:55 | zilti | lol :) |
| 13:55 | RickInGA | nice |
| 13:55 | jodaro | good thing irc is still around in 2102 |
| 13:55 | wingie | haha |
| 13:55 | technomancy | :dependencies [[org.clojars.docbrown/flux-capacitor "0.0.1-SNAPSHOT"]] |
| 13:56 | zilti | Too bad we can't look what's happening outside IRC in 2102 :( |
| 13:56 | jodaro | heh |
| 13:56 | jodaro | crap, forgot plutonium at safeway |
| 13:57 | RickInGA | anyone using clooj 0.2.7 on windows? |
| 13:58 | zilti | Oh, Windows's still around, too? |
| 13:58 | RickInGA | heh, yeah some of us are still on legacy platforms |
| 13:58 | jodaro | huh |
| 13:58 | jodaro | the future kind of sucks |
| 13:58 | jodaro | bring us back, Raynes |
| 13:59 | RickInGA | I seem to have a RPL as opposed to a REPL. wondering if there is something I need to set to get my E :) |
| 13:59 | Raynes | &(clojure.string/reverse "2102") |
| 13:59 | lazybot | ⇒ "2012" |
| 13:59 | dabd | how do you call append-spit from duck-streams? when i call it with (ds/append-spit "~/tmp/out.txt" "hello") I get Can't dynamically bind non-dynamic var: clojure.contrib.duck-streams/*append-to-writer* |
| 13:59 | Raynes | You're trying to use an ancient library with a not-so-ancient version of Clojure. |
| 14:00 | Raynes | You don't need duck-streams for this. http://clojure.github.com/clojure/clojure.core-api.html#clojure.core/spit the normal spit works with an :append option. |
| 14:00 | Raynes | (spit "somefile" "sometext" |
| 14:01 | dabd | ty |
| 14:01 | Raynes | Damn enter key. |
| 14:01 | Raynes | Too close. |
| 14:01 | Raynes | (spit "somefile" "sometext" :append true) |
| 14:02 | Raynes | $examples clojure.core/spit |
| 14:02 | lazybot | https://gist.github.com/1561483 |
| 14:02 | Raynes | That's right. He can do that. |
| 14:07 | cemerick | If one were to publish an example (and therefore not well-behaved) web crawler, what URL should be used as the crawl root? |
| 14:07 | cemerick | I'd like to get a decent spread (i.e. dredging google isn't compelling), but I'm having a hard time coming up with a site that I don't mind quasi-DDOSing. |
| 14:08 | ibdknox | cemerick: what are you ddosing? |
| 14:09 | cemerick | ibdknox: you missed my first msg… :-) |
| 14:09 | cemerick | If one were to publish an example (and therefore not well-behaved) web crawler, what URL should be used as the crawl root? |
| 14:09 | ibdknox | lol |
| 14:10 | cemerick | I am perhaps overestimating the example's reach. ;-) |
| 14:10 | ibdknox | :) |
| 14:10 | cemerick | But I figure it's better to be polite in any case. |
| 14:10 | cemerick | Or, be impolite to someone that won't care. |
| 14:11 | ibdknox | amazon! |
| 14:11 | cemerick | hrm, maybe |
| 14:11 | cemerick | not the best spread though… |
| 14:11 | cemerick | The best thing I've come up with is BBC's news section. |
| 14:12 | ibdknox | that's not bad |
| 14:12 | cemerick | wikipedia is even better, but that feels wrong somehow |
| 14:14 | jodaro | if you donate $20 first, you might feel better about it |
| 14:15 | ibdknox | haha |
| 14:15 | zilti | lol |
| 14:16 | zilti | cemerick: What are you parsing the pages with? |
| 14:16 | ibdknox | enlive, I assume |
| 14:16 | zilti | Didn't know that's possible |
| 14:16 | cemerick | yeah, enlive |
| 14:16 | semperos | it's quite adept at it |
| 14:16 | ibdknox | it's one of its primary use cases :) |
| 14:16 | cemerick | which uses tagsoup |
| 14:17 | ibdknox | zilti: dnolen has a good tutorial on it on his github |
| 14:17 | ibdknox | cemerick: book example? |
| 14:17 | cemerick | yup |
| 14:17 | ibdknox | zilti: and cemerick has in his book :) |
| 14:17 | ibdknox | lol |
| 14:17 | cemerick | 91 lines for a pretty decent little webcrawler, with some stupid word frequency tabulation as well |
| 14:18 | zilti | The last time I had to parse HTML I tried a few libs |
| 14:18 | zilti | htmlcleaner was the only one able to parse EVERYTHIN |
| 14:18 | cemerick | never heard of it |
| 14:18 | zilti | http://htmlcleaner.sourceforge.net/ |
| 14:18 | cemerick | tagsoup and stone soup have never failed me *shrug* |
| 14:18 | zilti | It's java, though. But it's small and simple IMO |
| 14:19 | cemerick | not that I do this sort of stuff much |
| 14:19 | cemerick | Gah, Java? I try to say away from stuff written in Java. |
| 14:19 | zilti | lol, and then again you're using Clojure |
| 14:20 | cemerick | zilti: I'm very dry. ;-) |
| 14:20 | ibdknox | all the cool kids are. |
| 14:20 | ibdknox | cemerick: I'd say it and mean it ;) |
| 14:20 | cemerick | That should mean that I need to get outta here. |
| 14:21 | cemerick | ibdknox: you are in the *wrong* place then! :-D |
| 14:21 | ibdknox | stumbled in here by accident |
| 14:21 | ibdknox | I was trying to go to #closure ;) |
| 14:21 | jordandanford | I'm new to Clojure and I'm having some trouble with macros and namespaces - can someone help? http://pastebin.com/B75pHUni |
| 14:21 | cemerick | ibdknox: oh, burn |
| 14:22 | zilti | jordandanford: If you're new to Clojure macros should be pretty much the last thing to learn |
| 14:23 | ibdknox | jordandanford: it's usually not a good idea to create magic vars like that. |
| 14:23 | jordandanford | ibdknox: What would you recommend I do instead? |
| 14:23 | cemerick | jordandanford: You're trying to establish anaphoric bindings, and what ibdknox said. Very rarely a good reason for either. |
| 14:23 | cgray | jordandanford: and you probably mean ~@body rather than ~body |
| 14:24 | jordandanford | cgray: oh yeah, good point |
| 14:24 | pandeiro | ibdknox: i'm trying to test my app at the REPL (swank) and getting no such var arguments, yet running `lein run` works fine... do I need to manually require all the namespaces in the REPL before requiring app.server? |
| 14:24 | cemerick | jordandanford: (println (:name current-state)) |
| 14:24 | ibdknox | pandeiro: what do you mean by test your app? |
| 14:25 | ibdknox | pandeiro: Noir doesn't mess with Clojure's dependency resolution so requiring server should require all the things it needs |
| 14:26 | pandeiro | ibdknox: yeah i mean i just want to run the app from the REPL... |
| 14:26 | jordandanford | cemerick: I'm going to end up with a lot of functions that modify the state map, so I was just hoping I could use a macro to reduce the boilerplate – is that just a bad idea from the start? |
| 14:26 | lynaghk | cemerick, you know about the JIRA, yeah? I just submitted my first patch to CLJS and I accidently set the status to "in progress", though it should probably be "open" until a core member has time to look at it, right? |
| 14:27 | cemerick | lynaghk: yup |
| 14:27 | ibdknox | pandeiro: as in just start the server from the repl? That should work |
| 14:27 | lynaghk | I can't figure out how to flip it back. |
| 14:27 | ibdknox | pandeiro: what's the exact error you're getting? |
| 14:27 | lynaghk | (p.s. I am not so good at "computers") |
| 14:27 | ibdknox | lynaghk: me neither |
| 14:27 | ibdknox | :D |
| 14:27 | cemerick | jordandanford: I don't think (:name state) is boilerplate :-) |
| 14:27 | pandeiro | No such var: user/prepare-user-doc |
| 14:28 | lynaghk | Nice job on Mostly Lazy, b.t.w., I listened to the episode with chris granger this morning. |
| 14:28 | cemerick | keys into maps are pretty essential; hiding them behind magical macros isn't really doing anyone any good. |
| 14:28 | pandeiro | ibdknox: yet like i said, i don't get that error with `lein run`, only when i try to require myapp.server |
| 14:28 | ibdknox | pandeiro: ah, I wonder if swank doesn't execute in the directory of your project |
| 14:28 | ibdknox | pandeiro: try changing it load-views-ns instead of load-views |
| 14:28 | cemerick | lynaghk: thanks :-) Going roll in a new format soon. Hoping people like it, too. |
| 14:29 | pandeiro | ibdknox: ah ok |
| 14:29 | cemerick | lynaghk: link to this JIRA issue? |
| 14:29 | lynaghk | http://dev.clojure.org/jira/browse/CLJS-114 |
| 14:29 | ibdknox | pandeiro: I don't use swank, so I've not run into this |
| 14:29 | ibdknox | pandeiro: but assuming the classpath is setup correctly, load-views-ns should wor |
| 14:29 | ibdknox | k |
| 14:29 | pandeiro | ibdknox: that did it, thank you |
| 14:30 | ibdknox | np :) |
| 14:30 | pandeiro | ibdknox: what do you use? |
| 14:30 | ibdknox | pandeiro: VIM :D |
| 14:30 | jordandanford | cemerick: I'm not referring to that in particular, I just mean that I'm going to need to get a lot of those values in every function and I don't really want to write out extra let bindings every time |
| 14:30 | ibdknox | haha |
| 14:30 | jordandanford | cemerick: but I guess I'm just being lazy |
| 14:30 | emezeske | ibdknox: I thought maybe I was insane for using VIM, it makes me happy that I'm not alone :) |
| 14:30 | ibdknox | emezeske: not at all |
| 14:31 | ibdknox | we are the few and the proud ;) |
| 14:31 | cemerick | jordandanford: That may be the case, but at the very least, I would write them out a couple of times before |
| 14:31 | pandeiro | ibdknox: i made the switch when i decided to focus on learning clojure... after 2 years learning vim... embarrassed to say i can't even remember some of the most basic bindings |
| 14:31 | lynaghk | :wq |
| 14:31 | cemerick | getting into a macro, so you understand what you need |
| 14:31 | ibdknox | emezeske: also I mostly just like being able to say that I don't use emacs so I don't have to fix those problems for people ;) |
| 14:31 | jordandanford | cemerick: okay |
| 14:31 | ibdknox | lynaghk: lol |
| 14:31 | cemerick | jordandanford: That, and anaphora are tricky :-) |
| 14:31 | pandeiro | ibdknox: haha |
| 14:32 | jordandanford | cemerick: seems like it |
| 14:32 | emezeske | ibdknox: excellent plan! |
| 14:34 | cemerick | emezeske: #2 editor in these parts; you're far from alone |
| 14:35 | pandeiro | ibdknox: i noticed in the webnoir examples, you put valid? functions together with a view, and in noir-blog, you stick them with the models... any logic behind that? |
| 14:35 | pandeiro | (is this stuff that would traditionally go in the 'controller' portion of a rails/etc app?) |
| 14:35 | ibdknox | pandeiro: I usually put them in models |
| 14:36 | pandeiro | what about data-mapping and processing? also models usually? |
| 14:36 | ibdknox | pandeiro: yessir |
| 14:41 | ibdknox | Clojure has been eating HN these past few days :) |
| 14:45 | lynaghk | cemerick, is there anything I can do about this mangled JIRA issue, or should I just let it be for a week or two? |
| 14:47 | TimMc | lynaghk: You can't just edit it? |
| 14:47 | pandeiro | ibdknox: with load-views-ns I don't get the error output, but I also don't get any of my views ... should I take it to #emacs? ;) |
| 14:47 | ibdknox | haha |
| 14:48 | lynaghk | TimHc, the status field doesn't show up anywhere on the edit screen |
| 14:48 | ibdknox | pandeiro: easiest solution is to just require your views explicitly at the top like you would normal files |
| 14:48 | ibdknox | pandeiro: what does your load-views-ns look like? |
| 14:48 | pandeiro | require all the views in the server.clj ? |
| 14:48 | TimMc | lynaghk: It's probably handled differently. |
| 14:49 | ibdknox | pandeiro: yeah, that essentially what those are doing |
| 14:49 | pandeiro | (load-views-ns "src/woodshed/views") |
| 14:49 | ibdknox | ah |
| 14:49 | ibdknox | it should be (load-views-ns 'woodshed.views) |
| 14:49 | pandeiro | wha... ok |
| 14:49 | cemerick | lynaghk: Let it be; as long as it's tagged appropriately, it should move through |
| 14:50 | ibdknox | pandeiro: you're telling it what namespace you want to load, as opposed to a directory |
| 14:50 | lynaghk | cemerick, okay. Thanks Chas. |
| 14:50 | cemerick | bug people on clojure-dev ~Friday if it hasn't been touched |
| 14:51 | lynaghk | We git-submodule our dependencies from private repos, so it's not a huge need since we wrote the patch. I just want to be a good citizen = ) |
| 14:51 | pandeiro | ibdknox: still no views... guess i will have to add them manually to server.clj if i want to use the swank repl? |
| 14:51 | TimMc | lynaghk: Status changes are performed using specific transitions on a state machine graph. :-) |
| 14:51 | ibdknox | pandeiro: I guess so :( Sorry I'm not more help there :/ |
| 14:52 | TimMc | Unfortunately, this JIRA installation does not have a transition from In Progress back to whatever. |
| 14:53 | pandeiro | ibdknox: np, you've helped plenty... i will adjust my workflow for now |
| 14:53 | pandeiro | i already wasn't using swank to launch the app, just thought it would be cool |
| 14:53 | lynaghk | TimMc, That's certainly a positive outlook: always making progress. |
| 14:54 | TimMc | haha |
| 14:54 | gregATio | anyone there? |
| 14:54 | ibdknox | pandeiro: I don't think there will be a huge benefit over just using Noir's reload behavior, but I dunno |
| 14:55 | TimMc | gregATio: Where? |
| 14:55 | ibdknox | TimMc: I dunno, but I'm there |
| 14:55 | gregATio | just using irc in emacs for the first time |
| 14:55 | gregATio | lol , ok ok , i guess its working |
| 14:57 | TimMc | lynaghk: It's a mildly interesting topic: https://confluence.atlassian.com/display/JIRA/Configuring+Workflow |
| 14:57 | pandeiro | ibdknox: yeah really what i wanted to be able to do is examine things inside the running app... validation/*errors* for example |
| 14:57 | lynaghk | TimMc, I thought you were joking about the state machine. |
| 14:58 | pandeiro | ibdknox: i am debugging load-views-ns and your implementation is getting all the nested namespaces just fine... |
| 14:58 | TimMc | It makes sense though, doesn't it? |
| 14:58 | ibdknox | pandeiro: ah, so those are bound per request, so you really wouldn't be able to see them anyways. You'd have to print them out or something |
| 14:58 | pandeiro | ibdknox: ah ok, Raynes told me that an hour ago and I pretended I understood but now I get it |
| 14:58 | ibdknox | haha |
| 14:59 | Raynes | Nice to know that I'm excellent at explaining things. |
| 14:59 | pandeiro | so there really isn't anyway to example requests while they happen? |
| 14:59 | Raynes | Good thing I'm not writing a book. |
| 14:59 | Raynes | Oh wait... |
| 14:59 | jodaro | haha |
| 14:59 | ibdknox | Raynes: :D |
| 14:59 | pandeiro | Raynes: no it's a pebkac issue for sure (on my side) |
| 14:59 | ibdknox | pandeiro: not without being able to break at a specific line |
| 15:00 | ibdknox | which I believe you can do using the debuggers out there |
| 15:00 | ibdknox | but that's getting deep into emacs land |
| 15:00 | pandeiro | yeah i don't think i will make it there in 2012 |
| 15:01 | pandeiro | basically then there isn't much advantage to launching the server in the REPL (other than not having to leave the REPL, which is comforting :) |
| 15:01 | ibdknox | yeah, pretty much |
| 15:03 | TimMc | The REPL means you can redef stuff, though. |
| 15:04 | ibdknox | TimMc: it reloads the NS, so you essentially get the same behavior |
| 15:05 | pandeiro | ibdknox: so i just had to do the (load-views-ns 'woodshed.views) inside the REPL |
| 15:05 | TimMc | oof, right |
| 15:05 | ibdknox | pandeiro: oh cool :D |
| 15:12 | _Vi | Is there way to automatically convert "(:use some.namespace)" to "(:use [some.namespace :only [this that those]])"? It should scan the source, resolve things and "register" them in ":only" lists. |
| 15:13 | amalloy | slamhound alleges to do this |
| 15:17 | zilti | "Caused by: java.lang.RuntimeException: Unable to resolve symbol: pass in this context" What could cause this error? That symbol doesn't exist anywhere in my source code |
| 15:22 | Vinzent | What can I use to extract the text content of a page? |
| 15:25 | zilti | Vinzent: Web page? enlive (Clojure) or - my recommendation b/c I already did it - htmlcleaner (java) |
| 15:27 | Vinzent | zilti, yes, but I need only text, without any tags. https://github.com/tol/webmine seems outdated |
| 15:29 | yazirian | If I run clojure-jack-in, where do stdout/stderr go? They aren't appearing in the REPL, nor are they appearing in *swank* or something, and slime-redirect-inferior-output says "No inferior lisp process" |
| 15:32 | wingie | i can't require math: (require 'clojure.contrib.math) |
| 15:32 | wingie | it says couldn't not include it |
| 15:32 | wingie | im using "lein repl" |
| 15:32 | TimMc | wingie: Don't use contrib... |
| 15:32 | TimMc | unless you really have to. |
| 15:33 | amalloy | and then if you really have to, still don't |
| 15:33 | wingie | why? |
| 15:33 | clojurebot | #<ClassCastException java.lang.ClassCastException: clojure.lang.Cons cannot be cast to clojure.lang.IPersistentStack> |
| 15:33 | wingie | but the issue still remains .. why can't i require it? |
| 15:33 | amalloy | haha good call clojurebot |
| 15:36 | wingie | TimMc: could you explain why i shouldn't use it? |
| 15:36 | zilti | wingie: Because contrib is discontinued |
| 15:36 | zilti | since like forever |
| 15:36 | TimMc | wingie: It's hard, I have a terribvle connection right now. |
| 15:37 | TimMc | Basically, it's a monolithic lib containing unmaintained parts. Hard to version, too! |
| 15:37 | ferd | Any enlive expert around? I need a way to delete a node (and it's children) but the condition is on one of the children. Example: Delete nodes whose child element contains text "test": <x><y><z>test</z></y></x> -> <x></x> |
| 15:38 | TimMc | wingie: Anyway, do you have it in project.clj? And have run lein deps? |
| 15:38 | wingie | i see |
| 15:38 | wingie | no i haven't |
| 15:38 | wingie | i guess i shouldn't have |
| 15:38 | wingie | okay .. no contrib! |
| 15:38 | TimMc | Everything, including clojure.core, needs to be listed (or a dep of something that is.) |
| 15:38 | wingie | hate unmaintained stuff |
| 15:39 | wingie | code is like muscles |
| 15:39 | fbru02_ | is there a way to distinguish if you are creating a var or just calling make a fucntion call ? |
| 15:39 | wingie | have to be maintained |
| 15:39 | TimMc | fbru02_: defn is def + fn, if that's what you're asking. |
| 15:40 | wingie | in a post the author said rather use "require" than "use" |
| 15:40 | wingie | is this better practice? |
| 15:40 | TimMc | wingie: use is fine with :only, and require is gest with :as |
| 15:40 | TimMc | *best |
| 15:41 | wingie | okay |
| 15:41 | wingie | require reminds me about node.js |
| 15:41 | wingie | just require it into a var |
| 15:41 | fbru02_ | TimMc: no , i was thinking about introspection sth of the sort (defn foo (if (creating-var? (first [1 2 3]) (fnext [1 2 3])) ; (foo) => 2 , (def bar (foo)); (bar) => 1 |
| 15:43 | TimMc | I don't understand the question, sorry. |
| 15:43 | simonadameit | is there a function to check if a sequence contains some elements? |
| 15:43 | Vinzent | simonadameit, some |
| 15:44 | Vinzent | fbru02_, why do you need this? |
| 15:45 | fbru02_ | Vinzent: i have a case where i need to distinguish when i'm doing a closure or when i'm calling the defn directly |
| 15:45 | zilti | simonadameit: or some? |
| 15:45 | TimMc | simonadameit: You mean, is not empty? |
| 15:45 | simonadameit | zilti: actually I want the seq to contain all members of a a set |
| 15:45 | simonadameit | or some collection |
| 15:45 | simonadameit | not just some |
| 15:45 | zilti | There's a function for that, too, if I remember correctly |
| 15:47 | simonadameit | zilti: i thought so too.. but I dont seem to find the name right now |
| 15:47 | zilti | Maybe "every?" works |
| 15:47 | zilti | http://clojuredocs.org/clojure_core/clojure.core/every_q |
| 15:48 | zilti | looks like it's what you're looking for |
| 15:48 | Vinzent | fbru02_, as being said, defn is just (def name (fn ...)), I don't think you can do that without wrapping all your code in some macro... If I understand you correctly, which I probably don't :) |
| 15:49 | fbru02_ | Vinzent: heheh thanks!! I thnk i will go the macro way |
| 15:49 | simonadameit | hm… not exactly, since I want to check if a seq/collection contains all elements, not if a predicate is true for all elements of the seq |
| 15:49 | zilti | fbru02_: defn is just a macro expanding to (def name (fn ...)) |
| 15:49 | simonadameit | it can contain others too |
| 15:49 | Vinzent | fbru02_, anyway, why do you need such thing? |
| 15:50 | Vinzent | simonadameit, clojure.set/subset or somethin like that? |
| 15:50 | emezeske | simonadameit: every? #{elements that I want} coll |
| 15:50 | zilti | simonadameit: It works even if the set contains others, too |
| 15:50 | fbru02_ | Vinzent: so, let think about it for a while and then I tell you :) maybe my thinking is wrong |
| 15:50 | emezeske | simonadameit: would using the set as the pred work? |
| 15:50 | zilti | ,(every? #{1 2 3 4 5 6 7} [1 2 3]) |
| 15:50 | clojurebot | true |
| 15:50 | Vinzent | fbru02_, ok |
| 15:51 | simonadameit | ,(every? #{1 2 3} [1 2 3 4]) |
| 15:51 | clojurebot | false |
| 15:51 | simonadameit | that I want to be true |
| 15:51 | TimMc | fbru02_: You're probably trying to do somethign terrible. |
| 15:51 | zilti | simonadameit: You could just flip the order |
| 15:51 | zilti | ,(every? [1 2 3 4] #{1 2 3}) |
| 15:51 | clojurebot | true |
| 15:52 | Vinzent | ,(clojure.set/subset? #{1 2 3} (set [1 2 3 4])) ; more readable, imo |
| 15:52 | clojurebot | #<ExecutionException java.util.concurrent.ExecutionException: java.lang.RuntimeException: java.lang.ClassNotFoundException: clojure.set> |
| 15:52 | Vinzent | ,(require 'clojure.set) |
| 15:52 | clojurebot | nil |
| 15:52 | Vinzent | ,(clojure.set/subset? #{1 2 3} (set [1 2 3 4])) ; more readable, imo |
| 15:52 | clojurebot | true |
| 15:52 | emezeske | Vinzent: that definitely seems like the right solution |
| 15:52 | simonadameit | zilti: that only works incidently since vector looks up keys :)) |
| 15:53 | simonadameit | I guess I will have to do with set… though that is less efficient than it could be in this case |
| 15:53 | simonadameit | no need to create a set from the seq |
| 15:57 | wingie | would you use clojure to write a banking system? |
| 15:57 | wingie | or a game backend? |
| 15:58 | TimMc | Didn't you already ask this? |
| 15:58 | wingie | no? |
| 15:58 | clojurebot | #<ClassCastException java.lang.ClassCastException: clojure.lang.Cons cannot be cast to clojure.lang.IPersistentStack> |
| 15:58 | wingie | not this specific |
| 15:58 | TimMc | clojurebot: botsmack |
| 15:58 | clojurebot | Owww! |
| 15:58 | Vinzent | wingie, someone already wrote MMO server in clojure |
| 15:58 | wingie | MMO? |
| 15:59 | TimMc | wingie: OK, someone was asking here (like yesterday) about game dev. Oh, right -- it was about OOP or something. |
| 16:00 | zilti | I wouldn't write huge games in clojure - I don't think the transactional memory system can handle that |
| 16:00 | Vinzent | wingie, yeah, online game. I can't give you a link, but I read about it in some blog... |
| 16:01 | zilti | Vinzent: You mean this one? http://code.google.com/p/poonscape/ |
| 16:02 | emezeske | zilti: what is it about the STM system that you think can not handle a huge game? |
| 16:02 | zilti | ARGHHH WHY does Clojure keep spitting errors at me because of keywords that aren't there?? |
| 16:02 | lazybot | zilti: Definitely not. |
| 16:02 | Vinzent | zilti, no, i don't think so |
| 16:02 | simonadameit | is there a preferred paste site/bot for this channel? |
| 16:03 | cemerick | most people use gist |
| 16:03 | TimMc | ~paste |
| 16:03 | clojurebot | paste is gist |
| 16:03 | zilti | emezeske: Not that much the STM itself but more that if you copy the whole game stuff each frame (which has to happen if you code idiomatic) you'll fill the whole ram |
| 16:03 | cemerick | The lisp paste bot used to be here, years ago. |
| 16:03 | TimMc | clojurebot: forget paste |is| gist |
| 16:03 | clojurebot | I forgot that paste is gist |
| 16:03 | TimMc | ~paste |
| 16:03 | zilti | and copying even in STM is slow compared to mutable data structures |
| 16:03 | clojurebot | paste is gist |
| 16:03 | TimMc | clojurebot: You're terrible. |
| 16:03 | clojurebot | Huh? |
| 16:03 | technomancy | clojurebot: pastesnack |
| 16:03 | clojurebot | Cool story bro. |
| 16:04 | cemerick | zilti: persistent data structures do not use copy-on-write. |
| 16:04 | TimMc | zilti: JVM GC is pretty fast for small recent objects. |
| 16:04 | emezeske | zilti: so you're saying that any clojure app with lots of state will eventually run out of memory? that doesn't sound right... |
| 16:04 | zilti | No |
| 16:04 | simonadameit | zilti: this is what I had in mind: https://gist.github.com/1562138 |
| 16:04 | zilti | Just that 60 times a sec plus garbage collection will really slow things down I think |
| 16:05 | simonadameit | i wonder if clojure already has this :) |
| 16:05 | TimMc | zilti: *really* fast |
| 16:05 | zilti | simonadameit: Now it does ;) |
| 16:06 | amalloy | i bet clojurebot sees the . and gives up? if so that's terrible |
| 16:06 | hiredman | the what? |
| 16:07 | cemerick | zilti: I wouldn't knock it 'til you try it. The STM is no slouch. |
| 16:07 | zilti | Never said it is |
| 16:07 | zilti | It's an amazing piece of code |
| 16:07 | hiredman | or have tried it even without the stm |
| 16:09 | ferd | No enlive guru around ? |
| 16:10 | TimMc | ferd: You'll never know until you ask an enlive question. :-P |
| 16:10 | Raynes | ~anyone |
| 16:10 | clojurebot | Just a heads up, you're more likely to get some help if you ask the question you really want the answer to, instead of "does anyone ..." |
| 16:10 | ferd | TimMc: I did a few mins ago ;-) |
| 16:11 | Raynes | So your question was rhetorical? ;P |
| 16:11 | ferd | Here I ago again: I'm new to enlive... I cannot find a way to delete a node (and it's children) but the condition is on one of the children. Example: Delete nodes whose child element contains text "test": <x><y><z>test</z></y></x> -> <x></x> |
| 16:12 | TimMc | ferd: Oh, I saw that. Bad timing. |
| 16:12 | TimMc | Someone had just asked about why they shouldn't use contrib. |
| 16:12 | ferd | Raynes: exactly ;-) |
| 16:14 | devinus | i'm still struggling to understand when to use 'symbol vs symbol |
| 16:14 | devinus | for example |
| 16:15 | pandeiro | can a nested map have meta data? no right? |
| 16:15 | devinus | why does use use (use 'clojure.repl) when doc uses (doc refer-clojure) |
| 16:15 | devinus | why isn't it (doc 'refer-clojure) ? |
| 16:15 | amalloy | pandeiro: certainly |
| 16:15 | cemerick | ferd: doable, but I'm tied up; maybe msg the ML. Someone (maybe me) will get to it in short order. |
| 16:15 | Raynes | doc is a macro and use is not. |
| 16:15 | zilti | devinus: the ' means "don't evaluate the following thing" |
| 16:16 | pandeiro | amalloy: I mean when using a map literal? without making it a var? |
| 16:16 | devinus | zilti: right, i get that much |
| 16:16 | zilti | yes, and doc is a macro |
| 16:16 | devinus | but how is (doc refer-clojure) evaluating refer-clojure? |
| 16:16 | Raynes | Since use is not a macro, it can't defer evaluation of refer-clojure, so if you don't quote it, it evaluates it immediately. |
| 16:16 | devinus | Raynes: i get that macro's don't quote the symbol, but why is doc a macro and use is not? |
| 16:16 | devinus | if use is not a macro, is it a fun? |
| 16:17 | Raynes | Because... |
| 16:17 | TimMc | devinus: doc uses the var -- (doc +) would give doc the fn, not the var. |
| 16:17 | TimMc | devinus: You could write a doc function that takes #'+, but that's inconvenient. |
| 16:17 | TimMc | and doc is a REPL namespace fn, intended for the common case. |
| 16:17 | pandeiro | i'm wondering about i18n, using a single map to store strings vs. storing each as its own var... the advantage i see in the latter is being able to store metadata... |
| 16:18 | devinus | ok, so is use a fn? |
| 16:18 | Raynes | There is already a macro that makes use prettier, ns. It's always a good idea to base your API on functions and, if you want, add macros to make them easier to use later. |
| 16:18 | Raynes | &(ifn? use) |
| 16:18 | lazybot | ⇒ true |
| 16:18 | amalloy | because when you want to look up something's doc, you always have its name available in raw code: a macro can do that and might as well add some syntax sugar for it |
| 16:18 | duck1123 | pandeiro: if it's all one var, that's only one thing to re-bind |
| 16:18 | amalloy | but when you want to import a namespace, you often only have the namespace passed to you as an argument |
| 16:18 | devinus | ok…so use is a function, that brings up another question i have…. |
| 16:18 | Vinzent | pandeiro, you can use metadata with maps, see 'with-meta' |
| 16:19 | devinus | if use can import names into the current namespace, isn't the namespace mutable? |
| 16:19 | devinus | and i see a lot of procedural-esque code like e.g. (update-foo!) |
| 16:19 | ferd | cemerick: Thanks... I'm making some progress... using the "has" selector... I think I'm close |
| 16:19 | Vinzent | by the way, why 'use' is a function? Imo, there should be the 'use' macro and the 'use*' function. Quoting in use leads to misunderstanding and confusing |
| 16:20 | devinus | Vinzent: +1 |
| 16:20 | devinus | that's why i think i've been getting confused |
| 16:21 | zilti | devinus: Yes, the namespace is mutable. Otherwise e.g. a REPL wouldn't be possible |
| 16:21 | pandeiro | duck1123: that is a good point, but with with ns-publics I could probably easily loop through and bind everything... |
| 16:22 | Vinzent | devinus, this question has been raised already... Maybe it will be done in clojure 2.0, since it a breaking change. |
| 16:23 | devinus | Vinzent: use vs use* you mena? |
| 16:23 | devinus | mean* |
| 16:23 | duck1123 | I think 'use' is considered low level enough, that the sugar isn't needed |
| 16:24 | technomancy | hawt: (let [graph (fetch-github-projects (build-project-graph))] (->> graph :clj-stacktrace :dependents (map graph) (map :github-url))) |
| 16:25 | duck1123 | if you're doing anything fancy with using that can't be done as part of the ns form, you already have to have them as symbols |
| 16:25 | TimMc | technomancy: *nice* |
| 16:25 | Vinzent | devinus, yeah. and also something like this https://github.com/stuartsierra/need would be cool |
| 16:25 | amalloy | (map (comp :github-url graph))? |
| 16:25 | Raynes | Yeah, I was thinking that too. |
| 16:25 | Raynes | Seems kind of wasteful to map twice. |
| 16:25 | technomancy | fine, fine |
| 16:26 | technomancy | anyway, I found our next seajure project. =) |
| 16:26 | Vinzent | duck1123, use is widly used in the repl and in various tutorials, code examples, etc |
| 16:26 | Raynes | technomancy: Will it use tentacles? :D |
| 16:26 | technomancy | Raynes: it uses clojuresphere |
| 16:26 | TimMc | Raynes: No, tentacles is so 2011... |
| 16:26 | technomancy | which still uses clj-github |
| 16:26 | devinus | Vinzent: that's actually pretty cool |
| 16:26 | Raynes | technomancy: The new Github API doesn't have a search mechanism, so that makes sense. |
| 16:27 | technomancy | Raynes: not even list by language? |
| 16:27 | Raynes | Nope. |
| 16:27 | technomancy | ouch |
| 16:28 | technomancy | I wonder how much stuff is in github that's not in clojars though |
| 16:28 | technomancy | for this particular purpose anyway |
| 16:29 | Vinzent | devinus, yeah, I have no idea why it's still not in the core |
| 16:30 | devinus | *sigh* hopefully my copy of JoC is going to clear some things up |
| 16:30 | mrb_bk | I'm assuming that it will create more questions than it answers |
| 16:30 | mrb_bk | In a good way |
| 16:30 | Raynes | IIRC, there is some consolidation going on for namespace imports. |
| 16:31 | technomancy | yeah! |
| 16:31 | technomancy | there's this open issue |
| 16:32 | technomancy | http://dev.clojure.org/jira/browse/CLJ-879 |
| 16:32 | technomancy | you should all go vote for it |
| 16:32 | technomancy | since it's getting ignored |
| 16:32 | Raynes | Not surprising. |
| 16:32 | simonadameit | is there something like quickcheck for clojure? |
| 16:33 | devinus | simonadameit: i'm interested in the same thing |
| 16:33 | wingie | this was a good one: http://cemerick.com/2010/06/07/results-from-the-state-of-clojure-summer-2010-survey/ |
| 16:33 | djwhitt | there's also https://github.com/clojure/test.generative |
| 16:34 | hiredman | https://github.com/clojure/test.generative |
| 16:34 | cemerick | wingie: that's old |
| 16:34 | cemerick | ~survey |
| 16:34 | clojurebot | survey is http://cemerick.com/2011/07/11/results-of-the-2011-state-of-clojure-survey/ |
| 16:34 | devinus | when clojure.contrib was broken up, where was repl-utils landed? |
| 16:34 | wingie | devinus: oh they have a clojure survery each year =) |
| 16:35 | hiredman | test.generative hasn't seen a lot of use outside of stuart h. though |
| 16:35 | cemerick | they? o.0 :-P |
| 16:35 | cemerick | The omnipresent "they" perhaps. |
| 16:35 | technomancy | cemerick: the royal we |
| 16:35 | Vinzent | technomancy, what's the problem with breaking backward compatibility? 1.3 and deprecating of contrib caused much more problems than changing ns decl can cause |
| 16:35 | mcrittenden | ⧒ |
| 16:35 | mcrittenden | oops |
| 16:36 | technomancy | Vinzent: well the whole point of contrib was it was full of ideas that weren't necessarily very good to begin with. so there was no guarantee of stability. |
| 16:36 | simonadameit | hiredman: thanks ill look into it |
| 16:37 | technomancy | Vinzent: practically speaking people ended up using it like the standard library because early on there was no alternative, but it was very clear that was not the intention |
| 16:37 | Vinzent | technomancy, but, anyway, is was de-facto standard clojure library |
| 16:37 | technomancy | Vinzent: right; in the end the only difference is that core gets to say "i told you so" when everything breaks. |
| 16:39 | Vinzent | hah, right... |
| 16:39 | devinus | anybody know what happened to clojure.contrib.repl-utils? :( |
| 16:41 | Raynes | devinus: clojure.repl |
| 16:41 | devinus | Raynes: what happened to show ? |
| 16:43 | devinus | it listed out all the methods of a java object pretty nicely |
| 16:43 | TimMc | ~what happened to contrib? |
| 16:43 | clojurebot | Well... it's a long story: http://dev.clojure.org/display/design/Where+Did+Clojure.Contrib+Go |
| 16:44 | TimMc | devinus: ^ |
| 16:44 | devinus | hrm... |
| 16:44 | TimMc | devinus: clojure.reflect/reflect, sort of |
| 16:45 | xcv | Hey guys, does anyone have a feel for how a typical noir-esque clojure web stack performs compared to rails? |
| 16:47 | devinus | xcv: probably generally faster, unless there's some serious architectural problems with noir |
| 16:47 | xcv | I realize that this question might not have a perfect answer, but do share if you have any biased anecdotes or gut-feeling approximations |
| 16:47 | xcv | :P |
| 16:47 | ibdknox | xcv: well |
| 16:47 | xcv | devinus: I'd think so, a priori. How much faster in general? 50%? 20%? |
| 16:48 | TimMc | A friend of a friend once told me that noir doesn't have to reticulate quite so many splines as rails does. |
| 16:48 | devinus | xcv: i don't know myself, but we are talking about rails. it's not known for it's speed. plus clojure has the JVM working in it's favor |
| 16:48 | ibdknox | TimMc: it's true |
| 16:48 | xcv | haha |
| 16:48 | devinus | and i'm pretty sure noir can use jetty right? which means it can utilize multiple threads |
| 16:48 | ibdknox | yes |
| 16:48 | devinus | (i think?) |
| 16:48 | ibdknox | devinus: Noir can use anything |
| 16:49 | xcv | and then there's aleph |
| 16:49 | devinus | right |
| 16:49 | ibdknox | Netty/Tomcat/Jetty |
| 16:49 | devinus | which uses netty |
| 16:49 | devinus | nice |
| 16:49 | ibdknox | xcv: I have a gist that has Noir on top of aleph |
| 16:50 | xcv | ibdknow: Ok cool, I'll check that out |
| 16:50 | duck1123 | transitioning from jetty to aleph was pretty easy |
| 16:50 | devinus | Noir would probably do best on netty when used in a highly concurrent simultaneous situation like a chatroom or something, prob best on jetty when serving sites |
| 16:50 | devinus | that's just an educated guess though |
| 16:50 | ibdknox | devinus: correct |
| 16:51 | xcv | I think my use case calls for jetty then |
| 16:52 | xcv | the reason I ask is that I was checking out some mailing lists for yesod, the haskell web framework, and though one would think haskell outperformed rails (being statically typed and compiled), that was not the case, since the rendering engine yesod used was slower |
| 16:53 | xcv | they seemed to be working on fixing it, but it got me thinking whether the "newness" of some of the clj web libs was hurting performance or not |
| 16:53 | xcv | not rendering in particular, but the general case |
| 16:53 | xcv | that's why I asked |
| 16:54 | xcv | [outperformed ruby, I mean] |
| 16:54 | technomancy | that's quite surprising |
| 16:54 | technomancy | I bet yesod lets you swap in a more efficient rendering engine though |
| 16:55 | xcv | ah, sorry, seems it was the database driver in that case |
| 16:56 | xcv | here's part of that conversation (http://www.haskell.org/pipermail/web-devel/2011/001064.html) |
| 16:56 | TimMc | Yep, the whole stack matters. |
| 16:56 | xcv | but of course, this is an area where the java interop is really helping clojure |
| 16:58 | xcv | so my gut tells me a lot of those problems are not there for clojure, thanks to all the battle-tested libs that are being wrapped below the surface |
| 16:59 | technomancy | yeah IIRC the yesod author had to write his own mysql adapter |
| 16:59 | xcv | yeah, I think I heard about that too |
| 17:01 | xcv | they're working on a couple of different postgres adapters, but it seemed like neither of them was both performant and production-ready |
| 17:07 | devinus | hrm |
| 17:08 | devinus | does anybody know how to start a newline in the current parens with paredit without slime taking the line? |
| 17:08 | amalloy | i use C-j |
| 17:08 | amalloy | well. actually i don't use paredit in the repl. but C-j works anyway |
| 17:09 | devinus | it does work |
| 17:09 | devinus | sort of annoying though |
| 17:09 | devinus | maybe i should bind Shift-Enter to be the new enter |
| 17:09 | amalloy | technomancy: i am completely baffled by some behavior i'm getting from lein. i have this test, which depends on protocol P being extended to type T. when i run lein test, i get failures saying P isn't implemented for T. lein swank followed by (test #'the-test) returns :ok and prints nothing. lein repl followed by (test #'the-test) prints out the "no implementation" error messages and then returns :ok anyway, but i assume that's something to d |
| 17:10 | TimMc | amalloy: "that's something to d" |
| 17:10 | amalloy | that's something to do with me calling the clojure.test code incorrectly in some way. does any of this make sense to you, and is there more information i could provide that would help clarify? |
| 17:10 | amalloy | (thanks TimMc) |
| 17:13 | technomancy | I'm not sure what to expect calling test directly. what about run-tests? |
| 17:13 | technomancy | in general I'm useless re: protocol questions though |
| 17:14 | amalloy | &(doc run-tests) |
| 17:14 | lazybot | java.lang.RuntimeException: Unable to resolve var: run-tests in this context |
| 17:15 | hiredman | amalloy: the thing to watchout for with protcols and clojure-test-mode is runing tests can causes code to be reloaded |
| 17:16 | amalloy | hiredman: i don't use clojure-test-mode |
| 17:16 | amalloy | but yes, i agree it looks kinda like a classloader issue |
| 17:16 | technomancy | bloody protocols |
| 17:16 | hiredman | you might want to turn on verbose loading and see what happens |
| 17:17 | amalloy | hiredman: how do i do that? |
| 17:17 | amalloy | technomancy: run-tests clarifies things a little: the tests fail in both repl and swank, and only repl prints any output. weird, but whatever |
| 17:17 | hiredman | (alter-var-root *loading-verbosely* (constantly true)) |
| 17:18 | hiredman | you can also do (require 'foo.bar :verbose) |
| 17:18 | amalloy | what namespace is that in? it doesn't seem to be available in my 1.3 repl |
| 17:18 | hiredman | it's in core |
| 17:18 | hiredman | oh |
| 17:18 | hiredman | (alter-var-root #'*loading-verbosely* (constantly true)) |
| 17:18 | hiredman | of course |
| 17:19 | amalloy | oh, it's private. right |
| 17:20 | Vinzent | btw, why there is no set-var-root? |
| 17:21 | technomancy | Vinzent: that's not what vars are for. |
| 17:21 | technomancy | alter-var-root is awkward on purpose |
| 17:26 | Vinzent | technomancy, that's a strange approach. One can still misuse vars, awkwardness of alter-var-root won't stop him! |
| 17:26 | technomancy | ugly things should look ugly |
| 17:27 | amalloy | hiredman: that's a neat little tool to know about. it doesn't seem to be useful for me, since each file is being loaded only once (in a probably-reasonable order), and calling run-tests doesn't cause anything to reload |
| 17:27 | hiredman | huh |
| 17:29 | Vinzent | I remember I have (alter-var-root #'something (constantly (constantly :foo)) - that's too ugly for this |
| 17:32 | amalloy | but there's definitely some weird classloader voodoo going on. maybe it's relevant that the class i'm extending to is a java class; it is presumably not showing up in the clojure namespace-loading verbose info |
| 17:33 | hiredman | sure |
| 17:39 | technomancy | ibdknox: noir uses clj-stacktrace, right? |
| 17:39 | ibdknox | technomancy: yeah |
| 17:40 | technomancy | I'm adding functionality to let you specify frames to omit |
| 17:40 | ibdknox | ! |
| 17:40 | ibdknox | that would be killer |
| 17:40 | technomancy | excellent |
| 17:41 | technomancy | if you want to take a look at the omit-frames branch, basically right now it's just set up so the pst function takes an options map |
| 17:41 | technomancy | hm; but you probably don't use that as your entry point |
| 17:41 | ibdknox | I don't |
| 17:41 | technomancy | you use parse-exception? |
| 17:41 | ibdknox | let me look real quick at what I do |
| 17:42 | devinus | (defn my+ [& args] (apply '+ args)) |
| 17:42 | devinus | what am i missing there? |
| 17:42 | ibdknox | technomancy: yep |
| 17:42 | devinus | how do i refer to args correctly? |
| 17:42 | ibdknox | devinus: don't quote + |
| 17:42 | devinus | ok, so apply is a macro |
| 17:42 | devinus | sweet it works |
| 17:42 | ibdknox | ,(doc apply) |
| 17:42 | Bronsa | no, apply is a function |
| 17:42 | clojurebot | "([f args] [f x args] [f x y args] [f x y z args] [f a b c d ...]); Applies fn f to the argument list formed by prepending intervening arguments to args." |
| 17:42 | ibdknox | not a macro |
| 17:43 | technomancy | ibdknox: so I've exposed the omit function as well: https://github.com/mmcgrana/clj-stacktrace/blob/omit-frames/src/clj_stacktrace/repl.clj#L56 |
| 17:43 | devinus | grr |
| 17:43 | Bronsa | ,+ |
| 17:43 | clojurebot | #<core$_PLUS_ clojure.core$_PLUS_@143fc61> |
| 17:43 | technomancy | would that get you what you need? |
| 17:43 | devinus | i still don't get how symbol resolution works |
| 17:43 | ibdknox | technomancy: I think so |
| 17:43 | devinus | well |
| 17:43 | devinus | what i mean is i don't understand why apply would take the unquoted version |
| 17:44 | technomancy | ibdknox: do you already have a mechanism set up for how users would customize things like to-omit? |
| 17:45 | amalloy | devinus: apply doesn't want a symbol, it wants a function |
| 17:45 | rjack | I need to parse a query string and I'm trying to use ring.middleware.params as suggested here: http://stackoverflow.com/a/6596296/54967 but I can't use parse-params in my code. Is this because it's defined with defn-? How can I use it anyway? |
| 17:45 | ibdknox | technomancy: no, I'll have to think about that. My thought was just to omit things I know you don't want to see... which isn't necessarily a long list, but enough that it would be valuable |
| 17:45 | amalloy | '+ evaluates to a symbol, +. + evalutes to a function, the implementation of addition |
| 17:46 | devinus | there's too much mixing between functions that want symbols versus functions |
| 17:46 | ibdknox | rjack: you might find it much easier to get started with Noir |
| 17:46 | technomancy | ibdknox: there are curmudgeons who think that no such things exist |
| 17:46 | ibdknox | technomancy: they don't use Noir ;) |
| 17:46 | amalloy | hah |
| 17:46 | ibdknox | technomancy: like amalloy :p |
| 17:47 | rjack | ibdknox: I'm using enlive because I need to scrape some web pages. Some infos I want to scrape are query string parameters in href urls. |
| 17:47 | ibdknox | ah |
| 17:48 | hiredman | technomancy: I am not saying that a mechanism shouldn't exist, I am saying that the default should not be to trim stuff out |
| 17:48 | devinus | amalloy: thanks |
| 17:48 | devinus | it's starting to slowly sink in |
| 17:49 | technomancy | hiredman: ok, but I need actual examples |
| 17:49 | nickmbailey | how do i import a type defined with deftype from another namespace into my current namespace |
| 17:49 | nickmbailey | (:use ns) doesn't seem to work |
| 17:49 | technomancy | like concrete things you would use that otherwise-lost information for |
| 17:50 | rjack | ibdknox: I'm new to clojure so I don't know if I need to specify some parameter in (:use ring.middleware.params)) in order to use parse-params. |
| 17:51 | ibdknox | rjack: defn- makes it private, unfortunately |
| 17:51 | devinus | clojure uses UTF16 strings right? |
| 17:52 | rjack | ibdknox: as I thought :( thank you |
| 17:53 | hiredman | technomancy: depends, what you filtering out? |
| 17:55 | Vinzent | nickmbailey, use :import |
| 17:55 | technomancy | hiredman: clojure.lang.AFn and clojure.lang.RestFn seem like no-brainers |
| 17:56 | technomancy | probably clojure.lang.Compiler and clojure.lang.Var as well |
| 17:57 | Vinzent | rjack, you still can use private fns like this: #'full.ns/private-var, but only if you really know what are you doing |
| 17:57 | hiredman | I could see AFn and RestFn |
| 17:57 | ibdknox | technomancy: I started writing something for a new project of mine that allowed me to also modify what was said for each frame of an exception |
| 17:57 | nickmbailey | Vinzent: thanks |
| 17:57 | ibdknox | technomancy: to make them a bit more friendly |
| 17:57 | technomancy | ibdknox: how so? |
| 17:58 | hiredman | does clj-stacktrace do transforming of java frames into clojure (fn classes into vars) |
| 17:58 | ibdknox | technomancy: in this particular case the system you're working with is a blackbox, and should stay that way. So it would replace parts of the stack with what it was doing |
| 17:59 | ibdknox | technomancy: kind of neat, but has limited applicability. It was also replacing the messages of exceptions based on the type and whatever other information I could extract. |
| 18:00 | technomancy | hiredman: I think so, if I get what you're asking |
| 18:01 | hiredman | ,(class +) |
| 18:01 | clojurebot | clojure.core$_PLUS_ |
| 18:01 | hiredman | -> clojure.core/+ |
| 18:01 | technomancy | oh, yeah it does that |
| 18:02 | technomancy | has to reimplement it though; it's a shame that's not exposed by Clojure itself |
| 18:02 | TimMc | technomancy: I did see a demunge somewhere. |
| 18:02 | TimMc | clojure.main, maybe |
| 18:03 | technomancy | TimMc: oh cool; in clojure.repl. must be new-ish. |
| 18:04 | technomancy | yeah, :added "1.3" |
| 18:04 | technomancy | glad it exists, even though I can't rely on it in this case. |
| 18:04 | TimMc | ,(require 'clojure.repl) |
| 18:04 | clojurebot | nil |
| 18:05 | TimMc | ,(-> + class str demunge) |
| 18:05 | clojurebot | "class clojure.core/+" |
| 18:06 | TimMc | I guess clojure.repl was already use'd, that require wouldn't have done anything for me. |
| 18:09 | rjack | Vinzent: it works, thank you! |
| 18:09 | replaca | technomancy: do you want me to take a whack at the slamhound pretty-print thing? |
| 18:10 | Vinzent | rjack, but I don't thibk you really should use it in your case. It was done private for some reason |
| 18:11 | technomancy | replaca: oh dang; sorry. way behind on my email. |
| 18:11 | technomancy | replaca: yeah, I think the main issue was it was inserting newlines like so: (:use\n [whatever.blah]) |
| 18:13 | rjack | Vinzent: as strange as it may sound, I think that in this file https://github.com/rjack/ring/blob/master/ring-core/src/ring/middleware/params.clj parse-params should be public and assoc-params should be private. |
| 18:14 | rjack | Vinzent: I don't know, but assoc-params looks like an helper function for parse-params, yet it's public. |
| 18:14 | Vinzent | rjack, indeed |
| 18:14 | hiredman | technomancy: one possiblity is release with omit defaulting to false, see what people come up with, and get a reasonable default from there |
| 18:15 | technomancy | hiredman: yeah, that may be wise |
| 18:16 | rjack | Vinzent: let's see, I'm opening a pull request |
| 18:55 | wingie | are everything an object in clojure? |
| 18:55 | wingie | or is there no such thing |
| 19:01 | gf3 | I notice sometimes people show the expansion of the function short-form by preceding it with a quote, does this work simply because the macro is expanded as usual, and the quote prevents invocation? |
| 19:01 | gf3 | or is there some other magic at work there? |
| 19:12 | jodaro` | ahah |
| 19:13 | jodaro | gloss.repeated is automagically prefixing my stuff with a count |
| 19:13 | jodaro | which i don't wnat |
| 19:13 | jodaro | or want |
| 19:13 | ztellman | use :prefix :none |
| 19:13 | jodaro | perfect |
| 19:13 | jodaro | thanks! |
| 19:14 | ztellman | keep in mind that the frame needs to be bounded some other way |
| 19:14 | ztellman | otherwise it will never actually return anything |
| 19:14 | jodaro | hmm |
| 19:14 | ztellman | you could use finite-frame as a wrapper, for instance |
| 19:14 | jodaro | basically this protocol has a spot for 0 or more null terminated strings |
| 19:14 | ztellman | or define a delimiter |
| 19:15 | jodaro | and a size field that tells the server the size of those strings (as a whole) |
| 19:15 | jodaro | so sometimes i need it empty |
| 19:15 | jodaro | sometimes i need "foo" |
| 19:15 | ztellman | is the size field always there? |
| 19:15 | jodaro | and sometimes i need "foo\0bar" |
| 19:15 | jodaro | yeah |
| 19:15 | jodaro | size field is required |
| 19:15 | jodaro | (and sometimes "foo\0bar |
| 19:15 | jodaro | sorry |
| 19:16 | jodaro | foo\0bar\0baz |
| 19:16 | ztellman | so isn't the size field the prefix you were saying you don't want? |
| 19:16 | jodaro | well i'm specifiying it manually |
| 19:16 | amalloy | technomancy, hiredman: figured out my issue and it was pretty weird. try this: (defprotocol Foo (bar [this])) (def b bar) (extend-type String Foo (bar [this] 10)) ;; now, (bar "") returns 10 but (b "") throws an exception |
| 19:17 | ztellman | can you put your frame in a gist and show it to me? |
| 19:17 | jodaro | i suppose i could let repeated specify it autmagically |
| 19:17 | jodaro | yeah, hold |
| 19:18 | amalloy | gf3: #(foo %) is a reader macro, not a regular macro. it gets "expanded" as part of the process of reading, whereas regular macros get expanded during evaluation (which is suppressed when quoting) |
| 19:18 | hiredman | amalloy: must be the magic protocol metadata+var name |
| 19:19 | gf3 | amalloy: so the quote just prevents invocation of the already expanded macro? |
| 19:19 | technomancy | amalloy: you aren't making me trust protocols more |
| 19:19 | jodaro | ztellman: https://gist.github.com/1563014 |
| 19:19 | jodaro | thats what i started with and i've just been splitting/joining by hand |
| 19:19 | jodaro | but having gloss handle it would be way cleaner |
| 19:19 | TimMc | gf3: No macros involved. |
| 19:20 | jodaro | wait sorry, i left something out |
| 19:20 | TimMc | Hey, it's ztellman! |
| 19:20 | jodaro | :type is just an :int32 |
| 19:20 | amalloy | right, hiredman. b doesn't have :protocol in its var's meta, though i don't really know what the consequences of that are |
| 19:20 | gf3 | TimMc: I am confused, amalloy just mentioned it is a reader macro |
| 19:20 | jodaro | in an enum |
| 19:21 | ztellman | TimMc: hi |
| 19:21 | TimMc | gf3: reader "macro" :-/ |
| 19:21 | hiredman | the call site isn't being compiled as a protocol callsite |
| 19:21 | ztellman | jodaro, the data-size is defined earlier in the rame? |
| 19:21 | ztellman | frame* |
| 19:21 | TimMc | ztellman: We had a burning question for you the other day: Why specify codecs using maps, which aren't sequential? |
| 19:21 | jodaro | oh, yeah |
| 19:21 | jodaro | (defcodec data-size :int32) |
| 19:21 | jodaro | |
| 19:21 | jodaro | doesn't really need to be like that i guess |
| 19:22 | jodaro | i was just trying to split things up |
| 19:22 | ztellman | TimMc, you can use other data structures |
| 19:22 | ztellman | but sometimes it's nice to have the key-value pairing |
| 19:22 | jodaro | TimMc: i switched to ordered-map |
| 19:22 | amalloy | in fact the way i was doing it was a little bit different: more like (letfn [(make-fn [f] (...use f...))] (def bar-fn (make-fn bar)), so there was no var at all to have metadata on |
| 19:22 | jodaro | and it works great |
| 19:22 | ztellman | for instance [:int32 :int32] is a perfectly valid frame |
| 19:23 | ztellman | jodaro: there are only interposed null delimiters, correct? |
| 19:23 | jodaro | ztellman: i was doing something like {:m :int32 :f (string :utf-8)} |
| 19:23 | ztellman | so "a\0b\0c", not "a\0b\0c\0" |
| 19:23 | jodaro | without ordered maps but forgetting that they wouldn't be ordered |
| 19:23 | jodaro | yes, thats correct |
| 19:24 | ztellman | ok, so the best thing to do is just have the splitting be a post-step |
| 19:24 | jodaro | ok |
| 19:24 | ztellman | putting together a forked gist, just a sec |
| 19:24 | jodaro | the request and response are the same format |
| 19:24 | jodaro | i'm already splitting the response |
| 19:24 | jodaro | and that works fine |
| 19:27 | TimMc | ztellman: If you use a map, that restricts you to use of the exact same architecture and Clojure version -- the ordering is arbitrary. |
| 19:28 | ztellman | TimMc, that's why ordered-map exists |
| 19:28 | ztellman | jodaro: https://gist.github.com/1563018 |
| 19:28 | ztellman | I haven't tested this, but hopefully the intent is clear |
| 19:29 | TimMc | ztellman: Wiki might need clarification, then -- plain maps are used everywhere. |
| 19:29 | ztellman | TimMc, maps cleanly encode and decode within gloss |
| 19:29 | jodaro | ztellman: nice, thanks! |
| 19:30 | ztellman | keys are ordered alphabetically |
| 19:30 | TimMc | Ah! I see. |
| 19:30 | hiredman | b |
| 19:30 | ztellman | if you're trying to conform to another protocol, ordered-map is required |
| 19:30 | TimMc | Got it. |
| 19:30 | ztellman | I think I mention this in the wiki, but I'll double-check |
| 19:30 | TimMc | ztellman: What "alphabetically" do you use? |
| 19:30 | jodaro | TimMc, ztellman: thats what threw me |
| 19:30 | jodaro | the alphabetical ordering |
| 19:30 | ztellman | I sort by (name keyword) |
| 19:31 | jodaro | mainly because i figured the key would be descriptive of the field |
| 19:31 | TimMc | ztellman: I'm thinking about non-ASCII. |
| 19:31 | jodaro | not necessary an ordered key |
| 19:31 | jodaro | necessarily |
| 19:31 | ztellman | ok, if that was confusing I'll clarify in the documentation |
| 19:31 | ztellman | thanks for the feedback |
| 19:32 | jodaro | yeah |
| 19:32 | jodaro | maybe just add in a plug for ordered-map in the first example |
| 19:33 | mdeboard | This is a bit off-topic but do any of you have any recommended reading/study materials wrt machine learning? |
| 19:35 | ztellman | TimMc: I think naive unicode sorting should be consistent even if it's not always "correct" |
| 19:35 | ztellman | and consistency is all we need |
| 19:36 | TimMc | Codepoints worked. |
| 19:36 | TimMc | *works |
| 19:36 | wingie | why doesn't ^serializable-stu work |
| 19:36 | wingie | for showing meta |
| 19:37 | jodaro | mdeboard: https://cwiki.apache.org/confluence/display/MAHOUT/Reference+Reading |
| 19:37 | jodaro | looks like there is some stuff there |
| 19:37 | mdeboard | Yeah I'm there atm |
| 19:37 | mdeboard | jodaro: thanks |
| 19:37 | jodaro | http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-867-machine-learning-fall-2006/ |
| 19:37 | technomancy | wingie: that's deprecated; use the meta function |
| 19:37 | jodaro | i haven't read any of it |
| 19:37 | jodaro | but |
| 19:38 | wingie | technomancy: ah good .. i love using the names instead |
| 19:38 | wingie | makes it more consistent |
| 19:38 | wingie | why i love clojure in the first place |
| 19:38 | technomancy | ^ is now used to attach metadata instead of reading it |
| 19:38 | wingie | okay .. ill just use the function instead |
| 19:38 | wingie | they should ditch all those syntax! |
| 19:39 | wingie | make it clean and consistent with no exceptions! |
| 19:39 | wingie | wouldn't that be cooler? |
| 19:39 | mdeboard | jodaro: Yeah I guess I was looking for some first-hand recommendations from the Clojure crowd; thanks for your efforts |
| 19:39 | wingie | the no syntax lang |
| 19:46 | TimMc | ztellman: "When a frame is defined using a map, Gloss encodes the vals in an arbitrary but consistent order. To work with existing binary protocols, use Gloss' ordered-map (or a vector.)" |
| 19:46 | TimMc | Sound about right? |
| 19:54 | ztellman | TimMc: yeah |
| 19:55 | ztellman | feel free to make the edit to the wiki, if you're feeling driven |
| 19:55 | TimMc | OK, added after the encode/decode[BJust did. :-) |
| 19:55 | TimMc | (ugh, bad connection) |
| 19:55 | ztellman | ha, ok |
| 19:55 | ztellman | thanks |
| 20:02 | clj_newb | anyone know of a decent effort to implement a J/K/APL DSL within Clojure? |
| 20:07 | wingie | Is it possible to use OOP JS frameworks (ExtJS, Sproutcore, YUI etc) with ClojureScript? |
| 20:07 | TimMc | wingie: You have the full power of JS in CLJS. |
| 20:08 | ibdknox | when I get a minute again I'll release the cool stuff I did with jQuery in cljs |
| 20:09 | alexbaranosky | hey TimMc, give any more love to TryClojureScript ? |
| 20:10 | etosch | Anyone know if there's a straightforward way of setting max_allowed_packets using with-connection on a mysql database? |
| 20:14 | TimMc | alexbaranosky: Nah, I'm still annoyed at it. |
| 20:15 | ibdknox | TimMc: what's wrong? |
| 20:16 | TimMc | ibdknox: Can't figure out how to get the namespace right. |
| 20:16 | TimMc | Let me start up the server... |
| 20:19 | ibdknox | are you using Clojail to sandbox cljs compilers for each person? |
| 20:20 | TimMc | ibdknox: http://k.timmc.org:7013/ Try (+ 1 2), then (str 6), then (clojure.core/str 6) |
| 20:20 | TimMc | Oh, I'm not sandboxing the compiler at all. Should I? |
| 20:21 | ibdknox | I thought it kept track of declared symbols so it can resolve them over time, but that might only be part of the repl functionality. I can't remember |
| 20:21 | wingie | TimMc: cool .. will check back later on it when it's mature |
| 20:22 | TimMc | ibdknox: Anything it doesn't recognize gets a cljs.user. in front of it. |
| 20:22 | amro | I have a vector, [a1 a2 b1 b2 ...] and I need to process each pair at once. is there an idiomatic way for handling that? |
| 20:23 | ibdknox | ,(doc partition) |
| 20:23 | TimMc | amro: partition is a good start |
| 20:23 | alexbaranosky | amro, 'partition |
| 20:23 | clojurebot | "([n coll] [n step coll] [n step pad coll]); Returns a lazy sequence of lists of n items each, at offsets step apart. If step is not supplied, defaults to n, i.e. the partitions do not overlap. If a pad collection is supplied, use its elements as necessary to complete last partition upto n items. In case there are not enough padding elements, return a partition with less than n items." |
| 20:23 | amro | thanks |
| 20:24 | hiredman | ~partition |
| 20:24 | clojurebot | partition is probably not what you want; see partition-all. |
| 20:24 | ibdknox | TimMc: hm, are you declaring a namespace somewhere for the user? |
| 20:25 | TimMc | I have only once ever needed partition-all. |
| 20:25 | ibdknox | I almost always want it |
| 20:25 | jodaro | rad. ztellman had exactly the solution i needed |
| 20:25 | TimMc | The one time I needed it, it was for displaying data for human consumption. |
| 20:26 | ibdknox | TimMc: lol have you tried this? (defn b [] (js/alert "hey")) |
| 20:26 | ibdknox | TimMc: it might be worth looking into how I did brepl |
| 20:26 | ibdknox | it's a similar problem |
| 20:27 | TimMc | ibdknox: Here's latest: https://github.com/baznex/trycljs/blob/master/src/trycljs/models/compile.clj |
| 20:27 | TimMc | I'm basically flailing around. |
| 20:27 | ibdknox | I think if you refer clojure.core into there it'll work :) |
| 20:28 | TimMc | Is that it? |
| 20:29 | TimMc | ibdknox: As in, (refer 'clojure.core) as the first part of the code to compile? |
| 20:30 | ibdknox | mhm |
| 20:31 | TimMc | ibdknox: Evaluation error: TypeError: cljs.core.refer is undefined |
| 20:31 | ibdknox | lol |
| 20:32 | ibdknox | another potential solution is to wrap all of it in an NS call |
| 20:32 | ibdknox | but that won't work long term if people are allowed to define functions |
| 20:33 | TimMc | ibdknox: ns call won't work -- GClosure throws a shitfit |
| 20:33 | ibdknox | let me see what I did then |
| 20:34 | TimMc | (goog.provide() throws an error the second time you give it the same ns to "teach new developers not to do that") |
| 20:35 | ibdknox | I cheated and used compiler internals |
| 20:36 | TimMc | I saw a browser repl thingy in the CLJS codebase, is that brepl? |
| 20:36 | ibdknox | nope, that's the official browser repl |
| 20:37 | ibdknox | I wrote mine a couple days after CLJS came out |
| 20:37 | wingie | what does # mean: (meta #'str) |
| 20:37 | mdeboard | hipster |
| 20:37 | ibdknox | I think they used mine as inspiration |
| 20:37 | ibdknox | mdeboard: srsly. |
| 20:37 | TimMc | found it |
| 20:38 | alexbaranosky | wingie, means its a var |
| 20:38 | ibdknox | I think the problem is you need to add clojure.core to the build environment, without sending it to the client again |
| 20:38 | TimMc | wingie: # is a reader dispatch character. It is meaningless without the next char. |
| 20:38 | alexbaranosky | wingie, specifically #' indicates that 'str' is a var |
| 20:39 | TimMc | wingie: #'foo is (var foo) |
| 20:39 | wingie | alexbaranosky TimMc I see |
| 20:39 | wingie | the latter seems more understandable |
| 20:39 | TimMc | wingie: read http://clojure.org/reader |
| 20:39 | alexbaranosky | try: (#'str "a" "b") |
| 20:39 | wingie | ,(#'str "a" "b") |
| 20:39 | clojurebot | "ab" |
| 20:39 | TimMc | ibdknox: Did you solve the require vs. goog.provide problem? |
| 20:39 | ibdknox | but the compiler has to know about that ns otherwise it won't be able to resolve it. Last I knew it basically just kept a map of vars and their corresponding namesapces |
| 20:39 | ibdknox | yeah |
| 20:39 | alexbaranosky | wingie, understanding is in the eye of the beholder |
| 20:40 | wingie | alexbaranosky: yepp .. good that both methods exist |
| 20:40 | wingie | i like choice |
| 20:40 | alexbaranosky | I think #' goes back to Common Lisp |
| 20:40 | alexbaranosky | so we're building on the backs of the greats here :) |
| 20:41 | hiredman | #' means something different in common lisp |
| 20:41 | TimMc | ibdknox: Maybe I can surgically remove the ns declaration after compilation. >_< |
| 20:41 | hiredman | "look up the value of this symbol in the function namespace" or something |
| 20:42 | ibdknox | TimMc: what you really want is to just call analyze and emit on the things, that will solve your problem |
| 20:42 | jcrossley3 | is there a way to determine whether a java class is available at runtime? |
| 20:42 | ibdknox | TimMc: you'll have to sandbox though, otherwise people's functions will stomp on eachother |
| 20:42 | alexbaranosky | hiredman, ahh, I wasn't aware it had a different meaning in CL. thx |
| 20:42 | hiredman | http://c2.com/cgi/wiki?SharpQuote |
| 20:42 | mdeboard | If anyone's was paying attention earlier when I asked for first-hand recommendations for ML reading, I got a recommendation for http://www.amazon.com/gp/product/B0028N4WM4, $6 on the kindle |
| 20:43 | hiredman | "it's a crazy lisp 2 thing" |
| 20:43 | TimMc | ibdknox: Are you sure that the analyzer needs to know what functions have been declared? |
| 20:44 | TimMc | I was hoping that since symbols are expanded by default to cljs.user/foo that I wouldn't have to bother. |
| 20:44 | alexbaranosky | hiredman, totally makes sense, since symbols are in another namespace from functions in lisp 2's |
| 20:44 | ibdknox | ah |
| 20:44 | ibdknox | sure |
| 20:44 | ibdknox | TimMc: it at least needs to know clojure.core and anything else you want to expose |
| 20:45 | technomancy | alexbaranosky: assuming keeping functions in a separate namespace made sense in the first place =) |
| 20:45 | ibdknox | TimMc: also, don't forget, you can always overwrite goog.provide to not be retarded |
| 20:46 | alexbaranosky | technomancy, well, if you're going to be crazy, might as well make sense while you're at it |
| 20:46 | etosch | jcrossley3: you mean like http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/ClassLoader.html? |
| 20:46 | TimMc | ibdknox: Hmm... perhaps delegate and catch? |
| 20:46 | hiredman | jcrossley3: as far as I know the only way is to try and load the class |
| 20:47 | jcrossley3 | etosch: hiredman: nothing similar to ruby's 'defined?' method? |
| 20:47 | jcrossley3 | something like symbol? or var? but for java classes? |
| 20:47 | hiredman | ,(doc resolve) |
| 20:47 | clojurebot | "([sym] [env sym]); same as (ns-resolve *ns* symbol) or (ns-resolve *ns* &env symbol)" |
| 20:47 | hiredman | ,(doc ns-resolve) |
| 20:47 | clojurebot | "([ns sym] [ns env sym]); Returns the var or Class to which a symbol will be resolved in the namespace (unless found in the environement), else nil. Note that if the symbol is fully qualified, the var/Class to which it resolves need not be present in the namespace." |
| 20:48 | hiredman | ^- but ns-resolve actual throws an exception instead of returning nil for classes |
| 20:48 | etosch | jcrossley3: okay, this is from a while ago, but I seem to remember that the only way to check on the jvm speciically was to get a runtime and then test for a specific class using a class loader, but i am not certain |
| 20:48 | hiredman | ,(ns-resolve 'Foo) |
| 20:48 | clojurebot | #<ArityException clojure.lang.ArityException: Wrong number of args (1) passed to: core$ns-resolve> |
| 20:48 | hiredman | ,(ns-resolve *ns* 'Foo) |
| 20:48 | clojurebot | nil |
| 20:48 | hiredman | Uh |
| 20:48 | hiredman | Oh |
| 20:49 | hiredman | well, then there you go |
| 20:49 | ibdknox | TimMc: that works too :) |
| 20:49 | hiredman | ,(ns-resolve *ns* 'String) |
| 20:49 | clojurebot | java.lang.String |
| 20:49 | hiredman | ,(class (ns-resolve *ns* 'String)) |
| 20:49 | clojurebot | java.lang.Class |
| 20:49 | jcrossley3 | hiredman: nice, thanks. :) |
| 20:49 | ibdknox | TimMc: gotta run, but let me know how it goes :) |
| 20:49 | etosch | hiredman: cool, nice to see this is less painful in clojure :) |
| 20:49 | TimMc | ibdknox: thanks |
| 20:56 | TimMc | Here's a nice trick for reading multiple forms from a string: |
| 20:57 | TimMc | &(let [s "1 2 ;comment \n 3 ; more comment"] (rest (read-string (str "(do " s " \n)")))) |
| 20:57 | lazybot | ⇒ (1 2 3) |
| 21:05 | TimMc | alexbaranosky: ugh, you tricked me into working on trycljs more |
| 21:16 | alexbaranosky | TimMc, old Jedi trick ;) |
| 21:23 | unlink | Perhaps my expectations are incorrect, but why does a call to (meta foo) after (defn ^String foo [] "foo") yield nil? |
| 21:23 | TimMc | unlink: the meta you seek is on the var |
| 21:24 | TimMc | unlink: Try (meta #'foo) |
| 21:28 | unlink | TimMc: Why thank you. |
| 21:28 | unlink | I was looking on the fn, wasn't I. |
| 21:29 | TimMc | yep! |
| 21:48 | gf3 | is there a predicate in core somewhere which is something like: checking if the count of an intersection is greater than zero? |
| 21:49 | gf3 | I guess (subset?) is what I want |
| 21:49 | wingie | are all of the clojure's functions available in clojurescript? |
| 21:52 | xcv | Are you guys using any authentification library for your clojure web apps? I'm used to devise with rails and was wondering if there was a slimmed down version of it that still handled most of the boring standard auth logic, password encryption etc. |
| 21:53 | xcv | authentication, that is |
| 21:53 | xcv | :P |
| 21:54 | wingie | xcv: i fixed it with oneall.com =) |
| 21:54 | wingie | better than janrain and gigya |
| 21:55 | wingie | and no need for custom auth (which sucks nowadays if your app is for the crowd= |
| 21:59 | xcv | wingie: Thanks, this might be a good fit for one part of my app, I'll look into it. I also need a more classical username/password system for the other part |
| 22:01 | xcv | wingie: wrt clojurescript, there's an overview on the wiki https://github.com/clojure/clojurescript/wiki/Differences-from-Clojure |
| 22:01 | gf3 | is there a more idiomatic way of writing the following: |
| 22:01 | gf3 | (some (set (list clip)) [:border-box :padding-box :content-box]) |
| 22:01 | gf3 | where clip is a keyword |
| 22:02 | wingie | I hope it will be out of alpha and similar to coffeescript with solid documentation and user base |
| 22:03 | xcv | wingie: the major differences, as I recall, are the lack of refs, stm and agents, and that macros have to be defined in clojure files and imported to clojurescript files, since they operate on the clojure side of things |
| 22:03 | amalloy | (set (list x)) is just #{x} |
| 22:03 | xcv | there's a better overview in Rich's presentation on blip.tv |
| 22:03 | wingie | xcv: do you know if the functions work like: rest, first, second etc? |
| 22:04 | amalloy | but really you want (#{:border-box :padding-box :content-box} clip) |
| 22:04 | wingie | xcv: okay *watching it* |
| 22:05 | xcv | wingie: first and rest are, at least |
| 22:05 | xcv | there's a lot of stuff in src/cljs/cljs/core.cljs in the github repo |
| 22:06 | xcv | I guess most of the "canonical" utility functions and common algorithmic stuff is there or coming soon, in the talk he mentioned that those things were low-hanging fruit |
| 22:07 | xcv | don't know the specific status though |
| 22:09 | gf3 | amalloy: thank you |
| 22:09 | gf3 | amalloy: that should have the same effect, right? |
| 22:09 | amalloy | naw, i like suggesting totally-different replacement code |
| 22:12 | xcv | Any more recommendations for auth plugins? Or should I just roll my own? |
| 22:14 | wingie | xcv: he says that clojure targets the .NET platform |
| 22:15 | wingie | what's that about |
| 22:15 | amalloy | sandbar has auth-related stuff but i don't know much about it |
| 22:16 | xcv | wingie: Not sure, maybe this? https://github.com/clojure/clojure-clr |
| 22:18 | gf3 | amalloy: no I meant set→key vs key→set |
| 22:18 | gf3 | amalloy: I didn't mean your actual suggestion, sorry |
| 22:18 | gf3 | I remember reading that |
| 22:19 | wingie | xcv: looks cool |
| 22:19 | wingie | but it seems to be a big project for one guy to handle :) |
| 22:25 | fbru02_ | ,(map (partial apply hash-map) [["x" 4] ["x" 5] ["y" 6]]) |
| 22:25 | clojurebot | ({"x" 4} {"x" 5} {"y" 6}) |
| 22:31 | kenth | Hi, is there a way to extend a given protocol to a record after it has already been partially defined in defrecord? |
| 22:38 | riddochc | Hey. Anyone had problems building clojure under openjdk? When I do a 'mvn install' at the tip of clojure's master branch, I get a few errors like: "The method divide(BigDecimal, int) in the type BigDecimal is not applicable for the arguments (BigDecimal, MathContext)" |
| 22:46 | riddochc | Running 'lein jar' in enlive says it can't get org.clojure:clojure:jar:1.4.0-alpha3. I'm a bit surprised by this. |
| 22:52 | replaca | technomancy: (sorry, got pulled from the computer) yeah, that's what I guessed. I'll make a patch and see what you think |
| 22:52 | replaca | technomancy: do you have a preference patch or pull? |
| 22:53 | amalloy | replaca: it's easy to create a patch from a pull request, not so easy the other way |
| 22:56 | replaca | amalloy: yeah, doesn't matter to me much - just what people like. |
| 23:00 | amalloy | replaca: https://github.com/flatland/useful/pull/5.patch for example. i'm just saying if technomancy doesn't like pull requests it's super-easy for him to pretend you sent him a patch instead |
| 23:15 | jodaro | ztellman: that worked great |
| 23:15 | ztellman | jodaro: awesome, glad to hear it |
| 23:22 | jodaro | i shuffled things around a little and put it in its own codec |
| 23:22 | jodaro | and then include it in the request and response codec |
| 23:23 | jodaro | but otherwise, yeah, exactly what i was looking for. i guess i should have explored compile-frame closer |
| 23:24 | ztellman | I think the documentation could stand a little restructuring |
| 23:25 | jodaro | i like the conversational style |
| 23:25 | jodaro | the lamina channels docs are good like that too |
| 23:25 | jodaro | maybe just more examples along those same lines |
| 23:26 | technomancy_ | replaca: a pull request would be great |
| 23:26 | technomancy_ | is it something that can be done entirely in slamhound? |
| 23:27 | technomancy_ | riddochc: I use openjdk for everything |
| 23:35 | alexbaranosky | man can't wait to deploy next version of Midje, the colorized clj-stacktraces look great |
| 23:36 | technomancy_ | alexbaranosky: I think I wrapped up the omit-frames branch |
| 23:36 | technomancy_ | just waiting for review from Mark to merge it |
| 23:37 | alexbaranosky | technomancy_, nice. then comes the color-specifying code? Or is it already incorporated in the branch? |
| 23:38 | technomancy_ | I think it should be implemented in terms of the opts arg to pst once omit-frames is on master |
| 23:39 | alexbaranosky | yeah, I see the opts arg now, I'm checking out the branch |
| 23:39 | alexbaranosky | now would you need to make the color into semantically meaningful names, like I did (:java-colo, repl-color, etc)? |
| 23:41 | riddochc | technomancy_: I've only recently been using openjdk - suse's been shipping it, and apparently oracle's licenses don't allow the linux distros to package the sun jdk/jre. |
| 23:45 | technomancy_ | alexbaranosky: yeah, so probably two layers of maps |
| 23:45 | technomancy_ | one for color names to ansi codes, and one for frame types to color names |
| 23:46 | alexbaranosky | technomancy_, yeah that sounds necessary |