2010-03-14
| 00:00 | psykotic | in that example you posted, i don't see how readability is improved |
| 00:04 | somnium | hmm, not much I agree, but it saves 5 parens or so :) |
| 00:04 | somnium | anyway, just a random thought. not something I plan on using atm |
| 00:07 | psykotic | i think the unrolled plist-style that clojure uses for conds, lets, etc, but not a big fan of 'unstructured' separators like that |
| 00:07 | psykotic | s/i think/i really like/ |
| 00:12 | somnium | I think I like the separators better than so-called sweet-expressions, if there were reader macros they could be newlines. sometimes I just get a kick out of just playing with syntax |
| 04:03 | vy | How can we submit issues to http://github.com/technomancy/slime project? It's the SLIME distributed with ELPA, ain't? |
| 04:03 | vy | bitbckt: |
| 04:33 | kwertii | vy: there's an issue tracker at that page |
| 04:36 | vy | kwertii: Would you mind telling me where it is, please? |
| 04:37 | kwertii | vy: ahh, that's a fork. you have to go to the original |
| 04:37 | kwertii | it says "forked from nablaone/slime" .. go there... and then there's a button that says "issues" |
| 04:37 | kwertii | but that fork doesn't seem to belong to the original author |
| 04:38 | kwertii | "unofficial repository, updated daily (import from CVS) " |
| 04:38 | kwertii | looking at the README in the archive, there is a mailing list at http://common-lisp.net/mailman/listinfo/slime-devel that might be what you want |
| 04:44 | vy | Hrm... No, I want to submit issues for technomancy's fork. |
| 05:22 | psykotic | mmm, (run-seq (mfilter (const [false true]) [1 2 3 4])) |
| 07:33 | TDT | hey all. I've been trying to get clojure working for about a week now. I really am trying to get it to work in swank/slime and have had mixed results. I've followed about 5-6 different blog posts on various ways of setting it up. Is there a good definitive source that's fairly recent on getting this setup? I'm specifically running into an issue saying that swank/swank.clj is not in my classpath - but kinda feel like starting over |
| 07:33 | TDT | and trying again. |
| 07:38 | LauJensen | TDT: http://www.bestinclass.dk/index.php/2009/12/clojure-101-getting-clojure-slime-installed/ |
| 07:39 | ttmrichter | What is swank/slime? |
| 07:39 | ttmrichter | Quick glanceover with Google makes it look like an emacs thing. Is that right? |
| 07:40 | arbscht | ttmrichter: yes |
| 07:40 | ttmrichter | Ah. Thanks. |
| 07:40 | TDT | LauJensen: Thanks, I watched another video that tended to be out of date in the end, I'll take a look at this one. Thanks for the link. |
| 07:40 | LauJensen | TDT Np - The good thing is, that if the install 'just works', then you're done in a couple of minutes, if it breaks, I show you how to fix it - If you run into trouble let me know |
| 07:51 | TDT | LauJensen: Using the ELPA is something I've done in the past as well, this worked out well - I removed all my previous installations of clojure/etc as well as my setup for common lisp, and this worked well. I'd like to try and get it working hand in hand with my current common lisp stuff, but what I may just do for now is pull this all to its own config, and load package.el and battle the coexistence problem later. |
| 07:52 | TDT | LauJensen: Thanks for the video, that di dhelp - going to watch the rest of it to see the problems you mentioned earlier but for now it works. |
| 07:53 | LauJensen | TDT: http://nakkaya.com/2010/02/07/using-multiple-lisps-with-inferior-lisp/ |
| 07:53 | LauJensen | That might help you with the CL issue - Glad the video helped |
| 07:54 | psykotic | re: ELPA, auto-install is more useful at the moment because of how few packages are on ELPA, but auto-install is a bit too anarchaic |
| 07:54 | psykotic | i mean, damn, the standard use case is to set an emacswiki url as a source. that's too exploitable with eval injections it's not even funny, heh. |
| 07:55 | TDT | LauJensen: Looks like that post directly talks about clojure as well, as long as swank-clojure-project correctly picks the right slime it should work fine. I'll give that a try after finishing the video. |
| 07:56 | LauJensen | psykotic: Emacs will automatically detect any evil intentions and erase the harddrive of the guilty party |
| 07:57 | psykotic | LauJensen: yeah, i saw that in the latest cvs head :) |
| 07:59 | psykotic | LauJensen: i have a few emacs projects i hack on from time to time--one of them is a simple slideshow app. it looks surprisingly good since truetype fonts are available! |
| 08:00 | LauJensen | What kind of slideshow? |
| 08:00 | psykotic | i mean like powerpoint, keynote |
| 08:00 | psykotic | actually, it's written as an org-mode exporter. |
| 08:00 | psykotic | so i piggyback on their mark up and structure |
| 08:00 | psykotic | org-mode already has a beamer/latex exporter for slides, but i thought it would be fun to have it be live and in emacs itself :) |
| 08:02 | psykotic | i'm entirely too infatuated with org-mode |
| 08:02 | Chousuke | I should use org-mode more, but... |
| 08:06 | LauJensen | hehe |
| 08:07 | LauJensen | Chousuke: Put it in your TODO list |
| 08:07 | psykotic | doh! :) |
| 08:08 | Chousuke | :P |
| 08:13 | LauJensen | psykotic: Although the idea sounds nice, how about just doing a 1:1 port of Keynote and Open Sourcing it ? |
| 08:13 | Chousuke | LauJensen: Delivered with a complimentary pony, obviously |
| 08:13 | psykotic | someone actually did a web app that's almost like that (the cappucino guys), but not open source |
| 08:15 | psykotic | LauJensen: 99% of the keynote slides i've seen have all used the default template with hardly any fancy stuff, except maybe some nice antialiased, rounded graphs |
| 08:15 | TDT | LauJensen: Do you use lein for your project management within clojure? |
| 08:15 | psykotic | or maybe it's that i wouldn't recognize keynote slides that don't use the default template :) |
| 08:15 | LauJensen | You're the odd-ball - Slides need to be pretty and catchy |
| 08:15 | LauJensen | TDT: Clojuresque and Lein |
| 08:16 | psykotic | pretty and catchy usually means simple |
| 08:16 | psykotic | little clutter, lots of whitespace. i don't think the tech part of it factors heavily into it. |
| 08:17 | psykotic | i used to work at a big company where everyone did slide-based presos all the time, it was hell |
| 08:17 | psykotic | 99% of them were engineers, and they liked to stuff 10 items into each slide. the worst feature in the world is powerpoint's autoshrinking font size feature, where you can just keep adding items and they will fit in the slide |
| 08:17 | psykotic | the mere absence of that feature in keynote is a large part of why keynote slides are better |
| 08:51 | callen | should I just use ClojureX? |
| 08:51 | callen | contrib is being cantankerous for both emacs and on my side. |
| 08:52 | callen | "build.xml does not exist" yeah thanks. the maven build worked fine though, but emacs isn't smart enough to try that. |
| 08:57 | TDT | LauJensen: One last question if you don't mind. I worked off your .emacs file and created a project, lein new test-proj, cded into that directory and ran lein deps, then in emacs ran swank-clojure-project, pointed it to the root of that directory, and swank started. It's trying to do a (require 'swank.swank), which is failing saying that swank/swank.clj isn't there. I found the file in my .emacs.d/swank-clojure/src, so I added it to |
| 08:57 | TDT | the my swank-clojure-classpath at the end: "~/.emacs.d/swank-clojure/src/*", but am still getting this error. Have you encountered t his issue before? |
| 09:00 | LauJensen | TDT I've never experienced that |
| 09:02 | TDT | Ah ok, I'll tinker a lot more then, slime, by itself, runs fine..I have a feeling it has to do with elpa since I'm not requiring slime earlier. I disabled elpa, required slime and stuff broke so I just need to pull wht elpa is doing out likely. |
| 09:03 | LauJensen | TDT - Make sure that your lein project has swank as a dev-dependency and that you're run 'lein deps' |
| 09:03 | LauJensen | You can find the 'Reddit Clone in 90 lines of clojure' post on my site for a quick demo of how to set it all up |
| 09:03 | LauJensen | (as well as a cloneable git repo) |
| 09:05 | TDT | good catch you're right the swank wasn't as a dependency. In your .emacs config, did you move away from using elpa in the end or are you still using whatever it gives you in conjunction with your customizations in your post? |
| 09:05 | LauJensen | Still using the same setup |
| 09:06 | rhickey | this looks like it could use some help, type hints, modern interop style etc - http://www.paullegato.com/blog/yahoo-finance-clojure/ |
| 09:06 | TDT | LauJensen: k, I'll stick with it then as well. Thanks |
| 09:07 | LauJensen | np |
| 09:46 | callen | coming to clojure from python, when I'm dealing with a java date object, how can I see the methods that the object has? |
| 09:46 | callen | previously, ipython provided tab completion to see all the available methods, metadata, class variables, etc. |
| 09:50 | rhickey | callen: if you use enclojure it will do completion for both Clojure and Java stuff |
| 09:51 | rhickey | La Clojure w/IntelliJ probably will as well |
| 09:51 | callen | rhickey: excellent, thank you. Due to not being a java coder I'm having to learn what goes to what, and basically learn two languages at once. |
| 09:53 | etate | callen: i'd focus on using what you can from clojure before resorting to Java, though for date stuff incanter has a chronos lib which binds to joda time :) |
| 09:53 | callen | rhickey: is there a way to have method completion, without departing slime or the repl? |
| 09:53 | callen | rhickey: is there just some object metadata that I can invoke? |
| 09:53 | callen | rhickey: python equivalent being _meta |
| 09:53 | rhickey | callen: also, repl-utils from contrib will give you the show and javadoc functions - http://richhickey.github.com/clojure-contrib/repl-utils-api.html |
| 09:54 | callen | because ipython introspects using standard metadata attached to the objects at runtime, tool agnostic that way. |
| 09:54 | callen | oh bugger, contrib. I don't think that's in my class-path yet. |
| 09:58 | callen | aha, contrib is on my cp now. |
| 09:58 | Raynes | What is the best way to check if a element is in a sequence? For example (any? \x coll). |
| 10:01 | callen | are there any paste services that accommodate clojure? |
| 10:01 | callen | n/m, got one. |
| 10:02 | psykotic | Raynes: (some #(= x) coll) |
| 10:02 | callen | http://www.dpaste.org/E7I6/ <- http://richhickey.github.com/clojure-contrib/repl-utils-api.html |
| 10:02 | psykotic | err, make that (some #(= x %) coll) |
| 10:02 | Raynes | callen: gist.github.com, hpaste.org (I think), programble.co.uk/paste, paste.pocoo.org, snipt.org, etc. |
| 10:02 | callen | Raynes: already got one. see above for paste. |
| 10:03 | callen | Raynes: dpaste supports it. |
| 10:03 | psykotic | gist has stolen my heart. |
| 10:03 | psykotic | i doubt i'll ever use another patebin |
| 10:03 | Chousuke | gist is fun in that you can actually clone the gists :P |
| 10:03 | Chousuke | and push to them |
| 10:03 | Raynes | http://www.acidrayne.net/wiki/doku.php?id=pastebins I keep a list here. |
| 10:03 | Raynes | Not that all of them support Clojure, but most of them do. |
| 10:03 | callen | that's pretty cool @ gist. I might switch to it. |
| 10:04 | callen | anyone have any idea Re: my error? |
| 10:04 | psykotic | it's especially nice if you already have a gist account |
| 10:04 | psykotic | err, github account |
| 10:04 | callen | clojure-contrib is on the classpath. |
| 10:04 | Raynes | psykotic: Thanks. |
| 10:04 | Chousuke | Clojurebot started as a gist, but then I cloned it and pushed it into a proper github repo |
| 10:04 | psykotic | Raynes: fwiw, there should still be a builtin for that idiom |
| 10:04 | Chousuke | that's why the first commit messages aren't very informative :P |
| 10:04 | psykotic | i'm sure there is in contrib but imo it should be in core |
| 10:04 | Raynes | psykotic: Agreed. |
| 10:05 | psykotic | Raynes: btw a nice thing about some is that it doesn't just return 'false' or 'true' but it turns the first logically true entry |
| 10:05 | Chousuke | I also like M-x gist-buffer |
| 10:05 | Raynes | Eh. |
| 10:05 | callen | cannot create ISeq from clojure.lang.Symbol after attempting to create a namespace with require repl-utils. |
| 10:05 | callen | Wat. |
| 10:05 | callen | oh hoh. |
| 10:05 | callen | it works in a repl |
| 10:06 | callen | but not in slime. |
| 10:06 | callen | #!@$ |
| 10:06 | psykotic | ,(some :b [{:a 1} {:b 2} {:c 3}]) |
| 10:06 | clojurebot | 2 |
| 10:06 | callen | psykotic: is cljbot isolated safely? |
| 10:06 | psykotic | rhickey: since you seem to be here, is there any reason you didn't make every? symmetric with some? |
| 10:07 | psykotic | admittedly the use case for every is less useful, but it's an odd asymmetry |
| 10:08 | psykotic | Chousuke: auto-install.el even has support for installing from gist! |
| 10:12 | Raynes | http://gist.github.com/331995 |
| 10:12 | Raynes | Eh, wrong channel. |
| 10:12 | callen | ugh. |
| 10:13 | rhickey | psykotic: it's some, not some? and that is the difference. some returns the return value of the test fn, not necessarily true/false |
| 10:14 | psykotic | rhickey: i said some. the ? was a question indicator. :) |
| 10:14 | rhickey | ok, well, same answer |
| 10:14 | rhickey | :) |
| 10:14 | psykotic | well, my point is that and : or :: some : every?, or well, that's the natural symmetry |
| 10:14 | Raynes | callen: clojurebot is sandboxed. |
| 10:15 | rhickey | but some does more than t/f |
| 10:15 | psykotic | just as (and true x) returns x, i'd expect every to return the last logically true element if all preceding ones were logically true |
| 10:15 | callen | the tutorial I'm reading doesn't appear to have described how to make comments in clojure. google was similarly unhelpful (clojure.org/api, oh come on.) |
| 10:16 | callen | how do I make a comment? |
| 10:16 | rhickey | ;comment |
| 10:16 | Raynes | callen: ; |
| 10:16 | Raynes | callen: And (comment ..) |
| 10:16 | callen | I saved a class path printer. And thank you. |
| 10:16 | Raynes | (doc comment) |
| 10:16 | clojurebot | "([& body]); Ignores body, yields nil" |
| 10:18 | rhickey | psykotic: ah. so you want every like some, could do, not sure about the utility of that value though |
| 10:18 | callen | rhickey: I was reading a paper on programming paradigms, explained type safety, expressiveness, their relationship, etc. With respect to concurrency, it praised the model you use in clojure. |
| 10:18 | callen | it seemed to think STM was the future. |
| 10:19 | rhickey | callen: where was that? |
| 10:19 | callen | (without explicitly mentioning clojure, I don't think clojure existed when the paper was written) |
| 10:19 | psykotic | rhickey: i agree it's less useful but it just seems like an unexpected asymmetry. principle of least astonishment and all that. |
| 10:19 | callen | rhickey: it was a "least you should know about programming paradigms" or some-such, I'll look it up. |
| 10:19 | callen | rhickey: it did a good job of explaining why I don't like haskell, indirectly. (again without naming names, really.) |
| 10:20 | psykotic | haskell is pretty pluralistic about concurrency. |
| 10:20 | callen | aha, 2009. |
| 10:20 | callen | psykotic: I'm referring less to concurrency when I speak of haskell |
| 10:20 | callen | psykotic: and more to it being the BDSM of programming languages. |
| 10:20 | callen | http://lambda-the-ultimate.org/node/3465 |
| 10:20 | psykotic | hardly |
| 10:20 | callen | 2009, I was wrong, clojure was extant. |
| 10:21 | callen | psykotic: tch. I'm here for a reason. anyway, linkage above. |
| 10:21 | psykotic | pascal is more bdsm than haskell. in pascal the types are just sitting there as pences. |
| 10:21 | callen | rhickey: ^^ |
| 10:21 | psykotic | *fences |
| 10:21 | callen | psykotic: pascal at least didn't pretend it wasn't being executed by a computer. pascal's type system was horrid, but that's another matter. |
| 10:21 | psykotic | in haskell you have things like type-directed dispatch via type classes and how it interacts with type inference. it has a pretty good bang to buck ratio, even if you're not a type fan. |
| 10:21 | rhickey | psykotic: least astonishment depends on where you come from - http://www.lispworks.com/documentation/HyperSpec/Body/f_everyc.htm#every |
| 10:22 | callen | rhickey: have you seen the paper I linked to above before? |
| 10:22 | rhickey | callen: yes, thanks |
| 10:22 | callen | np. |
| 10:22 | psykotic | rhickey: cl's standard library is pretty horrible, i'm not sure it's much of a yardstick :) |
| 10:22 | callen | it more or less summarized the 'ick' I was experiencing. |
| 10:22 | Raynes | #letsargueabouthaskell |
| 10:23 | callen | Raynes: yeah I'd rather not. |
| 10:23 | callen | anyway. |
| 10:23 | psykotic | i often wonder how cl would have changed if they had adopted richard waters's streams proposal |
| 10:23 | psykotic | it lets you program in a style very similar to lazy sequences in clojure |
| 10:23 | rhickey | psykotic: I disagree |
| 10:23 | callen | http://gist.github.com/332001 <--- clojure-contrib is in the class path, what gives? |
| 10:23 | psykotic | s/streams/series/ |
| 10:23 | rhickey | It may be limited, but not horrible |
| 10:23 | rhickey | some of it very well considered |
| 10:24 | psykotic | rhickey: fair enough, yeah |
| 10:24 | callen | I think having good judgment with respect to libraries is more important than making it expansive. |
| 10:24 | callen | .NET and python are good examples of what can go wrong there. |
| 10:24 | psykotic | its paucity is a good example of why it's important to have a very strong and versatile standard library though. despite their being good extension libraries around, some quite widespread, a lot of programmers stick to the standard library and make their code much less expressive for it. |
| 10:24 | rhickey | psykotic: an interesting exercise would be - define every (no ?) as you describe. Would anyone prefer it to every? ? |
| 10:25 | callen | did guido *ever* sit in #python and respond to people? |
| 10:25 | psykotic | callen: probably in 93 :) |
| 10:25 | rhickey | psykotic: agreed, but there I would say the main liability of CL lib is age, not design. For its age, a great design |
| 10:25 | callen | psykotic: I'd be surprised if he did. He doesn't seem the type to actually care to talk to anyone. |
| 10:26 | psykotic | rhickey: well, i have some bones to pick with it. a lot of it is very "first-order". things like loop and format. |
| 10:27 | psykotic | it's interesting to read steele's comments on that aspect. |
| 10:27 | psykotic | he attributes it to a lack of practical experience with that programming style among lispers--which is probably true. |
| 10:27 | rhickey | psykotic: but being a Lisp-2, that is the style. There was Scheme for the other style, after all. What matters is consistency |
| 10:27 | psykotic | rhickey: you know the standard appendix with the SERIES proposal, right? |
| 10:27 | vy | rhickey: I still couldn't understand how CL commitee managed to miss the networking (and threading) stuff in the standard. Sometimes I'm wondering if they ever would have made such a stupid mistake as imagining a software future without networking? |
| 10:27 | psykotic | it's much higher-order. |
| 10:28 | rhickey | Given all that CL had on its plate, I think they did a great job |
| 10:28 | psykotic | oh sure |
| 10:28 | psykotic | it's amazingly good |
| 10:28 | psykotic | i'm just not sure using it as a model for 2010 is necessarily the way to go. you seem to have liberally broken with convention and tradition where it made sense. |
| 10:29 | rhickey | SERIES is neat, but a lot of macrology to enable the inlining. I wouldn't consider it really higher order, but I'm not too familiar |
| 10:29 | callen | psykotic: given that I know more scheme than CLOS, this doesn't hurt me. |
| 10:29 | psykotic | right, i should say it gives a similar STYLE to higher-order programming but it's first-order by design. |
| 10:30 | psykotic | the whole compiling thing is pretty crazy but an obvious artifact of the performance obsessiveness of the lisp heads at the time. |
| 10:30 | rhickey | psykotic: the test for every is as I said about - would people prefer and use a non-predicate every vs every? I think the would instead argue for a predicate some? |
| 10:30 | rhickey | they would |
| 10:30 | psykotic | i don't disagree. actually, i think what bothers me most is the visual asymmetry :) |
| 10:31 | psykotic | the semantics are a corollary, or vice versa, heh |
| 10:31 | psykotic | i also think any/all are prettier, shorter and more symmetric, but again that's a haskell vs cl heritage thing |
| 10:38 | callen | okay, I've tried loading the class path from the manual install, and from clojurex. |
| 10:39 | callen | it cannot find clojure.contrib nor clojure.contrib.repl-utils |
| 10:39 | callen | clojure appears to otherwise function. |
| 10:40 | callen | http://gist.github.com/332001 |
| 10:40 | callen | is there some procedure for testing/dealing with class loading issues? |
| 10:41 | psykotic | rhickey: srfi-1's every seems to have the semantics i mentioned. http://srfi.schemers.org/srfi-1/srfi-1.html#Searching |
| 10:48 | callen | cannot validate pom.xml in mvn package attempt for latest git clone of clojure-contrib. |
| 10:49 | callen | even using the distro default install of clojure does not seem to be able to load my clojure contrib. |
| 10:52 | psykotic | i had problems building clojure-contrib a few days ago from the github head. try switching to the 1.1.0 branch or something. |
| 10:52 | callen | psykotic: I've got 4 installs of clojure running around, all in an attempt to get clojure.contrib to work. |
| 10:52 | callen | psykotic: your name is illustrative of my state of mind in trying to get this to work. |
| 10:53 | psykotic | i'll take your slight of haskell as the ravings of a madman, then :) |
| 10:53 | callen | I'd be delighted if we didn't bring that discussion up again. |
| 10:53 | callen | I'm here for clojure, not Simon. |
| 10:54 | psykotic | so you're sure you have clojure-contrib.jar in your -cp? |
| 10:54 | callen | psykotic: as I said before, it was in the list, right before the clojure.jar |
| 10:55 | psykotic | dude, you're typing (:require ...) |
| 10:55 | callen | cargo cult. got it from the repl-utils page. |
| 10:55 | psykotic | ,(doc require) |
| 10:55 | clojurebot | "([& args]); Loads libs, skipping any that are already loaded. Each argument is either a libspec that identifies a lib, a prefix list that identifies multiple libs whose names share a common prefix, or a flag that modifies how all the identified libs are loaded. Use :require in the ns macro in preference to calling this directly. Libs A 'lib' is a named set of resources in classpath whose contents define a library of Cloju |
| 10:55 | callen | I'm in the shotgun blast and pick apart the remnants stage of learning the language. |
| 10:55 | psykotic | you're typing it as a keyword. |
| 10:56 | psykotic | ,(:require {:require 42}) |
| 10:56 | clojurebot | 42 |
| 10:56 | callen | psykotic: okay, how do I invoke the stuff in repl-utils? |
| 10:56 | callen | because it says none of the stuff in there exists. |
| 10:56 | psykotic | for a start, use require rather than :require |
| 10:56 | chouser | repl-utils is one of the rare cases that I recommend a naked 'use' |
| 10:56 | callen | ClassNotFoundException for (require clojure.contrib.repl-utils) |
| 10:56 | rhickey | callen: (require 'clojure.contrib.repl-utils) |
| 10:57 | callen | symbol. |
| 10:57 | callen | bugger. |
| 10:57 | psykotic | if you looked at (doc require) it has a straight-up example |
| 10:57 | callen | throws a verify error, no idea if that indicates anything meaningful. |
| 10:58 | callen | psykotic: what does that colon do? |
| 10:58 | callen | it makes doc fail, for one. |
| 10:58 | callen | so obviously it's syntactically significant. |
| 10:59 | psykotic | ,(class :x) |
| 10:59 | clojurebot | clojure.lang.Keyword |
| 10:59 | psykotic | ,(class 'x) |
| 10:59 | clojurebot | clojure.lang.Symbol |
| 10:59 | psykotic | it's the difference between specifying a keyword and a symbol |
| 10:59 | callen | okay but with respect to require? |
| 10:59 | psykotic | keywords in operator position act as lookup operations |
| 11:00 | psykotic | the standalone require doesn't use it. you're probably thinking of (ns foo (:require ...)) |
| 11:00 | callen | right. |
| 11:00 | callen | why is it needed as part of a namespace (lookup operation?) |
| 11:00 | psykotic | there it's acting as a 'key'. it's not a function in itself, it's interpreted by the ns macro |
| 11:00 | callen | ah. |
| 11:00 | callen | so it's a way of passing it unevaluated to the macro? |
| 11:00 | callen | much like symbol, but for...other things. |
| 11:00 | callen | *twitches* I think? |
| 11:01 | rhickey | keywords evaluate to themselves |
| 11:02 | callen | so what is its purpose as before a require in the operator area for a namespace? |
| 11:02 | psykotic | in the case of macros, i think it's mostly just a convention. it's possible to use symbols there. |
| 11:02 | callen | is it just a way of creating a reference that the macro can use without executing the require statement? |
| 11:02 | rhickey | callen: ns is a macro and has its own internal syntax, which uses keywords. it is not a block of code, parts of which you could take out and use elsewhere |
| 11:03 | callen | well I gathered that it was a macro, I'm just trying to understand where the keyword fits into that. Am I correct in my summarization above? |
| 11:03 | callen | ugly word, summary. |
| 11:05 | rhickey | no, a macro just takes forms as data and interprets them as it sees fit. It is a little program that takes data structures and returns other data structures. So, it takes lists and vectors and symbols and keywords and assigns its own meaning to them. It is not leveraging a special property of keywords |
| 11:06 | rhickey | ns need not evaluate any of the data forms it is passed |
| 11:06 | callen | well, you pass a require into a namespace in order to make use of what the library provides in a sanitary area, right? |
| 11:06 | callen | I guess what I'm wondering is why you're keywording the require. |
| 11:07 | rhickey | so it doesn't look, to a more experienced Clojure programmer, like a call to the require function, because ns is not a code block |
| 11:07 | psykotic | i.e. it's convention |
| 11:08 | callen | ah, okay. thank you. |
| 11:08 | callen | sorry to be such a pain, but I very much want to understand what's going on. |
| 11:08 | rhickey | else they would be tempted to put other function calls in there, which won't make sense to ns |
| 11:08 | callen | I don't like riding on cargo. |
| 11:10 | callen | okay, I can get repl-uitls to require. |
| 11:10 | callen | none of the relevant public stuff seems to work though. |
| 11:10 | callen | nothing in this context. |
| 11:10 | callen | unable to resolve symbol. |
| 11:11 | rhickey | callen: are you just winging it without a book or tutorial? |
| 11:11 | rhickey | or reading the online docs? |
| 11:11 | callen | online docs. |
| 11:11 | callen | and tutorials. |
| 11:11 | callen | went through one tutorial, it covered the basics of the data types, operations, etc. I'd done scheme before, nothing unfamiliar there so far. |
| 11:12 | rhickey | require will load the library but not pull all of its names into your ns |
| 11:12 | callen | that's the kind of thing the tutorials I've read have not covered. |
| 11:12 | psykotic | rhickey: i'm looking at the yahoo finance guy's clojure code and there are some funny java slips |
| 11:12 | rhickey | you could do that, at some cost of pollution, by using 'use' instead |
| 11:12 | psykotic | rhickey: like in his big (str ...) call to construct an url by concatenation, there's a + between two elements :) |
| 11:12 | callen | rhickey: how do I reference the namespace/path to the library? Or better yet, where can I find a book/tutorial that teaches me these kinds of things. |
| 11:13 | callen | I swear to god, I read another tutorial that can be boiled down to, "LOL PREFIX NOTATION" I'm going to get stabby. |
| 11:14 | rhickey | a cleaner way is to use an alias for the namespace with require :as - (require '[clojure.contrib.repl-utils :as repl]) |
| 11:14 | rhickey | then (repl/javadoc String) |
| 11:14 | callen | aha, just like python. excellent. |
| 11:14 | callen | seriously though, is there a book/tutorial that'll go more in-depth than what I've found so far? |
| 11:14 | callen | I don't really want to keep pinging the channel like this. |
| 11:15 | rhickey | http://pragprog.com/titles/shcloj/programming-clojure |
| 11:15 | callen | is the pragprog book on.....I was just about to ask. |
| 11:15 | callen | did Halloway do a good job? |
| 11:16 | rhickey | yes |
| 11:17 | callen | excellent. thank you. |
| 11:17 | rhickey | people have liked this also: http://java.ociweb.com/mark/clojure/article.html |
| 11:17 | rhickey | http://stackoverflow.com/questions/599519/which-tutorial-on-clojure-is-best |
| 11:19 | callen | I'd found that before. |
| 11:19 | callen | I don't do video, it's too slow. |
| 11:19 | rhickey | faster than IRC sometimes :) |
| 11:20 | callen | I'd already said I didn't like pinging you guys. :( |
| 11:20 | rhickey | callen: we don't mind really |
| 11:21 | callen | rhickey: fsm bless you. |
| 11:21 | rhickey | and the ns stuff is the trickiest bit, that and classpaths |
| 11:21 | callen | rhickey: somehow I managed to trip over both right off the git. |
| 11:22 | callen | wait a tic. has anyone used clojure on android yet? |
| 11:22 | callen | oh hoh, there's a framework. |
| 11:22 | callen | cool. #_# |
| 11:36 | remleduff | I've heard that the dalvik vm is bad at both jit and gc, which are two things that closure uses heavily |
| 11:36 | callen | rhickey: what guided many of your decisions wrt language design? I'd like to read the same material, perhaps understand your mindset better. |
| 11:38 | callen | remleduff: dalvik sucks period. |
| 11:39 | AWizzArd | callen: also take in mind that Rich is an exceptional talent and has very much experience. I think this adds to and trancends reading books alone. |
| 11:40 | callen | AWizzArd: I can't download experience. I took that part for granted. All I can do is look to his personal library. |
| 11:40 | rhickey | callen: http://www.amazon.com/Clojure-Bookshelf/lm/R3LG3ZBZS4GCTH |
| 11:40 | Raynes | I believe someone asked the same question a while back. I don't think it was books that inspired Clojure, as much as it was personal experience over time. |
| 11:40 | callen | AWizzArd: unless you're aware of some esoteric goat sacrifice ritual for me to download his years of laerning, I'm left to resort to reading. |
| 11:40 | Raynes | callen: I don't think he was trying to be a smartass. |
| 11:41 | callen | Then why say it? |
| 11:41 | Raynes | Because he's right. |
| 11:41 | callen | I know he's got lots of experience. I read several interviews. |
| 11:41 | callen | Raynes: it was an unconstructive statement for reasons I laid out above. |
| 11:41 | AWizzArd | callen: we are working on the part of downloading knowledge, but I think we are still 2-4 decades away from that. |
| 11:41 | Raynes | Eh, I'm not so sure about that. |
| 11:41 | callen | deconstructing an attempt at learning without providing an alternative is pointless and nihilistic. |
| 11:41 | Raynes | Maybe he'll write a book about it all one day. |
| 11:42 | callen | wonderful. Until then, the bookshelf he linked to will be very helpful. |
| 11:42 | Raynes | And then you can go into your magical corner where everything is in books. :D |
| 11:42 | callen | Raynes: provide an alternative. |
| 11:42 | callen | Raynes: I function on what I can do *right now* and what I can do *right now* is read. |
| 11:42 | callen | and code. |
| 11:42 | callen | that's about it. |
| 11:43 | callen | Raynes: I can't even compare my lisp experiences to his because I come from scheme, rather than LW // CLOS |
| 11:43 | Raynes | Well, you could ask questions about what you're wondering about, to fill in the blanks. |
| 11:43 | rhickey | ok, let's not argue |
| 11:44 | callen | agreed. |
| 11:44 | Raynes | I'm not arguing. I just don't appreciate the attitude. I'll slip on out the back now. ;) |
| 11:44 | callen | Raynes: there's no specificity in my curiosity. |
| 11:44 | callen | Raynes: that's why I asked for general sources of reading. I'm curious about everything. I just want to absorb mass amounts of material. |
| 11:44 | callen | I know the rationale for STM, so need to ask about that specifically. |
| 11:44 | callen | I know the rationale for Lisp, so no need to ask there either. |
| 11:45 | callen | There's nothing at all to scope any particular query with. So I might as well just ask for general purpose reading. *shrugs* |
| 11:47 | callen | Raynes: does that explain where I'm coming from? |
| 11:47 | callen | if I sounded hostile previously, I'm sorry, I didn't mean to. |
| 11:47 | rhickey | callen: I think they were just pointing out that your original question "what guided ... I'd like to read same" includes a presumption that the decisions were driven by things you could read. Some were, some weren't and were experience-driven. |
| 11:48 | Raynes | It's all good. I don't hold grudges. |
| 11:48 | etate | callen: have you watched the clojure vids on blip? |
| 11:48 | callen | I wouldn't ever presume a language to be guided entirely by book learning, one that I would learn anyway. |
| 11:48 | callen | etate: Don't do video. |
| 11:48 | etate | callen: the two vids specifically targetted at Common Lispers are really informative and explain a lot of the design decisions |
| 11:49 | callen | etate: schemer. I don't like listening to people talk, it's distracting. I multi-task quite a bit. |
| 11:49 | callen | etate: speech is slow. |
| 11:49 | remleduff | I know the list says "In no particular order" but SICP at the very bottom of the list? ;) |
| 11:49 | AWizzArd | callen: You are denying yourself input channels that may transport useful information. |
| 11:50 | callen | AWizzArd: I'm glad you think so, but my work-style doesn't really mesh with video very well. I only watch a video if it's extremely important or if I'm not doing anything else. |
| 11:50 | callen | I *hate* it when my friends send me pointless videos. *hate* |
| 11:50 | rhickey | callen: well, there is a lot of good stuff in the videos, and they're the primary way that I personally have communicated about Clojure |
| 11:50 | rhickey | in talks etc |
| 11:51 | callen | it forces me to stop 100 things I have spooled up and going in order to sit and pay attention to one thing for minutes/hours at a time for no reason. |
| 11:51 | callen | rhickey: is there a transcript? :( |
| 11:51 | remleduff | callen: I actually watched the videos while doing other work, for some reason that was pretty much enough attention to get started |
| 11:51 | Raynes | I don't think I can read and watch television at the same time. |
| 11:51 | rhickey | http://clojure.googlegroups.com/web/clojure-for-lispers-transcript.txt |
| 11:51 | callen | remleduff: once the linguistic portion of my mind is forced to focus on words, I'm unable to multitask. |
| 11:52 | callen | rhickey: :D thank you. |
| 11:52 | callen | remleduff: I'm almost physically incapable of working/coding without music. |
| 11:52 | rhickey | one of the few for which there is |
| 11:52 | etate | callen: they are really worth watching, even if they take you out of your busy schedule for an hour |
| 11:52 | callen | remleduff: the only thing I can do without music is tests. |
| 11:52 | callen | etate: have transcript, unnecessary. |
| 11:52 | callen | Hickey's voice is delightful but unrelated to the material. |
| 11:52 | etate | callen: and rhickeys voice is soothing |
| 11:53 | callen | etate: ^^ |
| 11:53 | etate | :D |
| 11:53 | Raynes | I put on a Rich Hickey talk when I have trouble sleeping at night. |
| 11:53 | Raynes | It helps me sleep, and I dream of parentheses. |
| 11:53 | etate | haha |
| 11:55 | rhickey | callen: http://clojure.googlegroups.com/web/Clojure-Boston-Lisp-Part-1-Audience-Questions.txt goes with that |
| 11:56 | rhickey | and the slides: http://clojure.googlegroups.com/web/clojureforlispers.pdf |
| 11:59 | callen | all very helpful, thank you. |
| 12:00 | Raynes | rhickey: Where are the slides for the first transcript? |
| 12:01 | rhickey | Raynes: are they not ^^ |
| 12:01 | rhickey | ? |
| 12:01 | Raynes | Oh. I thought those were for a different talk. |
| 12:02 | callen | nope. they're for the talk. |
| 12:14 | remleduff | If I'm typing a sexp, and I'm done with it, is there a quick key to get to the end of it (I'm using paredit-mode). I can type C-M-f, but just wondered if I was missing a better way to do it. |
| 12:14 | remleduff | There should be a question mark there |
| 12:14 | remleduff | Argh, meant that for #emacs |
| 12:15 | Raynes | remleduff: A quick glance at my cheetsheet just shows C-M-f |
| 12:24 | LauJensen | rhickey: The implication of your quote "When you get hit by lightning, who's behaving? There is no behavior?" was that simply to say that the notion of behavior is also a derrived term from seeing a series of states? |
| 12:25 | TDT | Hmm...for C-u M-x slime, I have my implementation for sbcl working fine now - and just running M-x slime works perfectly fine , but for the C-u M-x slime, what is clojure called. Looking at swank-clojure, it appears that they may not have been able to define it the normal way. |
| 12:38 | remleduff | When using swank-clojure, if I do C-x C-e to evaluate, where does the result end up? If I evaluate (def x 1), x doesn't exist in my slime repl after evaluating, unless I'm doing something wrong. |
| 12:40 | Chousuke | remleduff: are you sure you have the correct namespace in the repl? |
| 12:40 | remleduff | Argh, I must have been doing something wrong |
| 12:40 | Chousuke | if you have a (ns ...) form in the top of the file you're evaluating, all evals are done in it |
| 12:40 | Chousuke | and the slime repl defaults to the user namespace |
| 12:41 | Chousuke | you can do (in-ns 'foo.bar) to switch the namespace in the repl |
| 12:41 | remleduff | I had (client ["ping"]) and ended up evaluation ["ping"] instead of the whole thing accidentally |
| 12:41 | Chousuke | heh |
| 12:44 | remleduff | How would I, using paredit, change "id" to :id? |
| 12:46 | dnolen | remleduff: hmm, probably simpler to just replace-string right? |
| 12:47 | remleduff | It's weird, it won't let me delete the quotes, but it won't let me "barf" the thing inside the quotes |
| 12:47 | psykotic | LauJensen: i remember trying to decipher that quote too. |
| 12:47 | LauJensen | Yea - I'm just wondering if there's more to it |
| 12:48 | psykotic | LauJensen: i thought it was maybe a stab at the OO people who see every event as an asymmetric something-happening-to-an-object kind of thing. |
| 12:48 | LauJensen | Could be |
| 12:48 | remleduff | "If a tree falls in a forest, who's behaving?" ;) |
| 12:48 | LauJensen | "State - Who's behaving?" :) |
| 12:49 | psykotic | regarding the whole 'sequence of states' thing, it reminded me of david hume's investigation of causality. |
| 12:49 | LauJensen | I'm unfamiliar with his study |
| 12:50 | remleduff | I highly recommend the "Giants of Philosophy" audiobooks for listening while jogging :) |
| 12:50 | psykotic | well, it's the whole problem of trying to figure out what causation means. he ends up with a definition of it as 'invariant sequence'. in other words, A causes B if whenever you see B, A immediately precedes it. the problem with this is the problem of induction--there's no way you can know whether A always precedes B from a finite set of data. |
| 12:51 | psykotic | fortunately, in functional programming, we have data flow :) |
| 12:51 | psykotic | life is simple |
| 12:51 | LauJensen | simple(r) |
| 12:53 | psykotic | i really enjoyed that talk of rich's, it's rare to see talks that go into that level of things. |
| 12:53 | LauJensen | I think Rich is one of the few who starts out by saying "I've made a language, based on these philosophers view of time" |
| 12:54 | psykotic | i'm not sure the causality is that strict, but they certainly seem to have informed his views |
| 12:55 | LauJensen | True - I dont know the sequence of events, but Clojure has certainly inspired me to go out of the 'code box' to consider solutions more than anything else in the past |
| 12:55 | remleduff | Anyone using FleetDB at the moment? |
| 12:55 | LauJensen | remleduff: Meikel has implemented a backend for ClojureQL for FleetDB now and he seems pretty psyched about it |
| 12:56 | psykotic | my one reversation is that he seems a bit too committed to the idea that there is a 'right metaphysics' for this kind of thing. |
| 12:56 | Raynes | Is there a function to get a random element of a list? |
| 12:56 | Raynes | Or to randomize a list, or something similar? |
| 12:56 | psykotic | *reservation |
| 12:56 | LauJensen | psykotic: Can you elaborate on your concern ? |
| 12:56 | Raynes | I know it's easy to just generate a random number the size of the sequence and then nth it, but still. |
| 12:56 | psykotic | for example, he says that the world 'really doesn't work like message passing'. |
| 12:56 | remleduff | It has a requirement that every item entered has a unique "id". I'm wondering how a client is supposed to guarantee that it's inserting unique IDs |
| 12:56 | Raynes | A random number between 0 and the size of the seq* |
| 12:56 | psykotic | i think this whole idea that we can figure out what the world 'really is' is misguided. what we have are more or less useful models, and their usefulness is context dependent. |
| 12:56 | remleduff | Well, it will get an exception if it inserts a duplicate, but how is it supposed to know what the next free id is |
| 12:57 | etate | LauJensen: which talk is the one with that quote? |
| 12:57 | psykotic | so, i don't think imperative programming is bad (when it is) because the world 'doesn't work like that'. |
| 12:57 | LauJensen | "Are we there yet?" JVM Keynote |
| 12:57 | LauJensen | @etate |
| 12:58 | LauJensen | psykotic: Thats a big talk - I think I agree with you so far that as the years go by, me might learn more and more paradigmes of which we were unaware when implementing current features/solutions, but from a pragmatic standpoint we get a lot of mileage from the current approach |
| 12:58 | LauJensen | I'm not sure this isn't just the natural evolution of paradigmes |
| 12:58 | psykotic | and i think his dismissal of message passing as the default is really a pragmatic one. if he had wanted to take the idea of semblance to reality seriously, i think message passing might stand a better chance of winning. |
| 12:59 | psykotic | i.e. everything is mediated by particles. |
| 12:59 | psykotic | the notion of a consistent snapshot doesn't really make sense from a pure physical point of view |
| 12:59 | LauJensen | You mean as the medium of observance? |
| 12:59 | LauJensen | psykotic: Sure it does, in the sense that your mind makes this snapshots, he's referring to the sensory/mental process |
| 12:59 | psykotic | right |
| 13:00 | etate | LauJensen: thanks checking it out now :D |
| 13:00 | psykotic | well, first, i think that gets into issues we don't really know very much about |
| 13:00 | LauJensen | psykotic: Even message passing in its current form does not match particle passing, as there's the 2-way quality check |
| 13:00 | psykotic | LauJensen: the actor model was directly modeled on physics, btw. |
| 13:00 | psykotic | if you go read carl hewitt's original paper |
| 13:01 | psykotic | 2-way quality check? |
| 13:01 | LauJensen | psykotic: I haven't read it. But when the particles fly off the screen to my eye - My eye doesn't send them back to confirm that I got the right data |
| 13:01 | psykotic | the actor model doesn't either |
| 13:01 | psykotic | you can do that - but it's pure protocol, like any kind of handshaking, not intrinsic to the model |
| 13:01 | LauJensen | I remember looking at one implementation which does, Erlangs perhaps |
| 13:02 | sproust | Clj newbie has a question; listening to RHickey's interview on Channel9 (very interesting). |
| 13:02 | LauJensen | I dont see how you could do with out. In distributed computing there's no assurance of sound transmission without such a check? |
| 13:02 | sproust | Because the data structures are immutable, copies are beign made of "values" eveywehre. |
| 13:02 | LauJensen | sproust: link? |
| 13:02 | psykotic | LauJensen: right, you usually end up doing something like that at some point. |
| 13:02 | sproust | These copies "must" be made atomically, no? if that is the case, whare are the performance characteristics of the atomic mechanisms? Is it using mutex'es? Or atomic ops? |
| 13:03 | LauJensen | psykotic: Sure, so its not a model which translate well from physics to computing |
| 13:03 | LauJensen | sproust: There are more than 1 way of doing it in Clojure, check this out for great detail: http://www.infoq.com/presentations/Are-We-There-Yet-Rich-Hickey |
| 13:03 | psykotic | LauJensen: well, you have to distinguish different levels here. in this analogy, the basic actor model (one-way, fire-and-forget asynchronous message passing) is physics. things like handshaking, acks, etc would be akin to biology--more complex systems with simple underpinnings. |
| 13:03 | sproust | http://channel9.msdn.com/shows/Going+Deep/Expert-to-Expert-Rich-Hickey-and-Brian-Beckman-Inside-Clojure/ |
| 13:04 | LauJensen | thanks |
| 13:04 | psykotic | or perhaps chemistry vs physics, or something, e.g. molecules are a good example of 'handskaking' |
| 13:04 | LauJensen | psykotic: But weren't we talking about the physics level, and how you didn't think it was viable to think like Rich did? :) |
| 13:04 | psykotic | LauJensen: no, i'm saying he's switching levels, and now you are too. |
| 13:05 | psykotic | your argument about consistent snapshots concerned the brain, a biological, very complex system |
| 13:06 | LauJensen | sure, but the connection to the sensory system is still valid. Where your models doesn't seem to be, in that its inherently insecure |
| 13:06 | psykotic | i think trying to model common sense ideas about perception make for good design, but unsound philosophy :) |
| 13:07 | psykotic | and in his discussion he's jumping between the two as if they were the same |
| 13:07 | LauJensen | I'll give you that |
| 13:08 | LauJensen | And an interesting observation |
| 13:08 | remleduff | sproust: There actually aren't all that many copies being done with clojure's data structures, that's the meaning of "persistent" the way Clojure uses it. They share structure as much as possible. |
| 13:09 | psykotic | LauJensen: i think in general it's good to be cognizant of how much we are really speaking in metaphor when we think we are directly addressing reality. |
| 13:10 | psykotic | so, in the philosophy of science, there are all these discussions about the concept of realism--in what sense are things like electrons 'real', and so on. are they only useful abstractions that let us build useful stuff? |
| 13:10 | sproust | remleduff: I understand much of the data structures are shared, and so you may not have to lock an existing old version of a value in order to construct a new one at all, but I'm guessing there must be a few cases were CAS operations are being used (thus locking the memory bus), or even some locks... I'm interested in the low-level detail, w.r.t. to building a low-latency system with such a language. |
| 13:11 | LauJensen | sproust: Check out the link I sent you, there's STM, CAS, Agents explained there |
| 13:11 | sproust | remleduff; or perhaps there AREN'T any locks nor CAS used at all in constructing new data structures! That would be a wonderful thing. |
| 13:11 | psykotic | i guess what i'm proposing is a kind of similar distinction with programming semantics. some metaphorical relationship to everyday concepts and notions may be a good guiding light, but ultimately it's the usefulness, the instrumentalism that determines whether it's garbage or whether it's good. |
| 13:11 | sproust | LauJensen: I will, thanks :-) |
| 13:11 | LauJensen | psykotic: the instrumentalism? |
| 13:12 | psykotic | instrumentalism is the guy that the validity of ideas should be judged by how useful tools/instruments they are |
| 13:12 | psykotic | err, /is the guy/is the idea/ |
| 13:13 | LauJensen | So its pragmatism ? |
| 13:13 | psykotic | well, pragmatism is a kind of extreme instrumentalism :) |
| 13:13 | LauJensen | No wait, I see the distinction |
| 13:13 | psykotic | where they apply it to everything |
| 13:13 | remleduff | sproust: Well, the old lisp cons, wouldn't require locking the old list to construct a new list, and I believe the goal was to create an analogy of that for every persistent data structure |
| 13:13 | remleduff | sproust: You do need some kind of concurrency construct when you alter what an identity is looking at |
| 13:14 | psykotic | LauJensen: there was actually a mostly american school of philosophy called the pragmatists, who argued that a belief is true when it is useful. which leads to a lot of silliness. :) |
| 13:15 | remleduff | sproust: so (assoc {} :a 1) shouldn't require locking, but (def a {}) (dosync (alter a assoc {:a 1}) obviously involves locking |
| 13:15 | LauJensen | psykotic: Indeed, since fundamental truth then is determined by the user/perceiver |
| 13:16 | sproust | remleduff: so you're saying that ALL of the synchronization is always explicit, in the form of (swap) (alter) etc. ? |
| 13:17 | psykotic | LauJensen: i'm reading some of your older blog posts (e.g. the beautiful code manifesto). you really like comparing different algorithms between languages and pretending it's a 1-to-1 comparison, don't you? :) |
| 13:17 | Chousuke | sproust: I think seqs have some synchronised methods |
| 13:17 | remleduff | sproust: That's my understanding, I hope I'm not leading you astray |
| 13:18 | remleduff | Darn it, I knew if I hit enter someone would contradict me |
| 13:18 | Chousuke | sproust: but you shouldn't care about the underlying implementation. |
| 13:18 | LauJensen | psykotic: No I always say whats going on - The thing I'm tend to do, which upsets the teens, is that I use examples as people publish them. I recognize that you can do solid multithreading in Assembly, but I think its more fair to show the examples where people get in trouble for trying |
| 13:18 | Chousuke | sproust: it might change at any time and you wouldn't (shouldn't) notice :) |
| 13:18 | LauJensen | s/I'm/I |
| 13:18 | sproust | Right; Chousuke: I'm curious about those special cases. |
| 13:19 | Chousuke | sproust: I suppose you need to go read the java code then |
| 13:19 | psykotic | LauJensen: you are being disingenuous and condescending. the people who object to that kind of tactic aren't "teens". |
| 13:19 | LauJensen | psykotic: Agreed - Those that get upset probably are |
| 13:19 | psykotic | getting upset at what seems like self-serving dishonesty is childish? |
| 13:20 | sproust | Chousuke: depending on the performance characteristics of the system you're building, my experience is that you will eventually need to get into the nitty gritty. For high-level operations I'm with you, we care more about the quality of the abstractions, but for the inner loop I'm sure you'd want to use a well-known subset of operations were you know exactly what's going on behind the scenes. |
| 13:20 | psykotic | you're obviously a damn good programmer and a good writer, so i feel it detracts from your points. |
| 13:20 | psykotic | you don't really need to do that. |
| 13:21 | LauJensen | psykotic: If you find dishonesty on the site let me know and I'll remove it. I do take it as a sign of immaturity when people are hurling accusations in capital letters at me - But I know that there are exceptions of course |
| 13:21 | clojurebot | /summon rhickey |
| 13:22 | psykotic | sorry, off topic |
| 13:22 | LauJensen | np |
| 13:22 | Chousuke | I think most of the so called "dishonesty" is just LauJensen not paying enough attention to the implications of his statements. |
| 13:24 | Licenser | wow bindings are a evil thing, they really can bite you in the behind o.O |
| 13:25 | psykotic | chousuke: i give lau's intelligence more credit than that, but i've gone too far off topic already, and apologize |
| 13:26 | LauJensen | I hear what you guys are saying, and I retract the 'teen' comment and appologize whilst hoping that we can get back to talking Clojure! :D |
| 13:26 | Chousuke | psykotic: I think it has more to do with experience than with intelligence. |
| 13:26 | Chousuke | but yeah, I'll go do something else now. |
| 13:29 | SynrG | what reference doc exists for clojure for offline reading? |
| 13:29 | SynrG | a recursive wget of clojure.org/Reference fails. not sure why. the robots.txt file didn't look like it would exclude it ... |
| 13:29 | LauJensen | SynrG: (doc ...) from the REPL works great |
| 13:30 | SynrG | fair enough. and i have been using that ... |
| 13:30 | SynrG | it's just a little awkward to browse. |
| 13:30 | StartsWithK | SynrG, wget -krmnp -E -X/page,/message --no-check-certificate -P <target> https://clojure.org |
| 13:30 | SynrG | StartsWithK: thanks |
| 13:30 | remleduff | sproust: If you grep for synchronized in the clojure java code, the only instances are in the reference types and in the compiler, {Lazy, Iterator, Enumeration}Seq, Delay, Stream and MultiFn. Stream and MultiFn can basically be ignored. |
| 13:30 | Licenser | Is there a way to indentify a anonymous FN? |
| 13:31 | Licenser | Like can I attatck a meta something to it do that the trace says 'this is function X/Y/Z? |
| 13:31 | Chousuke | fns support metadata in master |
| 13:31 | Chousuke | but not in earlier versions of clojure |
| 13:34 | Licenser | darn too sad but thanks Chousuke |
| 13:34 | SynrG | being fairly java-illiterate, i wanted some java reference doc too, but the openjdk-6-doc package is ~260M unpacked! a bit much |
| 13:35 | chouser | anonymous functions can have names that show up in their classname |
| 13:35 | chouser | bends the term "anonymous" a bit, doesn't it. |
| 13:35 | remleduff | Why doesn't the following cause some kind of error? (dosync alter a assoc :a 1) |
| 13:35 | remleduff | I'm missing the parens around the alter form |
| 13:35 | chouser | each of those is a valid expression |
| 13:35 | chouser | ,alter |
| 13:35 | clojurebot | #<core$alter__4925 clojure.core$alter__4925@189471a> |
| 13:35 | chouser | ,assoc |
| 13:35 | Licenser | chouser: I don't know it's very handy to know where it was created :P |
| 13:35 | clojurebot | #<core$assoc__4268 clojure.core$assoc__4268@11d8ca6> |
| 13:35 | chouser | ,:a |
| 13:35 | clojurebot | :a |
| 13:36 | SynrG | i stumble on things like "clojure strings are java strings" because i don't know the latter |
| 13:36 | Licenser | ,(fn [a] (+ a a)) |
| 13:36 | clojurebot | #<sandbox$eval__5928$fn__5930 sandbox$eval__5928$fn__5930@93b096> |
| 13:36 | chouser | ,(fn adder-thing [a] (+ a a)) |
| 13:36 | clojurebot | #<sandbox$eval__5934$adder_thing__5936 sandbox$eval__5934$adder_thing__5936@1c342bd> |
| 13:36 | Licenser | ,#{:name "my-fn"}(fn [a] (+ a a)) |
| 13:36 | clojurebot | #{"my-fn" :name} |
| 13:36 | Licenser | wait chouser this is great! |
| 13:36 | Licenser | # |
| 13:36 | Licenser | I love you! Well platonaically spoken |
| 13:36 | chouser | ;-) |
| 13:37 | Licenser | it his horribly usefull since I juggle with fn's in fn's in fn's that come out of fn chains themselfs |
| 13:38 | remleduff | What's the advantage of using the metadata reader magic to set the name over the (fn name ...) style ? |
| 13:38 | chouser | yep, and the classname generally has the full lexical context of the fn |
| 13:39 | dnolen | SynrG: Finding documentation on Java strings is pretty easy. http://java.sun.com/j2se/1.5.0/docs/api/java/lang/String.html. You also might want to look at clojure.contrib.str-utils2 to see if what you're looking for isn't already there. |
| 13:39 | chouser | ,(class (((fn foo [] (fn bar [] (fn baz [])))))) |
| 13:39 | clojurebot | sandbox$eval__5942$foo__5944$bar__5945$baz__5946 |
| 13:40 | noidi | is there a complement for nil? in clojure? #(not (nil? %)) seems a bit wordy for what I'd think would be a commonly used piece of code... |
| 13:40 | The-Kenny | noidi: just use % |
| 13:40 | StartsWithK | noidi, (complement nil?) |
| 13:40 | chouser | noidi: nil? itself is pretty rarely used |
| 13:41 | noidi | The-Kenny, ah, of course :) |
| 13:41 | chouser | noidi: usually, nil and false are lumped together as The-Kenny suggests |
| 13:41 | noidi | I just need to filter out nils from a seq, so (filter identity ...) is probably the way to go |
| 13:41 | noidi | ...or is it? :) |
| 13:41 | StartsWithK | ,(filter identity [1 2 nil 3]) |
| 13:41 | clojurebot | (1 2 3) |
| 13:42 | chouser | yes, that's a common idiom |
| 13:42 | bsteuber | noidi: also for and :when can often be used |
| 13:42 | Chousuke | you might also like (remove nil? ...) |
| 13:43 | StartsWithK | is clojurebot configured to deny access to certan things only by using java security, or is there some kind of whitelist of names too? |
| 13:43 | Chousuke | StartsWithK: there's actually a blacklist ;/ |
| 13:43 | Chousuke | StartsWithK: which of course means it has holes |
| 13:43 | StartsWithK | what about memory consumation? |
| 13:43 | StartsWithK | i will not try, just asking |
| 13:44 | StartsWithK | what if you create realy large array |
| 13:44 | Chousuke | the JVM it runs on is limited to a 64MB heap I think |
| 13:46 | StartsWithK | i see, but in general its safe? you can't access nothing from filesystem, open a socket or exit the jvm |
| 13:46 | Chousuke | yeah |
| 13:47 | Licenser | I really really love clojure := |
| 13:49 | remleduff | StartsWithK: You might be interested in http://github.com/hiredman/clojurebot/blob/master/hiredman/sandbox.clj |
| 13:49 | remleduff | Bad link, sorry |
| 13:50 | StartsWithK | remleduff, thanks |
| 13:51 | remleduff | http://github.com/hiredman/clojurebot/blob/master/src/hiredman/clojurebot.clj |
| 13:51 | remleduff | I mean: http://github.com/hiredman/clojurebot/blob/master/src/hiredman/sandbox.clj |
| 13:52 | remleduff | Never C&P when you're in a hurry to leave |
| 13:52 | AWizzArd | I think Licenser also has some sandbox stuff? |
| 13:52 | Licenser | Yap I do :) |
| 13:52 | Licenser | it's even working nicely |
| 13:53 | StartsWithK | hehe, remleduff i found the code, thanks |
| 13:53 | StartsWithK | is there a good tutorial on java security? |
| 13:53 | Licenser | StartsWithK: have a look at http://github.com/Licenser/clj-sandboxm if you like |
| 13:54 | StartsWithK | Licenser, thanks, i will |
| 13:54 | Licenser | it does not go into jvm security but it at least lets you use sandboxes pretty easiely without much work |
| 13:57 | StartsWithK | is there a way to do a security per thread/class loader, or only with codepoint |
| 13:59 | StartsWithK | in java security model.. i tried to find some tutorial/blog on how to setup a security policy for each class loader i create, but as i can see it, only way is by codebase |
| 13:59 | StartsWithK | codepoint* |
| 14:02 | dnolen | in depth tour of Enlive, http://github.com/swannodette/enlive-tutorial, feedback appreciated. covers scraping Hacker News, New York Times, and functional templating from pure HTML files. |
| 14:02 | noidi | is there something like filter, that would use the value returned by the predicate instead of the original value? |
| 14:03 | Licenser | StartsWithK: sorry, I don't know much about jvm security :( just tried to make the clojure part less of work |
| 14:03 | noidi | I'd like to combine the map and filter operations somehow http://gist.github.com/332107 |
| 14:04 | SynrG | dnolen: sure. it's just a matter of not knowing what to wget in advance for offline reference |
| 14:05 | StartsWithK | Licenser, thanks anyway, its weird how how hard it is to find a good tutorial on the subject |
| 14:05 | SynrG | dnolen: i'm afraid the whole doc is just too huge to put on my little model 4G eeepc |
| 14:06 | Licenser | StartsWithK: I know, hiredman is very knoweldable, the library was build with lots of help and hints from him - and some of the code from the clojurebot ;) |
| 14:06 | noidi | ,(filter second [[1 2] [3] [4 5]]) |
| 14:06 | clojurebot | ([1 2] [4 5]) |
| 14:07 | noidi | is there a filter-like function that would return (2 5) in that case? |
| 14:09 | Licenser | ,(filter identity (map second [[1 2] [3] [4 5]])) |
| 14:09 | clojurebot | (2 5) |
| 14:10 | noidi | that's what I'm doing now |
| 14:11 | Licenser | that isn't too bad is it? |
| 14:12 | noidi | not too bad, but bit on the verbose side for my tastes |
| 14:12 | jcromartie | Is it just a coincidence that (defroutes foo (GET "/foo" bar)) works, when bar is a defn somewhere? |
| 14:13 | jcromartie | because I can't find a trace of that style of route definition in the docs or wikis anywhere |
| 14:13 | AWizzArd | jcromartie: this is how you should do it |
| 14:13 | noidi | oh well, I just wrote a helper to do clean that up :) (defn fmap [& args] (filter identity (apply map args))) |
| 14:13 | jcromartie | AWizzArd: oh? well that's good then |
| 14:13 | jcromartie | someone needs to illustrate that then |
| 14:14 | AWizzArd | jcromartie: you list your routes, and they should all look like (GET|POST|PUT|DELETE "/some/url" your-handler-fn) |
| 14:14 | jcromartie | AWizzArd: yeah, it's just never shown that way in the docs |
| 14:14 | AWizzArd | and before that you do a (defn- your-handler-fn [request] ...) |
| 14:14 | jcromartie | here http://github.com/weavejester/compojure/blob/master/README.markdown or here http://compojure.org/ or here http://en.wikibooks.org/wiki/Compojure/Core_Libraries or here http://nakkaya.com/2010/01/22/unit-testing-compojure-routes/ |
| 14:14 | bsteuber | ,(for [xs [[1 2] [3] [4 5]] :when (second xs)] (second xs)) |
| 14:14 | clojurebot | (2 5) |
| 14:14 | jcromartie | not all of that is official of course |
| 14:14 | bsteuber | even more ugly |
| 14:14 | jcromartie | but the style is nowhere to be found |
| 14:15 | bsteuber | but in general the for :when might be useful sometimes |
| 14:15 | AWizzArd | jcromartie: I personally do it as you do, and as I just described. |
| 14:15 | jcromartie | yup |
| 14:15 | noidi | the reason I asked was that I've been reading On Lisp lately, which has bent my brain into thinking that there should be a function for everything :) |
| 14:16 | noidi | even (filter identity (apply map args)) |
| 14:18 | AWizzArd | bsteuber: an alternative could be destructuring |
| 14:18 | AWizzArd | ,(for [[f s] [[1 2] [3] [4 5]] :when s] s) |
| 14:18 | clojurebot | (2 5) |
| 14:18 | jcromartie | AWizzArd: I'm going through the source, trying to figure out how it even works |
| 14:18 | AWizzArd | jcromartie: what specifically do you mean by βitβ? |
| 14:19 | jcromartie | using a fn in place of a fn body |
| 14:19 | jcromartie | err, a keyword |
| 14:19 | jcromartie | I don't even know how to describe it |
| 14:20 | AWizzArd | Hmm, you did not use a keyword. |
| 14:21 | jcromartie | I mean (GET "/foo" foo) |
| 14:21 | jcromartie | where foo is (defn foo [...] ...) |
| 14:21 | AWizzArd | Yes, foo is a symbol here, which evals to a fn object. |
| 14:21 | bsteuber | awizzard: yeah, the destructuring looks nicer - wasn't sure it worked withour error on the missing second element |
| 14:21 | jcromartie | right sorry, that's what I mean |
| 14:21 | jcromartie | so it evals to a fn |
| 14:21 | jcromartie | but how is that fn called with the request as an argument? |
| 14:21 | AWizzArd | yes, because you bound a fn to it when you said (defn foo ...) |
| 14:21 | jcromartie | it doesn't seem like the macros expand in such a way as to do that |
| 14:23 | jcromartie | or is all of this request-binding stuff throwing me off |
| 14:23 | AWizzArd | jcromartie: compojure sees the url that is called. Then it simply calls the fn that follows the string in which you encoded the url in your route declaration. |
| 14:23 | jcromartie | ok but I can say (GET "/foo" (println "bar")) and it prints "bar" |
| 14:23 | AWizzArd | (Method Url Fn) |
| 14:24 | AWizzArd | When does it print bar? On visiting /foo in a browser? |
| 14:24 | jcromartie | right |
| 14:25 | jcromartie | and what I'm saying is that none of the examples that I can find do it in the (GET url fn) way |
| 14:26 | jcromartie | they do it in the (GET url body) way |
| 14:26 | jcromartie | I think I figured it out |
| 14:26 | AWizzArd | Probably your GET is handled differently, because you put a list in there, not a symbol. |
| 14:27 | jcromartie | no |
| 14:27 | AWizzArd | It will in such a case just eval the list and not try to call it. |
| 14:27 | jcromartie | that's the way it is supposed to work |
| 14:27 | AWizzArd | Yes, I think it is supposed to work this way. |
| 14:28 | jcromartie | the GET macro expands to a fn that accepts a request, and this fn wraps the body in an if-let that only runs when the request matches the URL passed to GET |
| 14:28 | AWizzArd | And the (Method Url Fn) style is imo the appropriate way to have a clean declaration in non-trivial projects. It doesn't matter that it is not typically documented this way. |
| 14:29 | jcromartie | sure |
| 14:30 | jcromartie | it just needs to be documented, and Compojure appears to be doing a lot of extra work that is just thrown away |
| 14:30 | jcromartie | when you use that stiy |
| 14:30 | jcromartie | style |
| 14:30 | jcromartie | not anything really significant |
| 14:30 | jcromartie | but the macros involved are big |
| 14:30 | jcromartie | and they do a bunch of bindings that are never used |
| 14:31 | AWizzArd | In the Compojure group people use this style. |
| 14:31 | jcromartie | maybe (GET "/foo" (bar request)) would be more idiomatic |
| 14:32 | AWizzArd | in a lisp-1? |
| 14:32 | AWizzArd | I think the current style is very nice. |
| 14:32 | jcromartie | you say "current style" but that's not what is documented at all |
| 14:32 | AWizzArd | You just place your callback there that takes a request object. |
| 14:32 | jcromartie | yeah |
| 14:33 | AWizzArd | the (Method Url (Fn request)) would just be syntactic salt. |
| 14:34 | jcromartie | salt? |
| 14:34 | AWizzArd | Yeah, hehe, the opposit of syntactic suger ^^ |
| 14:35 | jcromartie | huh |
| 14:35 | jcromartie | well, anyway, it should at least be documented that this style is possible |
| 14:35 | AWizzArd | I mean, it would be repetative to type that out each time. |
| 14:35 | jcromartie | and maybe the macros be made a bit smarter |
| 14:36 | AWizzArd | jcromartie: yes, I would also prefer it if this style were the predominant one in all the examples. |
| 14:37 | jcromartie | this is what (GET "/foo" bar) expands to: http://gist.github.com/332142 |
| 14:37 | AWizzArd | But then again, many people let their Clojure apps produce HTML as output. This is also done in several examples, while I don't produce HTML. |
| 14:39 | chouser | anyone know how to start java with debugging on such that jswat can attach to the process? |
| 14:39 | chouser | -Xdebug seem to be the common suggestion, but isn't working for me |
| 14:40 | chouser | jswat still says "not a debuggee" |
| 14:41 | LauJensen | chouser: http://clojure.org/getting_started <-- See debugging :) |
| 14:41 | chouser | hehe. thanks! |
| 14:43 | jcromartie | I still don't quite understand how this works, AWizzArd |
| 14:43 | jcromartie | you can see the expansion here http://gist.github.com/332142 |
| 14:44 | jcromartie | but the fn at line 4 is what's called with the request as an argument, not bar |
| 14:44 | jcromartie | so when does bar get called with the request? |
| 14:48 | AWizzArd | jcromartie: bar is the second argument to create-response |
| 14:48 | AWizzArd | bar is made a closure |
| 14:53 | jcromartie | I still don't see at what point bar is called with the request as an argument |
| 14:55 | jcromartie | oh, update-response is a multimethod |
| 14:55 | jcromartie | defmethod update-response Fn |
| 14:55 | jcromartie | calls the fn with the request |
| 14:55 | jcromartie | finally! |
| 15:04 | Licenser | I have a problem there is something happening I don't understand: http://gist.github.com/332156 this code. Line 4 tells me there are 2 elements in the list called 'units'. woggle woggle tells me that it runs, but the "bla!!!!!!!!!!!!!!" in the filter fn never shows up :( |
| 15:05 | Licenser | I really don't understand why the fn is never called o.o |
| 15:06 | vy | Licenser: Is it because filter works lazily? |
| 15:06 | Licenser | vy: thanks!!!! |
| 15:06 | LauJensen | Thats it |
| 15:06 | The-Kenny | haha |
| 15:06 | The-Kenny | Lazy-Evaluation strikes back |
| 15:07 | Licenser | it strikes again |
| 15:07 | Licenser | thanks people you all rock |
| 15:08 | Licenser | #clojure to the rescue! :D |
| 15:15 | chouser | bleh. I can't figure out what's going on here. |
| 15:15 | chouser | I'm making a call into a java lib and I simply never hear back. |
| 15:15 | chouser | the following statement is not execute |
| 15:15 | chouser | executed |
| 15:15 | chouser | this statement is wrapped in a try/catch |
| 15:16 | chouser | oh, I should be catching Throwable, shouldn't I. |
| 15:16 | chouser | nope, nuthin. |
| 15:17 | LauJensen | Hard to say without seeing the code |
| 15:17 | chouser | yeah, I know. but it's so much code |
| 15:17 | chouser | very very similar code elsewhere works fine |
| 15:18 | chouser | I guess I'm not so much looking for help as just whining. |
| 15:18 | Licenser | Don't worry you'll finde the bug :) |
| 15:19 | LauJensen | chouser: You could try removing the try/catch if you haven't already |
| 15:21 | chouser | ah, it's waiting on a lock! |
| 15:22 | Licenser | chouser: see told you you'll find it! |
| 15:22 | LauJensen | yea, Licenser was right all along |
| 15:23 | Licenser | ;) knows you all are smartish here |
| 15:23 | LauJensen | How did you track it chouser? |
| 15:29 | chouser | (prn (Thread/currentThread)) before the line in question |
| 15:30 | chouser | then Ctrl-\ after it gets stuck, looked through the dumped threads for the same-named one, then looked at it's stack trace |
| 15:30 | LauJensen | Ok |
| 15:32 | chouser | and there it is: java.lang.Thread.State: WAITING (on object monitor) |
| 15:32 | LauJensen | I'm a little curious why your working with locks... |
| 15:32 | Licenser | because he likes the trhill :D |
| 15:33 | chouser | that's the thing, I'm not -- the java lib I'm using is. I've never seen a deadlocked JVM before. |
| 15:33 | chouser | if that's what this is |
| 15:34 | chouser | presumably there's a line in its docs somewhere saying I shouldn't do thus-and-such from thread so-and-so. |
| 15:38 | chouser | wow. nothing in the docs, but wrapping (future ...) around the callback function I was passing in (thus calling my code from a Clojure thread instead of one supplied by the lib) fixed everything. |
| 15:41 | LauJensen | Sounds dangerous |
| 15:51 | Licenser | :D very nice |
| 15:52 | Licenser | So soon I'll have a little game online where everyone can write their own AI's in clojure and have then comeet :D |
| 15:52 | LauJensen | I love comeets |
| 15:53 | underdev | i call that bodog poker :) |
| 15:53 | Licenser | bodog poker? |
| 15:54 | underdev | the little online game where my AI in clojure competes |
| 15:55 | Licenser | nono, no poker, it's a space fight simulation :) |
| 15:55 | Licenser | it's going to be quite cool I think |
| 15:55 | LauJensen | Sounds great - JME ? |
| 15:56 | Licenser | no everything written from scratch, own engine and everything :) |
| 15:56 | LauJensen | oh |
| 15:56 | Licenser | now I just have to kick the frontend person(s) to make the webside that allows people to interact with the engine |
| 15:57 | Licenser | It's a bit like RoboCom or, now was it called, AI wars? |
| 15:57 | LauJensen | I think once I can find a spare 6 months or so, I'd like to make something like Eve Online - Thinking of the Universe modeling |
| 15:59 | Licenser | nah it's not that complex LauJensen, for now it's just two fleets that can fight eachother based on ship statistics, and AI scripts |
| 16:00 | LauJensen | Ok - Let me know once I can get a beta account :) |
| 16:00 | Licenser | LauJensen: you can bet :) I'll post on the mailing list and bother people here :P |
| 16:01 | LauJensen | Would be nice if you named it FlightPaster.com or FlightCaster.org :) |
| 16:01 | Licenser | while it is more like a alpha account ;) the game we aim for is supposed to be way more then fleet combat this is just a tech demo for the combat stuff |
| 16:01 | Licenser | heh the engine is called EPIC |
| 16:01 | LauJensen | ok |
| 16:02 | Licenser | we thought a lot over the name |
| 16:02 | Licenser | ^^ |
| 16:02 | Licenser | but why should it be called like that? |
| 16:02 | eevar | you've actually written a poker bot, underdev? nice |
| 16:03 | Licenser | ah the webside that was in the news that used clojure |
| 16:03 | underdev | well, i've got all the clicky done via the Robot class... still learning the AI stuff |
| 16:04 | LauJensen | yea |
| 16:04 | underdev | it reads the cards too |
| 16:04 | underdev | also via the Robot class |
| 16:05 | Licenser | underdev: nice! |
| 16:05 | underdev | slogging through "Paradigms of Artificial Intelligence" right now |
| 16:09 | eevar | not sure real AI is the way to go for poker, though |
| 16:09 | eevar | well, i guess you could call expert systems "AI" as well |
| 16:10 | underdev | yeah, the nlp stuff isn't relavent. i guess |
| 16:14 | eevar | a self-learning poker bot could get expensive, yea :p |
| 16:14 | underdev | lol |
| 16:15 | Licenser | heh |
| 16:15 | Licenser | ask IBM to finance it and call it light green or something :P |
| 16:30 | etate | wow that JVM summit talk is truly awesome |
| 16:48 | LauJensen | etate: Yea it gives some great background info |
| 16:48 | LauJensen | btw etate I'm seriously loving that color-theme, its growing on me! |
| 16:51 | etate | LauJensen: cool :) I'm making a white background version at the moment |
| 16:53 | LauJensen | cool, for what? :) |
| 16:53 | etate | LauJensen: day time :> sometimes i like white backgrounds instead of dark ones so i need one dark version and one light :D |
| 16:54 | LauJensen | I think white bg is too hard on the eyes if you're coding for hours, but maybe thats just me |
| 16:54 | LauJensen | Also - It would never fly in the Matrix |
| 16:55 | etate | LauJensen: yeah I find it hard with extensive periods of coding in it, but i like light backgrounds when reading dense code sometimes |
| 16:55 | LauJensen | Look forward to seeing it |
| 16:56 | etate | :D i'm making use of some unusual colours that i haven't see in other themes, trying to get a good mix of blues and shades of red |
| 16:57 | etate | i'm actually trying to re-create a theme i made a long time ago which had blues and reds, just taking time to get it right |
| 18:09 | Raynes | Is there any way to unload a namespace dynamically? |
| 18:13 | hiredman | ,clojure.lang.Namespace/namespaces |
| 18:13 | clojurebot | java.lang.Exception: Unable to find static field: namespaces in class clojure.lang.Namespace |
| 18:15 | Raynes | (doc remove-ns) |
| 18:15 | clojurebot | "([sym]); Removes the namespace named by the symbol. Use with caution. Cannot be used to remove the clojure namespace." |
| 18:35 | SynrG | win 23 |
| 18:35 | SynrG | argh |
| 18:52 | defn | hello all |
| 19:30 | kwertii | with contrib.logging, I see " Mar 14, 2010 4:26:57 PM clojure.contrib.logging$eval__7116$impl_write_BANG___7127 invoke" printed before every log line. what's doing that? how do I turn it off? |
| 20:17 | psykotic | noidi: way late, but here's another suggestion for your filter/map fusion. |
| 20:25 | psykotic | ,(letfn [(filter-map [p f xs] (for [x xs :let [y (f x)] :when (p y)] y))] (filter-map #(< % 10) #(* % %) (range 10))) |
| 20:25 | clojurebot | (0 1 4 9) |
| 20:27 | psykotic | iirc, for actually uses mapcat under the covers. something like (mapcat #(let [x (f %)] (when (p x) x)) xs |
| 20:28 | psykotic | make that (when (p x) [x]) |
| 20:32 | kwertii | Is there a simple way to adjust the contrib.logging log message level? |
| 20:32 | psykotic | in the jave world, is there a standard technique for making startup fast for quick script-like apps? |
| 20:33 | psykotic | like, i don't know, jvm memory images dumped immediately after library loads |
| 20:36 | kwertii | psykotic: I vaguely remember something that would let you bind the "java" runtime to your classes/jar from a long time ago |
| 22:20 | psykotic | cgrand-rec: you around? |
| 23:05 | aj1979 | Hi all |
| 23:08 | aj1979 | Quick question: do we have a function in clojure which prints a value and returns it? print and println seem to return nil |
| 23:13 | psykotic | i have my own (defn trace [x] (println x) x) thing i use, i'm sure there's probably something more elaborate in contrib |
| 23:14 | psykotic | that's the only use case i have for it--i want to quickly wrap (trace ...) around a subexpression to see its value at run time, without having to rearrange the code structure by introducing new bindings or whatever |
| 23:14 | drewr | aj1979: i/o is a side effect; it can't return anything other than nil |
| 23:16 | aj1979 | @psykotic - thanks. I may be having some trouble with something like that though. Not working as expected when lazy seqs come into picture |
| 23:16 | psykotic | that's right |
| 23:17 | psykotic | in most of the clojure use cases of lazy seqs, it isn't that much different from something like an early terminating loop in an imperative language, though |
| 23:17 | psykotic | except that things can be deferred much longer :) |
| 23:18 | aj1979 | @drewr - Ok, I understand. .... but sometimes is convenient to see the result of an intermediate form that is nested inside something else. I agree it is not functional but very useful. |
| 23:19 | psykotic | even haskell has a trace form for something liek that |
| 23:19 | psykotic | which uses unsafeIO |
| 23:19 | psykotic | it's definitely useful, though the laziness can be an issue, as you say, more so in haskell than clojure fortunately |
| 23:24 | tomoj | drewr: why does it have to return nil? |
| 23:36 | aj1979 | @tomoj: a function HAS to return something. I/O is side-effecting. So a function like println does some side-effecting and returns then returns nil because that is the most appropriate thing to return |
| 23:37 | tomoj | ah, right |
| 23:37 | tomoj | definitely appropriate |