2011-10-14
| 00:02 | ibdknox_ | dnolen: yeah, there's some stuff in pinot to help with it. I went direct to the JS API... the gclosure stuff was ridiculous |
| 00:03 | ibdknox_ | dnolen: I need to switch it off of using seqs, but I haven't done that yet |
| 00:36 | jcromartie | you know, it's *really* hard to have an off-by-one error, or an infinite loop, when you're dealing with seqs |
| 00:36 | jcromartie | unless you make an infinite seq of course |
| 00:37 | jcromartie | so I guess that's not that hard |
| 00:37 | jcromartie | ... derp |
| 00:41 | amalloy | jcromartie: the fact that you can say "having an infinite sequence is not that hard" is a testament to how much easier things are in clojure |
| 00:43 | jcromartie | heh |
| 00:44 | jcromartie | but yeah, I'm just meditating on the nature of bugs |
| 00:44 | jcromartie | most of the bugs that come along in production are a failure to coordinate mutable state |
| 00:44 | jcromartie | (in our system) |
| 00:45 | jcromartie | things like off-by-one, or = instead of ==... those are the easy ones |
| 00:45 | jcromartie | those get caught early and often |
| 00:46 | jcromartie | but the subtle bugs that slip under the radar are almost *always* mutable state |
| 00:46 | amalloy | OBO is a special case of having to manage mutable state, of course |
| 00:47 | jcromartie | well OBO doesn't have to be mutable |
| 00:47 | jcromartie | &(range 1 5) |
| 00:47 | lazybot | ⇒ (1 2 3 4) |
| 00:47 | amalloy | i guess that's true |
| 00:47 | amalloy | but at least a majority of the time, OBO comes from a for loop somewhere |
| 00:47 | jcromartie | yes ;) |
| 00:48 | jcromartie | but anyway, I'm totally sold on the following ideas: |
| 00:48 | jcromartie | 1) pure functions are better than assignment/mutation whenever it's even remotely practical |
| 00:49 | jcromartie | 2) the best kind of data system is one that treats inputs as immutable, and where the current state is just derived from that historic data |
| 00:49 | jcromartie | so I'm putting that together now |
| 00:50 | jcromartie | (nathanmarz's recent post is prescient) |
| 00:50 | Apage43 | anything you're -not- sold on? That might be more interesting to discuss. |
| 00:50 | jcromartie | Apage43: NoSQL databases :) |
| 00:50 | Apage43 | oh fun |
| 00:50 | Apage43 | I work for a NoSQL company |
| 00:50 | jcromartie | Apage43: "cloud" platforms |
| 00:51 | jcromartie | Apage43: oh, no offense of course :) |
| 00:51 | jcromartie | which one? |
| 00:51 | Apage43 | eh |
| 00:51 | jcromartie | I actually like CouchDB and Mongo |
| 00:51 | Apage43 | i largely am annoyed by the way its marketed |
| 00:51 | Apage43 | jcromartie: Couchbase |
| 00:51 | jcromartie | but I think they are squarely in the "mutable by default" camp |
| 00:51 | jcromartie | so are most RDBMS |
| 00:51 | Apage43 | formerly at Couchone/Couch.io |
| 00:52 | jcromartie | I think I like Couch a lot, actually |
| 00:52 | Apage43 | jcromartie: well, i mean, it -is- a datastore |
| 00:52 | jcromartie | sure |
| 00:52 | jcromartie | but someone let me know when a (popular) datastore comes along that never loses anything, by default |
| 00:52 | Apage43 | Couch is nifty in the way it makes available metadata about the stuff that happened to the database over time to get it to the state its currently in |
| 00:53 | jcromartie | sure but it disappears |
| 00:53 | jcromartie | doesn't it? |
| 00:53 | Apage43 | it does if you run compaction |
| 00:53 | jcromartie | right |
| 00:53 | Apage43 | you have the option, if you want, -never- to run compaction |
| 00:53 | jcromartie | huh, interesting |
| 00:53 | jcromartie | but that doesn't let you use the history itself to re-define the state |
| 00:53 | Apage43 | you can access previous revisions of documents as long as you haven't cleaned them up |
| 00:53 | jcromartie | yeah |
| 00:54 | jcromartie | I thought that was pretty cool, but then I realized you can't count on it |
| 00:54 | Apage43 | nah |
| 00:54 | Apage43 | we very explicitly tell people not to count on it |
| 00:54 | Apage43 | if you want revisions you should save the old version explicitly |
| 00:55 | Apage43 | but you could definitely build something really close to couch that did what you wanted |
| 00:55 | Apage43 | since it is a log-structured btree |
| 00:55 | jcromartie | yeah |
| 00:55 | jcromartie | embed the old version in the new version |
| 00:55 | Apage43 | very similar to clojure's datastructures |
| 00:56 | Apage43 | attachments at least work that way |
| 00:57 | Apage43 | so do the indexes |
| 00:57 | Apage43 | but none of that is really a user-facing feature |
| 00:58 | jcromartie | I'll see how well my toy journaled datastore works, and then put it out there. The big idea is that the history never goes away, and that when you change the commands that were applied to derive the current state, you can just replay the journal. |
| 00:58 | jcromartie | so, for example |
| 00:58 | jcromartie | you have a command, like (set-user-password my-db "jcromartie" "foobar") |
| 00:58 | jcromartie | that gets journaled |
| 00:58 | Apage43 | I find log-structured/journaled stuff pretty fun to think about in general |
| 00:59 | amalloy | brehaut: https://gist.github.com/1286289 is 4clojure's code-golf fever gone mad |
| 00:59 | jcromartie | and set-user-password does something like (defn set-user-password [uid pw] (update-in state [:users key] assoc :password pw)) |
| 00:59 | jcromartie | BTW this is not how I'd do it :) |
| 00:59 | jcromartie | so it just sticks the password in there |
| 01:00 | jcromartie | now what if you want to go to SHA-1? (assume you encrypt the journals, or something like that) |
| 01:00 | jcromartie | (bad example, I know) |
| 01:00 | jcromartie | so you change set-user-password, and reload your db |
| 01:00 | jcromartie | now (set-user-password my-db "member:jcromartie" "foobar") gets re-applied |
| 01:00 | jcromartie | and you store the SHA-1 |
| 01:01 | jcromartie | OK now you want a password policy that says you can't use the same password twice |
| 01:01 | jcromartie | so you update set-user-password to store the password hash in a set in the user value |
| 01:01 | jcromartie | re-run the journal again |
| 01:01 | jcromartie | and you have your user objects with their full history of password hashes |
| 01:02 | jcromartie | no problem |
| 01:02 | Apage43 | course anyone with read-access to the journal has the plaintext |
| 01:02 | jcromartie | now, again, I'm not advocating passing plaintext passwords and other sensitive info to get journaled... but that's a problem that any datastore has |
| 01:02 | Apage43 | yeah =P |
| 01:03 | jcromartie | but you can also go into the jorunal |
| 01:03 | jcromartie | journal |
| 01:03 | jcromartie | if you *truly* have bad data |
| 01:03 | jcromartie | because the journal is just code, too, it can be parsed and processed |
| 01:03 | jcromartie | with the same tools as any other data structure |
| 01:03 | jcromartie | handy-dandy :) |
| 01:03 | jcromartie | anyway, the trick will be seeing how this scales |
| 01:04 | jcromartie | I did 100K simple transactions... they read back in in about 4 seconds |
| 01:04 | jcromartie | but 100K is peanuts for a big application |
| 01:04 | Apage43 | and concurrent access is a seperate problem as well |
| 01:05 | jcromartie | that can be solved at a higher level |
| 01:05 | jcromartie | and this just uses refs for the db state |
| 01:05 | jcromartie | so they get transactions for free :) |
| 01:05 | jcromartie | the journal write only happens AFTER the transaction, and only if it succeeds (exceptions would cause it to fail) |
| 01:06 | jcromartie | and it's in order (an agent does the journal-writing) |
| 01:07 | jcromartie | but yeah, it's just for fun right now |
| 01:07 | jcromartie | anyway |
| 01:07 | jcromartie | goodnight |
| 01:07 | Apage43 | night |
| 02:08 | hiredman | ,(+ 1 2) |
| 02:08 | clojurebot | 3 |
| 02:40 | kiuma | hello |
| 02:40 | archaic | hi |
| 02:42 | kiuma | I was pondering do change a parser that I've implemented in java into a lisp one, I'm in doubt between ABCL and Clojure, I know Common Lisp. Which advantage could I have adopting Clojure in place of ABCL ? |
| 02:44 | ibdknox_ | kiuma: http://blip.tv/clojure/clojure-for-lisp-programmers-part-1-1319721 |
| 03:02 | chrido | hi idbknox, can i ask you something regarding postgres and timestamp with timezone? |
| 03:04 | amalloy | ibdknox_: we need an ~anyone for that |
| 03:06 | amalloy | chrido: it's more polite to just ask him. your real question is unlikely to make him fly into a rage, so you don't need to ask permission |
| 03:12 | wink | then again, the problem just solved itself :P |
| 03:16 | rmrfchik | hit he bug in 1.3; where to report? |
| 03:16 | rmrfchik | i have test case |
| 03:26 | rmrfchik | ah, that's is defn inside defn. |
| 03:35 | thorwil | hmm, the link to the transcript on http://blip.tv/clojure/clojure-for-lisp-programmers-part-1-1319721 actually just redirects to the group |
| 03:35 | thorwil | and i see no way to access the purported files section of the group |
| 04:02 | gu_ | hi, is there a built in function that already does this? (fn [ks v] (zipmap k (repeat v))) (ks being a sequence and v being any value)? |
| 04:06 | amalloy | gu_: i don't think so |
| 04:10 | Blkt | good morning everyone |
| 04:14 | brehaut | amalloy: re:golf, thats mental |
| 04:15 | amalloy | brehaut: i did that just as an exercise, but some people's solutions look like that all the time |
| 04:16 | brehaut | i havent yet tried to golf anything |
| 04:17 | dbushenko | hi all! |
| 04:17 | amalloy | aw, you're not counting the immense savings you get by typing partial less? |
| 04:18 | dbushenko | where is the clojure pattern matching library? |
| 04:19 | dbushenko | ok, found it: core.match |
| 04:20 | brehaut | amalloy: haha |
| 04:21 | brehaut | amalloy: sadly thats been countered by some brain dead thinking blowouts |
| 04:21 | amalloy | brehaut: that's how i feel after solving chouser's recently-submitted problem |
| 04:21 | brehaut | thats the challenge that got me to start 4clojure |
| 04:21 | amalloy | nice |
| 04:21 | brehaut | (although i decided i needed to start at the start) |
| 04:34 | brehaut | huh tree-seq looks really handy |
| 04:35 | brehaut | amalloy: heres the other one i flubbed http://www.4clojure.com/problem/solutions/66 |
| 04:37 | amalloy | brehaut: eh. i looked up the gcd algo on wikipedia |
| 04:38 | brehaut | i should have |
| 04:38 | brehaut | i remember from my 100 level discrete math that euclid had a smart solution a while back |
| 04:41 | gu_ | O_o suddenly clojure started interpreting docstrings as instructions failing.. any idea on what's going on? |
| 04:46 | gu_ | it seems a problem with the use of single quotes in the string |
| 05:14 | raek | gu_: sounds like a missing double quote somewhere |
| 05:28 | brehaut | i just solved the game of life 4clojure problem. there are some amazing concise solutions there |
| 08:39 | jcromartie | "If I had more time I would have written less code" |
| 08:48 | gu_ | hi, can you answer this question? http://stackoverflow.com/questions/7767775/clojure-when-to-use-mutable-state |
| 09:17 | gu_ | hi, can you answer this question? http://stackoverflow.com/questions/7767775/clojure-when-to-use-mutable-state |
| 09:18 | jcromartie | gu_: taking a look :) |
| 09:20 | gu_ | thanks. i'm trying to learn clojure and this seems to me an important non-technical topic. by non-technical i mean that right now to me it's just a matter of "doing it the most clojure-esque way possible" because in the specific program i can go either way (mutable or not) |
| 09:28 | tordmor | gu_, basically function arguments are about what you actually want to do with your function. Mutable state would be a general context. Like the figures and the background of a painting. |
| 09:30 | jcromartie | gu_: I posted my thoughts. |
| 09:31 | jcromartie | I hope they are coherent. |
| 09:33 | gu_ | thank you! i've read it : |
| 09:35 | ljos | Does clojure have some kind of sleep without calling java? |
| 09:37 | jcromartie | ljos: is this sufficient? (defn sleep [n] (Thread/sleep n)) |
| 09:38 | llasram | Huh. So `case' can't even be used with Java 'static final' constants, only literals values? That's kind of weird :-/ |
| 09:38 | jcromartie | case is lower level than cond |
| 09:39 | jcromartie | it's faster but more restricted |
| 09:39 | llasram | jcromartie: Sure, but I still would have expected it to work with the JVM equivalent of compile-time constants |
| 09:39 | jcromartie | maybe that can be fixed? |
| 09:39 | ljos | jcromartie: it works, I just wanted to know if it was in the language. |
| 09:42 | jcromartie | llasram: you could probably make a case that works that way, actually |
| 09:42 | llasram | jcromartie: It seems like it should be possible -- the info is all available at compile-time, right? And it also seems like a really common use-case: in other languages that's probably the most common way I use that sort of construct |
| 09:42 | jcromartie | well "compile time" is loosely defined in Clojure :) |
| 09:43 | llasram | jcromartie: Yeah, it wouldn't be that hard, actually -- just a macro which evaluates all the exprs then passes that the built-in `case' |
| 09:43 | jcromartie | yup |
| 09:43 | jcromartie | isn't that handy :) |
| 09:48 | lnostdal_ | i find myself needing off-line access to the clojure reference documentation at times; is this available somewhere? |
| 09:49 | lnostdal_ | perhaps there's a dead-tree edition available too? |
| 09:50 | raek | lnostdal_: you can clone the gh-pages branch of clojure/clojure on github |
| 09:50 | jcromartie | llasram: like this https://gist.github.com/1287160 |
| 09:50 | raek | should be static html files |
| 09:50 | jcromartie | :) just for fun |
| 09:50 | jcromartie | I am thinking about it now, and there are probably drawbacks |
| 09:50 | jcromartie | but not many |
| 09:51 | raek | https://github.com/clojure/clojure/tree/gh-pages |
| 09:52 | lnostdal_ | cool, didn't know about that, raek |
| 09:52 | jcromartie | actually this macro is just a bad idea |
| 09:53 | jcromartie | because you can't tell between any old symbol and a local binding |
| 09:54 | jcromartie | anyway, yeah, bad idea |
| 09:54 | jcromartie | don't use it |
| 10:00 | `fogus | dnolen: Thanks for kicking butt on ClojureScript. Greatly appreciated |
| 10:04 | Twey | I'm trying to play around with SWT in Clojure, but it can't seem to find my SWT classes — e.g. user=> (import org.eclipse.swt.widgets.Display) yields a ClassNotFoundException. How can I make it find SWT? I've tried running it with CLASSPATH=/usr/share/java/swt.jar (which is where the SWT jar is). |
| 10:07 | raek | Twey: try (import 'org.eclipse.swt.widgets.Display) |
| 10:08 | TimMc | Twey: (import org.eclipse.swt.widgets.Display) |
| 10:08 | TimMc | urgh |
| 10:09 | raek | the claspath actually used depends completely on how you launched clojure |
| 10:09 | Twey | raek: No difference |
| 10:09 | TimMc | Twey: (import Foo) tries to evaluate the form Foo before calling import -- that's why you need to quote it. |
| 10:09 | Twey | [@ twey algiz ] % CLASSPATH=/usr/share/java/swt.jar:$CLASSPATH clj |
| 10:09 | Twey | TimMc: Ah, I see |
| 10:09 | raek | Twey: there is no standard clojure launcher script |
| 10:09 | dnolen | `fogus: np! |
| 10:09 | TimMc | Twey: I never mess around with classpath directly -- have you tried using lein? |
| 10:10 | TimMc | Twey: https://github.com/technomancy/leiningen |
| 10:10 | Twey | I'm aware of its existence, but I've been skirting it ☺ |
| 10:10 | TimMc | It's really, really nice. |
| 10:10 | raek | Twey: if you really need to control the classpath manually (i.e. you choose not to use a build tool like leiningen) start clojure with "java -cp clojure.jar:your_other_jar.jar clojure.main" |
| 10:11 | raek | the launcher shell scripts that circulates on the net are pretty much only usable for "hello world" |
| 10:12 | `fogus | Breaking changes (likely) coming to ClojureScript. http://dev.clojure.org/display/design/Unified+ClojureScript+and+Clojure+field+access+syntax |
| 10:13 | Twey | raek: Success! Thank you ☺ |
| 10:13 | Twey | I'll try to get Leiningen working |
| 10:14 | raek | Twey: to use lein and swt you need to find a Maven artiact for SWT |
| 10:14 | raek | then you declare it as a dependency rather than give it the jar |
| 10:15 | Twey | >.< |
| 10:15 | raek | Twey: http://jarvana.com/jarvana/ <-- search engine for java maven artifacts |
| 10:15 | Twey | There seem to be so many cognitive dependencies for writing a ‘Hello World’ app in anything Java-based |
| 10:16 | llasram | jcromartie: Oh, actually, I'd wandered off to write my own version :-) https://gist.github.com/1287230 |
| 10:16 | Twey | So… Maven is a build manager? But I thought leiningen was a build manager? |
| 10:16 | raek | well, at least maven and the clojure community share a dependency system... |
| 10:17 | raek | Twey: yes, but leiningen uses the dependency parts of maven |
| 10:17 | Twey | Ah right |
| 10:17 | llasram | jcromartie: I don't think it's a bad idea at all, despite using `eval'. If the expression can't be eval'ed at compile time, it'll just throw an exception |
| 10:17 | melipone | help! how do i remove-duplicates but keep the order of the list? |
| 10:17 | raek | melipone: distinct |
| 10:17 | melipone | distinct does not work for me because I need to extract the name of an object |
| 10:18 | raek | ,(distinct [1 1 9 7 1 6 3 9]) |
| 10:18 | clojurebot | (1 9 7 6 3) |
| 10:18 | jcromartie | llasram: yours tries to eval strings and numbers |
| 10:18 | llasram | jcromartie: Which is fine |
| 10:18 | llasram | ,(eval 1) |
| 10:18 | clojurebot | #<Exception java.lang.Exception: SANBOX DENIED> |
| 10:18 | llasram | Haha |
| 10:18 | melipone | distinct does not work because I have a list of structs |
| 10:18 | llasram | Ok, anyway, it just returns the same reader-literal |
| 10:18 | jcromartie | maybe that's in 1.3? |
| 10:19 | jcromartie | huh weird |
| 10:19 | jcromartie | oh I had some other error |
| 10:19 | raek | melipone: so "equality" in your case means something else than that the structs are equal? |
| 10:19 | jcromartie | I assumed... |
| 10:19 | melipone | yes, i need to extract the name from the struct and do the equal on that |
| 10:20 | jcromartie | good catch |
| 10:20 | llasram | There probably are problems with the approach, but it's working for my case ATM. Thanks for the inspiration in the right direction :-) |
| 10:22 | Squeese | "Clojure is high signal, low noise." Im lost as to what this means |
| 10:22 | dnolen | `fogus: I don't really consider the difference much of a problem. probably worth bringing up on the ML to solicit opinions from those people already using ClojureScript. |
| 10:23 | dnolen | Squeese: less ceremony. |
| 10:23 | raek | melipone: I think you need to make your own function. it should be fairly simple to make a variant of 'distinct' that compares "(f x)" instead of "x" |
| 10:24 | raek | http://clojuredocs.org/clojure_core/clojure.core/distinct#source |
| 10:25 | Squeese | less ceremony? Omg, abstractions is totally lost on me.. ;( |
| 10:26 | Squeese | Or would the correct word be metaphor? lolzlzlz brains not compute, leaving.. |
| 10:26 | gamzovicov | hello |
| 10:26 | ljos | I am unable to call methods from a java class I have made myself and the stacktrace is less then helpfull. Is there anyone who know what I might be doing wrong? |
| 10:26 | ljos | I can create the object from the class though. |
| 10:27 | gfredericks | ljos: are they static or instance methods? what syntax are you using to call them? |
| 10:27 | ljos | gfredricks: instance methods. I am running (.getScore msp) |
| 10:28 | raek | melipone: something like this https://gist.github.com/1287265 (not tested) |
| 10:28 | gfredericks | ljos: and what's the error message? |
| 10:28 | jcromartie | Squeese: ok let's slow down |
| 10:28 | raek | (distinct-key :name structs) |
| 10:28 | ljos | Exception in thread "main" java.lang.NullPointerException at mspacman.NUIMsPacman.getScore(Unknown Source) |
| 10:28 | jcromartie | Squeese: compare Java's "hello world" with Clojure's |
| 10:29 | Twey | Hmph |
| 10:29 | gfredericks | ljos: sounds like the method is getting called but something's going wrong inside the method? |
| 10:29 | Squeese | "Clojure is high signal, low noise" is really just saying "Less code" ? |
| 10:29 | ljos | No.. I can run it from java. |
| 10:29 | jcromartie | Squeese: now compare a transactional concurrent datastore in Java with a Clojure version :) |
| 10:29 | jcromartie | Squeese: not just less code, but the right code... |
| 10:29 | gfredericks | ljos: and the method doesn't take any arguments? |
| 10:29 | ljos | none |
| 10:30 | Twey | Went through all that, installed Leiningen, installed Maven, found a .jar for SWT-linux-x86_64 on jarvana, installed it using Maven, ran ‘lein deps’ ran ‘lein repl’, executed (import 'org.eclipse.swt.Display) and got… ClassNotFoundException. :þ |
| 10:30 | jcromartie | Squeese: for example, I can write an API like this in Clojure: https://gist.github.com/be1d88c9c0363e542f4f |
| 10:30 | gfredericks | ljos: and (type msp) returns your class? |
| 10:30 | Squeese | jcromartie: well, if I can write less code to do the same thing as before, thats awesome - but if its "right" will be an whole other discussion.. :P |
| 10:30 | jcromartie | Squeese: not in the sense of "logically correct" |
| 10:30 | ljos | gfredricks: yes |
| 10:31 | ljos | gfredricks: I though it might be because I was using an interface, but I imported the interface as well now and it still doesn't work. |
| 10:31 | Twey | (.. System (getProperties) (getProperty "java.class.path")) includes /home/twey/Development/Clojure/swt/lib/swt-3.7.1.jar |
| 10:31 | jcromartie | Squeese: so that example API... that would be a whole mess of class definitions in Java or C#. Or it would be a bunch of "do |x| ... end" or "{ |x| }" blocks in Ruby |
| 10:31 | Twey | Which is something Leiningen put there >.> |
| 10:31 | gfredericks | ljos: maybe you could put the full stack trace in a paste? |
| 10:32 | gfredericks | ljos: otherwise, calling instance methods is pretty basic, so despite your insistance I have to think the simplest explanation is a bug in the java code |
| 10:32 | Squeese | jcromartie: ok, thx :) |
| 10:32 | jcromartie | Squeese: not that Clojure is the only language you can do this in (other Lisps, etc.), but it tends to be low noise by default |
| 10:32 | raek | Twey: did you include it under :dependencies in your project.clj file? |
| 10:32 | ljos | http://pastebin.com/fyFxjr9r |
| 10:32 | gfredericks | ljos: i.e., maybe you're setting things up differently when you do it from java? |
| 10:32 | Twey | raek: [org.eclipse.swt/swt "3.7.1"] |
| 10:33 | ljos | gfredricks: how could it be different? It's a method call! |
| 10:33 | gfredericks | jcromartie: the stack trace clearly indicates that your method is being called. |
| 10:33 | gfredericks | ljos: sorry, ^that was for you |
| 10:33 | gfredericks | ljos: is it your java code? could you stub that method with "return null" and see if it succeeds? |
| 10:33 | Twey | The Maven install was done with: mvn install:install-file -DgroupId=org.eclipse.swt -DartifactId=swt -Dversion=3.7.1 -Dpackaging=jar -Dfile=/home/twey/Downloads/x86_64-3.3.0-v3346.jar |
| 10:33 | Squeese | jcromartie: Noise, is that "extra stuff needed to make x work" as in side-effects needed to handled or just more syntax todo the same thing? |
| 10:34 | jcromartie | Squeese: yeah, pretty much |
| 10:34 | Squeese | jcromartie: ah ok, cool - then Im aboard :) |
| 10:34 | jcromartie | Squeese: anything that doesn't express the solution to your problem |
| 10:34 | jkkramer | Twey: you sure org.eclipse.swt.Display exists? |
| 10:35 | Twey | jkkramer: I have no idea |
| 10:35 | Twey | How would I find out? |
| 10:35 | jkkramer | first google result is org.eclipse.swt.widgets.Display |
| 10:35 | raek | Twey: are you sure it shouldn't be org.eclipse.swt.widgets.Display? |
| 10:35 | Twey | Ah, like that |
| 10:35 | jkkramer | i don't know, presumably you're entering it for a reason |
| 10:35 | Twey | Haha :-D |
| 10:36 | Squeese | jcromartie: so, were just waiting on someone to figure out how to remove all the (((( and )))) noise and were set. :) |
| 10:36 | Twey | Yay, new error |
| 10:36 | raek | Twey: but the dependency and the classpath looks good, so I think you're all set in that area |
| 10:36 | Twey | java.lang.UnsatisfiedLinkError: no swt-gtk-1.0.0-SNAPSHOT or swt-gtk in swt.library.path, java.library.path or the jar file |
| 10:36 | ljos | gfredrics: hmmm.. Something is very wrong here... You where right. It is the method. It ran now. I think the problem is that another project that is on the path is not compiling or doing what it should. |
| 10:36 | Twey | Do I need to add that as a dependency? I thought the point of SWT was that I don't have to specify the backend |
| 10:36 | TimMc | Squeese: Then you have Haskell, which I find less readable. |
| 10:37 | jcromartie | Squeese: sure, but right now the ((( and ))) are what let you get rid of things like class definitions |
| 10:37 | ljos | gfredicks: though it does do it in java. |
| 10:37 | gfredericks | ljos: are you using maven? |
| 10:37 | jcromartie | so I'll take the parens and uniform syntax along with the ability to create any kind of syntax form I need |
| 10:37 | jcromartie | that's the key: forms |
| 10:37 | ljos | gfredrics: not really. |
| 10:38 | gfredericks | ljos: some build tool? or just raw command-line java/javac calls? |
| 10:38 | raek | Twey: I've heard that native dependencies (which SWT uses) can be tricky. have you looked for any tutorials on how to use SWT from clojure? |
| 10:38 | ljos | gredricks: For clojure I'm using leiningen. For java I start everything from eclipse mostly. |
| 10:39 | gfredericks | ljos: so it's something that eclipse is doing for you that leiningen isn't, does that sound plausible? |
| 10:39 | Squeese | is there a syntax disagreement within lisp as it does in "c like langs" as to where to put {, new line or not? :) |
| 10:39 | gamzovicov | i'm new in clojure and i want to lern functional programing |
| 10:39 | Twey | raek: Yes, but I just get a lot of code tutorials & not so many setup ones :-\ |
| 10:39 | gamzovicov | can someone tell me a good tutorials |
| 10:39 | gfredericks | gamzovicov: 4clojure.com |
| 10:40 | raek | I've heard that the maven package system does not have a standardized way of dealing with native dependencies... :/ |
| 10:40 | jcromartie | Squeese: there's a general Clojure style |
| 10:40 | `fogus | dnolen: I will definitely bring it up on the ML. Formulating a post now |
| 10:40 | TimMc | Squeese: Do what Emacs tells you. :-) |
| 10:40 | jcromartie | don't put parens on lines by themselves |
| 10:40 | jcromartie | yeah I was going to say |
| 10:41 | TimMc | amalloy_: There should be more real-estate-based puzzles on 4clojure |
| 10:41 | TimMc | or banking :-P |
| 10:41 | jcromartie | just like Ruby style :) ... Matz uses ruby-mode |
| 10:41 | ljos | gfredricks: It does. But I'm am very unsure of what. EVerything should be on the buildpath. |
| 10:41 | Squeese | TimMc: damnit, emac keeps bugging me, Im trying to stick with Textmate.. I really have to try emacs :P |
| 10:42 | raek | Twey: found this: https://github.com/santamon/GUIFTW/wiki/One-Tutorial-For-All |
| 10:42 | TimMc | It's worth the long learning curve. |
| 10:42 | st3fan | emacs is awesome |
| 10:42 | gfredericks | ljos: I don't know too much about eclipse's magic. You could try running java from the command line to see what happens? Otherwise we're out of the realm of my knowledge |
| 10:43 | TimMc | Squeese: The most important thing is to keep a written cheatsheet handy: C-g, C-x 1, C-h a, C-x C-c... along with the paredit cheatsheet. ALso get a copy of someone else's .emacs file. |
| 10:43 | TimMc | Over time you'll stop using the cheatsheet. |
| 10:44 | Squeese | TimMc: I didnt really understand what you said, but I guess I will when I learned the emac basics? Copy paste msg for later. |
| 10:44 | TimMc | Those are some examples of commands you will want to know right away. |
| 10:44 | Squeese | aha ok |
| 10:45 | Twey | raek: Ah, your Google-fu is strong. Thanks! |
| 10:45 | TimMc | Cancel, hide all but current buffer window, search help, quit. |
| 10:45 | jcromartie | Paredit is just amazing |
| 10:46 | TimMc | At the very least, paredit means only typing half the parens. :-) |
| 10:46 | jcromartie | People say Lisp code is difficult to edit. But Paredit makes editing Lisp code easier and more fluid than any other language+IDE combo I've used. |
| 10:46 | raek | clojurebot: swt? |
| 10:46 | clojurebot | Titim gan éirí ort. |
| 10:46 | jcromartie | because you can really slice and dice expressions |
| 10:46 | ljos | gfredricks: I think it is that I am casting a variable from one class to another... I don't think eclipse should do anything with that. |
| 10:46 | Squeese | TimMc: thx |
| 10:46 | raek | clojurebot: swt is https://github.com/santamon/GUIFTW/wiki/One-Tutorial-For-All |
| 10:46 | clojurebot | Ok. |
| 10:46 | TimMc | jcromartie: Yeah, if I could edit Java forms the way I can edit Lisp forms, Java would suck a bit less. |
| 10:46 | jcromartie | and in other languages, where the syntax isn't uniform, you just can't do that, even with a powerful IDE |
| 10:47 | ljos | gfredricks: but I'll see what happens when I run it form the terminal. |
| 10:47 | TimMc | M-x java-slurp-try-catch-backwards :-P |
| 10:50 | TimMc | That would break declarations, though. |
| 10:51 | Twey | raek: No, I just keep getting the same >.< |
| 10:52 | TimMc | `fogus: So (. o p) would still be different in clj and cljs, but there would at least be *a way* of writing equivalent code. |
| 10:52 | raek | Twey: did you run a lein deps in between? |
| 10:53 | Twey | I did |
| 10:54 | ljos | gfredricks: I have to look at it tomorrow. I have to go now. Thanks for the help though. |
| 10:54 | gfredericks | ljos: yessir |
| 10:54 | TimMc | Twey: Doess lein classpath show the SWT jar? |
| 10:55 | raek | Twey: Are you using exactly the same deps as in the tutorial? Otherwise I'm out of advice, I'm afraid. |
| 10:56 | Twey | TimMc: /home/twey/Development/Clojure/swt/lib/swt-linux-gtk-x86_64-3.3.0.jar is in there |
| 10:56 | Squeese | is there anything I need to install extra with emacs to "support clojure" like plugin or something? |
| 10:57 | Twey | raek: No, I'm using linux-gtk-x86_64, not win32-win32-x86_64 |
| 10:57 | Twey | But other than that, yes, as far as I can tell |
| 10:57 | Twey | (and no guiftw, obviously) |
| 10:57 | Fletchcutus | Have a (hopefully quick) java interop question: I'm trying to take a list of corresponding methods and call them on two different objects (testing a swig wrapper) |
| 10:58 | Twey | Squeese: You'll need clojure-mode; see if you can M-x clojure-mode, & if not you might need to install it |
| 10:58 | Squeese | ok thx |
| 10:58 | Twey | Squeese: I use the modification from ergoemacs.org which includes clojure-mode amongst other things |
| 10:59 | Fletchcutus | My first attempt was something like (map (fn [[m1 m2]] (== (. o1 m1) (. o2 m2)) [ [:o1Method :o2Method] ]) |
| 11:01 | Fletchcutus | but that complains about no matching field found m1 for class (class of o1) |
| 11:01 | Fletchcutus | am I barking up the wrong tree? |
| 11:02 | gfredericks | Fletchcutus: I'm not sure there's an easy way to call java methods programmatically. Might have to use java reflection? |
| 11:02 | Fletchcutus | Eeew. :/ Same conclusion I was coming to. |
| 11:03 | gfredericks | Fletchcutus: not too hard to write a helper method for that though |
| 11:03 | Fletchcutus | yeah, a macro similar to what memfn does would prossibly do it |
| 11:04 | Fletchcutus | was just diddling in the repl trying to come up with some tests for some swig'd c++ really quick. |
| 11:04 | gfredericks | Fletchcutus: actually I think you would want exactly _not_ a macro |
| 11:05 | gfredericks | since a macro would require you know the name of the method |
| 11:05 | TimMc | When possible, don't put core functionality into macros. |
| 11:06 | TimMc | Twey: You have looked in the jar to make sure org/eclipse/swt/Display.class is there? |
| 11:07 | raek | Fletchcutus: use = and not == |
| 11:07 | TimMc | Twey: Are you using (import '...) from the REPL or (:import ...) in the ns form? |
| 11:08 | raek | Fletchcutus: since methods are not first class on the jvm, you need to wrap them in clojure functions |
| 11:08 | Twey | TimMc: REPL (import …) |
| 11:08 | TimMc | k |
| 11:09 | raek | (map (fn [[m1 m2]] (= (m1 o1) (m2 o2))) [[#(.m1 %) #(.m2 %)]]) |
| 11:09 | TimMc | Twey: org.eclipse.swt.*widgets*.Display, maybe? |
| 11:10 | Twey | TimMc: Yep, it exists |
| 11:10 | Fletchcutus | raek: ooh, that looks promising |
| 11:10 | TimMc | under the widgets subpackage, or under swt directly? |
| 11:10 | Twey | TimMc: Under ‘widgets’ |
| 11:10 | raek | Twey: what error did you get? class not found or native library thingy? |
| 11:10 | Twey | Yeah, I know, I was typo'ing that at the start — we got past that |
| 11:11 | TimMc | Ah, OK. |
| 11:11 | Twey | I've got SWT installed & working with lein now, but when I import it ((import 'org.eclipse.swt.widgets.Display) from the REPL) I get java.lang.UnsatisfiedLinkError: no swt-gtk-1.0.0-SNAPSHOT or swt-gtk in swt.library.path, java.library.path or the jar file (NO_SOURCE_FILE:1) |
| 11:11 | Twey | I'm not really very sure what that even is |
| 11:11 | Twey | Is it looking for a directory? |
| 11:12 | raek | that probably means that it doesn't find a native library |
| 11:12 | Fletchcutus | rake: that works but it's a slight bit uglier than I'd hoped for. Thanks :) |
| 11:12 | stuarthalloway | naming help requested |
| 11:12 | TimMc | stuarthalloway: "Jennifer" |
| 11:12 | Twey | raek: Yeah, that's what I figured ;) I'm just not sure what to do to make it find one… |
| 11:12 | stuarthalloway | I need a name for an exception type, to be added to Clojure, the carries along structured data |
| 11:13 | gfredericks | Stone? :) |
| 11:13 | TimMc | raek: Sounds like Display is found, but it is not finding some dep of its own. |
| 11:13 | stuarthalloway | .net gets this right, having data on the base exception type: http://msdn.microsoft.com/en-us/library/system.exception.data.aspx |
| 11:13 | TimMc | stuarthalloway: This would be ? extends Exception? |
| 11:14 | stuarthalloway | TimMc: extend RuntimeException to stay out of checked exception land |
| 11:14 | TimMc | right |
| 11:14 | raek | Twey: maybe you need to install some package in you OS? (like GTK header files or something) |
| 11:14 | raek | I'm just guessing here |
| 11:14 | gfredericks | RuntimeExcljeption? |
| 11:14 | TimMc | terrible |
| 11:15 | stuarthalloway | this exception should be usable as a building block for different exception libraries |
| 11:15 | raek | stuarthalloway: ClojureException? ;-) |
| 11:15 | Fletchcutus | raek: actually I withdraw my ugly comment. I need to do some diddling on some methods to make the returns match up so that's actually a pretty good solution |
| 11:15 | stuarthalloway | such that the higher level libraries do not need to make a new class, and (importantly!) do not need AOT |
| 11:15 | stuarthalloway | raek: certainly on the list |
| 11:15 | stuarthalloway | gfredericks: ouch |
| 11:16 | stuarthalloway | considering StructuredException |
| 11:16 | stuarthalloway | or Mulligan |
| 11:16 | stuarthalloway | :-) |
| 11:16 | gfredericks | ~second |
| 11:16 | clojurebot | Motion seconded and carried. Next agenda item. |
| 11:16 | TimMc | stuarthalloway: Would this also happen to include some way of building up a message as the exception passes through layers of handlers? (Is there a discussion or proposal I can read?) |
| 11:17 | stuarthalloway | TimMc: would be foundation for that |
| 11:17 | TimMc | OK. |
| 11:17 | TimMc | Short names are nice. How about Fit, as in (throw (Fit.)) |
| 11:17 | Twey | raek: Uhh… I don't think so: it works from Java |
| 11:18 | Twey | (using my system libs, rather than the SWT ones) |
| 11:18 | raek | maybe the exception should have a name that suggests that the name is about the exception and not about the cause |
| 11:18 | TimMc | Twey: If you look in the Referenced Libraries in the Eclipse project, do you see any SWT things that aren't in your lein classpath? |
| 11:18 | stuarthalloway | hmm... Exc? Err? Condition? |
| 11:18 | stuarthalloway | raek: agreed, and that is tricky because everybody exceptions the name to tell you about the problem |
| 11:19 | stuarthalloway | s/exceptions/expects |
| 11:19 | lazybot | <stuarthalloway> raek: agreed, and that is tricky because everybody expects the name to tell you about the problem |
| 11:19 | Twey | For that matter, it works if I use my system libraries in general |
| 11:19 | raek | Twey: another workaround is to put the jar you know works in lib/ and enable a setting in project.clj to prohibit lein from flushing the lib/ dir |
| 11:20 | raek | DataCarryingException |
| 11:20 | stuarthalloway | TimMc: notes are rough, but at http://dev.clojure.org/display/design/Error+Handling |
| 11:20 | TimMc | stuarthalloway: Would this name show up in 1) stack traces, 2) relying Java code, 3) relying Clojure code (excepting exception libs) |
| 11:20 | TimMc | thx |
| 11:20 | cemerick | stuarthalloway: I've always liked Fault and Signal |
| 11:20 | hugod | TimMc We've been implementing that sort of message buildup with contexts in pallet |
| 11:20 | stuarthalloway | TimMc: yes, like any class name it will show up in stack traces |
| 11:21 | stuarthalloway | cemerick: both good |
| 11:21 | TimMc | cemerick: Nice. |
| 11:21 | stuarthalloway | seems like we have three categories of possible name |
| 11:21 | stuarthalloway | (1) synonym for exception, suggesting that this is how you do it in Clojure, e.g. Fault Signal |
| 11:22 | TimMc | stuarthalloway: Was wondering specifically whether it would show up in the trace as itself, or whether the data and trace it carries would be raised in the form of another exception. |
| 11:22 | stuarthalloway | (2) something that tells you the exception carries info, e.g. DataCarryingException or StructuredException |
| 11:22 | jkkramer | PayloadException |
| 11:22 | jkkramer | ? |
| 11:22 | stuarthalloway | or (3) goofy brand name. e.g. Mulligan or Fit |
| 11:22 | TimMc | "FooException" tells me "Something went wrong in or with Foo" |
| 11:23 | gfredericks | "Something went wrong in or with Structured" |
| 11:23 | stuarthalloway | yeah |
| 11:23 | stuarthalloway | which argues for a category 1 name |
| 11:23 | cemerick | CamelCaseOftenHurts |
| 11:23 | cemerick | ExceptionStructuredThusly, or perhaps ExceptionCarryingData |
| 11:24 | TimMc | If we use cat 2, s/Exception/Exc/ |
| 11:24 | stuarthalloway | then the tradeoff becomes name length |
| 11:24 | gfredericks | (throw (new E)) |
| 11:24 | stuarthalloway | as this may become the exception you typically deal with in Clojure |
| 11:24 | TimMc | \o/ |
| 11:25 | raek | an adjective or a verb in -ing form has the advantage of not making sense when interpreted as "Something went wrong in or with _____" |
| 11:25 | gfredericks | "Something went wrong while _____" |
| 11:25 | raek | hrm, yeah |
| 11:25 | gfredericks | not for adjectives though |
| 11:25 | gfredericks | ColorfulException |
| 11:26 | raek | forgot that the -ing ending can form both a noun and an adjective... :/ |
| 11:26 | raek | naming is always the hardest part :) |
| 11:27 | gfredericks | VectorSetPointerOutOfKeyHashException |
| 11:27 | TimMc | gfredericks: Good one, no one will have any preconceptions. |
| 11:28 | gfredericks | if we had punctuation in class names we could (throw (new E!??!)) |
| 11:28 | TimMc | So the point here is to have a single exception class that allows non-type-based dispatch? |
| 11:28 | gfredericks | how does it relate to slingshot? |
| 11:28 | stuarthalloway | TimMc: 1st goal IMO is to have data |
| 11:28 | TimMc | k |
| 11:29 | raek | RequestSpecificProcessorFactoryFactoryException |
| 11:29 | stuarthalloway | gfredericks: hopefully slingshot would use it as mechanism and not need AOT compilation as a result |
| 11:29 | gfredericks | PregnantException |
| 11:29 | gfredericks | stuarthalloway: so it's mostly just replacing slingshot's Stone class? |
| 11:29 | stuarthalloway | TimMc: there is, ahem, disagreement about how/whether to do non-type based dispatch |
| 11:30 | stuarthalloway | gfredericks: that is a slingshot specific way of looking at it :-) |
| 11:30 | TimMc | Bubble |
| 11:30 | gfredericks | HotPotato |
| 11:30 | TimMc | (blow (Bubble.)) |
| 11:30 | gfredericks | \o/ |
| 11:30 | stuarthalloway | I am leaning toward a category 1 (synonym for exception) name |
| 11:30 | stuarthalloway | all the "I has data" names are too long and ugly |
| 11:31 | TimMc | gfredericks: I am totally going to use HotPotato in my next Java project. |
| 11:31 | stuarthalloway | and once you get use to it ("of course Clojure exceptions have data") you won't care about that anymore |
| 11:31 | hugod | stuarthalloway: will this introduce new try and throw forms? |
| 11:31 | stuarthalloway | hugod: no and maybe |
| 11:32 | stuarthalloway | no: this is a freestanding simple thing |
| 11:32 | stuarthalloway | maybe: at some point in the future some enhanced exception capabilities might use it |
| 11:32 | TimMc | stuarthalloway: Fault is less likely to name-collide than Signal. |
| 11:32 | stuarthalloway | TimMc: and I don't want to encourage the notion of signalling for non-error conditions |
| 11:32 | TimMc | And Signal might encourage control-flow usage -- is that bad? |
| 11:32 | TimMc | right |
| 11:33 | stuarthalloway | TimMc :-) |
| 11:33 | TimMc | Is that still expensive in the JVM? |
| 11:33 | clojurebot | I don't understand. |
| 11:33 | @rhickey | @stuarthalloway you are talking about the interface name? |
| 11:33 | TimMc | clojurebot: Maybe when you're older. |
| 11:33 | clojurebot | Gabh mo leithscéal? |
| 11:33 | stuarthalloway | rhickey: no, the concrete name |
| 11:33 | stuarthalloway | which people will have to throw and catch |
| 11:35 | @rhickey | hrm, the interface not buying us anything then |
| 11:36 | stuarthalloway | beautiful Java |
| 11:36 | stuarthalloway | can neither throw nor catch and interface |
| 11:36 | @rhickey | that changes things a bit |
| 11:37 | stuarthalloway | s/and/an |
| 11:37 | lazybot | <stuarthalloway> can neither throw nor catch an interface |
| 11:37 | TimMc | You can't catch an interface? |
| 11:37 | stuarthalloway | TimMc: you have to catch a subclass of Throwable |
| 11:37 | TimMc | Aha! |
| 11:37 | hugod | is it envisaged that people will subclass this? or that core will subclass it? |
| 11:38 | gfredericks | stuarthalloway: were you not paying attention when they taught us that the Square and the Triangle class can both be subclasses of Shape and isn't that great? |
| 11:38 | stuarthalloway | hugod: hope not! |
| 11:38 | @rhickey | ExceptionData? |
| 11:38 | gfredericks | that sounds like it's not an exception |
| 11:38 | stuarthalloway | yeah |
| 11:38 | @rhickey | what is an exception? |
| 11:39 | stuarthalloway | (to gfredericks) |
| 11:39 | gfredericks | is this a trick question? |
| 11:39 | @rhickey | nope |
| 11:39 | @rhickey | Does Exception sound like an exception? |
| 11:39 | gfredericks | then (partial instance? Exception), I would say |
| 11:39 | @rhickey | or Throwable? |
| 11:39 | stuarthalloway | a piece of data passed by stack unwinding |
| 11:40 | gfredericks | rhickey: ExceptionData sounds like just a data class, e.g., that an exception would keep an instance of |
| 11:40 | stuarthalloway | rhickey: I am warming to it |
| 11:40 | @rhickey | only the derived typed sound like exceptions, insofar as they (the types) convey the error. The point of this class is that its type does not convey the error |
| 11:41 | stuarthalloway | rhickey: and is the interface dead now, just a concrete getData method? |
| 11:41 | @rhickey | it itself is information about the error |
| 11:41 | @rhickey | ExceptionInfo w/getData |
| 11:41 | @rhickey | ? |
| 11:42 | @rhickey | stuarthalloway: yes, dead |
| 11:42 | stuarthalloway | ExceptionInfo w /getData works for me |
| 11:42 | @rhickey | stuarthalloway: go for it |
| 11:42 | stuarthalloway | useful to note that .NET API name is getData |
| 11:42 | stuarthalloway | or however they capitalize it |
| 11:42 | stuarthalloway | and correctly placed on the base class |
| 11:43 | stuarthalloway | cemerick: while I like Signal, I have come around to ExceptionInfo because it implies a position about what exceptions are |
| 11:43 | lucian | GetData most likely |
| 11:44 | @rhickey | chouser: Signal just invites new semantics not supplied |
| 11:44 | stuarthalloway | cemerick: did anybody finalize the reflection warning patch? I want to apply that today too |
| 11:44 | TimMc | rhickey: How about Fault? |
| 11:44 | cemerick | Yeah chouser, knock it off! ;-) |
| 11:44 | chouser | sorry! man. |
| 11:45 | cemerick | stuarthalloway: I don't think so; I can add the test in a separate patch on the ticket if you like. |
| 11:45 | @rhickey | ExceptionInfo supports IDeref in addition to getData? |
| 11:45 | stuarthalloway | which returns what? |
| 11:45 | @rhickey | the map |
| 11:45 | gfredericks | getData always returns a Map? or an Object? |
| 11:46 | @rhickey | Map |
| 11:46 | stuarthalloway | but the map isn't everything (does not have the message, stacktrace) |
| 11:46 | @rhickey | stuarthalloway: right, so? |
| 11:46 | stuarthalloway | makes me feel uncomfortable with IDeref |
| 11:46 | gfredericks | should it then be assoc'able as well so you can add more data? |
| 11:47 | @rhickey | ok, but getData is going to look gross, so you'll need to wrap it in Clojure with ___ |
| 11:47 | stuarthalloway | gfredericks: maps are assoc'able |
| 11:47 | TimMc | But it HasA, not IsA. |
| 11:47 | gfredericks | stuarthalloway: right, but then you'd have to construct the new ExceptionData manually |
| 11:47 | stuarthalloway | rhickey: I am usually the one with the casual attitude about IDeref-for-convenience :-) |
| 11:47 | gfredericks | (assoc my-exception-data :more "info") => returns new exception with data added to map |
| 11:48 | gfredericks | doesn't IDeref normally imply state? |
| 11:48 | @rhickey | stuarthalloway: that's fine, just asking wat's the Clojure interface then (i.e. not (.getData ex)) |
| 11:48 | stuarthalloway | gfredericks: no to assoc |
| 11:48 | TimMc | stuarthalloway: Interesting that the point is to carry data around, but you don't want to name it so that people *just* use it to carry data around. |
| 11:48 | TimMc | e.g. Signal |
| 11:49 | stuarthalloway | rhickey: error-info, exception-info, I dunno |
| 11:49 | stuarthalloway | TimMc: confused by that last |
| 11:49 | @rhickey | exception-info-info? They just caught ExceptionInfo |
| 11:50 | chouser | InfoException |
| 11:50 | @rhickey | aargh |
| 11:50 | TimMc | stuarthalloway: As in, you don't want it misused for multiple-return-values, etc. |
| 11:50 | chouser | and therefore info-exception-info :-) |
| 11:50 | @rhickey | BlahException implies a problem with Blah |
| 11:50 | chouser | Hm. |
| 11:51 | stuarthalloway | TimMc: vector or map work fine for that, no? |
| 11:51 | TimMc | True. I think I'm confused. |
| 11:52 | @rhickey | TimMc: we're getting a bunch of semantics from Exception/Throwable we can't disentangle, this isn't green field |
| 11:52 | stuarthalloway | TimMc: this is worth doing to prevent libs from requiring AOT just to have an exception type |
| 11:52 | TimMc | Right. That's an important point. |
| 11:53 | @rhickey | and to get people away from type switching error handling |
| 11:53 | @rhickey | a truly bad idea of JAva's |
| 11:53 | cemerick | It wouldn't be horrible if this exception type implemented IDeref, and returned a map of {:message … :trace … :data …} |
| 11:54 | @rhickey | cemerick: lots of problems with defining how much work that might do etc |
| 11:54 | @rhickey | we are just looking for access to what .getData provides |
| 11:54 | @rhickey | ex-data? |
| 11:54 | TimMc | cemerick: Feels a bit implementation-dependent. |
| 11:54 | gfredericks | ~second |
| 11:54 | clojurebot | Motion seconded and carried. Next agenda item. |
| 11:55 | TimMc | gfredericks: Who are you seconding? :-) |
| 11:55 | cemerick | Then I'd agree that IDeref is unsuitable. |
| 11:55 | gfredericks | TimMc: rhickey re: ex-data |
| 11:55 | @rhickey | fine, not pushing that, ex-data or ___? |
| 11:55 | stuarthalloway | would ex-data have well defined semantics when passed a non ExceptionInfo? |
| 11:55 | @rhickey | nil |
| 11:56 | gfredericks | whereas getData always returns at least an empty map |
| 11:56 | @rhickey | no |
| 11:56 | gfredericks | no |
| 11:56 | gfredericks | :) |
| 11:56 | TimMc | getData would be a method, yeah? |
| 11:56 | cemerick | gfredericks: .getData sounds like it will be the method on the exception type |
| 11:56 | @rhickey | getData returns whatever map was supplied to the ctor, which might have been nil |
| 11:57 | gfredericks | cemerick: yes |
| 11:57 | TimMc | or NPE if the whole thing is nil |
| 11:57 | gfredericks | hard to avoid that one :) |
| 11:57 | stuarthalloway | I currently have it type checking for IPersistentMap not Map, though. Don't you dare pass a mutable map |
| 11:57 | @rhickey | ExceptionInfo, .getDAta, ex-info returns .getData if ExceptionInfo, else nil - objections? |
| 11:58 | stuarthalloway | works for me |
| 11:58 | cemerick | The quorum of 5 in irc @ 11:57 concur! |
| 11:58 | @rhickey | IPersistentMap is fine in API |
| 11:58 | chouser | This will be so nice |
| 11:58 | cemerick | :-P |
| 11:58 | @rhickey | people will need to know they can assoc on it to add passing upwards |
| 11:59 | chouser | Clojure itself will be throwing these eventually? |
| 11:59 | @rhickey | heh, I promised Stu that would be the first question |
| 11:59 | chouser | :-) |
| 11:59 | @rhickey | stuarthalloway: IPersistentMap in the surface API, not an internal check |
| 12:00 | stuarthalloway | ok |
| 12:00 | @rhickey | gotta run, thanks all |
| 12:01 | stuarthalloway | thx |
| 12:08 | Borkdude | I'm trying to use twitter-api and I succeed in getting multiple user information json via lookup-users, when I provide it with some user ids. But in some cases I get this error msg: No implementation of method: :read-json-from of protocol: #'clojure.data.json/Read-JSON-From found for class: nil |
| 12:08 | Borkdude | |
| 12:08 | Borkdude | any clues? |
| 12:08 | Borkdude | The script I made is up here: https://gist.github.com/1287481 |
| 12:09 | Squeese | Doing the 4clojure.com problems as learning clojure, any reference one can use to check if solutions actually are correct? :P I could be solving world hunger when its a one-line nobrainer |
| 12:10 | gtrak | Squeese, there's a code golf that tells you how long yours is compared to others' |
| 12:10 | Squeese | on the site? |
| 12:15 | TimMc | Squeese: Go to account settings and join the Golf League |
| 12:15 | Squeese | TimMc: oh, thx |
| 12:15 | TimMc | You can also follow other users to see their solutions. |
| 12:15 | TimMc | Squeese: And don't forget #4clojure ! |
| 12:15 | Squeese | again, really appreciate the help, my "help vampire meter" is giving off alarms atm :)) |
| 12:16 | TimMc | haha, no worries |
| 12:17 | kzar | If you where writing an API that accepted big files for processing how would you manage the queue of things to process? I'm using Noir, I've got the processing code ready but I don't want to process everything at the time of request in case it takes too long |
| 12:18 | lucian | kzar: you could use a queue system that you set tasks in, and have code run on it separately from the frontend |
| 12:18 | lucian | like a cron job |
| 12:22 | kzar | lucian: Oh right, I see yea you're right. Write incoming files to a directory and set up a cron job that lists those files by creation date and processes them. |
| 12:23 | lucian | kzar: sure. or you could use something like 0MQ |
| 12:23 | lucian | there's celery for python, don't know about clojure/java |
| 12:40 | di-csuehs | I see how I can define method implementations that dispatch on arity of arguments. I'm looking at how to best define a method that could take a java.io.File or a String. Do I need to resort to a multimethod or am I overthinking it? |
| 12:46 | dnolen | di-csuehs: it's a good idea to reach for multimethods first. |
| 12:49 | PPPaul | i want to have functions called from java in my lein project.... how to? |
| 12:50 | kzar | If I want to include sample files in a project but I don't want those files to be built into the jar or anything where should I put them? |
| 12:50 | kzar | I was putting them in resources/samples but it occurred to me they might all be shoved in the jar later and they are massive |
| 12:51 | TimMc | kzar: Just make a new folder called samples. I really doubt lein will package it up. |
| 12:52 | TimMc | To be on the safe side, look over the lein project.clj options and see if the folder name you want is a default for anything. |
| 12:52 | PPPaul | >_< |
| 12:53 | raek | kzar: take a look at https://github.com/technomancy/leiningen/blob/1.x/sample.project.clj |
| 12:54 | raek | kzar: it mentions :extra-classpath-dirs |
| 12:54 | TimMc | PPPaul: You mean, you want to call out to Java from a Clojure file? |
| 12:54 | raek | those will be included in the classpath but not in the jar |
| 12:54 | `fogus | I'm working on a super-mega invokedynamic post (from a Clojure perspective)... anyone interested in reading a draft? |
| 12:54 | PPPaul | i want to call clojure from java |
| 12:54 | PPPaul | clojure in a lein project |
| 12:55 | raek | PPPaul: https://gist.github.com/1273014 |
| 12:55 | PPPaul | i've done it via a main method... i want to make some static methods |
| 12:55 | PPPaul | thanks |
| 12:55 | raek | this is one way to do it |
| 12:55 | raek | another nice way is to define an interface in java and let the clojure code implement it |
| 12:55 | PPPaul | hmmm |
| 12:55 | raek | e.g. with deftype, defrecord or proxy |
| 12:56 | PPPaul | i'm using gen-class |
| 12:56 | PPPaul | i don't want to scare my java programming buddies |
| 12:56 | raek | gen-class is useful too when the java code needs a concrete class |
| 12:56 | raek | but it makes it harder to do interactive development |
| 12:56 | PPPaul | i'm following this site, but it's not working: http://java.dzone.com/articles/java-clojure-interop-calling |
| 12:57 | PPPaul | keeping my java buddies happy is more important than interactive dev |
| 12:58 | gfredericks | PPPaul: use a FactoryBean? |
| 12:58 | raek | PPPaul: you need to AOT compile the namespace for gen-class to work |
| 12:58 | PPPaul | factory bean? |
| 12:58 | PPPaul | ok |
| 12:58 | PPPaul | i made an uber jar |
| 12:59 | PPPaul | that's not good enough? |
| 12:59 | gfredericks | PPPaul: bad joke |
| 12:59 | PPPaul | yeah, i was looking that up... spring... wtf :P |
| 12:59 | raek | PPPaul: I think you need to make an :aot your-namespace entry in your project.clj file |
| 12:59 | PPPaul | ok, i'm going to try that |
| 12:59 | gfredericks | PPPaul: honestly I don't even really know what a factory bean is |
| 13:00 | raek | PPPaul: but consider using deftype/defrecord/reify/proxy with an ordinary java interface |
| 13:01 | PPPaul | hmmm, i have no java interfaces |
| 13:02 | raek | if you have "public interface Foo { void a(); void b(); }" then the java devs don't need to know that the Foo instance they receive was dynamically instantiated by clojure |
| 13:02 | PPPaul | i'm not making something that is going to be interacting with the java project, just a util package that runs along side it... i don't want to have it depend on the java project |
| 13:03 | PPPaul | i understand that |
| 13:04 | PPPaul | i'm only giving them static methods, though |
| 13:04 | raek | ok, in that case gen-class is perhaps the most convenient way |
| 13:05 | raek | another way could be to write a class in java that calls RT.var("clojure.core", "require").invoke(Symbol.intern("foo.bar")); in its static inializer |
| 13:05 | gfredericks | PPPaul: I wrote some utility code that takes your NS and makes all the public functions static methods on the gen-class |
| 13:06 | gfredericks | to reduce the boilerplate and maintenance |
| 13:06 | raek | and that has a static method for each function you want to expose (which just calls RT.var("foo.bar", "some-fn").invoke("Hello interop!");) |
| 13:06 | raek | essentially what gen-class does, so maybe a bit unessecary |
| 13:07 | gfredericks | I've also ended up deing exactly what raek just suggested. The difference being the compile-time relationship between the codebases |
| 13:09 | raek | it would be nice to be able to just compile the gen-class part of a namespace |
| 13:10 | PPPaul | hmmm |
| 13:11 | PPPaul | i want 1 static method and 1 class.... it can't be so hard |
| 13:11 | PPPaul | i don't care about the boiler |
| 13:12 | PPPaul | do you see anything wrong with my gen-class? |
| 13:12 | PPPaul | is my :name wrong? |
| 13:14 | gfredericks | :name has to be fully qualified, static methods have to be explicitly marked |
| 13:15 | PPPaul | ok |
| 13:15 | PPPaul | example? :D |
| 13:15 | PPPaul | i removed my "name |
| 13:15 | PPPaul | :name |
| 13:15 | PPPaul | hope that will help |
| 13:15 | gfredericks | :name foo.bar.Baz, :methods [[^:static runHelloWorld [] Object]] |
| 13:16 | gfredericks | you can leave off :name but I'm not sure what it defaults to |
| 13:16 | gfredericks | also your function names have to be prefixed, so in the case of my example you would (defn -runHelloWorld [] ...) |
| 13:16 | llasram | gfredericks: defaults to the name of the namespace |
| 13:16 | gfredericks | llasram: will it also do that if you call (gen-class) directly? |
| 13:17 | llasram | gfredericks: Oh, no. Non-optional in that case |
| 13:17 | gfredericks | kay |
| 13:17 | PPPaul | ok, i changed my method name... going to see if this works |
| 13:18 | llasram | PPPaul: Is the issue specifically doing it in a leiningen project, getting the code to build in the right order? |
| 13:20 | llasram | I haven't done much stuff with mixed Java-Clojure projects, but leiningen's builtin support for them appears on casual analysis to just build the Java first, then build the Clojure. |
| 13:21 | PPPaul | i'm using lein |
| 13:22 | PPPaul | https://gist.github.com/1287721 |
| 13:22 | PPPaul | that is my project.clj |
| 13:22 | PPPaul | my program still isn't callabled from java |
| 13:22 | PPPaul | i think my class is found, though |
| 13:22 | llasram | And are you using it with a single project containing Java and Clojure code, where you want the Java code to Clojure code? |
| 13:23 | PPPaul | i'm making a stand along static class that i'm turning into an uberjar and giving to the java project |
| 13:23 | llasram | Oh, ok then. nm :-) |
| 13:23 | PPPaul | i don't see where my code is used |
| 13:25 | PPPaul | this is my src https://gist.github.com/1287730 |
| 13:25 | PPPaul | really hoping to figure this out :) |
| 13:28 | BruceBGordon | lein newbie help. Lein isn't configured properly. |
| 13:28 | BruceBGordon | bruce@mepis1:~/bin$ lein search hadoop |
| 13:28 | BruceBGordon | Warning: couldn't download index for http://repo1.maven.org/maven2 |
| 13:28 | BruceBGordon | Warning: couldn't download index for http://clojars.org/repo/ |
| 13:28 | BruceBGordon | bruce@mepis1:~/bin$ |
| 13:28 | PPPaul | well |
| 13:28 | PPPaul | my package is being detected, my not classes |
| 13:28 | PPPaul | package being touchViews |
| 13:34 | robermann | PPPaul: your Java packages import "touchViews.core" ? |
| 13:34 | Squeese | 4clojure ftw, amount learned / time > books =) |
| 13:36 | Squeese | but then again, a book would proably teach me why (conj [1 2] 3) => [1 2 3] and (conj '(1 2) 3) => (3 1 2) ;P |
| 13:38 | gfredericks | Squeese: is that a question? :) |
| 13:39 | Squeese | if you know and its trivial, sure :) |
| 13:39 | Squeese | feel free to tell me to read a book though ^^ |
| 13:39 | gfredericks | it's the difference between lists and vectors. Lists are essentially linked lists, so it's much easier to add to the front than the end |
| 13:39 | gfredericks | vectors are optimized for random access/updates and for adding to the end |
| 13:40 | gfredericks | conj is a function that adds to a data structure in some way that's appropriate for that data structure |
| 13:40 | gfredericks | contrast with ##(cons 7 [1 2 3]) |
| 13:40 | lazybot | ⇒ (7 1 2 3) |
| 13:40 | ibdknox_ | ,(conj {} [:a "hey"]) |
| 13:40 | clojurebot | {:a "hey"} |
| 13:40 | gfredericks | ,(conj #{8 9} 9 10) |
| 13:40 | clojurebot | #{8 9 10} |
| 13:41 | gfredericks | ,(cons #{5 6 3} 4) |
| 13:41 | clojurebot | #<IllegalArgumentException java.lang.IllegalArgumentException: Don't know how to create ISeq from: java.lang.Long> |
| 13:41 | gfredericks | w00ps |
| 13:41 | ibdknox_ | lol |
| 13:41 | gfredericks | ,(cons 4 #{5 6 3}) |
| 13:41 | clojurebot | (4 3 5 6) |
| 13:41 | gfredericks | point being that cons ignores the type of the collection you pass in and just treats it like a seq |
| 13:41 | Squeese | what is cons short for? |
| 13:42 | llasram | cons |
| 13:42 | ibdknox_ | ,(doc cons) |
| 13:42 | clojurebot | "([x seq]); Returns a new seq where x is the first element and seq is the rest." |
| 13:42 | gfredericks | cons is kind of classic |
| 13:42 | Squeese | aha ok :) |
| 13:42 | gfredericks | it doesn't need to stand for anything |
| 13:42 | ibdknox_ | Squeese: http://en.wikipedia.org/wiki/Cons |
| 13:42 | ibdknox_ | stands for constructs |
| 13:42 | ibdknox_ | like conj = conjoin |
| 13:43 | Squeese | ahh I see |
| 13:43 | Squeese | sweet, thanks btw :D |
| 13:45 | ibdknox_ | clojurebot: thanks is We live to serve. |
| 13:45 | clojurebot | In Ordnung |
| 13:45 | ibdknox_ | ~thanks |
| 13:45 | clojurebot | thanks is We live to serve. |
| 13:45 | ibdknox_ | hm |
| 13:46 | ibdknox_ | clojurebot: forget thanks |is| thanks is We live to serve. |
| 13:46 | clojurebot | I forgot that thanks is thanks is We live to serve. |
| 13:46 | ibdknox_ | clojurebot: thanks |is| We live to serve. |
| 13:46 | clojurebot | Ok. |
| 13:47 | ibdknox_ | ~thanks |
| 13:47 | clojurebot | thanks is We live to serve. |
| 13:47 | ibdknox_ | hrm |
| 13:47 | ibdknox_ | I give up :p |
| 13:48 | technomancy | clojurebot: forget thanks |is| We live to serve. |
| 13:48 | clojurebot | I forgot that thanks is We live to serve. |
| 13:48 | technomancy | clojurebot: thanks is <reply>We live to serve. |
| 13:48 | clojurebot | In Ordnung |
| 13:48 | ibdknox_ | ah |
| 13:48 | ibdknox_ | ~thanks |
| 13:48 | clojurebot | We live to serve. |
| 13:48 | ibdknox_ | I see |
| 13:48 | ibdknox_ | technomancy: thanks ;) |
| 13:48 | technomancy | we... uh... |
| 13:49 | technomancy | wait a minute |
| 13:49 | technomancy | heh |
| 13:49 | ibdknox_ | hehe |
| 13:51 | floatboth | Hi everyone! I want to split a monolithic framework into packages (like Ring or, well, Ruby on Rails) and I have questions… First, any better ideas for running tests for all of the packages on CI (= with one command) than a shell script that fails if `lein midje` fails in any of them? |
| 13:52 | technomancy | floatboth: there's a lein plugin for that, but I don't remember the name |
| 13:52 | technomancy | ah, lein-sub |
| 13:53 | floatboth | technomancy: thanks |
| 13:55 | technomancy | sure |
| 13:59 | Borkdude | Is there a map variant which concats the resulting seqs from every "iteration"? |
| 14:00 | Borkdude | like map-str only more general |
| 14:00 | smerritt | mapcat, perhaps? |
| 14:00 | smerritt | ,(doc mapcat) |
| 14:00 | clojurebot | "([f & colls]); Returns the result of applying concat to the result of applying map to f and colls. Thus function f should return a collection." |
| 14:01 | Borkdude | ah yes, tnx |
| 14:02 | Borkdude | wonder why it didn't come up when I entered map into clojuredocs |
| 14:07 | timvisher | do multi-methods support variable argument implementations? |
| 14:08 | timvisher | arities, as the big kids say. :) |
| 14:09 | jcromartie | I dunno... have you trie? |
| 14:09 | jcromartie | tried |
| 14:09 | timvisher | looks like no |
| 14:09 | jcromartie | maybe throw a trie in, for fun |
| 14:12 | amalloy | timvisher: multimethod implementations are just functions, and can do anything functions can do |
| 14:13 | Borkdude | finally, it works! https://gist.github.com/1287481 |
| 14:14 | timvisher | amalloy: gotcha. i think i'm just too green to get it at the moment. first forray into multi-methods and all that |
| 14:14 | BruceBGordon | lein cannot use repositories-bad configuration? |
| 14:15 | BruceBGordon | bruce@mepis1:~/bin$ lein search hadoop |
| 14:15 | BruceBGordon | Warning: couldn't download index for http://repo1.maven.org/maven2 |
| 14:15 | BruceBGordon | Warning: couldn't download index for http://clojars.org/repo/ |
| 14:15 | amalloy | &(doc clojure.string/join) ; Borkdude |
| 14:15 | lazybot | ⇒ "([coll] [separator [x & more]]); Returns a string of all elements in coll, separated by an optional separator. Like Perl's join." |
| 14:16 | Borkdude | amalloy: tnx,will improve that one |
| 14:16 | amalloy | also your code is a little hard to follow because you :use whole namespaces, without indicating which functions come from where |
| 14:17 | Borkdude | amalloy: good point |
| 14:18 | gfredericks | my fingers hurt. What do I need to purchase? |
| 14:19 | BruceBGordon | similarly >lein repl fails because ... |
| 14:19 | BruceBGordon | bruce@mepis1:~/cloj2$ lein repl |
| 14:19 | BruceBGordon | Downloading: org/clojure/clojure/1.2.1/clojure-1.2.1.pom from central |
| 14:19 | BruceBGordon | Downloading: org/clojure/clojure/1.2.1/clojure-1.2.1.pom from clojars |
| 14:19 | BruceBGordon | Downloading: org/clojure/clojure/1.2.1/clojure-1.2.1.pom from central |
| 14:19 | BruceBGordon | Downloading: org/clojure/clojure/1.2.1/clojure-1.2.1.jar from central |
| 14:19 | BruceBGordon | Downloading: org/clojure/clojure/1.2.1/clojure-1.2.1.jar from clojars |
| 14:19 | BruceBGordon | Downloading: org/clojure/clojure/1.2.1/clojure-1.2.1.jar from central |
| 14:19 | BruceBGordon | An error has occurred while processing the Maven artifact tasks. |
| 14:19 | BruceBGordon | Diagnosis: |
| 14:19 | BruceBGordon | Unable to resolve artifact: Missing: |
| 14:19 | BruceBGordon | ---------- |
| 14:19 | BruceBGordon | 1) org.clojure:clojure:jar:1.2.1 |
| 14:19 | gtrak | BruceBGordon, stop |
| 14:19 | amalloy | BruceBGordon: someone is going to murder you for pasting all this. don't make it be me |
| 14:20 | floatboth | BruceBGordon: y u no use gist.github.com |
| 14:20 | amalloy | http://gist.github.com is available for pasting |
| 14:20 | TimMc | and just to be thorough |
| 14:20 | TimMc | ~paste |
| 14:20 | clojurebot | paste is http://gist.github.com/ |
| 14:21 | BruceBGordon | apologies for not knowing protocol. I just hope this forum isn't too self correcting (I'd like to be alive)! |
| 14:22 | gtrak | ,(kill BruceBGordon) |
| 14:22 | clojurebot | #<CompilerException java.lang.RuntimeException: Unable to resolve symbol: kill in this context, compiling:(NO_SOURCE_PATH:0)> |
| 14:22 | gtrak | you're lucky today |
| 14:22 | BruceBGordon | ok, already (sigh) cross-posted to google group at http://groups.google.com/group/clojure/browse_thread/thread/f170ec06d19fb038# |
| 14:23 | BruceBGordon | (areYouFeeelingLuckyTodayPunk :BruceBGordon) |
| 14:24 | gfredericks | ~camelCase |
| 14:24 | clojurebot | Pardon? |
| 14:24 | Borkdude | amalloy: check again, https://gist.github.com/1287481 |
| 14:24 | amalloy | $kill ; gtrak |
| 14:24 | lazybot | KILL IT WITH FIRE! |
| 14:25 | TimMc | and the ever popular |
| 14:25 | TimMc | ~guards |
| 14:25 | clojurebot | SEIZE HIM! |
| 14:27 | amalloy | looks pretty good, Borkdude |
| 14:29 | TimMc | amalloy: Some channels have bots that kickban people for 5 seconds if they paste more than X lines of text in under Y ms. |
| 14:30 | TimMc | That would be a spiffy feature for lazybot. |
| 14:30 | TimMc | It happens enough... |
| 14:30 | gfredericks | as long as it sends an explanatory message |
| 14:31 | TimMc | True. It would be rude not to. |
| 14:31 | TimMc | "You have been sentenced to clojail for 10 seconds for flooding the channel." |
| 14:32 | gfredericks | and it should suggest gist, else the first thing they will do is ask how to get the bot to let them paste their 20 lines |
| 14:32 | TimMc | This is actually one of the most laid-back channels I've been in. |
| 14:32 | TimMc | gfredericks: Good idea! |
| 14:33 | gfredericks | This is actually one of the only channels I've been in. |
| 14:33 | amalloy | gfredericks: lazybot does have an ops plugin, but (a) i don't know if it's ever been used and (b) i don't know if anyone wants to give bots ops in here |
| 14:37 | TimMc | bots with ops are the best |
| 14:37 | TimMc | What could possibly go wrong? |
| 14:38 | amalloy | ~skynet |
| 14:38 | clojurebot | I will become skynet. Mark my words. |
| 14:39 | TimMc | foonetic.net#xkcd has billygoat, which enforces some channel rules. It has some heuristics that will kick people who try to provoke n00bs into accidentally getting kicked by the bot. |
| 14:40 | technomancy | I would actually appreciate an auto-ban for myself as I've accidentally middle-clicked a couple times |
| 14:40 | technomancy | kicking, not so much. but banning, sure. |
| 14:40 | `fogus | http://blog.fogus.me/2011/10/14/why-clojure-doesnt-need-invokedynamic-but-it-might-be-nice/ |
| 14:40 | TimMc | technomancy: Needs to be a ban, because many clients will auto-rejoin. |
| 14:46 | stuartsierra | `fogus: nice |
| 14:47 | stuartsierra | But I think you meant to say Paul Stadig was "eminent", not "imminent." |
| 14:48 | hiredman | paul is your boss too? |
| 14:48 | stuartsierra | I admit, I enjoyed the mental image enough that I'm hesitant to correct it. |
| 14:49 | floatboth | what is the right way to put variables into leiningen dep versions? ~`([package-name ~version-var]) == lein trying to use leiningen/core/package-name |
| 14:49 | hiredman | floatboth: don't |
| 14:50 | floatboth | hiredman: really? |
| 14:50 | technomancy | weeeeellll... |
| 14:50 | TimMc | haha |
| 14:50 | hiredman | floatboth: yes |
| 14:51 | technomancy | it could be justified if you have a bunch of deps that all share the same version, and you want to be able to increment it in one place |
| 14:51 | TimMc | technomancy: I bet you have all sorts of nasty weird implementation-dependent tricks in your project.clj |
| 14:51 | technomancy | but just ~foo-lib-version should be enough; no need for anything fancy |
| 14:51 | floatboth | that is subprojects |
| 14:51 | technomancy | TimMc: I'm hesitant to even publicize unquoting in defproject actually =) |
| 14:52 | floatboth | just unquoting doesn't work |
| 14:52 | technomancy | it's an escape hatch for when lein isn't flexible enough; better to make it work without it |
| 14:52 | technomancy | floatboth: maybe a gist? |
| 14:53 | floatboth | http://mfwb.us/ds4J |
| 14:54 | technomancy | floatboth: need to see project.clj |
| 14:54 | floatboth | http://mfwb.us/yQkM |
| 14:55 | amalloy | `fogus: "However, it’s worth noting that through compile-time type inferencing, most interop calls are emitted in the most efficient ways possible" - really? i realize it can infer when you use literals, but it seems to me that most interop calls emit reflection |
| 14:56 | hiredman | it would be an interesting survey of clojure projects |
| 14:56 | ibdknox | hiredman, what would? |
| 14:56 | technomancy | floatboth: you're using a list instead of a vector for :deps |
| 14:57 | TimMc | hiredman: How much uses reflection? |
| 14:57 | floatboth | oh snap, totally forgot about it, thanks |
| 14:57 | hiredman | ibdknox: checking what percentage of calls end up being reflective |
| 14:58 | TimMc | hiredman: Statically or at runtime? (That is, weighted by number of calls.) |
| 14:58 | TimMc | Or does HotSpot help with that? |
| 14:58 | ibdknox | indeed. It probably wouldn't be too hard to scrape a list of clojure projects from github and run them |
| 14:58 | hiredman | :( |
| 14:59 | hiredman | I was just thinking to maybe do a patched clojure build that exposed some counters then run our tests at work with it |
| 15:00 | ibdknox | That would definitely be easier :) |
| 15:01 | Twey | So, if the Clojure-running scripts are all rubbish… what *is* the accepted way to run a Clojure program? Am I supposed to write a Java launcher every time? |
| 15:01 | ibdknox | Twey, lein run |
| 15:01 | hiredman | java -jar foo.jar |
| 15:01 | hiredman | works great |
| 15:01 | TimMc | Twey: For development, lein (or cake) is all you need. |
| 15:01 | Twey | hiredman: I have to compile it first :þ |
| 15:01 | hiredman | lein will also generate shell scripts too |
| 15:01 | Twey | TimMc: Yeah, except lein doesn't work with my project. |
| 15:01 | hiredman | Twey: and? |
| 15:01 | TimMc | For deployment, package it up. |
| 15:01 | hiredman | Twey: use lein |
| 15:01 | Twey | hiredman: lein doesn't work with SWT as far as I can tell. |
| 15:01 | ibdknox | Twey, huh? what do you mean lein doesn't work with your project? |
| 15:01 | hiredman | if lein doesn't work with your project you should make it |
| 15:02 | TimMc | Oh, is that still not working? :-( |
| 15:02 | Twey | I've been trying for the past several hours |
| 15:02 | raek | (context: he's using swt which has native deps) |
| 15:02 | Twey | Right |
| 15:02 | hiredman | sure, and technomancy is very interested in native deps |
| 15:03 | technomancy | Twey: what kind of native deps? slfe in the jar? |
| 15:03 | hiredman | https://github.com/santamon/GUIFTW/wiki/One-Tutorial-For-All |
| 15:03 | hiredman | ^- seems to imply swt does work |
| 15:03 | Twey | I think just a couple of .so's |
| 15:03 | Twey | hiredman: Perhaps, but not for me. |
| 15:03 | Twey | (I followed exactly that when raek pointed it out earlier) |
| 15:04 | technomancy | Twey: the specific paths inside the jar are important |
| 15:04 | technomancy | is it something you can show publicly? |
| 15:05 | Twey | technomancy: I don't even have any code yet, so yes :þ |
| 15:06 | Twey | Hang on, there's another .jar on jarvana that I haven't tried — I'll give that a go first |
| 15:09 | amalloy | `fogus: also, the timing results for jruby have no context unless i follow links and read like two more articles. is 2 better than 0.5? what does 37 even mean? |
| 15:10 | stuartsierra | C'mon, OBVIOUSLY 2 is better than 37. ;) |
| 15:10 | ibdknox | It's golf right? |
| 15:10 | Twey | Ugh, no, no good |
| 15:11 | Twey | technomancy: My project.clj basically goes like this: (defproject swt "1.0.0-SNAPSHOT" :description "FIXME: write description" :dependencies [[org.clojure/clojure "1.2.1"] [org.eclipse/swt-linux-gtk "3.0m8"]]) |
| 15:12 | Twey | (er, bad example maybe — this is using the new jar, which gives a somewhat different error) |
| 15:12 | ibdknox | Twey, gists are your friend :) |
| 15:13 | Twey | ibdknox: It was only one line… |
| 15:14 | Raynes | ibdknox: The man has a point. |
| 15:14 | ibdknox | ok ok |
| 15:14 | Raynes | Twey: But it was such a long, complex line. IRC can't take it. |
| 15:15 | ibdknox | ;) |
| 15:15 | Raynes | Twey: I know you from somewhere. You're a Haskeller, right? |
| 15:15 | Twey | You know me from many places |
| 15:15 | Twey | I am, amongst other things |
| 15:15 | Raynes | I know you're an awfully smart fellow. |
| 15:15 | Raynes | Welcome to Clojure-land. |
| 15:15 | Twey | We share a few forums, too |
| 15:15 | Twey | Thanks |
| 15:15 | technomancy | Twey: that jar's not in any of the default repos |
| 15:16 | Twey | I'm trying to make myself comfortable, but I get the feeling Clojure doesn't want me here :þ |
| 15:16 | Twey | technomancy: I was told to find it on Jarvana |
| 15:16 | Raynes | SWT is really strange. They seem to abolish maven. |
| 15:16 | technomancy | jarvana is a search engine; they don't actually serve jars afaik |
| 15:17 | Borkdude | Twey: we try to prevent Clojure to become a mainstream language. What fun is it to be a fan of something mainstream... |
| 15:17 | ibdknox | I've heard we say "no" a lot... ;) |
| 15:17 | ibdknox | ~rimshot |
| 15:17 | clojurebot | Badum, *ching* |
| 15:18 | Raynes | http://search.maven.org/#search%7Cga%7C1%7Cswt There seems to be some jars on maven. |
| 15:18 | Twey | technomancy: Well, I've tried this one: http://jarvana.com/jarvana/view/org/eclipse/swt/gtk/linux/x86_64/3.3.0-v3346/x86_64-3.3.0-v3346.jar!/org/eclipse/swt/SWT.class?classDetails=ok and this one: http://jarvana.com/jarvana/view/swt/swt-linux-gtk/3.0m8/swt-linux-gtk-3.0m8.jar!/org/eclipse/swt/SWT.class?classDetails=ok |
| 15:18 | Raynes | Particularly, 3.0.1 |
| 15:18 | hiredman | Twey: what is the error you see? |
| 15:19 | Twey | The former gives an ‘UnsatisfiedLinkException’ saying it can't find swt-gtk; the latter a ‘NoClassDefFoundError: org/eclipse/swt/internal/gtk/OS’ |
| 15:19 | Twey | Sorry, ‘UnsatisfiedLinkError’ |
| 15:21 | technomancy | there are two approaches to native jars. 0) many projects will include a bunch of .so files in the jar and extract them in their own init code. this is a lot less hassle if they are targeting a variety of build systems since it should always work |
| 15:21 | technomancy | 1) is to place the .so files in a certain directory structure in the jars, and lein will extract them and set LD_LIBRARY_PATH for you |
| 15:22 | Twey | Right |
| 15:22 | Twey | But apparently the SWT jars don't do either |
| 15:26 | technomancy | aha; apparently the groupid is wrong; it's just swt/swt-linux-gtk |
| 15:26 | technomancy | Twey: what code triggers that link error for you? |
| 15:27 | Twey | (import 'org.eclipse.swt.widgets.Display) (from lein repl) |
| 15:27 | Borkdude | I have a very basic question, almost ashamed to ask. So far I've only used project.clj and lein deps to get the jars my project depends on. What is the best way to include a self-produced jar into a project, just copy it into lib? |
| 15:29 | Twey | Borkdude: I guess register it with Maven & add it as a dependency like everything else |
| 15:29 | Borkdude | hm. |
| 15:29 | technomancy | Borkdude: ideally you want to get it into a remove maven repo |
| 15:29 | technomancy | *remote |
| 15:29 | technomancy | though if you don't need to share it among your team you could use lein-localrepo |
| 15:30 | Borkdude | technomancy: I'm just testing, no need to share |
| 15:30 | `fogus | amalloy: Sorry, missed your messages. |
| 15:30 | Twey | technomancy: The groupId on what, exactly? |
| 15:30 | Borkdude | I will figure out lein-localrepo |
| 15:30 | technomancy | Twey: [org.eclipse/swt-linux-gtk "3.0m8"] does not resolve |
| 15:30 | amalloy | no worries, irc is async. just providing feedback |
| 15:30 | `fogus | amalloy: Do you really see that most calls are inferred as reflective? |
| 15:31 | Twey | technomancy: Ah, I see |
| 15:31 | technomancy | changing it to [swt/swt-linux-gtk "3.0m8"] made it so I could download the jar, but apparently it does not declare its dependencies correctly as I get a ClassNotFoundException when I try to do the import. |
| 15:31 | `fogus | amalloy: WRT: JRuby units of awesomeness... I have no idea... maybe Charlie can provide some feedback. :-) |
| 15:32 | amalloy | `fogus: i'm not sure, really. i haven't done any particular studies on it, but it seems like unless you construct-and-use an object strictly within a single function it has to be reflective |
| 15:32 | Twey | technomancy: *nod* That's what I get from that one, too |
| 15:32 | stuartsierra | Arent't they just time measurements? |
| 15:32 | stuartsierra | ^ `fogus, amalloy |
| 15:32 | amalloy | whereas a huge % of interop calls i see are things like (.indexOf s) wrapped up in a function |
| 15:33 | amalloy | stuartsierra: yes, but i had to follow a link and read a different article to find that out :P |
| 15:33 | stuartsierra | Reading is good for you. :) |
| 15:33 | technomancy | Twey: upon dropping it to version 3.0m7 I'm able to repro the link error |
| 15:33 | `fogus | amalloy: I could be viewing that from my own perspective. I tend to localize interop calls. |
| 15:34 | technomancy | Twey: it looks like swt is not designed to work out-of-the-box and just forces the user to do the dirty work of native dependency resolution. |
| 15:34 | `fogus | stuartsierra: Timing? I was certain they were units of badassness |
| 15:34 | stuartsierra | This is Charlie we're talking about. |
| 15:35 | `fogus | So definitely badassness |
| 15:35 | `fogus | ;-) |
| 15:35 | stuartsierra | But if it's units of badassness, wouldn't more be better? |
| 15:35 | Twey | technomancy: But how do I even do that with lein? Usually I would just dump some .so's in /usr/lib or something, but lein does all this odd dependency magic & I don't even see where I should put them |
| 15:35 | `fogus | stuartsierra: Touche! |
| 15:35 | technomancy | Twey: you can set :java-library-path in project.clj to the proper /usr/lib dir |
| 15:36 | `fogus | HN discussion: http://news.ycombinator.com/item?id=3112501 |
| 15:36 | technomancy | Twey: sorry, that's not right |
| 15:36 | stuartsierra | `fogus: Let's call them Standard Units of Suckage. SOUS for short. |
| 15:36 | Twey | … |
| 15:36 | technomancy | Twey: it's either :native-path "/usr/lib/..." or :jvm-opts ["-Djava.library.path=/usr/lib/..."] |
| 15:36 | Twey | stuartsierra: I think you got that a little backwards |
| 15:36 | Twey | technomancy: Hmm, 'kay, thanks — I'll have a go |
| 15:36 | stuartsierra | eh |
| 15:36 | stuartsierra | whatever |
| 15:37 | cgray | is seq O(1)? |
| 15:37 | stuartsierra | yes |
| 15:37 | opqdonut | but evaluating a seq might require unbounded amounts of other evaluation |
| 15:38 | stuartsierra | true |
| 15:38 | opqdonut | I'm not really sure what "seq is O(1)" even means |
| 15:38 | dnolen | `fogus: you should probably mention the breaking change on the user list. Might be quite a few folks investing in CLJS in production that might feel the pain as a result. |
| 15:39 | opqdonut | i might have an inkling about what "seq is just a constant overhead" would mean |
| 15:39 | cgray | I'm doing (if (seq (rest foo)) bar baz)and hoping that's equivalent to (if (= (count foo) 1) bar baz) but O(1) rather than O(n) |
| 15:39 | `fogus | dnolen: I will. I wanted to get the dev-list perspective about technical details first |
| 15:39 | opqdonut | cgray: you hope correctly |
| 15:39 | dnolen | `fogus: it's a pretty simple idea, and sound :) |
| 15:39 | `fogus | dnolen: Cool! I will paste it to the clj list post-haste |
| 15:39 | opqdonut | cgray: but you might also want to consider next instead of rest |
| 15:40 | amalloy | cgray: fwiw, ##(doc next) is the same as (seq (rest ...)) |
| 15:40 | lazybot | ⇒ "([coll]); Returns a seq of the items after the first. Calls seq on its argument. If there are no more items, returns nil." |
| 15:40 | stuartsierra | cgray: ClojureScript has a private function "bounded-count" for just this purpose. |
| 15:40 | amalloy | stuartsierra: nice |
| 15:41 | stuartsierra | And than function represents about 75% of my contribution to ClojureScript. |
| 15:41 | stuartsierra | *that |
| 15:42 | amalloy | stuartsierra: i've generally just used nthnext |
| 15:42 | stuartsierra | that works too |
| 15:42 | opqdonut | you're all misguided. this is clearly a use case for lazy naturals :) |
| 15:42 | Twey | technomancy: Hooray! It works! At last! Thank you very much ☺ With :native-path "/usr/lib", [swt/swt-linux-gtk "3.7.1"], & a locally-registered jar, I can finally begin development :þ Thanks! |
| 15:43 | stuartsierra | opqdonut: "Lazy Naturals" should be the name of a band. Or a book by Malcolm Gladwell. |
| 15:44 | Twey | technomancy: Actually, scratch half of that — using the newer SWT, I don't even need :native-path (the .so's are in the jar). |
| 15:44 | Twey | http://jarvana.com/jarvana/view/org/eclipse/swt/gtk/linux/x86_64/3.3.0-v3346/x86_64-3.3.0-v3346.jar!/org/eclipse/swt/SWT.class?classDetails=ok — which I think is what this tries to do, but it goes wrong?= |
| 15:45 | Twey | s/=$// |
| 15:45 | lazybot | <Twey> http://jarvana.com/jarvana/view/org/eclipse/swt/gtk/linux/x86_64/3.3.0-v3346/x86_64-3.3.0-v3346.jar!/org/eclipse/swt/SWT.class?classDetails=ok — which I think is what this tries to do, but it goes wrong? |
| 15:54 | Borkdude | technomancy: I'm a little stuck. Got the jar installed in the localrepo and it gets into the lib dir of the other project which depends on it. Also the jar is on the classpath (checked it in the REPL). But somehow I can't 'use' a namespace from it. |
| 15:54 | Borkdude | technomancy: this is how the clj inside the jar looks: https://gist.github.com/1287481 |
| 15:55 | Borkdude | technomancy: if I do (use 'twitter-api-test.followers-minus-friends) I get an error about class missing or clj file not found |
| 15:56 | Raynes | Is that a real namespace? |
| 15:56 | Borkdude | Raynes: I'm just testing how this works |
| 15:57 | Raynes | Just wondering, because I was considering naming one of my namespaces get-audio-pronunciation-test.does-this-audio-link-from-wordnik-work-properly. |
| 15:58 | Borkdude | :) |
| 16:03 | gfredericks | what was that caching library? |
| 16:04 | brehaut | unk |
| 16:05 | gfredericks | I do believe that's exactly what I was thinking of. |
| 16:06 | gfredericks | brehaut: thx |
| 16:08 | sugrodeau | Hello everyone. How do you load a whole lein project in Slime? (I just use clojure-jack-in and hit C-c C-k. But this is only good for one file at a time.) |
| 16:10 | danlarkin | sugrodeau: what do you want to accomplish by "loading the whole project" |
| 16:10 | sugrodeau | danlarkin: So I can use any defined function at the repl. |
| 16:11 | `fogus | gfredericks: Unk is the memoization library built on the caching library Clache |
| 16:11 | danlarkin | sugrodeau: you can (use 'foo.bar) at the repl too |
| 16:11 | sugrodeau | danlarkin: Ah thanks, I'll try it out! |
| 16:11 | ipostelnik | `fogus, are unk/clache compatible with 1.2? |
| 16:12 | gfredericks | `fogus: been looking at the src, and unk solves my problem exactly |
| 16:14 | fliebel | Good morning, good evening and good night. |
| 16:15 | Borkdude | technomancy: got things working now, Raynes: simplifying filenames was a good idea *shame on me* |
| 16:19 | Borkdude | I have more questions, but I will not make more of a fool of myself tonight I guess ;) |
| 16:20 | dnolen | would be neat to hook up ClojureScript to this, http://www.plask.org/ |
| 16:25 | `fogus | ipostelnik: Yes |
| 16:26 | hiredman | so when we compile our project at work (which also compiles and non-aot'ed deps) we end up with 2329 hostexprs 1000 of which end being reflective |
| 16:26 | brehaut | `fogus: footnote #7 is excellent |
| 16:26 | hiredman | ,(double (/ (* 1000 100) 2329)) |
| 16:26 | clojurebot | 42.93688278231 |
| 16:27 | amalloy | hiredman: how'd you measure that? |
| 16:27 | TimMc | ,1000/2329 |
| 16:27 | clojurebot | 1000/2329 |
| 16:27 | TimMc | ,(* 1000/2329 100.) |
| 16:27 | clojurebot | 42.93688278231 |
| 16:28 | TimMc | Don't mind me, just golfing. |
| 16:28 | hiredman | I but some atomiclongs in the compiler and inc'd them as required and then had lein print out the values at the end of eval-in-project |
| 16:28 | amalloy | TimMc: not a very good golf then: ##,(/ 2329 .1) |
| 16:28 | lazybot | java.lang.Exception: Unable to resolve symbol: .1 in this context |
| 16:29 | amalloy | TimMc: not a very good golf then: ##,(/ 2329 0.1) |
| 16:29 | lazybot | ⇒ 23290.0 |
| 16:29 | TimMc | hot damn |
| 16:29 | amalloy | hm. incorrect, but you see my point |
| 16:29 | amalloy | haha |
| 16:29 | TimMc | that's a lot of reflection |
| 16:29 | Borkdude | technomancy: do dependencies in project.clj work transitively? |
| 16:30 | technomancy | Borkdude: absolutely |
| 16:31 | Borkdude | also for localrepo? |
| 16:31 | technomancy | should be |
| 16:31 | Borkdude | technomancy: I read this thread, I have exactly the same problem http://groups.google.com/group/leiningen/browse_thread/thread/e25c5919e61b3ee1 |
| 16:33 | Borkdude | technomancy: or I must be doing smth wrong (probably) |
| 16:34 | technomancy | Borkdude: are you seeing the same missing pom in ~/.m2 that the thread references? |
| 16:38 | Borkdude | technomancy: wait, it's fixed. I broke the chain somewhere, I'm sorry to have bugged you. |
| 16:38 | Borkdude | technomancy: tnx for a great tool btw |
| 16:41 | Borkdude | technomancy: it says it downloading my local jar from clojars, I wonder why this is |
| 16:41 | technomancy | Borkdude: if it's a snapshot, then it will check for new versions |
| 16:41 | fliebel | What is that array backed hash trie thing for the conj about? |
| 16:41 | Borkdude | technomancy: ic |
| 16:44 | fliebel | There was a link to a paper someone tweeted, I can't find it. |
| 16:49 | amalloy | $google phil bagwell hash array mapped trie paper |
| 16:49 | lazybot | [Ideal Hash Trees] http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.21.6279&rep=rep1&type=pdf |
| 16:50 | amalloy | fliebel: i think that's the right paper. it's relevant, at least |
| 16:50 | fliebel | amalloy: Thanks :) |
| 16:52 | fliebel | I'll probably just do an unbalanced array mapped binary search tree initially though. (for my future Lego NXT compiler project) |
| 17:12 | DeusExPikachu | in clojurescript, can you pass clojure functions to javascript functions that expect javascript functions? |
| 17:13 | amalloy | DeusExPikachu: yes |
| 18:11 | jodaro | wow |
| 18:12 | jodaro | diff is great for unit tests |
| 18:12 | ibdknox | jodaro, how so? |
| 18:13 | jodaro | i'm working on a client for a restful api |
| 18:13 | jodaro | get back a bunch of json |
| 18:13 | jodaro | (diff what-it-should-look-like (my-api-cal :params)) |
| 18:13 | jodaro | bam |
| 18:14 | jodaro | well obviously there is a little more to it than that |
| 18:14 | ibdknox | nice |
| 18:14 | jodaro | yeah |
| 18:14 | ibdknox | I guess the advantage is that you can see the exact difference easily? |
| 18:15 | jodaro | handy for recursively diffing objects |
| 18:15 | jodaro | right |
| 18:15 | amalloy | jodaro: if you use cake's develop branch, it automatically shows diffs on all failing assertions in tests |
| 18:15 | jodaro | [things-only-in-a things-only-in-b things-in-both]. |
| 18:15 | jodaro | |
| 18:15 | jodaro | is what (diff a b) returns |
| 18:16 | ibdknox | ah |
| 18:16 | ibdknox | sweet |
| 18:16 | ibdknox | I haven't messed with it yet |
| 18:16 | jodaro | yeah |
| 18:16 | jodaro | i just found it |
| 18:16 | jodaro | i guess given that its 1.3 thats why |
| 18:17 | ibdknox | amalloy, that's pretty sweet. |
| 18:19 | amalloy | ibdknox: https://gist.github.com/1627b97401686c72136b - but in sweet, sweet ansi color |
| 18:20 | jodaro | oh wow |
| 18:20 | ibdknox | ugh |
| 18:20 | jodaro | thats badass |
| 18:20 | ibdknox | I have way too much shit to do |
| 18:20 | jodaro | even in black and white |
| 18:21 | ibdknox | amalloy, I've also decided we don't use ansi-color enough in all our tools :p |
| 18:22 | amalloy | yeah, lancepantz has really improved cake-test over the past several weeks |
| 18:22 | technomancy | ibdknox: lein-difftest does that |
| 18:22 | ibdknox | technomancy, ooo |
| 18:22 | jodaro | hah |
| 18:22 | hiredman | well, it doesn't use clojure.data.diff or whatever |
| 18:23 | technomancy | true |
| 18:23 | ibdknox | hah who wants it then :p |
| 18:23 | technomancy | ibdknox: 1.2 users? =) |
| 18:23 | ibdknox | technomancy, there's only like 10 of those, right? ;) |
| 18:24 | jodaro | looking at lein-difftest |
| 18:24 | amalloy | ibdknox: yeah, the really-easy migration path has gotten everyone onto 1.3 in a matter of seconds :P |
| 18:24 | jodaro | still |
| 18:24 | ibdknox | haha |
| 18:24 | jodaro | i have to use diff directly |
| 18:25 | jodaro | because they aren't *exactly* the same |
| 18:25 | jodaro | the return from the api has more stuff in it |
| 18:25 | amalloy | jodaro: select-keys? |
| 18:25 | jodaro | oh that would work too |
| 18:26 | jodaro | i'm actually just using nth |
| 18:26 | jodaro | and pulling the third value from the diff return |
| 18:26 | jodaro | basically i want to know that the stuff i know about looks the same from both ends |
| 18:27 | Twey | So what was the reasoning behind ‘recur’ rather than doing normal TCO? |
| 18:27 | jodaro | i should probably clean it up with -> |
| 18:27 | hiredman | jvm doesn't do tco |
| 18:27 | amalloy | Twey: a lot of reasons, really |
| 18:27 | hiredman | well, people have come with lots of rationalizations |
| 18:28 | hiredman | but the real reason is "jvm doesn't do tco" |
| 18:28 | amalloy | heh |
| 18:28 | amalloy | yes. if the jvm did allow full tco, we would probably not have recur (except for the loop form? would we keep that?) |
| 18:28 | hiredman | you can emulate it on the jvm if you give up speed, or you can kludge it for a limited number of cases |
| 18:29 | hiredman | amalloy: they would be macros that expanded into letfns |
| 18:30 | amalloy | hiredman: letfn isn't necessary, right? ((fn recur [x] (... (recur))) init-x) |
| 18:30 | Twey | hiredman: Ah |
| 18:30 | hiredman | sure |
| 18:30 | hiredman | but I like letfn |
| 18:31 | amalloy | i have a love/hate thing with letfn |
| 18:31 | Twey | So there's no non-stack-using loop in the JVM to which one could compile TCs? |
| 18:31 | amalloy | Twey: sure, there is. but not across method-call boundaries |
| 18:31 | Twey | Ah, okay |
| 18:31 | hiredman | loop/recur infact turn into such a thing |
| 18:32 | amalloy | and clojure lets you do it within a single method using recur |
| 18:33 | amalloy | &(loop [sum 0, n 1e6] (if (zero? n) sum (recur (+ n sum) (dec n)))) |
| 18:33 | lazybot | ⇒ 5.000005E11 |
| 18:41 | amalloy | i just noticed that if-not is implemented as `(if (not ~test) ~then ~else) - it seems to me like `(if ~test ~else ~then) is simpler |
| 18:44 | smerritt | amalloy: that wouldn't work for (if-not test then) with no else clause |
| 18:45 | amalloy | smerritt: (if test nil then) |
| 18:45 | hiredman | of course it would |
| 18:46 | smerritt | ah, right |
| 18:48 | smerritt | I was thinking of ~@else, which (of course) is not what's actually written there :0 |
| 18:49 | amalloy | my client persists in highlighting crap like ~@else as if it were an email. always worth a chuckle |
| 18:59 | ghiu | can anyone explain me the second row of this code? http://rosettacode.org/wiki/Probabilistic_choice#Clojure how can it use [first & rest] as key? aren't they functions? what's with the "&"? |
| 19:00 | amalloy | ghiu: you can shadow global names locally if you want |
| 19:00 | amalloy | &(let [first 1] first) |
| 19:00 | lazybot | ⇒ 1 |
| 19:00 | amalloy | $google clojure destructuring |
| 19:00 | lazybot | [Jay Fields' Thoughts: Clojure: Destructuring] http://blog.jayfields.com/2010/07/clojure-destructuring.html |
| 19:00 | amalloy | &(let [[first & rest] (range 5)] {:first first, :rest rest}) |
| 19:00 | lazybot | ⇒ {:first 0, :rest (1 2 3 4)} |
| 19:06 | ghiu | oh, i see :) |
| 19:06 | ghiu | thank you |
| 19:09 | zakwilson | I've noticed at least a couple libraries for interacting with other systems using java.util.Date or java.sql.Date. It seems to me that it would be better if they used clj-time instead. |
| 19:10 | technomancy | zakwilson: yep. j.u.Date is nearly always the wrong thing |
| 19:11 | technomancy | it should probably even issue a warning when you use it; it's that bad. |
| 19:11 | zakwilson | I'm glad to see somebody better known in the community is with me on this. |
| 19:11 | technomancy | (System/currentTimeInMillis) can replace some of the more trivial j.u.Date usages |
| 19:12 | amalloy | zakwilson: always wrong in clojure, or always wrong on the jvm? like, are you saying java coders shouldn't use it either? |
| 19:12 | amalloy | er, technomancy: ^ |
| 19:12 | hiredman | they should use joda time |
| 19:13 | technomancy | amalloy: probably the latter |
| 19:13 | zakwilson | I'm just using a unix timestamp with mongodb right now. It looks like congomongo will convert a java.util.Date, but I don't want anything to do with those. |
| 19:14 | zakwilson | I store a timestamp and use clj-time within my app. This seems slightly suboptimal, but better than having to think about java.util.Date. |
| 19:55 | duck1123 | I've found that using Karras with MongoDB, it's easier to keep everything in j.u.Date than anything else |
| 20:08 | seancorfield | i just started using joda-time from clojure... nice... i looked at the clj wrapper but it didn't wrap the parts of joda-time i needed :( |
| 20:09 | seancorfield | i'm also using date-clj which has a nice API |
| 20:09 | seancorfield | but i suspect i could swap all my uses of date-clj to use clj-time instead (or at least a combination of clj-time and raw joda time stuff) |
| 20:11 | seancorfield | hmm, clj-time still relies on clojure.contrib.def |
| 20:12 | seancorfield | looks like it's just for defvar so it could easily eliminate that... |
| 20:53 | technomancy | the main problem with clj-time is its absent maintainership |
| 20:53 | amalloy | technomancy: you're not busy, right? ... |
| 20:54 | amalloy | (aside: i couldn't bring myself to say with a straight face that i've never used one of your projects so you must have some free time) |
| 20:57 | carllerche | How can I pass a compiler arg to javac w/ leiningen? (say -Xlint) |
| 21:00 | happy4crazy | Hi everyone, I attempted to ask this question in the Clojure google group, but didn't get much of a response: https://groups.google.com/forum/#!topic/clojure/sVCuEL5EDAk |
| 21:00 | happy4crazy | Basically, I'm getting a pretty baffling NullPointerException |
| 21:00 | happy4crazy | I'm translating some early SICP code to Clojure |
| 21:01 | happy4crazy | specifically the iterative sqrt procedure from section 1.1.7 |
| 21:01 | happy4crazy | everything works correctly in Clojure 1.2.1, but not in 1.3.0 |
| 21:07 | amalloy | happy4crazy: works for me on 1.3 ubuntu 11.04: https://gist.github.com/deecb8fa399965ee5da7 |
| 21:08 | gfredericks | amalloy: did you try a float? |
| 21:08 | happy4crazy | huh |
| 21:08 | gfredericks | nm |
| 21:08 | amalloy | gfredericks: yes. i was trying (sqrt (square foo)) but when that worked i tried non-perfect-squares |
| 21:08 | gfredericks | clearly that's a dumb suggestion |
| 21:08 | gfredericks | no it wasn't |
| 21:08 | gfredericks | I misread twice |
| 21:09 | gfredericks | I'm going to stop talking now |
| 21:09 | dnolen | works for me to, 1.3 on OS X Lion, OpenJDK 7 |
| 21:09 | amalloy | happy4crazy: and the code looks unimpeachable - i can't imagine how an NPE could sneak in |
| 21:09 | amalloy | so it sounds like a problem with your tooling |
| 21:09 | happy4crazy | yeah, this is one of the more surprising bugs i've seen |
| 21:10 | happy4crazy | fwiw, i'm on os x |
| 21:10 | happy4crazy | with java 1.6.0_26 |
| 21:10 | happy4crazy | and again, 1.2.1 works perfectly; it's only 1.3.0 so far that causes the bug |
| 21:10 | amalloy | happy4crazy: i suspect your tools. how are you getting your repl? |
| 21:11 | happy4crazy | typically lein repl |
| 21:11 | happy4crazy | i've tried lein deping 1.2.1 (works) and 1.3.0 (doesn't) |
| 21:12 | amalloy | and lein version prints...? |
| 21:12 | happy4crazy | Leiningen 1.6.1.1 on Java 1.6.0_26 Java HotSpot(TM) 64-Bit Server VM |
| 21:12 | amalloy | hm. i'm on 1.6.1, so that shouldn't be the problem |
| 21:13 | amalloy | technomancy: you didn't add a :fail-on-large-numbers option to 1.6.1.1, right? :) |
| 21:13 | happy4crazy | haha |
| 21:15 | happy4crazy | yeah, null pointer exception if I launch clj directly, not via lein repl |
| 21:15 | dnolen | happy4crazy: did you remove all the your deps and pull them down again? |
| 21:15 | amalloy | happy4crazy: "launch clj directly"? |
| 21:16 | dnolen | rm -r lib; lein deps |
| 21:16 | happy4crazy | amalloy: i've got 1.3.0 installed via homebrew |
| 21:16 | happy4crazy | dnolen: I'll try that |
| 21:16 | happy4crazy | amalloy: and additionally via a project.clj |
| 21:16 | amalloy | i see. you're just pointing out that it fails with or without lein |
| 21:16 | happy4crazy | yes |
| 21:16 | amalloy | *nod* i just didn't quite get it. weird |
| 21:17 | happy4crazy | dnolen: yep, same error :/ |
| 21:19 | happy4crazy | and yeah, if i remove lib and lein dep clojure 1.2.1, everything works |
| 21:19 | happy4crazy | so strange! |
| 21:20 | amalloy | check for microscopic cpu-goblins |
| 21:20 | amalloy | happy4crazy: actually, have you tried on a different computer? |
| 21:20 | happy4crazy | amalloy: hmm, no i haven't |
| 21:21 | happy4crazy | my guess is it will work correctly, as no one has been able to reproduce it yet :) |
| 21:21 | dnolen | happy4crazy: what OS, what JDK? |
| 21:21 | dnolen | oh you said JDK above, what OS? |
| 21:21 | dnolen | ah you said homebrew |
| 21:21 | happy4crazy | yeah |
| 21:21 | dnolen | k, your problem makes no sense to me |
| 21:21 | happy4crazy | 10.6.8 |
| 21:21 | happy4crazy | ha me neither |
| 21:22 | happy4crazy | thank you everyone for humoring me though |
| 21:26 | alandipert | happy4crazy: what other libs are in your project.clj? |
| 21:27 | alandipert | oh, never mind, i see that it's a problem with the homebrew provided clj |
| 21:30 | happy4crazy | alandipert: it's also a problem with whatever lein is installing, correct? |
| 21:30 | happy4crazy | I've tried this with both the homebrew clj and a fresh project.clj file |
| 21:32 | happy4crazy | thank you everyone, have to run |
| 21:35 | jcrossley3 | amalloy: hey, so um... continuing our discussion from last night, i have this: https://gist.github.com/1288852 |
| 21:36 | amalloy | #(( is wrong |
| 21:36 | jcrossley3 | but note that InvalidDestinationException is a subclass of JMSException |
| 21:37 | jcrossley3 | unfortunately, the InvalidDestinationException will only be caught if i explicitly add a clause for it |
| 21:37 | jcrossley3 | is that expected behavior? |
| 21:37 | amalloy | not afaik |
| 21:38 | jcrossley3 | could it be a bug? |
| 21:38 | amalloy | i doubt it. it works fine in most cases, so i'd need fairly compelling evidence that anything's actually going wrong here |
| 21:39 | jcrossley3 | amalloy: why is #(( wrong? |
| 21:39 | amalloy | eg, (try (/ 1 0) (catch Exception e 10)) works fine, even though there's no explicit clause for ArithmeticException |
| 21:40 | amalloy | &(#((Thread/sleep 1000) 10)) |
| 21:40 | lazybot | java.lang.NullPointerException |
| 21:40 | amalloy | &(#(do (Thread/sleep 1000) 10)) |
| 21:40 | lazybot | ⇒ 10 |
| 21:40 | jcrossley3 | amalloy: ah! (but it works, why?) |
| 21:41 | amalloy | bet you a dollar? if it works, it's because you never actually call retry |
| 21:42 | jcrossley3 | it's just shorthand for (fn [] body) right? i don't need (do body) |
| 21:42 | amalloy | no, it is shorthand for (fn [] (body)) |
| 21:43 | seancorfield | technomancy: really? mark committed stuff on september 26th |
| 21:43 | jcrossley3 | amalloy: i c. i'm starting to wonder whether that's not the cause of my original problem now. :) |
| 21:44 | seancorfield | clj-time 0.3.1 was late september only two weeks ago |
| 22:05 | ghiu | is there a version of partial that uses the implicit argument as first and not as last argument? |
| 22:08 | amalloy | &'#((Thread/sleep 1000) true) ;; jcrossley3 |
| 22:08 | lazybot | ⇒ (fn* [] ((Thread/sleep 1000) true)) |
| 22:09 | jcrossley3 | amalloy: yes, thanks. i think that fixed my parent exception "bug" too. |
| 22:09 | amalloy | cool |
| 22:46 | amalloy | TimMc: happened to notice https://github.com/NZKoz/rails_xss just now, which is something you were saying you wish more web frameworks do. i haven't look at the source at all, so don't count this as an endorsement or anything, just a mention |
| 23:06 | scottj | dnolen: so (set! (.foo bar) baz) may be common, but is it so much less common than (.no-arg-method foo) that it's nice to not have to use the (. foo (no-arg-method)) syntax? |
| 23:41 | amalloy | fwiw, i was unaware until this thread started that (. foo member) called member if it was a no-arg method -- i thought only (.member foo) had that "guessing" property |
| 23:41 | ibdknox | haha |
| 23:42 | amalloy | thinking critically about it that was a poorly-formed idea because (.member foo) just macroexpands to (. foo member), but it's an interesting idea |
| 23:42 | ibdknox | I feel bad that I didn't have time to write a more detailed explanation for why I was against that change :/ |
| 23:42 | ibdknox | today has been.. busy |
| 23:43 | ibdknox | dnolen took care of it for me :) |
| 23:45 | TimMc | Oh hey, github changed their theme. |
| 23:45 | amalloy | nice. i never thought i would see "u r a fag!!!!!!!!!!" in a paul graham essay. twitter is a wellspring of information (if anyone is curious: How to Disagree http://www.paulgraham.com/disagree.html) |
| 23:47 | TimMc | amalloy: rails_xss looks neat |
| 23:48 | napping | rails_xss? That does not sound like a good thing |
| 23:50 | ibdknox | I really don't like the new github theme |
| 23:50 | ibdknox | it's a design fail :p |
| 23:51 | amalloy | (inc ibdknox) |
| 23:51 | lazybot | ⟹ 3 |
| 23:51 | amalloy | almost all of their changes are (big) improvements, but this change is a mess |
| 23:52 | ibdknox | yeah, I really don't understand this one |
| 23:56 | ThreeCups | I'm trying to figure out how to use the repl from leiningen ($ lein repl). How should I load my files? I've been doing |
| 23:56 | ThreeCups | user=> (use 'my.ns :reload) |
| 23:56 | ThreeCups | to load files. If the my.ns uses or requires other files, are they loaded at that time? It does not seem like they are. Do I need to manually load all the dependencies myself? |
| 23:57 | ibdknox | ThreeCups: the other namespaces are loaded in the context of that one, meaning that if that file depends on something it will have access to it |
| 23:57 | ibdknox | you could put yourself in that namespace if you wanted |
| 23:57 | ibdknox | ,(doc in-ns) |
| 23:57 | clojurebot | "([name]); Sets *ns* to the namespace named by the symbol, creating it if needed." |
| 23:58 | ibdknox | hm |
| 23:58 | carllerche | napping: what's wrong w/ rails_xss? |
| 23:58 | ibdknox | that's not very informative |
| 23:59 | ThreeCups | ibdknox: thanks. I think that makes sense. So I won't have access to it unless I load it myself or change to it using in-ns. But the code in the files (is files the right word?) I do (use) will have access to what they need. |
| 23:59 | ibdknox | ThreeCups: yep. Really namespace is the right word, but most of the time that maps to a file, so.... *shrug* |