2009-11-18
| 00:38 | technomancy | _ato: how goes? |
| 00:38 | technomancy | have you beaten me to the finish line yet? =) |
| 01:19 | technomancy | oy... you can't add a docstring to a namespace once it's been defined? |
| 01:33 | _ato | technomancy: you should be able to, it should be mutable |
| 01:33 | _ato | technomancy: alter-meta! |
| 01:33 | technomancy | right; I was expecting re-evaling the ns form after adding a docstring would do it. |
| 01:33 | technomancy | no such luck |
| 01:34 | _ato | ah :( |
| 01:34 | technomancy | just confused me because I started to wonder if I was accessing the metadata correctly for a minute |
| 01:34 | _ato | oh and I'm getting there, got distracted by some other stuff for a few hours |
| 01:35 | technomancy | I just need more detailed help output for various tasks before I consider it ready for release. |
| 01:35 | _ato | I'm currently fighting sqlite's full-text search, looks like I need to make a seperate search table, it only wants to search one column at once |
| 01:36 | technomancy | =\ |
| 01:36 | technomancy | how much works so far? can you sign up for an account? |
| 01:36 | _ato | pretty much everything but search should work, though it hasn't be thouroughly tested, lemme push my current version in to production |
| 01:38 | _ato | technomancy: oh yeah. Also would you be able to add a way to set <description> in the POM with leiningen? (assuming you haven't since I last looked at it) I need something to search on ;-) |
| 01:39 | technomancy | sure thing |
| 01:41 | _ato | ooh.. I jsut looked in the production db and there's already 2 other users, how exciting! ;-) |
| 01:43 | technomancy | and now three! |
| 01:45 | piccolino | Four |
| 01:45 | _ato | damn... uploading is broken |
| 01:46 | piccolino | That'll give me time to figure out how to make a jar. |
| 01:51 | _ato | oh bummer, and links to jars aren't working either. heh. like I said not tested |
| 01:51 | _ato | uploading should now work though.. sorta mostly :P |
| 01:51 | _ato | oh and the repo URL is http://clojars.org/repo/ |
| 01:52 | technomancy | _ato: pushed out descriptions in leiningen |
| 01:55 | _ato | technomancy: awesome, thanks :) |
| 02:04 | technomancy | is lein push implemented? |
| 02:05 | technomancy | also: do you want me to add clojars to the default repo for this release? |
| 02:05 | technomancy | _ato: ^^ |
| 02:07 | _ato | technomancy: take a look at http://github.com/ato/lein-clojars/ |
| 02:07 | technomancy | I saw that; just wondering if it was working. =) |
| 02:08 | _ato | push should work with that, although again I haven't extensively everything yet |
| 02:08 | technomancy | cool |
| 02:08 | _ato | err extensively tested* |
| 02:08 | _ato | and yeah if you'd like to add clojars to lein's default repos, please do :) |
| 02:09 | technomancy | if you think it's ready. =) |
| 02:09 | jkkramer | technomancy: there's a typo in your latest commit. "designed not to set your hair on _file_" |
| 02:09 | jkkramer | in the :description line |
| 02:10 | technomancy | oops! thanks |
| 02:11 | _ato | technomancy: I'm determined to get the basics fully functional and debugged today. :) |
| 02:14 | _ato | ah! fixed the jar pages: http://clojars.org/compojure |
| 02:17 | technomancy | _ato: you want me to mention clojars as a "coming soon, watch out for:" in my leiningen announcement? |
| 02:17 | technomancy | =) |
| 02:17 | _ato | technomancy: hehe sure. :) |
| 02:20 | technomancy | _ato: I'm thrilled to get this out the door, but once the dust settles I'm going to be very interested in taking a closer look at the clojars code. |
| 02:23 | _ato | eek! :-) I'm a total compojure newbie so it probably doesn't look like much at the moment. |
| 02:24 | adityo | guys..what is Clojars.org? |
| 02:24 | technomancy | _ato: I haven't done anything with compojure either; no worries |
| 02:25 | _ato | adityo: it's *almost* a clojure community jar repository (for use with leiningen or maven or whatever) |
| 02:25 | _ato | well actually the repo part works, just need finish off browse and seearch |
| 02:25 | adityo | coool!! |
| 02:32 | technomancy | released, pushed, and announced. |
| 02:34 | _ato | technomancy: congrats! goodnight. :-) |
| 02:38 | adityo | waddap piyush |
| 05:02 | adityo | ,doc partial |
| 05:02 | clojurebot | java.lang.Exception: Can't take value of a macro: #'clojure.core/doc |
| 05:03 | adityo | ,(doc partial) |
| 05:03 | clojurebot | "([f arg1] [f arg1 arg2] [f arg1 arg2 arg3] [f arg1 arg2 arg3 & more]); Takes a function f and fewer than the normal arguments to f, and returns a fn that takes a variable number of additional args. When called, the returned function calls f with args + additional args." |
| 05:03 | adityo | is a bit confusing! |
| 05:03 | adityo | would like to see some simple examples |
| 05:27 | _ato | ,(filter (partial < 5) [1 7 3 2 5 9 2 3 4]) |
| 05:27 | clojurebot | (7 9) |
| 05:27 | _ato | adityo: ^ |
| 05:33 | adityo | _ato: hmm |
| 05:33 | adityo | ,(filter #(< 5 %) [1 7 3 2 5 9 2 3 4]) |
| 05:33 | clojurebot | (7 9) |
| 05:34 | adityo | what would be the benefits of using partial |
| 05:34 | Chousuke | it's sometimes neater. |
| 05:35 | Chousuke | mostly personal preference :P |
| 05:36 | adityo | anyways i think partial is cool :P |
| 05:47 | hoeck | adityo: also, partial can be nested, #() not |
| 05:52 | adityo | hoeck: yeah, thanks for pointing that out :) |
| 06:05 | Chousuke | adityo: the biggest problem with partial is that it's got 7 characters :P |
| 06:08 | hoeck | Chousuke: yes, are there any alternatives, for example, a shorter name or a reader macro? |
| 06:09 | Chousuke | hoeck: well, you can (def p partial) |
| 06:09 | Chousuke | but there's no reader macro |
| 06:09 | Chousuke | and somehow I doubt there will be :/ |
| 06:10 | Chousuke | good macro characters are a scarce resource :) |
| 06:15 | hoeck | Chousuke: | is unused :) |
| 06:15 | Hun | Chousuke: not if your reader allows unicode :) |
| 06:16 | Chousuke | unicode characters are out by default. :P |
| 06:18 | Chousuke | hoeck: and will probably be used for something more important than partial |
| 06:26 | adityo | ,(doc comp) |
| 06:26 | clojurebot | "([f] [f g] [f g h] [f1 f2 f3 & fs]); Takes a set of functions and returns a fn that is the composition of those fns. The returned fn takes a variable number of args, applies the rightmost of fns to the args, the next fn (right-to-left) to the result, etc." |
| 06:42 | esj | Guys, does there exists such a thing as a 'blocking rest' ? I have a seq that lives in atom and gets switched out from time to time as new data gets appended to it. I'm thinking about how to consume this seq, such that when the consumer gets to the end of the seq it doesn't just die, but blocks until something new is in the seq, rinse, repeat. |
| 06:42 | esj | any ideas ? |
| 06:43 | Chousuke | rest won't block, because it's lazy and you won't actually execute the function until you call first on it |
| 06:44 | Chousuke | but if the function generating the lazy seq items blocks, then any attempts to advance the seq will block too |
| 06:45 | Chousuke | I think there's something in contrib that creates a seq based on a BlockingQueue or something. (...vague, huh :P) |
| 06:45 | esj | Yeah, I've been reading through those |
| 06:45 | esj | its seque and fill-queue |
| 06:46 | esj | and something else too.... |
| 06:46 | Chousuke | there's the hydra |
| 06:46 | Chousuke | hmm |
| 06:46 | ohpauleez | do you really want to block or do you want to poll/select? |
| 06:46 | Chousuke | ~hydra |
| 06:46 | clojurebot | Excuse me? |
| 06:46 | esj | hydra - i'll have a look that |
| 06:46 | esj | I really don't want to poll |
| 06:47 | Chousuke | it was somewhere on pastebin/github |
| 06:47 | ohpauleez | ahh ok |
| 06:47 | esj | I basically need to know, cheaply, when a seq has been extended |
| 06:47 | Chousuke | hmm. |
| 06:48 | esj | I could use an observer type pattern so that the seq sends notifications, but wondered if there was a way to put the logic in the consumer, rather than the producer |
| 06:49 | ohpauleez | http://www.assembla.com/wiki/show/clojure/Protocols |
| 06:49 | ohpauleez | one possibility might be to add a protocol for it, extending it |
| 06:49 | ohpauleez | ie: if you go to observer way |
| 06:50 | cgrand | esj, you can try a promised seq: (lazy-seq @p) where p is a promise, producer thread deliver p and calls to seq/next/rest will block |
| 06:51 | ohpauleez | cgrand: any docs on that? |
| 06:53 | ohpauleez | oh nvm, I just reread what you wrote, I get it |
| 06:53 | esj | esj has been scared to look at protocols --- massive brain stack overflow as it is :) |
| 06:54 | ohpauleez | haha |
| 06:55 | esj | thanks for the input everybody. |
| 06:56 | ohpauleez | esj: np |
| 07:14 | esj | cgrand: oh having unpacked this promised seq idea, the question I have is what function do I use as the promise / future ? It needs to somehow know when the original seq has been extended, or am I being dull ? |
| 07:15 | esj | which is how I got to the idea of the 'blocking rest' function |
| 07:25 | _ato | ,(doc fill-queue) |
| 07:25 | clojurebot | "clojure.contrib.seq-utils/fill-queue;[[filler-func & optseq]]; filler-func will be called in another thread with a single arg 'fill'. filler-func may call fill repeatedly with one arg each time which will be pushed onto a queue, blocking if needed until this is possible. fill-queue will return a lazy seq of the values filler-func has pushed onto the queue, blocking if needed until each next element becomes available. fil |
| 07:31 | esj | _ato: doh ! |
| 07:33 | licoresse | oversaw someone speaking about many new special forms, where? |
| 07:40 | rsynnott | licoresse: is it any good? (the mouse) |
| 07:40 | licoresse | rsynnott: so far I am realy happy with it, very flexible with what finger you use to scroll |
| 07:40 | licoresse | you don't have to stay in the middle (where the ball previously were) |
| 07:53 | the-kenny | hm... I have to try the Magic Mouse in an Apple store. |
| 08:45 | Licenser | for ideomatic naming every function that changes state, or has side effects should have a ! in the end? like cd! for moving into a new directory? |
| 08:45 | cemerick | that's typical, yeah |
| 08:46 | Licenser | okay |
| 08:46 | Licenser | just wanted to be sure since for FileSystem opperations it kind of looked odd to have all the ! theree |
| 08:47 | cemerick | well, I don't do a lot of IO stuff, but ! is definitely associated with fns that destructively modify some data structure |
| 08:47 | Licenser | well rm! does that kind of doesn't it? The Data structure is the FS not a clojure data structure, or am I seening this wrong? |
| 08:47 | cemerick | thinking about it, all of the database libs, etc., don't use !, so perhaps it can be safely skipped for libs that are always associated with IO operations. |
| 08:48 | Licenser | *nods* |
| 08:48 | Licenser | hmm file IO isn't thread save :/ |
| 08:48 | cemerick | yeah, I'll backtrack and say that for things that are implicitly side-effecting, ! is probably unnecessary |
| 08:49 | Licenser | that sounds usefull, it looked very odd after I added all the ! |
| 08:50 | Licenser | hmm I think FS's are just not functional and I#ve to live with that |
| 08:57 | weissj | anybody here use vimclojure? |
| 08:57 | ohpauleez | I do |
| 08:57 | weissj | was looking for a better colorscheme than default - couldn't figure out where to get the one shown here: http://kotka.de/projects/clojure/vimclojure.html |
| 08:58 | chouser | inkpot has been my favorite for quite a while |
| 08:58 | weissj | chouser: is that builtin? |
| 08:58 | ohpauleez | I use wombat |
| 08:58 | chouser | weissj: I don't think so |
| 08:58 | ohpauleez | inkpot: http://www.vim.org/scripts/script.php?script_id=1143 |
| 08:59 | ohpauleez | wombat: http://dengmao.wordpress.com/2007/01/22/vim-color-scheme-wombat/ |
| 08:59 | ohpauleez | in the comments is my 256 version |
| 09:00 | weissj | ohpauleez: weird, i loaded inkpot and it's just plain green. |
| 09:00 | weissj | green is my terminal text color |
| 09:00 | ohpauleez | you might need to set your term and vim to 256 color |
| 09:00 | weissj | ohpauleez: gnome-terminal doesn't have 256? |
| 09:01 | ohpauleez | I've had issues with 256 and gnome-terminal, but other guys I work with have done it |
| 09:01 | weissj | ohpauleez: any idea how/ |
| 09:02 | chouser | I just use gvim. |
| 09:02 | chouser | sorry that's not much help. |
| 09:02 | ohpauleez | http://ubuntuforums.org/showthread.php?t=1090344 |
| 09:02 | ohpauleez | export TERM="xterm-256color" |
| 09:02 | ohpauleez | in your bash or zsh rc |
| 09:04 | weissj | ohpauleez: i think it got it, thanks! |
| 09:04 | weissj | supposed to be a lot of purple and blue right |
| 09:04 | ohpauleez | weissj: awesome, glad to hear it! |
| 09:06 | weissj | ohpauleez: so, what i find odd here is that "if" is purple, "defn" is green, "throw" is blue, "not" is red. |
| 09:06 | ohpauleez | with wombat? |
| 09:07 | weissj | oh sorry, i'm using chouser's colorscheme. but i think all those are different colors in any scheme |
| 09:07 | ohpauleez | right, macro, special forms, functions, data types, comments |
| 09:07 | ohpauleez | etc |
| 09:08 | chouser | not is purple for me, like the other core fns |
| 09:09 | chouser | dunno why "for" is blue but "with-out-str" is green. honestly, I'd never thought about it. |
| 09:09 | Licenser | hmm is there a way to compile a clojure into a jar with all dependecies? like the clojure stuff, and additional lbiraries? |
| 09:09 | weissj | chouser: is defn green for you? |
| 09:09 | chouser | weissj: yeah. so is "ns" |
| 09:10 | chouser | Licenser: I think that lein-thing has an "uberjar" command to do just that. |
| 09:10 | weissj | so no one has any idea what colorscheme is used here: http://kotka.de/projects/clojure/vimclojure.html |
| 09:11 | Licenser | chouser: thanks I'll try to figure that out |
| 09:11 | chouser | ~seen kotarak |
| 09:11 | clojurebot | kotarak was last seen quiting IRC, 983 minutes ago |
| 09:11 | fogus_ | Licenser: http://ant.apache.org/manual/CoreTypes/zipfileset.html |
| 09:11 | weissj | chouser: oh ok didn't know he hung out here |
| 09:13 | cemerick | that's funny, kotarak uses twitter via TwitVim |
| 09:13 | chouser | weissj: yeah, but I think he's on European time, so you'll have to wait a bit. :-) |
| 09:13 | weissj | chouser: isn't it the middle of the day in europe? |
| 09:13 | Licenser | fogus_: thanks |
| 09:14 | weissj | chouser or maybe you mean he hangs out here after work |
| 09:14 | chouser | weissj: hm. I guess you're right. |
| 09:14 | liwp | it's 2:13PM in the UK, so 3:13PM in Germany IIRC |
| 09:15 | Licenser | liwp: actually 15:14 |
| 09:15 | liwp | :-P |
| 09:15 | Licenser | we have twice as much houres here in germany then you in the us :P |
| 09:15 | lisppaste8 | fogus pasted "zipfileset example" at http://paste.lisp.org/display/90663 |
| 09:15 | fogus_ | Licenser: Use like this ^^^^^^ |
| 09:15 | Licenser | fogus_: thanks, you're my hero! |
| 09:16 | fogus_ | Licenser: YW. BUT, using Leningen would be nice too. :) |
| 09:17 | liwp | has anyone tried / does anyone know if the repl in leiningen is slime/swank enabled? |
| 09:18 | Licenser | fogus_: not when you're trapped om M$ Windooze |
| 09:19 | chouser | leningen doesn't work on Windows? |
| 09:20 | Licenser | chouser: it has a bash file :P |
| 09:20 | liwp | should be fine with cygwin or mingw though |
| 09:20 | Licenser | and I'm not in the mood right now to translate bash to bat :P |
| 09:20 | chouser | ah, yeah, maybe it just needs a .bat |
| 09:21 | liwp | the script uses curl / wget to pull stuff from github, so you need to have something similar available for windows |
| 09:21 | chouser | I haven't looked at it at all. Does it assume you have clojure or at least java already? |
| 09:22 | liwp | yeah, I think so |
| 09:22 | chouser | ok |
| 09:22 | liwp | IIRC it just pulls the leiningen stuff from github and that's it] |
| 09:23 | Licenser | well what I want to do is to create a .jar file that my more stupid colegues can execute without having to deal wit installing clojure or stuff |
| 09:23 | liwp | Licenser: are you using clojure at work? |
| 09:24 | Licenser | liwp: yes |
| 09:24 | liwp | Licenser: lucky you! |
| 09:24 | Licenser | but not for a project just for supporting tools |
| 09:24 | Licenser | liwp: yap lucky me |
| 09:24 | liwp | Licenser: that's still better than no clojure |
| 09:24 | weissj | any vim clojure users recognize this error with omnicomplete: Error detected while processing function vimclojure#OmniCompletion..vimclojure#ExecuteNail..vimclojure#ExecuteNa |
| 09:24 | weissj | ilWithInput: |
| 09:24 | weissj | line 19: |
| 09:24 | weissj | Couldn't execute Nail! [{"word" : "RuntimeException", "info" : "", "kind" : "c", "menu" : ""}] |
| 09:24 | Licenser | my boss as realized that letting me do my stuff is better then not letting me do my stuff :P |
| 09:32 | esj | sigh, making slime/swank work with the latest clojure is upsetting |
| 09:33 | ambient | making emacs a full clojure ide is upsetting, but perhaps that's just me |
| 09:35 | esj | making it work the first time was unenjoyable, but repeating the exercise... |
| 09:35 | esj | well, it hasn't killed me, so i must be getting stronger |
| 09:35 | chouser | heh |
| 09:36 | chouser | unfortunately all you can no for sure is that it hasn't killed you *yet* |
| 09:36 | ambient | but how would you know after you died that it killed you? |
| 09:37 | Maddas | esj: http://site.despair.com/images/dpage/adversity03.jpg |
| 09:38 | ambient | heh. my own version is "that which does not kill me, makes me weaker" |
| 09:38 | chouser | heh. replace "adversity" with "emacs" and *then* you'd have a poster. |
| 09:38 | esj | ie: that which does not kill me, is due for upgrade in the next version ? |
| 09:39 | ambient | unless you kill it first |
| 09:40 | ohpauleez | weissj: are you just opening up vim or trying to open a fie |
| 09:40 | ohpauleez | also, do you have nailgun running and is the client in your path? |
| 09:40 | weissj | ohpauleez: it's working now, for some reason |
| 09:40 | weissj | now i'm trying to figure out how to load the file i'm editing in a repl, and call one of the fn's |
| 09:40 | weissj | when i do \ef i get a read-only window listing the fn's |
| 09:41 | ohpauleez | Ok, I've noticed that vimclojure will choke sometimes if you open a file with a ns form at the top |
| 09:41 | weissj | ohpauleez: really? isn't that pretty much all of em |
| 09:41 | ohpauleez | weissj: (load-file "file-name") |
| 09:41 | ohpauleez | yes, it is, but after the error happens once it doesn't happen again for me |
| 09:41 | weissj | ohpauleez: then what is \ef for |
| 09:42 | weissj | <LocalLeader>ef *ef* *EvalFile* |
| 09:42 | weissj | Send off the current file to the Clojure Server. |
| 09:42 | ohpauleez | ohhh in vimclojure |
| 09:42 | ohpauleez | I thought you meant on any given REPL |
| 09:42 | weissj | ohpauleez: yeah sorry :) that load thing is why i'm trying vimclojure |
| 09:43 | weissj | that gets annoying |
| 09:43 | ohpauleez | I rarely use all the extra things, and only use it for text editing and quick evaling |
| 09:43 | weissj | hm ok |
| 09:51 | Licenser | hmm I found a pretty simple msolution, netbeans puts all libs in a lib folder which the jar uses automatically :D |
| 10:00 | sh10151 | technomancy: found a little bug in swank-clojure-project the other night |
| 10:02 | esj | yeah, it came up on the googlegroup: http://www.mail-archive.com/clojure@googlegroups.com/msg20575.html |
| 10:02 | esj | http://www.mail-archive.com/clojure@googlegroups.com/msg20576.html rather |
| 10:07 | sh10151 | think this is a different bug I found |
| 10:07 | sh10151 | Mine's just the maven-specific portion should treat target/dependency like a directory full of jars, not an exploded directory of .class files |
| 10:10 | esj | ok, sorry. |
| 10:21 | patrkris | the way to get clojure 1.1 alpha is just by cloning the git repos? |
| 10:21 | ohpauleez | patrkris: yes |
| 10:21 | patrkris | thanks |
| 10:21 | ohpauleez | clone it and build it, then put the jar in your classpath like normal |
| 10:21 | ohpauleez | np |
| 10:46 | michael_teter | Hello. I'm having great difficulty with basic configuration (I get FileNotFoundException when trying to use clojure.contrib) |
| 10:47 | michael_teter | I've built clojure-contrib.jar, and my clj.bat script is adding clojure.jar and clojure-contrib.jar to the classpath (-cp), but still I can't use clojure.contrib |
| 10:47 | michael_teter | Ideas? |
| 10:50 | michael_teter | my script is listed at http://pastebin.com/d5bdff0ef |
| 10:51 | michael_teter | and C:\src\clojure contains clojure.jar, and C:\src\clojure-contrib contains clojure-contrib.jar |
| 10:53 | AWizzArd | michael_teter: could you try to echo the variable which you append as the CP? |
| 10:53 | AWizzArd | So you can see if it really points to the clojure.jar and the clojure-contrib.jar |
| 10:54 | michael_teter | ok, willdo |
| 10:54 | AWizzArd | maybe @echo on or something like that at top of the .bat file |
| 10:54 | patrkris | michael_teter: what do you write in the REPL to try to use clojure-contrib? |
| 10:55 | michael_teter | It appears I have a user path problem, so it was using an old clj.bat |
| 10:55 | michael_teter | I may be ok; let me test with the correct .bat :) |
| 10:56 | michael_teter | I'm sorry, this was a stupid user problem. my clj.bat is fine, and my contrib is loadable. I just had a windows path problem |
| 10:56 | michael_teter | but to answer patrkris, I did (use 'clojure.contrib.sql) |
| 10:57 | michael_teter | it works now |
| 10:57 | michael_teter | Thanks all |
| 10:57 | sh10151 | looking at clojure.contrib.zip-filter.xml source, I don't see any negation examples |
| 10:58 | sh10151 | has anyone done that? e.g. return nodes that don't match a predicate |
| 10:58 | sh10151 | s/e.g./i.e. |
| 10:59 | chouser | sh10151: I don't think I've done it, but each step in xml-> is a filter run against all nodes at the level, so it should be straightforward. |
| 11:19 | Licenser | hmm (reader) will block when the stream it reads from is empty, what is the best way to prevent this, or at least give a usefull return value like :reader_empty? |
| 11:19 | stuartsierra | Licenser: call .available on the stream |
| 11:19 | stuartsierra | http://java.sun.com/j2se/1.5.0/docs/api/java/io/InputStream.html |
| 11:20 | Licenser | ah darn I looked at the output stream docs o.O |
| 11:20 | stuartsierra | or .ready on a Reader |
| 11:21 | Licenser | I called ready but (first (line-seq *reader-thingy*)) still blocks |
| 11:21 | Licenser | ah darn I think I know why o.O because the line-seq does not find a \n on the last line *hrm* |
| 11:24 | stuartsierra | reader, line-seq, etc. are conveniences, if you need to handle streams directly, e.g. to avoid blocking, you may be better off working with the stream objects |
| 11:25 | Licenser | *whine* but it is javaisch :P |
| 11:25 | stuartsierra | Clojure is Java. Therein lies its beauty and its tragedy. |
| 11:26 | stuartsierra | Speaking of which, someone tried my clojure-hadoop library on large-ish data and kept getting "GC limit exceeded" errors |
| 11:26 | Licenser | Clojure has the JVM but untill now it really shielded me from the ugly object mess in java |
| 11:26 | cemerick | stuartsierra: what's "large-ish"? |
| 11:29 | sh10151 | chouser: looks as though it's as straightforward as (comp not (attr= :foo "bar")) at least in my case |
| 11:29 | chouser | sh10151: great! |
| 11:32 | stuartsierra | cemerick: 3 GB |
| 11:33 | stuartsierra | I think it's something to do with handling the Hadoop reducer operation with lazy sequences. |
| 11:36 | cemerick | holding head, etc., I presume |
| 11:40 | stuartsierra | I think so, yes. But it's interesting that it's not "Heap size exceeded," but "GC overhead exceeded," i.e., the JVM is spending too much time in GC. |
| 11:41 | chouser | stuartsierra: I tend to get those more or less interchangably |
| 11:41 | chouser | I think |
| 11:41 | stuartsierra | Interesting. |
| 11:42 | tomoj | I've never seen "GC limit exceeded" before |
| 11:42 | stuartsierra | Is it true that simply (defn foo [a-sequence] ...) holds the head of a-sequence? |
| 11:43 | cemerick | it has to, yes |
| 11:43 | tomoj | so how to the core sequence functions get around that? |
| 11:43 | tomoj | how _do_ I mean |
| 11:44 | Licenser | hmm why does the function has to hold head? |
| 11:44 | cemerick | further, I presume that rebinding a-sequence elsewhere doesn't impact that -- if that weren't the case, that would be helpful. |
| 11:45 | tomoj | oh, I guess it only holds the head for the duration of the function call? |
| 11:45 | stuartsierra | Licenser: It doesn't HAVE to, but it does, because of the way Clojure and the JVM interact. |
| 11:45 | Licenser | with [a-seq] do you meen the arg seq or is a-seq a argument passed to the seq? |
| 11:45 | tomoj | so that if you return a lazy-seq, you're ok |
| 11:45 | cemerick | right, insofar as parameters to clojure fns are parameters to java methods, the same semantics apply |
| 11:45 | stuartsierra | yes, function locals last until the method returns |
| 11:46 | rhickey | stuartsierra: it won't hold it beyond the tail call of ... |
| 11:46 | Licenser | ah okay that is what you mean |
| 11:46 | Licenser | if you don#t want to have it hold head you could call (afn (fn [] a-seq)) right? |
| 11:47 | stuartsierra | rhickey: That's what I thought. Unfortunately, the reducer function, as I've implemented it, has to return pairs. |
| 11:47 | rhickey | cemerick: and loop rebinding will overwrite and thus release |
| 11:47 | stuartsierra | It looks like (defn my-reducer [key seq-of-values] [[key (reduce + seq-of-values)]]) |
| 11:47 | stuartsierra | for a simple wordcount example |
| 11:48 | stuartsierra | So the (reduce + ...) isn't in tail position. |
| 11:48 | cemerick | rhickey: sure, but a loop binding doesn't impact a separate fn parameter binding w.r.t. the latter holding head, right? |
| 11:48 | rhickey | yeah, the JVM doesn't see the stack reference to seq-of-vales as dead, and I only explicit null out (to help the JVM) on tail calls |
| 11:49 | stuartsierra | Is there a way I can work around that? |
| 11:49 | rhickey | cemerick: no, they are different bindings, even if the same name |
| 11:49 | cemerick | OK, glad I didn't misunderstand that. |
| 11:50 | lpetit | stuartsierra: out of my head (so maybe a big idiocy) : (defn my-reducer [key fn-producing-seq-of-values] [[key (reduce + (fn-producing-seq-of-values))]]) |
| 11:51 | stuartsierra | does that solve it? |
| 11:54 | lpetit | stuartsierra: or (not changing your user interface) : (defn my-reducer [key seq-or-fn] (if (ifn? seq-or-fn) [[key (reduce + (seq-or-fn))]] (recur key #(seq-or-fn)))) |
| 11:54 | lpetit | ugly, if not :) |
| 11:54 | lpetit | but still I'm not 100% sure this solves your problem |
| 11:54 | lpetit | feedback appreciated |
| 11:56 | stuartsierra | lpetit: I'm not worried about changing the interface; my-reducer is a user-supplied function, not part of the library. |
| 11:56 | lpetit | stuartsierra: sorry, mistake in the #() (but you've got the idea) |
| 11:56 | stuartsierra | I'm going to try that, though |
| 11:56 | lpetit | stuartsierra: but beware the problem may still be hidden in the user code ? |
| 11:57 | tomoj | is there a better way to get the project root than something like (nth (iterate #(.getParentFile %) (File. *file*)) 5) ? |
| 11:59 | stuartsierra | tomoj: in general, Java prefers classpath-relative paths rather than filesystem lookup |
| 12:01 | tomoj | yeah, but I wanted to get a file:///... to load some static html files with htmlunit |
| 12:01 | tomoj | thinking I'll just start a servlet instead since I'll need to do cookies etc eventually |
| 12:01 | stuartsierra | tomoj: you can add your static html directory to the classpath, then use one of the ClassLoader.getResource* methods |
| 12:03 | tomoj | oh, that would be cool |
| 12:03 | tomoj | thanks |
| 12:03 | stuartsierra | np |
| 12:07 | Licenser | grr, I don't seem to gasp the reader stuff, I came up with a own readln but it's ugly and mostly not working (always returning blank lines). If someone would take a look I'd be very glad, https://gist.github.com/edf803e0aa07ef2161eb |
| 12:08 | stuartsierra | Licenser: this would work better with a StringBuilder |
| 12:08 | stuartsierra | Also Reader.read returns an int, not a char. |
| 12:09 | Licenser | ahh nseaky I missed that :( |
| 12:15 | lpetit | stuartsierra: I must leave, would you please email me the result (if it works, or even if it doesn't work)? |
| 12:15 | stuartsierra | sure |
| 12:15 | Licenser | narf I fopund the problem |
| 12:15 | Licenser | the function was called too fast, the stream hadn't had data yet |
| 12:31 | rads | in ruby you can do this: [0]*6 => [0,0,0,0,0,0]. what's the equivalent in clojure? |
| 12:32 | tomoj | ,(repeat 6 0) |
| 12:32 | clojurebot | (0 0 0 0 0 0) |
| 12:32 | rads | thanks |
| 12:48 | Licenser | well time to go home |
| 12:59 | icey | technomancy: congrats on launching leiningen - it looks awesome! |
| 13:05 | technomancy | icey: thanks! hope it works well for you. |
| 13:11 | djork | technomancy: what's leiningen? |
| 13:11 | technomancy | djork: a build tool designed not to set your hair on fire |
| 13:11 | technomancy | I should teach clojurebot! |
| 13:11 | djork | oh cool |
| 13:12 | djork | heh yes |
| 13:12 | ohpauleez | build tool, an awesome one |
| 13:12 | technomancy | clojurebot: leiningen is a build tool designed not to set your hair on fire (http://github.com/technomancy/leiningen) |
| 13:12 | clojurebot | 'Sea, mhuise. |
| 13:12 | technomancy | of course, there's no guarantee that it won't set your hair on fire. that's just the goal. |
| 13:12 | ohpauleez | I haven't used it yet, but I'm pumped to |
| 13:13 | ohpauleez | Well I think any build tool that is expressive makes the job easier |
| 13:13 | ohpauleez | but Clojure allows you to make a DSL |
| 13:13 | ohpauleez | for building, which is ideal |
| 13:17 | rahulkmr1 | Having trouble with vimclojure. It won't compile complaining about pprint not found. "Could not locate clojure/contrib/pprint__init.class or clojure/contrib/pprint.clj on classpath" |
| 13:18 | michaeljaaka | hi |
| 13:18 | rahulkmr1 | I compiled clojure-contrib again from source. and -Dclojure.jar=/path/to/clojure.jar |
| 13:18 | michaeljaaka | I want to learn how to assign new values to vars |
| 13:18 | michaeljaaka | I have read that somehting like this |
| 13:18 | michaeljaaka | ,(do (def n 1)(set! n 2 )(println n)) |
| 13:18 | clojurebot | DENIED |
| 13:18 | ohpauleez | You need to put the contrib jar in your classpath too |
| 13:18 | rahulkmr1 | but that still didn't solve the issue. Any ideas what am I doing wrong? |
| 13:18 | michaeljaaka | is not valid |
| 13:19 | rahulkmr1 | for compiling vimclojure? yes. I did that. |
| 13:19 | michaeljaaka | so what I should use to make it possible? |
| 13:19 | djork | michaeljaaka: try refs, not vars |
| 13:19 | rahulkmr1 | when I compiled clojure-contrib with ant -Dclojure.jar, I still couldn't find the file vimclojure is complaining about |
| 13:19 | rahulkmr1 | ppprint__init.class |
| 13:19 | djork | michaeljaaka: but first consider if you really need to change anything at all |
| 13:20 | michaeljaaka | yes, I need it |
| 13:20 | michaeljaaka | I think that agents will be good |
| 13:20 | rahulkmr1 | it wasn't there in the classes or clojure-contrib.jar. The error message also talks about pprint.clj. Is there a way I can place the .clj file somewhere and it takes it from there? |
| 13:20 | michaeljaaka | but first I want to learn anything about assigning values |
| 13:21 | djork | michaeljaaka: I just feel that if you're asking about how to re-assign to vars in Clojure you haven't had quite enough experience with the language to know if you really need to in the first place |
| 13:21 | chouser | changing the root value of a var is hardly ever the right thing to do |
| 13:21 | michaeljaaka | well, I want to track available nodes in a cluster |
| 13:22 | chouser | a ref! |
| 13:22 | michaeljaaka | they are chaning in time |
| 13:22 | michaeljaaka | so I need to store theirs availbility (addresses) |
| 13:22 | djork | a ref is perfect for that |
| 13:22 | michaeljaaka | and remove if timeout of hearbeat occures |
| 13:22 | michaeljaaka | ok |
| 13:23 | ohpauleez | rahulkmr1: Are you building everything from clean, are following every instruction |
| 13:24 | ohpauleez | I've had vimclojure fail when I was building with an unclean build dir |
| 13:24 | ohpauleez | but I just rebuilt everything about five days ago, and it's working ok for me |
| 13:25 | rahulkmr1 | ohpauleez: ant clean should do the trick? anyways, let me try to untar and start again. But really, I don't see the pprint__init.class file in the contrib jar even when I did a "ant -Dclojure.jar=/path". I think even my clean compile will fail again. |
| 13:26 | ohpauleez | rahulkmr1: also, just for the sake of it: export CLASSPATH=$CLASSPATH:/path/to/clojure.jar:/path/to/contrib.jar:. |
| 13:27 | rahulkmr1 | yes. I have that in my .bashrc. I have been running clojure for the past week. So no issues with cp. I was re-compiling contrib coz of vimclojure |
| 13:27 | hiredman_ | rahulkmr1: where did you get contrib from? |
| 13:27 | hiredman_ | _! |
| 13:28 | rahulkmr1 | hiredman: I didn't really pay attention. I got one copy of contrib with sample code for programming clojure. And I d/l the source a couple of mins ago from some git repo which came up in my google search. Do I know a specific one? |
| 13:28 | hiredman | sounds right |
| 13:29 | hiredman | what does the output of ant look like? |
| 13:29 | rahulkmr1 | BUILD FAILED |
| 13:29 | rahulkmr1 | /home/rahulkmr/utils/vimclojure/vimclojure/build.xml:66: java.io.FileNotFoundException: Could not locate clojure/contrib/pprint__init.class or clojure/contrib/pprint.clj on classpath: (util.clj:23) |
| 13:29 | hiredman | rahulkmr1: I meant for contrib |
| 13:30 | rahulkmr1 | oops. sorry |
| 13:30 | michaeljaaka | what is a difference between alter and commute? |
| 13:30 | hiredman | ~commute |
| 13:30 | clojurebot | I don't understand. |
| 13:30 | hiredman | ~alter |
| 13:30 | clojurebot | alter is always correct |
| 13:30 | rahulkmr1 | hiredman: jar: |
| 13:30 | rahulkmr1 | [jar] Building jar: /home/rahulkmr/utils/richhickey-clojure-contrib-f165e28/clojure-contrib.jar |
| 13:30 | rahulkmr1 | BUILD SUCCESSFUL |
| 13:30 | michaeljaaka | I can read that commute allow concurent changes within transaction |
| 13:30 | hiredman | rahulkmr1: that is not the whole output |
| 13:31 | hiredman | pastebin it somewhere |
| 13:31 | rahulkmr1 | oh. ok. will do that |
| 13:31 | michaeljaaka | I mean others won't wait for transaction to finish |
| 13:31 | hiredman | michaeljaaka: use alter |
| 13:31 | michaeljaaka | ok |
| 13:31 | michaeljaaka | alter is like pesimistic locking? |
| 13:31 | michaeljaaka | I alter lock |
| 13:31 | hiredman | no |
| 13:31 | michaeljaaka | monitor or whatever |
| 13:31 | michaeljaaka | change value |
| 13:31 | michaeljaaka | and release lock? |
| 13:31 | hiredman | no |
| 13:32 | michaeljaaka | synchonized(value) { value.add("somthing") } |
| 13:32 | ohpauleez | no |
| 13:32 | michaeljaaka | this is alter? |
| 13:32 | hiredman | no |
| 13:32 | michaeljaaka | :) |
| 13:32 | ohpauleez | michaeljaaka: http://groups.google.com/group/clojure/browse_thread/thread/0e575db4718c1f85 |
| 13:32 | danlarkin | yes? |
| 13:33 | ohpauleez | alter does it during the transaction, commute waits for commit time |
| 13:34 | hiredman | no |
| 13:34 | ohpauleez | no? |
| 13:35 | hiredman | no |
| 13:35 | hiredman | use alter |
| 13:37 | rahulkmr1 | hiredman: here is the dump: http://pastebin.mozilla.org/684620 |
| 13:37 | qed | i have a grid 20x20 as a vector, how do I split it up into 2 sequences which are 20 rows and 20 columns |
| 13:38 | michaeljaaka | wow, I manage to write first alternation in transaction! thanks man! |
| 13:38 | hiredman | rahulkmr1: where did you get your clojure? |
| 13:39 | rahulkmr1 | I think it's the one which came with the book. Lemme check |
| 13:39 | hiredman | ok |
| 13:39 | ohpauleez | qed: map vector, and partition? |
| 13:39 | Bjering_ | Why does this throw IOException? (with-open [rdr (reader "http://clojure.org/")] (take 2 (line-seq rdr))) |
| 13:39 | hiredman | you will need the 1.0 compat branch of contrib |
| 13:39 | hiredman | Bjering_: line-seq and take are both lazy |
| 13:40 | hiredman | so by the time you force them, with-open has closed the reader |
| 13:40 | ohpauleez | ,(map vector [1 1 1 1][2 2 2 2]) |
| 13:40 | clojurebot | ([1 2] [1 2] [1 2] [1 2]) |
| 13:40 | Bjering_ | ah |
| 13:40 | michaeljaaka | check this out and let me know if it is ok http://pastebin.com/d2a6d0ae0 |
| 13:40 | michaeljaaka | or anything can be improved |
| 13:41 | Bjering_ | Then the next q becomes, why is (with-open [rdr (reader "http://clojure.org/")] (doall (take 2 (line-seq rdr)))) empty? |
| 13:42 | hiredman | ,(doc reader) |
| 13:42 | clojurebot | "clojure.contrib.duck-streams/reader;[[x]]; Attempts to coerce its argument into an open java.io.BufferedReader. Argument may be an instance of Reader, BufferedReader, InputStream, File, URI, URL, Socket, or String. If argument is a String, it tries to resolve it first as a URI, then as a local file name. URIs with a 'file' protocol are converted to local file names. Uses *default-encoding* as the text encoding. Should be |
| 13:42 | qed | ohpauleez: oh right :) i didnt know about partition |
| 13:42 | qed | thanks |
| 13:42 | ohpauleez | qed: happy to help |
| 13:44 | hiredman | Bjering_: hard to say |
| 13:44 | hiredman | I blame reader |
| 13:47 | rahulkmr1 | hiredman: just to be sure, i just downloaded a new copy of clojure from clojure.org and compiled it. copied the jar files and set the classpath. I still am getting those pesky messages while compiling clojure-contrib if that's what you asked me where did I get clojure from |
| 13:47 | rahulkmr1 | hiredman: Caused by: java.io.FileNotFoundException: Could not locate clojure/walk__init.class or clojure/walk.clj on classpath: |
| 13:47 | rahulkmr1 | I got a new copy of clojure and these messages persist while compiling contrib |
| 13:47 | hiredman | rahulkmr1: as I said, you need the 1.0 compat branch of contrib |
| 13:48 | rahulkmr1 | oh. I thought I got the latest copy from github. Lemme check |
| 13:48 | hiredman | you did get the latest |
| 13:48 | hiredman | but you don't have the latest clojure |
| 13:48 | hiredman | you have the 1.0 release |
| 13:48 | rahulkmr1 | so shall I do a repo copy then? |
| 13:48 | rahulkmr1 | for clojure, I mean |
| 13:49 | hiredman | you can also just get the 1.0 compat branch of contrib |
| 13:50 | rahulkmr1 | I would rather be on the bleeding edge:-). Will check if the repo copy works with this contrib or else would downgrade contrib |
| 13:50 | jkkramer | Bjering: clojure.org redirects upon visiting. see `curl -i http://clojure.org` |
| 13:51 | Bjering_ | jkkramer: aha.. yes wirks nicely with google.com |
| 13:51 | Bjering_ | works |
| 13:52 | Bjering_ | thanks hiredman & jkkramer |
| 13:54 | michaeljaaka | I need some advice can it be improved? http://pastebin.com/d3e81dde0 |
| 13:54 | michaeljaaka | as you can see every time I create a map |
| 13:54 | michaeljaaka | is there any way to replace values under key inplace ? |
| 13:55 | michaeljaaka | the keys are :alive and :reported |
| 13:55 | michaeljaaka | maybe I should use struct ? |
| 13:58 | rahulkmr1 | So I got my vimclojure compiled. I had to "git clone" clojure to make it work with my copy of contrib. But the compilation completed fine. I have my vimclojure.jar now. Thanks |
| 13:59 | ohpauleez | nice to hear rahulkmr1, enjoy! |
| 14:00 | stuartsierra | Can we come up with a general notion of "lazy-safe" functions in Clojure? |
| 14:01 | stuartsierra | That is, functions that take a sequence as an argument and will not run out of memory on very large sequences. |
| 14:07 | chouser | stuartsierra: how would you classify 'reduce'? |
| 14:08 | chouser | (reduce + c) is safe, (reduce conj {} c) is not |
| 14:09 | hiredman | (reduce + c) might not be either |
| 14:09 | hiredman | for a big C |
| 14:09 | chouser | oh? |
| 14:09 | chouser | If it's ever safe to walk all of c, (reduce + c) is safe, isn't it? |
| 14:10 | hiredman | there is a limit to how large of a number that can be stored in the memory of a computer |
| 14:10 | chouser | oh |
| 14:10 | chouser | (reduce (constantly nil) c) |
| 14:10 | hiredman | :P |
| 14:11 | hiredman | (partial * 0) |
| 14:11 | chouser | but of course if c is being held elsewhere, or if c itself has elements that are dangerous to compute, then still dangerous. |
| 14:13 | hiredman | I think you end up with moscow rules with regards to laziness |
| 14:14 | hiredman | http://en.wikipedia.org/wiki/The_Moscow_Rules |
| 14:14 | chouser | already there |
| 14:14 | chouser | :-) |
| 14:14 | stuartsierra | hmph |
| 14:15 | stuartsierra | I was hoping we could codify some rules for what is "lazy-safe." |
| 14:15 | hiredman | "# Everyone is potentially under opposition control." |
| 14:15 | stuartsierra | "Technology will always let you down." |
| 14:15 | chouser | everything is lazy safe if seqs are never very large. |
| 14:16 | hiredman | stuartsierra: that might just be the halting problem all over again |
| 14:16 | hiredman | you can't tell if it is lazy safe without computing it |
| 14:16 | stuartsierra | hiredman: Ok, not totally generally, then. But rules of thumb. |
| 14:16 | tayssir | Hi! Can someone help with a weird headscratcher? I used to be able to MySQL db from Clojure/Emacs/Slime, but not today. It still works under both pure Java and commandline Clojure. And it's apparently not a classpath issue, since (Class/forName "com.mysql.jdbc.Driver") works... Voodoo suggestions welcome! ;) |
| 14:17 | stuartsierra | I don't want an algorithmic lazy-safe-check, I want guidelines to give to new users. |
| 14:17 | rhickey | stuartsierra: do you have an example of one that isn't? |
| 14:17 | stuartsierra | Sure: (defn count-them [seq] [(count seq)]) |
| 14:18 | rhickey | that's your function, not Clojure's |
| 14:18 | stuartsierra | Right, so I want guidelines for writing functions that are lazy-safe. |
| 14:18 | rhickey | the rules are simple, all seqs are live until the tail call of the function |
| 14:19 | chouser | stuartsierra: Guideline number 1: Vary your pattern and stay within your cover. |
| 14:19 | stuartsierra | ok, so could one say that any function that calls a built-in sequence function in tail position is safe? |
| 14:19 | rhickey | stuartsierra: should be |
| 14:21 | stuartsierra | And, following lpetit's suggestion, a lazy seq wrapped in a function is also safe: (defn count-them [seq-fn] [(count (seq-fn))]) |
| 14:21 | ohpauleez | chouser: haha |
| 14:21 | ohpauleez | re: vary your pattern... |
| 14:21 | chouser | :-) |
| 14:22 | rhickey | you can see the technique used in drop/drop-while also |
| 14:22 | stuartsierra | ok, that's helpful |
| 14:23 | stuartsierra | Can I generalize that? |
| 14:23 | chouser | the rules are as simple as when scheme will avoid stack consumption on a recursive call |
| 14:23 | chouser | can we have a 'recur' for lazy seqs? |
| 14:23 | stuartsierra | as in (defn count-them [a-seq] (let [f (fn [] s)] [(count (f))]) ? |
| 14:23 | michaeljaaka | hi! |
| 14:24 | michaeljaaka | I have function |
| 14:24 | stuartsierra | I mean (defn count-them [a-seq] (let [f (fn [] a-seq)] [(count (f))]) ? |
| 14:24 | michaeljaaka | (fn [] let[ x 3 ] (when (true) (set! x 5))) |
| 14:24 | michaeljaaka | how to change local value in codition? |
| 14:24 | chouser | michaeljaaka: locals are immutable |
| 14:25 | ohpauleez | and are bound to that scope |
| 14:25 | chouser | michaeljaaka: you can get close to that with loop and recur |
| 14:25 | stuartsierra | no, that last example doesn't work |
| 14:26 | rhickey | stuartsierra: didn't think so |
| 14:26 | michaeljaaka | hmmm, I will split func to two funcs and make an codition |
| 14:27 | stuartsierra | So once you accept a sequence as an argument, you must use a lazy-seq function in tail position or you're hosed? |
| 14:29 | rhickey | lazy != ephemeral |
| 14:32 | stuartsierra | yeah, yeah. :) |
| 14:32 | rhickey | that said, I understand it could be known that seq is not used after the call to count in: (defn count-them [seq] [(count seq)]) |
| 14:33 | rhickey | and the CLR knows that |
| 14:33 | stuartsierra | ok |
| 14:33 | stuartsierra | Is there a way I can tell the JVM that? |
| 14:33 | rhickey | but the JVM doesn't, and doing that manually would be a significant piece of work in the current compiler |
| 14:33 | rhickey | what I'm doing now (nulling locals on tail call) is a complete hack that shouldn't be needed |
| 14:34 | chouser | but would be a cinch with datalog |
| 14:34 | rhickey | doing liveness tracking a whole other thing |
| 14:34 | stuartsierra | rhickey: Got it. What I need is a workaround then. Wrapping the seq in a fn is one way, I guess. |
| 14:34 | rhickey | there isn't always a workaround |
| 14:34 | stuartsierra | hrm, ok |
| 14:35 | rhickey | one thing that might be possible, but extremely ugly and painful, would be some sort of (releasing seq) primitive |
| 14:35 | rhickey | slectively applied could solve any case |
| 14:36 | stuartsierra | Yeah, I wondered about that. (ephemeral! a-seq) |
| 14:36 | rhickey | it's really (I'm-done-with seq) |
| 14:36 | stuartsierra | (dispose seq) |
| 14:37 | rhickey | aargh |
| 14:37 | stuartsierra | :) |
| 14:37 | rhickey | because it doesn't really dispose, more like relinquish |
| 14:38 | ohpauleez | (release seq) |
| 14:38 | rhickey | no point in a naming exercise since I'm unlikely to add this wart-like thing and have it be in people's code |
| 14:39 | stuartsierra | heh |
| 14:39 | stuartsierra | wish I could help with that |
| 14:39 | ohpauleez | have you shopped it out yet, or asked around? |
| 14:40 | cburroughs | When would the 'wrap a seq in a fn' technique not work? |
| 14:40 | ohpauleez | I know the PyPy guys went on a speaking tour when their EU funding was running low |
| 14:40 | rhickey | It has to become important to enough companies that something like this: http://industry.haskell.org/index might fly |
| 14:41 | ohpauleez | I know for a fact of two companies in Philadelphia (one of them being Comcast) that are actively developing with clojure |
| 14:42 | ohpauleez | rhickey: If you want, I can roll through some of my contacts to see if I can get the groundwork for some sponsorship for you |
| 14:42 | fogus_ | Is the Haskell industrial community that much larger? |
| 14:43 | ohpauleez | fogus_: I wouldn't think so |
| 14:44 | fogus_ | Granted, Haskell has been around for 100 years |
| 14:44 | chouser | in "clojure years" |
| 14:44 | ohpauleez | haha |
| 14:45 | fogus_ | I dog year == ?? Clojure years |
| 14:45 | fogus_ | 1 that is |
| 14:45 | jweiss | i got $20 i can donate :) |
| 14:45 | rhickey | ohpauleez: thanks, I'd like to wait until I have a model to propose |
| 14:46 | ohpauleez | rhickey: totally, let me know. I'm more than happy to help via community support or outreach |
| 14:46 | michaeljaaka | hi can anyone tell what is wrong with that code? http://pastebin.com/d25bc28af |
| 14:46 | michaeljaaka | I get |
| 14:46 | michaeljaaka | #<CompilerException java.lang.IllegalArgumentException: if-let requires a vector for its binding (NO_SOURCE_FILE:457)> |
| 14:46 | michaeljaaka | that pseudo code (def n {123 #{"a" "b"}})(if-let [t (get n 123)] t nil) works fine |
| 14:47 | michaeljaaka | I think that I'm using it in the same way |
| 14:48 | ohpauleez | ,(let [[a b c] [1 2 3] b (str b)] (list a b c)) |
| 14:48 | clojurebot | (1 "2" 3) |
| 14:48 | ohpauleez | look at your let form |
| 14:49 | tomoj | is it just me or are you trying to call correct like correct(args...) |
| 14:49 | sh10151 | tayssir: did you get your MySQL issue sorted out? |
| 14:49 | michaeljaaka | doh |
| 14:50 | michaeljaaka | bad call for correct :) |
| 14:50 | michaeljaaka | lol |
| 14:50 | Kjellski | Guess you´ve got exactly 5 min to show clojure in a REPL, what would you show? |
| 14:50 | sh10151 | Kjellski: are you showing it to Java people, Lisp people, or scripting language people? |
| 14:51 | Kjellski | sh10151 : Java... |
| 14:52 | ohpauleez | michaeljaaka: did that fix it, the correct? |
| 14:52 | michaeljaaka | yes |
| 14:52 | tomoj | seqs and java interop? |
| 14:52 | jweiss | any vimclojure users know how to control indenting? I'm surrounding a form with another fn call, i want it to indent the entire block more. |
| 14:52 | michaeljaaka | thank you very much |
| 14:52 | sh10151 | Kjellski: the Apache Commons isEmpty() example from "Programming Clojure" might be a good start |
| 14:52 | Kjellski | sh10151 : And btw. The simple don´t fear the braces from stuarts book is in... |
| 14:52 | sh10151 | sorry, isBlank |
| 14:52 | Kjellski | sh10151 : ^^ you mean the indexOfAny? |
| 14:53 | michaeljaaka | this irc channel saves me a lot of time |
| 14:53 | jkkramer | manipulating parts of a running program is always fun to show off |
| 14:53 | sh10151 | no, StringUtils.isBlank from page 2 |
| 14:53 | Kjellski | jkkramer : like the almost "magically" Frame setSite? |
| 14:53 | stuartsierra_ | show a simple "map" example, then ask "how would you parallelize this across multiple cores," then add one letter to get "pmap" |
| 14:55 | sh10151 | are you showing it in a REPL or do you you use slime? when I did a presentation to Java people they seemed impressed with emacs + paredit + slime :-P |
| 14:55 | Kjellski | stuartsierra : Thats neat, ... definitively in... |
| 14:55 | sh10151 | not really something to point out specifically |
| 14:55 | jkkramer | Kjellski: could create/run a simple game, like tic-tac-toe. and manipulate rules or appearance during the game |
| 14:55 | jkkramer | i might be doing that for a presentation, using the game go |
| 14:56 | Kjellski | jkkramer : I would love to discribe what I´m doing while typing, and I guess it would be hard to tell them from scratch everything for a tic tac toe... |
| 14:56 | jkkramer | yeah, probably too complex to explain quickly |
| 14:57 | stuartsierra_ | rhickey used to do demos showing that a Swing GUI app is shorter in Clojure than in Java |
| 14:57 | sh10151 | Maybe you can concoct an example for (binding ...) ... every time I use it I think, "why the heck do people think they need a framework for this?" |
| 14:57 | Kjellski | stuartsierra_: damn, that is a really nice thing to ask... =) |
| 14:57 | tomoj | I think it could be good to show them how easily they can use the java stuff they've already got |
| 14:57 | tomoj | but 5min isn't a long time :( |
| 14:58 | sh10151 | since I'm pretty sure everything you can do with Spring container injection you can do with binding |
| 14:59 | Kjellski | tomoj: That´s true! Really not enough ... but I need to fix my time before breaking my own rules... ^^ |
| 15:00 | Kjellski | sh10151 : I´m not sure that everyone of them used these in lab... so I think one Java-interop thing is missing... maybe a small frame with setSize as you mentioned before? |
| 15:01 | sh10151 | seems straightforward to me but I think it was stuartsierra_ mentioning Swing :) |
| 15:02 | Kjellski | oh, sorry... but that gave me some nice hints, thank all. |
| 15:03 | tomoj | I'm wondering if I can convince my employers to let me use clojure since they have java stuff in place. probably unlikely since I'm the only one who knows clojure and I'm not gonna be there for a long time :( |
| 15:03 | lisppaste8 | Chouser pasted "failed attempt to make assertions about head-holding" at http://paste.lisp.org/display/90685 |
| 15:04 | chouser | http://www.ecentralmetrics.com/onlinedisplay/jobdisplay.cfm?posting=73790&bid=326 -- comcast job listing with clojure |
| 15:04 | sh10151 | tomoj: I've been able to use it pretty well as a prototyping/scripting/"one-time shot" language |
| 15:05 | chouser | rhickey: well this is meant as a diagnostic tool, not for deployed code. |
| 15:05 | rhickey | just kidding |
| 15:05 | chouser | but I appear to be doing it wrong anyhow |
| 15:06 | djork | chouser: wow, clojure in a job listing... that's a first for me |
| 15:06 | chouser | tomoj: I've gotten away with using Clojure so far because they're under the vague impression it'll be rewritten in C++ once the performance starts to be an issue. |
| 15:06 | stuartsierra_ | djork: there have been a few now; follow #clojure on Twitter |
| 15:06 | djork | neat |
| 15:07 | djork | heh http://craiglook.com/all.html?q=clojure |
| 15:07 | djork | 0 results |
| 15:07 | stuartsierra_ | cool jobs aren't on Craigslist :) |
| 15:07 | djork | probably not |
| 15:08 | tomoj | chouser: haha |
| 15:09 | stuartsierra_ | chouser: I did the pmap trick for a C++ guy and he said, "ooh, that's hot" |
| 15:09 | chouser | heh |
| 15:10 | tomoj | this job looks awesome http://is.gd/4YecE |
| 15:10 | djork | I can't convince my C# friend that Clojure is even worth a glance |
| 15:11 | ohpauleez | then he isn't your friend anymore |
| 15:11 | djork | hah. he always says "I can do that with LINQ!" |
| 15:11 | djork | but then I say "but can you add new syntax? from a REPL?" |
| 15:11 | ohpauleez | Yes Comcast uses clojure, as does Algorithmics |
| 15:12 | chouser | cgrand: is pipe the same as fill-queue only *so* much cleaner? |
| 15:12 | tomoj | C#==blub? |
| 15:13 | djork | C# is a much better blub than most though |
| 15:13 | Chousuke_ | chouser: when in fact, once performance becomes an issue, you'll just add type hints? :P |
| 15:14 | icey | djork, I'm a c# guy; the key is to have him read up on macros |
| 15:14 | djork | yeah, I might even call myself a C# guy too :) |
| 15:15 | tomoj | hard to see why macros are useful if you've never used them before |
| 15:15 | djork | yeah |
| 15:15 | icey | i'm trying to remember when / how I saw the light |
| 15:16 | djork | functional + REPL + macros + namespaces + multimethods + lazy seqs are the power features to me |
| 15:16 | icey | oh, multimethods might be another good angle of attack |
| 15:17 | icey | it will be tough to woo him away when F# lands / is supported officially |
| 15:18 | chouser | Chousuke_: :-) |
| 15:19 | djork | ok... is "chousuke" "chouser's uke" or what? |
| 15:19 | Chousuke_ | no :P |
| 15:19 | Bjering_ | You know, you all probably know this, but what a newcomber really want to hear is how something great can be done with Clojure that is just too hard/expensive todo with another tool. Like how hearing that CCP used stackless-Python for EVE Online put many performance-huggers at rest. |
| 15:19 | Bjering_ | ...as it is _the_ largest single-shard-mmo server. |
| 15:20 | djork | clojure would need some beefy hardware for a mmo server (because of thread overhead) |
| 15:20 | djork | assuming you used something like an agent per player |
| 15:20 | hiredman | erm |
| 15:20 | hiredman | agents are not tied to threads |
| 15:21 | djork | pools |
| 15:21 | Bjering_ | Well, ofc it doesnät have to be that. That was a kiler app for a light-weight-thread system like stackless-Python |
| 15:21 | djork | right? |
| 15:23 | hiredman | apparently paypal is too hard for me |
| 15:23 | djork | some days anything is too hard |
| 15:24 | hiredman | I think I haven't used my paypal account in a few years, and maybe they changed something out from under me |
| 15:24 | djork | today it's this offshore team's tangle of globals and inane constructs in some iPhone code |
| 15:38 | ambient | icey clojure on clr would be sweet |
| 15:38 | ambient | ...i mean as functional as it is on jvm |
| 15:41 | ordnungswidrig | hi |
| 15:42 | ohpauleez | hello |
| 15:46 | KirinDave | ambient: That way we could have a slower, worse performing clojure on a runtime that is less open and less populated and run by a capricious company with competing products. Sounds good to me. ;) |
| 15:46 | KirinDave | ambient: And I say that from the perspective of a Microsoft employee. Even internally we get frustrated at the strange ways of the C#+CLR development timeline. |
| 15:48 | djork | hah wow |
| 15:48 | Bjering_ | Ok, I am at page 141 in "programming clojure" and reading about the relational-algebra. I take it there are no lazy sets? |
| 15:48 | djork | yeah, I think the JDK is more well-defined than the CLR at this point, is that correct KirinDave |
| 15:49 | KirinDave | djork: I can't ascertain a technical definition from "well-defined". |
| 15:49 | KirinDave | djork: The main advantage of the CLR, in my estimation, is that you can write a search engine with C# but it's harder to do with Java. :D |
| 15:50 | djork | well-defined meaning how much effort it would take to implement a new and correct VM |
| 15:50 | djork | not effort |
| 15:50 | djork | but hassle |
| 15:50 | Chousuke | Bjering_: I'm not sure how you would implement a lazy set. |
| 15:50 | djork | in terms of getting it to be compatible |
| 15:51 | KirinDave | Wasn't the old clojure a compiler to java and C#? |
| 15:52 | stuartsierra_ | KirinDave: yes, it was never released |
| 15:58 | hiredman | Chousuke: rule sets! |
| 15:58 | mrSpec | Hello |
| 15:58 | Bjering_ | Chousuke: in a way any predicate is a lazy set I guess... but perhaps there is little value to be able to use the join syntax on those as there are other functions that does that. |
| 15:58 | hiredman | ^- |
| 15:59 | KirinDave2 | Does anyone here use emacs with swank-clojure? |
| 16:00 | jasapp | are there many people who don't? |
| 16:00 | KirinDave2 | I'm having trouble getting swank-clojure-project to work. |
| 16:01 | KirinDave2 | I try to root to my project root and it waits forever. |
| 16:01 | KirinDave2 | I suspect from looking at what process is started that it's not adding the swank-clojure-1.0.jar |
| 16:01 | KirinDave2 | Obviously I can put that in lib |
| 16:01 | KirinDave2 | but it seems like this must be a bug. |
| 16:01 | KirinDave2 | Any advice? |
| 16:02 | jkkramer | KirinDave2: is it printing a newline after you press RET when giving the project root path? |
| 16:03 | technomancy | KirinDave2: it's a change in behaviour; if you use swank-clojure you should treat it like a dependency, even if it's only a dev-time dependency. |
| 16:03 | KirinDave2 | technomancy: So I should link it into lib? |
| 16:03 | technomancy | previous versions would automatically add it to the classpath, but they assumed that you had a git checkout of the swank-clojure project, which you can no longer assume |
| 16:04 | technomancy | yeah |
| 16:05 | KirinDave2 | Well that fixed it. :) |
| 16:05 | ohpauleez | does anyone know if -?> is getting moved into core? |
| 16:05 | KirinDave2 | technomancy: If you want to teach me I'll write up an epic dev howto. |
| 16:05 | KirinDave2 | technomancy: I've gotta break into the community somehow, in any case. ;) |
| 16:05 | shonen | ah it is time for me to start on my road with clojure so that opauleez and i can battle to the tic tac toe death |
| 16:06 | KirinDave2 | I've got a SimpleDateFormat that I want to use ONE of to parse dates in my library |
| 16:07 | KirinDave2 | Is it better style to use a def, or better style to (let [formatter (…)] (defn …)) |
| 16:09 | Kjellski | Is every datastructure in clojure build from the bit mapped hash trees? In order to get the nice branching factor? |
| 16:09 | hiredman | lists are just linked lists, I believe |
| 16:09 | rhickey | Kjellski: other than seqs, trees with high branching factors |
| 16:10 | rhickey | maps/sets are tries, vectors just trees |
| 16:10 | hiredman | didn't someone reimplement maps using something else? |
| 16:10 | chouser | sorted-maps are red black trees, right? |
| 16:10 | rhickey | right and sorteds are RB |
| 16:11 | technomancy | KirinDave2: I see def used more often than defn inside a let. you might also like defonce. |
| 16:11 | Kjellski | Thanks! |
| 16:12 | Kjellski | If I "alter" one thing in a list, this would cost linear time? Or how is the old version kept? |
| 16:13 | chouser | ooh, you don't know? get ready to experience magic... |
| 16:13 | ohpauleez | haha |
| 16:14 | Kjellski | chouser : C´mon, I am ready. |
| 16:15 | ohpauleez | Kjellski: this was in the IRC yesterday, I'm looking through the logs to find it for you |
| 16:15 | chouser | it's "essentially constant" time to change one item. log32 |
| 16:15 | Kjellski | ohpauleez : Thanks a lot... |
| 16:15 | chouser | no locks, no mutation |
| 16:15 | hiredman | chouser: he asked about lists |
| 16:16 | chouser | oh |
| 16:16 | chouser | oh |
| 16:16 | chouser | :-( |
| 16:16 | Kjellski | chouser : =P |
| 16:16 | ohpauleez | yeah, if you're doing random access or lookup, you should use vectors |
| 16:16 | KirinDave2 | Yeah, use vectors. |
| 16:16 | ohpauleez | unless you have to use a list |
| 16:16 | chouser | you can't alter lists except as you would a normal linked list. |
| 16:16 | KirinDave2 | But evidently (count list) is O(1) |
| 16:17 | KirinDave2 | As is (count my-vec) |
| 16:17 | KirinDave2 | So there is that at least. :) |
| 16:17 | chouser | yeah, an immutable linked list that knows its size. |
| 16:17 | chouser | :-) |
| 16:17 | chouser | adding/removing from the head is constant time. which is neat, of corse, but hardly magical. |
| 16:18 | ohpauleez | Kjellski: check out: http://java.ociweb.com/mark/clojure/article.html#Collections |
| 16:21 | Kjellski | ohpauleez: Thanks... |
| 16:21 | ohpauleez | Kjellski: np, totally welcome |
| 16:29 | kzar | So I've been watching some Clojure videos and I'm pretty convinced but I had one question before I spend too much time learning it. I would want to run web apps on a VM with 256meg of ram, is that possible? (I found Hunchentoot used around 50megs with SBCL and Python used maybe 10megs with web.py, I was wondering what to expect with Clojure) |
| 16:30 | ohpauleez | I don't know footprints, but you there is a lightweight web.py like project |
| 16:31 | ohpauleez | as well as more complete web framework project, like pylons or rails |
| 16:31 | kzar | ohpauleez: What's the lightweight one called? |
| 16:32 | Kjellski | Is there any other difference than spelling between "trees" and "tries"? |
| 16:33 | ohpauleez | There is Compojure (which looks awesome, but I haven't built anything with it) and webjure |
| 16:34 | kzar | ohpauleez: OK thanks |
| 16:34 | ohpauleez | kzar: I have one more link for you... |
| 16:34 | ohpauleez | here is a blog, written in compojure: http://github.com/briancarper/cow-blog/tree/master/blog/ |
| 16:36 | Kjellski | Is there any other difference than spelling between "trees" and "tries"? |
| 16:37 | ohpauleez | a trie is a prefix tree |
| 16:37 | ohpauleez | http://en.wikipedia.org/wiki/Trie |
| 16:39 | shonen | yessir a trie be prefix |
| 16:41 | arj | hi |
| 16:41 | arj | how exactly does one import a static class into clojure? |
| 16:42 | arj | a normal import seems to fail with class not found? |
| 16:44 | hiredman | well, then you must be doing it wrong |
| 16:44 | hiredman | so unless you show use what you are doing, it will be difficult to tell you what exactly you are doing wrong |
| 16:44 | arj | I'm trying to import JNotify |
| 16:44 | arj | that class is static |
| 16:45 | arohner | arj: is the class on your classpath? |
| 16:45 | arj | (import net.contentobjects.jnotify JNotify) |
| 16:45 | arj | fails |
| 16:45 | arj | but |
| 16:45 | arj | (import net.contentobjects.jnotify JNotifyListener) |
| 16:45 | arj | works fine |
| 16:45 | hiredman | (import '(net.contentobjects.jnotify JNotify)) |
| 16:45 | arj | ah yeah sorry, that is what I was doing |
| 16:45 | arj | tried import-static from clojure-contrib, hence th change |
| 16:46 | arj | Could not initialize class net.contentobjects.jnotify.JNotify [Thrown class java.lang.NoClassDefFoundError] |
| 16:46 | arj | the class contains only static stuff |
| 16:47 | hiredman | do you have the java docs for JNotify? |
| 16:47 | arj | no but I have the source |
| 16:48 | hiredman | :( |
| 16:48 | arj | http://jnotify.sourceforge.net/ |
| 16:48 | arj | there is some java examples |
| 16:48 | arj | *are |
| 16:49 | hiredman | it's possible the native part of jnotify is missing |
| 16:49 | chouser | arj: do you need the windows support? |
| 16:49 | arj | not really |
| 16:49 | arj | but I'd like to use Jnotify and not the Linux one, since I would like the dir recursion stuff |
| 16:49 | chouser | oh, ok. |
| 16:50 | arj | I did a add-classpath with the dir I have the .so file in |
| 16:50 | arj | maybe I need to do something else hiredman ? |
| 16:50 | hiredman | … |
| 16:50 | chouser | classpath doesn't help find .so files |
| 16:50 | hiredman | ~add-classpath |
| 16:50 | clojurebot | add-classpath is bad, avoid it. I mean it! |
| 16:50 | kzar | Is there a good page to read for people just starting with Clojure but with Lisp 'n Python experience? I want to give it a shot |
| 16:50 | arj | hmm |
| 16:51 | technomancy | ~peepcode |
| 16:51 | clojurebot | peepcode is a commercial screencast series; see the Clojure one at http://peepcode.com/products/functional-programming-with-clojure by technomancy |
| 16:51 | KirinDave2 | I liked the peepcode. |
| 16:51 | KirinDave2 | The project was cool |
| 16:51 | arj | how do I make my repl find the .so file? |
| 16:51 | KirinDave2 | technomancy: Although how you'd implement taking between users seemed tough to me. :) |
| 16:51 | hiredman | ~blip.tv |
| 16:51 | clojurebot | blip.tv is http://clojure.blip.tv/ |
| 16:52 | technomancy | KirinDave2: I had that in a branch of mire, but I didn't have time to work it into the video. |
| 16:52 | KirinDave2 | technomancy: Did you have to make an agent per user? |
| 16:53 | technomancy | no, I stored a map of usernames to outputstreams rather than just a set of users |
| 16:53 | technomancy | it didn't work smoothly with the prompt though. |
| 16:53 | KirinDave2 | Yeah |
| 17:07 | arj | gagh system/load also doesn't seem to work |
| 17:12 | jasapp | is anyone familiar with discrete event simulation? |
| 17:14 | jasapp | I need to do some simulation, preferably with clojure, and I'm a bit unsure of the proper clojure approach |
| 17:24 | twbray | Am closing in on my (presumed, for the moment) memory leak... calling NIO to map regions of a file and stringify them. Never did like NIO much. |
| 17:26 | hiredman | huh |
| 17:34 | ohpauleez | jasapp: I have made a DES before |
| 17:34 | ohpauleez | in a lot of languages |
| 17:34 | ohpauleez | what's up? |
| 17:34 | jasapp | interesting |
| 17:35 | jasapp | what do you think the best approach in clojure would be? |
| 17:35 | jasapp | I'm having a hard time not thinking of explicit locking |
| 17:36 | ohpauleez | if it's single threaded, no need to lock. You can use a vector of vectors to represent a tree of events |
| 17:36 | jasapp | I was thinking of using multiple threads, but I don't know why |
| 17:37 | ohpauleez | then you push new events onto the tree and reorder it, and see if there is something to do |
| 17:37 | ohpauleez | that's typically how I do these things |
| 17:37 | jasapp | and a single threaded model doesn't suffer from any performance issues? |
| 17:38 | ohpauleez | is this for a college homework assignment or something mission critical |
| 17:38 | jasapp | heh |
| 17:38 | jasapp | well, no one will die if it breaks, but it's work related |
| 17:40 | jasapp | performance would be nice since I was considering using a genetic algorithm to find good parameters |
| 17:40 | ohpauleez | Sure, if you're just looking to use clojure a tree made up of a vector of vectors should do it |
| 17:41 | ohpauleez | and if you do things in a nice functional way, you should have no trouble |
| 17:41 | jasapp | excellent, thanks for the help |
| 17:42 | ohpauleez | totally, I'm trying to dig you up an example before I put up my own |
| 17:42 | jasapp | cool, ok |
| 17:42 | jasapp | the single threaded approach doesn't sound bad at all |
| 17:42 | shonen | your brain will thank you as well :-P |
| 17:43 | ohpauleez | nope, it's real easy, especially when you use a functional approach, it'll be a breeze |
| 17:43 | shonen | how many times have we all gone, "why is this variable changing!?! i hate you threading!!" |
| 17:45 | hiredman | shonen: er |
| 17:45 | hiredman | variable? |
| 17:46 | hiredman | surely you have mistaken #clojure for #imperative |
| 17:46 | shonen | haha oh yes yes quite i apologize |
| 17:46 | ohpauleez | jasapp: specifically you want to use a heap: http://bit.ly/37wiF7 |
| 17:46 | ohpauleez | the first result has a PDF |
| 17:47 | ohpauleez | that walks through it |
| 17:47 | jasapp | thanks, I'll check it out |
| 17:47 | KirinDave | Heap sorting by event timestamp? |
| 17:48 | ohpauleez | more or less |
| 17:48 | kzar | Dumb question, I'm following that peepcode video and I was curious how to stop the server from the repl? |
| 17:50 | defn | 'lo |
| 17:51 | ohpauleez | jasapp: one really dirty and quick way would be to use a sorted map where the keys were timestamps, and the values were the events |
| 17:52 | ohpauleez | ok, that's all I got, but the way to do it is with a heap. :) |
| 17:54 | jasapp | yeah, I was thinking I might just hack out a quick one with a sorted map |
| 18:10 | KirinDave | So I have like 0 expereince with clojure and I started writing a quick twitter library |
| 18:10 | KirinDave | For a project I'd like to do |
| 18:11 | ohpauleez | awesome, how's it going? |
| 18:11 | KirinDave | https://gist.github.com/e696d410b168ba507046 |
| 18:11 | KirinDave | I feel like I am doing something wrong with prep-timeline-entry |
| 18:11 | KirinDave | And yes, i am aware that map is lazy, it's fine. |
| 18:12 | twbray | Um.... is "str" lazy? I kinda suspect it might be based on observed behavior. |
| 18:12 | KirinDave | twbray: There is an easy way to find out. :) |
| 18:13 | twbray | KirinDave: What would that be? |
| 18:14 | KirinDave | twbray: Write a (str) that has side effects |
| 18:14 | KirinDave | And capture that in a variable. |
| 18:14 | twbray | KirinDave: What a perfectly horrible perverted thing to think about. |
| 18:14 | twbray | Thanks, I'll try that. |
| 18:14 | ohpauleez | haha |
| 18:14 | KirinDave | (cliffnotes version: str is eager) |
| 18:15 | hiredman | str is definitely not lazy |
| 18:15 | KirinDave | ohpauleez: Is there anything I am doing obviously wrong? |
| 18:15 | twbray | because I'm keying a an array with (str foo bar) where bar is produced by (. substring ... ) out of a 50M Java string and it sorta looks like the string isn't being garbage collected |
| 18:15 | twbray | er a map I mean |
| 18:16 | ohpauleez | KirinDave: I think I might have spotted it, but I'm going to hit the REPL to try some things out |
| 18:16 | twbray | Anyhow, back to the coal-face... I'm closing in on the culprit one way or another |
| 18:16 | hiredman | twbray: string literals in clojure are .intern'ed, I believe |
| 18:16 | KirinDave | Woah |
| 18:16 | twbray | hiredman: Yes, they are. None of these are literals. |
| 18:18 | hiredman | twbray: have you seen http://bugs.sun.com/bugdatabase/view_bug.do;jsessionid=99227e05664f737f96932f3ec3c0?bug_id=4513622 |
| 18:19 | KirinDave | Huh |
| 18:19 | KirinDave | That there is a nasty bug. |
| 18:19 | twbray | hiredman: Yeah, I knew that, but I'm taking the substring and making a bigger string with (str ... ); now if str were lazy, I'd have an explanation. But anyhow, I'll know what's going on by end-of-day |
| 18:20 | ohpauleez | KirinDave: I'm new to Clojure, this is new to me: [{user :user, created-at :created_at :as entry}] |
| 18:20 | ohpauleez | if that is indeed a hash map |
| 18:20 | KirinDave | ohpauleez: That's a destructing bind on a map. |
| 18:20 | ohpauleez | shouldn't it be :key value, etc |
| 18:21 | ohpauleez | given the :as in the arg list I figured it was destructuring, but that's the correct form? |
| 18:21 | KirinDave | ohpauleez: Clojure doesn't seem to feel that way: http://idisk.me.com/dfayram/Public/Pictures/Skitch/Terminal_%E2%80%94_java_%E2%80%94_Homebrew_%E2%80%94_ttys002_%E2%80%94_80%C3%9724-20091118-152059.png |
| 18:22 | KirinDave | dysinger: Fancy meeting you here. |
| 18:22 | dysinger | I'm usually always here :) |
| 18:22 | ohpauleez | ah, awesome |
| 18:22 | dysinger | blending the erlang and clojure into a good golash ! |
| 18:22 | ohpauleez | hmm, let me look some more |
| 18:22 | KirinDave | dysinger: My next project is a better jinterface binding for clojure. |
| 18:23 | dysinger | sweet KirinDave we should team up - I did that over the weekend ! |
| 18:23 | the-kenny | Is there a way to do a (binding) with dynamic scopt which gets inherited to threads started by inside this binding? |
| 18:23 | dysinger | KirinDave: not to say I have anything finished but played with it. |
| 18:23 | KirinDave | dysinger: Is it on github? |
| 18:23 | dysinger | no not yet |
| 18:24 | hiredman | the-kenny: there is a new construct, bound-fn, which will capture dynamic bindings |
| 18:24 | KirinDave | dysinger: It seems like a multi-method could make it very easy to auto-convert clojure primitives to the Erlang primitives. |
| 18:24 | dysinger | KirinDave there is some public domain clojure code on the clojure list @ goog groups |
| 18:24 | the-kenny | hiredman: Is this in the "new" branch? |
| 18:24 | dysinger | KirinDave: exactly |
| 18:24 | ohpauleez | KirinDave: what is happening when you run it. That looks fine to me |
| 18:24 | KirinDave | dysinger: And a language with vectors, lists, maps, and symbols makes it way easier. |
| 18:24 | KirinDave | ohpauleez: Oh it's not broken |
| 18:24 | the-kenny | hiredman: And... is it stable enough? |
| 18:24 | dysinger | that's what the google groups code looks like KirinDave |
| 18:24 | hiredman | tehseel no idea |
| 18:24 | hiredman | er |
| 18:25 | hiredman | the-kenny: no idea |
| 18:25 | ohpauleez | ohh, that looks fine to me |
| 18:25 | KirinDave | ohpauleez: I was hoping for style tips, particularly with the prep-timeline-entry |
| 18:25 | hiredman | I've never bothered with it, since I understand the difference between dynamic and lexical scope, and avoid dynamic scope |
| 18:26 | the-kenny | hm... it's in "fbacc4a" |
| 18:26 | KirinDave | hiredman: It makes sense for things like io streams. It was just overused in the past. :) |
| 18:26 | dysinger | KirinDave: http://clojure.googlegroups.com/web/erlang+(2).clj?gda=nPnuyEQAAAB9TgGpbzbMg0BCq3i8IqXnF8SIL0JIfoYuHsuFZ6eabNDNU7UYDrd2uE4tSk0x5Y5V6u9SiETdg0Q2ffAyHU-dzc4BZkLnSFWX59nr5BxGqA |
| 18:26 | KirinDave | hiredman: Fear it not |
| 18:26 | hiredman | KirinDave: I don't fear it |
| 18:26 | hiredman | I just have no need of it |
| 18:26 | hiredman | and it annoys me that everone *must* write their database api to use it |
| 18:27 | KirinDave | So for something like clojure.contrib.json.read, what do you recommend is a better solution? |
| 18:28 | the-kenny | hiredman: That's exactly my problem :) I have a setup with some thread pools and one or two agents... and I'm using clojure-couchdb, which uses a binding named *server*. |
| 18:28 | hiredman | grrr |
| 18:28 | the-kenny | I hacked a macro together, but it really bloats the code.. |
| 18:28 | hiredman | the-kenny: wrap the api with functions that take a server argument |
| 18:29 | hiredman | or write an email to the author complaining |
| 18:29 | KirinDave | Well what's the correct solution? |
| 18:29 | dysinger | KirinDave: the thing I am working on is clojure + interface (client) | erlang + ports + clojure + jinterface (server) |
| 18:29 | dysinger | s/interface/jinterface |
| 18:29 | dysinger | (on the side for fun) |
| 18:29 | KirinDave | dysinger: You know exactly why I'd like to get java talking over a local erlang port. ;) |
| 18:29 | dysinger | :) |
| 18:30 | KirinDave | I can't show you the code yet, but the next big katamari thing is nodes that can handle multiple connections at once. |
| 18:30 | dysinger | sweet |
| 18:30 | KirinDave | And removing the insistence on port-based nodes. |
| 18:30 | dysinger | cool |
| 18:30 | KirinDave | Well, that'll make katamari able to work very well with hadoop. |
| 18:31 | KirinDave | Which I think will be a big part of the future of katamari... |
| 18:31 | the-kenny | hiredman: hm.. sounds a bit annoying. There is also a problem with the http-library clojure-couchdb uses.. I have to send an authentication-header to properly identify to the database server, and clojure-couchdb provides no api to access the underlying http-calls... I hacked together a solution to modify the standard-headers field of the http-client :D |
| 18:31 | hiredman | http://github.com/hiredman/clojurebot/blob/master/hiredman/triples.clj <-- all the functions take a db parameter |
| 18:31 | dysinger | I like the idea - better than hadoop's IO based mappers |
| 18:32 | jasapp | hiredman: did you ever use clsql for common lisp? |
| 18:32 | KirinDave | hiredman: Man that is one HELL of a defmethod criterion. |
| 18:33 | hiredman | jasapp: nope |
| 18:34 | hiredman | the-kenny: http://stackoverflow.com/questions/480153/how-to-modify-the-header-of-a-httpurlconnection |
| 18:34 | hiredman | KirinDave: :) |
| 18:34 | hiredman | I'm sure I could have just written out a table and reduced it to a few cases |
| 18:34 | hiredman | but I just can't be bothered |
| 18:35 | the-kenny | hiredman: I know how to do this, but I don't have any access to the instance of HttpUrlConnection clojure-couchdb uses :( |
| 18:35 | hiredman | :| |
| 18:36 | hiredman | sounds like you need to reach out to the author |
| 18:36 | hiredman | danlarkin? |
| 18:36 | the-kenny | Yes |
| 18:36 | the-kenny | He said some time ago that he's really busy |
| 18:37 | the-kenny | But I have a fork of it in my local repository. |
| 18:38 | the-kenny | I think I'll just merge the http-url to the server with the db-parameter... |
| 18:38 | the-kenny | The first time I tried to use the library, I tried exactly that because there was no documentation |
| 18:38 | dysinger | I have rubbed the genie lamp |
| 18:39 | dysinger | danlarkin will be here in a sec :) |
| 18:39 | the-kenny | Wow, where did you get that lamp? :) |
| 18:39 | hiredman | almost like /summon still worked |
| 18:40 | dysinger | (we work together) |
| 18:40 | danlarkin | the-kenny: yeah I saw you have patches for me |
| 18:41 | danlarkin | I just haven't gotten around to reviewing or applying them :( |
| 18:42 | the-kenny | danlarkin: No problem :) I didn't want to rush you |
| 18:44 | danlarkin | the-kenny: maybe I'll give you commit access to my repo and "solve" the problem that way :) |
| 18:44 | danlarkin | I'm not dealing with couchdb too much at the moment |
| 18:45 | the-kenny | danlarkin: Oh, I'm happy with my fork. I don't want to mess things up in your repository |
| 18:53 | the-kenny | Ah, I think I've found a clean way to deal with the authentication problem |
| 18:57 | qed | every time i think i understand loop/recur i just sit there and scratch my head -- im trying to take a vector [1 2 3 4 5], and conj the product of [1 2 3], [2 3 4], [3 4 5] onto a vector |
| 18:58 | qed | errr (* 1 2 3), (* 2 3 4), etc. |
| 18:59 | the-kenny | Awesome :) java.net.Authenticator is just perfect |
| 19:01 | jweiss | anyone here use vimclojure? i'm trying to figure out why when i run this in its repl, (do (println "hi") (Thread/sleep 2000) (println "there")) - that nothing is printed until after the sleep, then it prints everything. |
| 19:01 | qed | jweiss: let me apologize in advance for saying this, but: learn emacs |
| 19:02 | qed | repls in vim == ugly hacks |
| 19:03 | jweiss | qed: i'm not going to learn emacs just to use clojure |
| 19:03 | defmacro | jweiss: amen |
| 19:04 | the-kenny | jweiss: But emacs is the nonplusultra for lisp-editing |
| 19:04 | the-kenny | I learned it just for CommonLisp and I'll never go back |
| 19:04 | qed | i learned emacs to use clojure |
| 19:05 | qed | it took about 1 week of pain, but now id never go back |
| 19:05 | qed | </editor wars> |
| 19:05 | jweiss | meh |
| 19:05 | the-kenny | qed: I felt no pain. I had a feeling of freedom after one or two years with vim |
| 19:06 | qed | i use vim still for really quick and dirty stuff if i dont have an emacs open already |
| 19:06 | defmacro | emacs is all pain to me, <8 vim, but that's just me |
| 19:06 | fanatico | there is always viper-mode. |
| 19:06 | qed | defmacro: the big thing for me was getting emacs configured to fit my tastes |
| 19:06 | qed | if you dont like emacs, you can change every damn thing you dont like |
| 19:07 | fanatico | emulates the vi key bindings in emacs. |
| 19:07 | qed | evaluating elisp inside your buffer is pretty sweet |
| 19:07 | defmacro | qed: very very true, and I never got it configured to suit me. but i really love the modal editing theme in vim, the emacs commands didn't make sense to me |
| 19:08 | qed | defmacro: yeah they're really weird at first, but its been about a month since i started with emacs, and im flying around now |
| 19:08 | qed | it's a little pain, big gain, IMO |
| 19:08 | defmacro | qed: emacs also have me more hand pain than vim, which is a serious thing fo rme |
| 19:08 | the-kenny | Emacs isn't complicated.. it's much easier to understand the first time than vim, in my opinion |
| 19:08 | qed | and this brings us to our next discussion: keybindings and keyboard choice |
| 19:09 | defmacro | qed: kinesis contour, with customized mappings for keys to load balance across my hands and good fingers left |
| 19:09 | qed | map ctrl to caps lock |
| 19:09 | qed | defmacro: booya, nice |
| 19:09 | qed | i love the kinesis advantage pro |
| 19:09 | qed | but ive been using my happy hacking keyboard almost exclusively at work |
| 19:10 | qed | not as good for my hands, but very functional still |
| 19:10 | defmacro | yeah, i got three of the kinesis, for every workstation. i cannot type on anything else, making my macbook useless |
| 19:10 | qed | the keyswitches on the HHK make it friggen butter |
| 19:10 | qed | Topre capacitive switches |
| 19:12 | jweiss | i suppose it's not wasted |
| 19:12 | jweiss | none of the systems i use at work have emacs by default |
| 19:12 | jweiss | but they all have vi/vim |
| 19:13 | the-kenny | jweiss: It's possible to use vim *and* emacs. |
| 19:13 | defmacro | working on using vim's ruby support to extend the editor, heh |
| 19:13 | jweiss | the-kenny: yeah, but having to learn more than one arcane editor kinda sucks. why can't one of them be enough |
| 19:15 | defmacro | jweiss: do you want/need to use slime? cause vim doesn't have anything close to that awesomeness, that's why one can't be enough |
| 19:15 | qed | ^^ |
| 19:15 | the-kenny | Yes, slime and org-mode are the most awesome pieces of software for emacs. |
| 19:16 | jweiss | defmacro: what specifically about vim makes it worse? just that no one wrote something like slime for it? |
| 19:16 | defn | can you hang out in #clojure while you're coding clojure in another buffer and using slime/swank-clojure repl in another buffer inside your editor? |
| 19:16 | jweiss | seems like of arbitrary |
| 19:16 | defn | jweiss: no it's the base construction of emacs |
| 19:17 | defn | thats why you can code something like slime for it |
| 19:17 | defn | vim "REPL"s are hacks |
| 19:17 | defmacro | jweiss: have someone show you slime in person, it blew me away. not enough to make me switch to emacs, tho ;p |
| 19:17 | jweiss | well, back in college i hated emacs, but then again, back then i found java confusing. |
| 19:17 | jweiss | so maybe it's worth another look |
| 19:17 | the-kenny | vim can't execute other processes on a clean way.. I think that's the biggest problem |
| 19:18 | defmacro | also, vimscript is not compariable to elisp for extending the editor |
| 19:19 | defn | jweiss: i know im evangelizing a bit here, BUT-- I tried to learn emacs like 4 times, always losing my will power and heading back to vim. This last time I said enough is enough, aliased vim, vi, etc. to emacs -nw, and struggled like crazy to do some of the most basic stuff imaginable for the first two weeks |
| 19:20 | defn | but in the end, you will be a more efficient programmer if you take the time to get to know emacs, and that's probably going to sound like im trolling or something, but honestly, i firmly believe it to be the truth |
| 19:20 | defn | the best software devs ive met in my life seemed to all have one thing in common: emacs |
| 19:20 | jweiss | ok, ok, it's not like vim is a shining example of clarity either, so my only reason not to go to emacs is inertia |
| 19:21 | defmacro | i should hire an emacs expert for a day to customize my setup, i just can't get started enough |
| 19:21 | fanatico | jweiss: once again, I gotta recommend viper-mode. Makes the transition much easier. |
| 19:21 | technomancy | defmacro: *cough*peepcode*cough* |
| 19:21 | defn | defmacro: the whole setup process involves a lot of pain |
| 19:21 | technomancy | </shameless-promo> |
| 19:21 | defn | technomancy's screencast on peepcode is good |
| 19:22 | defmacro | technomancy: i bought that, but i want ultra aweosme customization and i want it in a day ;p |
| 19:22 | defn | defmacro: i know where you're coming from exactly |
| 19:22 | duncanm | twbray: congrats congrats! |
| 19:22 | defmacro | once i get it the way i like, oh, i'll be 100% into emacs, but until then, i can barely stand 20 mins figuruing this and that |
| 19:22 | technomancy | defmacro: ah, that will have to wait until my career-change to a traveling lisp mendicant then. |
| 19:22 | defn | my advice is this: open up technomancy's elpa-to-submit in his starter-kit, and pick the .el files you want in your setup, install elpa, make your own init.el, and slowly start cobbling your setup together |
| 19:23 | jweiss | i'm not going to customize anything. i hate that i can't do anything on any machine but my own. i always use basically stock setup |
| 19:23 | defn | IMO you absolutely cannot just use a starter kit out of the box and be happy |
| 19:23 | defn | you're better off starting from scratch and adding stuff as needed |
| 19:23 | defmacro | defn: tried that, i'm just too dumb. i'll keep trying tho, seriously i think a day with an emacs guy clarifying my misconcpetions about emacs setup is the way to go |
| 19:24 | technomancy | defmacro: nothing compares to looking over the shoulder of someone who's immersed in it. |
| 19:24 | defmacro | defn: yeah, i agree |
| 19:24 | technomancy | defmacro: are you the guy behind defmacro.org? |
| 19:24 | defmacro | technomancy: all textmate and vimmers at work, hehehe |
| 19:24 | defmacro | technomancy: no, new nick |
| 19:25 | arj | I have a problem with the slime repl. I'm registering callback handlers in jnotify but I don't get any messages it seems when in slime, but if I start up a repl outside of emacs it works. Any ideas? |
| 19:25 | defmacro | actually, i've stopped playing with clojure cause coding with vim seems less than natural, tho for ruby it's fine |
| 19:26 | Chousuke | jweiss: you could have your config on github or something and then just clone it onto machines (or download a tarball) |
| 19:27 | technomancy | dotfiles on github is a must, no matter what your editor is |
| 19:27 | jweiss | hm that's a good idea |
| 19:29 | kzar | so loop in clojure seems to be completely different to loop in CL, is there something like common lisp's loop? |
| 19:29 | the-kenny | kzar: Loop is propably the ugliest and the most awesome thing at once - But I don't like it :) |
| 19:30 | the-kenny | Oh and no, there isn't something like cl's loop in clojure. |
| 19:30 | Chousuke | I think I saw at least a partial implementation of cl loop somewhere. :/ |
| 19:30 | kzar | the-kenny: So supposing you need to loop over a list, grabbing the first 3 items each time what would be the clojure way to do that/ |
| 19:31 | Chousuke | (map f (partition 3 list))? |
| 19:31 | the-kenny | kzar: (map fn (partition 3 list) or so |
| 19:31 | Chousuke | explicit loops are not idiomatic. |
| 19:31 | defn | oh boy |
| 19:31 | defn | im having a hard time understanding loop/recur too |
| 19:31 | defn | it still is making no sense to me :\ |
| 19:32 | the-kenny | defn: Try not to use it :) |
| 19:32 | defn | im working on it the-kenny ! :) |
| 19:32 | Chousuke | defn: it's kind of like a recursive function |
| 19:32 | defn | right now i have this vector [1 2 3 4 5], and i want to conj (* 1 2 3), (* 2 3 4), etc. onto a list |
| 19:33 | Chousuke | only: there is no function object and primitives are supported. |
| 19:33 | defn | i put the conj part into my (recur ()), and inc my counter, but then i have 2 args where it expects 1 |
| 19:33 | defn | it's unnerving |
| 19:33 | Chousuke | (map (partial apply *) (partition 3 1 [1 2 3 4 5])) |
| 19:33 | Chousuke | hmm |
| 19:33 | Chousuke | ,(map (partial apply *) (partition 3 1 [1 2 3 4 5])) |
| 19:33 | clojurebot | (6 24 60) |
| 19:34 | defn | close |
| 19:34 | kzar | the-kenny / Chousuke: With the example list of [1 2 3 4 5 6] I need to run fn on [1 2 3], [2 3 4], [3 4 5], [4 5 6]. I think that example would run it on [1 2 3] [4 5 6] |
| 19:34 | defn | kzar: #11 in projecteuler, eh? |
| 19:34 | kzar | defn: What's projecteuler? |
| 19:34 | Chousuke | kzar: partition supports a step. |
| 19:34 | Chousuke | ,(map (partial apply *) (partition 3 1 [1 2 3 4 5 6])) |
| 19:34 | clojurebot | (6 24 60 120) |
| 19:35 | defn | oh, nvm, i have the exact same question kzar -- which is weird |
| 19:35 | the-kenny | ,(partition 3 1 [1 2 3 4 5 6]) |
| 19:35 | clojurebot | ((1 2 3) (2 3 4) (3 4 5) (4 5 6)) |
| 19:35 | kzar | Cool thanks |
| 19:37 | defn | whoa dude, that's awesome |
| 19:47 | defn | i was going about solving that problem the complete wrong way |
| 19:50 | defn | ,(partition 1 [1 2 3] [1 2 3] [1 2 3]) |
| 19:50 | clojurebot | java.lang.RuntimeException: java.lang.ClassCastException: clojure.lang.PersistentVector cannot be cast to java.lang.Number |
| 19:50 | defn | ,(partition 1 [[1 2 3] [1 2 3] [1 2 3]]) |
| 19:50 | clojurebot | (([1 2 3]) ([1 2 3]) ([1 2 3])) |
| 19:51 | defn | ,(partition 2 1 [[1 2 3] [1 2 3] [1 2 3]]) |
| 19:51 | clojurebot | (([1 2 3] [1 2 3]) ([1 2 3] [1 2 3])) |
| 19:51 | Chousuke | what are you trying to accomplish? |
| 19:51 | Chousuke | partition takes a single sequence and divides it. |
| 19:52 | defn | i have this vector of vectors, it amounts to a 20x20 grid, so now that i have all of the products for the horizontal combinations |
| 19:52 | defn | i need to find the vertical combinations, and finally the diagonal combinations |
| 19:53 | defn | my structure looks like [[1..20] [1..20]...[1..20]] |
| 19:54 | KirinDave | Why did you choose to make it that way? |
| 19:54 | defn | how would you do it? |
| 19:54 | Chousuke | well the vertical combinations are easy I think |
| 19:55 | Chousuke | ,(apply map + [[1 2 3] [4 5 6] [7 8 9]]) |
| 19:55 | clojurebot | (12 15 18) |
| 19:56 | KirinDave | defn: Well, I'd make it a flat array |
| 19:56 | KirinDave | defn: And then use partition to make rows and columns as separate views. |
| 19:56 | defn | yeah i originally planned on doing just that |
| 19:58 | _mst | a nice thing about the nested vectors approach is you can get out the diagonals using get-in... |
| 19:58 | _mst | possibly a bit harder with a flat vector? |
| 19:58 | defn | Chousuke: your solution works, but if i have [[1 2 3] [4 5 6] [7 8 9] [10 11 12]], i need to get (* 1 4 7), (* 4 7 10), etc. |
| 19:58 | KirinDave | I dunno if it'd be any harder. |
| 19:58 | defn | harder to think about with a flat vector |
| 19:58 | defn | for diagonals i like the nested vectors |
| 19:59 | KirinDave | Um, just write a function to translate from [x,y] -> [n] |
| 19:59 | defn | like i said "i like the nested vectors" |
| 19:59 | KirinDave | That's fine. I was just pointing out that the diagonals are not significantly easier to compute. :) |
| 20:00 | defn | sure sure |
| 20:00 | defn | im heading home, see you guys later |
| 20:00 | defn | thanks for the help all |
| 20:03 | michaeljaaka | hi |
| 20:03 | michaeljaaka | I'm getting Caused by: java.lang.Exception: Can't take value of a macro: #'ds.commons/invoke-me |
| 20:03 | michaeljaaka | at clojure.lang.Compiler.analyzeSymbol(Compiler.java:4610) |
| 20:03 | michaeljaaka | at clojure.lang.Compiler.analyze(Compiler.java:4307) |
| 20:03 | michaeljaaka | any idea what causes that? |
| 20:03 | michaeljaaka | anyone got such problem? |
| 20:08 | fanatico | Just like it says, you're trying to treat a macro like a value. |
| 20:09 | KirinDave2 | michaeljaaka: What expression involving invoke-me signals that error? |
| 20:10 | michaeljaaka | (defn some[d] invoke-me d rest of args.. ) |
| 20:10 | KirinDave2 | Maybe you meant |
| 20:10 | KirinDave2 | (defn some [d] (invoke-me d …)) |
| 20:10 | KirinDave2 | ? |
| 20:10 | michaeljaaka | then i get EOF |
| 20:11 | KirinDave2 | Um |
| 20:11 | KirinDave2 | I suspect that there is a simple syntax error |
| 20:11 | michaeljaaka | in macro? |
| 20:11 | michaeljaaka | Caused by: java.lang.Exception: EOF while reading |
| 20:11 | michaeljaaka | at clojure.lang.LispReader.readDelimitedList(LispReader.java:1003) |
| 20:11 | michaeljaaka | at clojure.lang.LispReader$ListReader.invoke(LispReader.java:860) |
| 20:11 | michaeljaaka | at clojure.lang.LispReader.readDelimitedList(LispReader.java:1011) |
| 20:11 | michaeljaaka | when typed as you propsed |
| 20:12 | KirinDave2 | What is the actual statement you typed? |
| 20:12 | KirinDave2 | I'm pretty sure it's impossible to make a macro that makes unbalanced parens. |
| 20:12 | duncanm | la la la |
| 20:14 | arj | is there any way I can using ns and import, import something java into the namespace under a different name? |
| 20:15 | fanatico | arj: Don't think so. Clojure and Java are in a different namespaces. |
| 20:15 | michaeljaaka | http://pastebin.com/d46062ac6 |
| 20:15 | michaeljaaka | here is an actual code |
| 20:16 | michaeljaaka | that don't want to compile |
| 20:16 | arj | fanatico: ok, it's just that if I import something I can't create my own e.g. structs with the same name as one I imported, it's a bit annoying |
| 20:16 | KirinDave2 | michaeljaaka: One moment. |
| 20:16 | fanatico | michaeljaaka: http://pastebin.com/mc7209be |
| 20:17 | duncanm | michaeljaaka: why did you write that as a macro? |
| 20:17 | michaeljaaka | because iface is an java interface name |
| 20:17 | michaeljaaka | and when written as fun iface won't be resolved |
| 20:18 | fanatico | arj: yeah. If you're not using the java class/method that conflicts, you could exclude it from the import, or you could refer to the clojure name using the full namespace. |
| 20:18 | michaeljaaka | fanatico: I get EOF when I write "act" like this |
| 20:19 | fanatico | michaeljaaka: did you balance the parens for let? |
| 20:19 | michaeljaaka | yes |
| 20:19 | KirinDave2 | michaeljaaka: http://gist.github.com/238447 |
| 20:19 | KirinDave2 | michaeljaaka: That does not eof for me. |
| 20:19 | KirinDave2 | And appears to match your intent |
| 20:19 | KirinDave2 | What editor are you using? |
| 20:19 | michaeljaaka | enclojure |
| 20:20 | KirinDave2 | Because lisps really demand an editor. |
| 20:20 | arj | sadly I am importing something important that conflicts. But it doesn't seem like I*m able to define a new struct with the same name as some java class I imported |
| 20:20 | arj | would be cool with a import bla as foo |
| 20:20 | KirinDave2 | I'd highly recommend emacs + clojure-mode + paredit |
| 20:20 | michaeljaaka | this is an editor for netbeans |
| 20:20 | michaeljaaka | ok |
| 20:20 | KirinDave2 | Anyways, I suspect you simply had unbalanced parens. |
| 20:20 | michaeljaaka | I will try compile it with emacs |
| 20:21 | KirinDave2 | Just make sure your quotes are right |
| 20:21 | KirinDave2 | Remember, invoke-rmi _must_ be immediately prefaced by an open-paren to work. |
| 20:21 | arj | does anyone know why slime eats some of the output that the running code produces? It seems like messages coming out-of-band are not displayed at all? |
| 20:22 | KirinDave2 | "out of band"? |
| 20:23 | the-kenny | I think he means from a different thread or so. |
| 20:23 | the-kenny | arj: If so, you can find them in the inferior-lisp buffer. |
| 20:24 | michaeljaaka | ok |
| 20:24 | arj | the-kenny: ah! |
| 20:24 | duncanm | arj: yeah, it's a little confusing, but *out* and *err* are not the same as System.out and System.err |
| 20:24 | arj | thanks a lot |
| 20:24 | michaeljaaka | I have looked at code and truly there were missing two closing parens |
| 20:24 | michaeljaaka | thanks a lot! |
| 20:24 | arj | very newb slime question I guess :D |
| 20:24 | michaeljaaka | btw why pastebin is lame? |
| 20:25 | KirinDave2 | arj: I'd use a C-x 3 in your slime repl, then swap one to the inferior lisp buffer. |
| 20:25 | KirinDave2 | That is what I do |
| 20:25 | duncanm | michaeljaaka: i don't understand your answer |
| 20:26 | KirinDave2 | arj: You end up like so : http://idisk.me.com/dfayram/Public/Pictures/Skitch/%2Ainferior-lisp%2A-20091118-172516.png |
| 20:26 | michaeljaaka | ; Rule #1, fuck pastebin. |
| 20:26 | michaeljaaka | this is from http://gist.github.com/238447#file_gistfile1.txt |
| 20:26 | KirinDave2 | michaeljaaka: Because it is fairly ugly and hard to read. gist is nice because it puts the code way out in front, design wise |
| 20:26 | KirinDave2 | I mean, compare those two pages. |
| 20:26 | arj | KirinDave2: yeah that's pretty cool, thanks agian |
| 20:27 | KirinDave2 | michaeljaaka: You can also checkout and manipualte whole pastes as a git repo, which can be very handy sometimes in larger pastes. And also because mojombo, defunkt and the crew are Folks Who Know What Salsa Should Taste Like. |
| 20:28 | michaeljaaka | :) |
| 20:28 | michaeljaaka | ok |
| 20:28 | michaeljaaka | now I know gist, paste.lisp.org and pastebin |
| 20:29 | hiredman | http://delicious.com/clojurebot/pastbin |
| 20:29 | michaeljaaka | :) |
| 20:30 | the-kenny | clojurebot has a delicious integration? Nice idea :) |
| 20:31 | hiredman | :) |
| 20:53 | churib | when happens destructuring? at read time? |
| 20:54 | chouser | runtime |
| 20:55 | churib | okay, thanks |
| 20:55 | hiredman | well, it's a macro |
| 20:56 | hiredman | it's expanded at macro expand time, but the code it expands to is run at runtime |
| 21:13 | polypus | is this (eval `(fn ~arg-lst ~expr)) the recommended way of building a function at run time when one has a param list and expression? |
| 21:15 | duncanm | polypus: or you could use a macro |
| 21:17 | duncanm | chouser: do you understand what michaeljaaka said about his macro? i'm not completely familiar with how identifiers are resolved in Clojure macros (vs. Scheme macros), but what he said didn't make sense to me |
| 21:26 | fanatico | duncanm: outside of the (.) special form, java methods don't resolve, so invoke-rmi has to be a macro. |
| 21:34 | jweiss | ok, so i was convinced this evening to switch to emacs+slime (from vim-clojure). it was pretty easy to set up. i still have no clue how to use emacs, but at least the REPL works. 2 questions. how to set classpath, and how to change the color scheme? |
| 21:34 | jweiss | i saw via google a way to set classpath in the .emacs, but apparently you have to restart emacs anytime that changes. there must be an easier way? |
| 21:36 | fanatico | jweiss: C-x C-e evals the last sexp (both in elisp and clojure), so you can update the variable that way. You still may have to restart slime. |
| 21:38 | jweiss | wow, in emacs, jumping to line 99 is "ESC-X goto-line <enter> 99" ? that sucks |
| 21:39 | jweiss | i'm about to fall back on viper mode |
| 21:39 | _mst | always seemed strange that it was never bound to a key |
| 21:39 | _mst | but you can bind it to a key yourself! :) |
| 21:39 | jweiss | _mst: all in due time, first i have to figure out how to do basic stuff |
| 21:40 | jweiss | but i can see it'll be better than vi,someday |
| 21:40 | _mst | ah right :) in my ~/.emacs I have: (define-key global-map (kbd "C-c g") 'goto-line) |
| 21:40 | hiredman | pfft |
| 21:40 | jweiss | i never knew the .emacs file was lisp. that is pretty cool |
| 21:41 | dnolen | _mst: I used (meta-n), simpler, I had multiple groups of keys I used often. |
| 21:41 | dnolen | also a fan of binding function keys to start REPL, magit, shell, etc. |
| 21:42 | _mst | ah yep. I'm not sure what my meta-n is off the top of my head, but I can assure you it's bound to something somewhere :) |
| 21:43 | dnolen | I hate multiple groups of keys I mean for common commands |
| 22:12 | polypus | duncanm: thanks but how? this don't work (defmacro template-function [arg-lst expr] `(fn ~arg-lst ~expr)) |
| 22:33 | kzar | What's the easiest way to get the first 3 values of a sequence? |
| 22:35 | fanatico | ,(take 3 '(1 2 3 4 5)) |
| 22:35 | clojurebot | (1 2 3) |
| 22:36 | kzar | fanatico: ah sweet |
| 22:36 | kzar | thanks |
| 22:36 | fanatico | np |
| 22:41 | kzar | fanatico: Is there something to give the rest after the first 3? |
| 22:42 | fanatico | ,(drop 3 '(1 2 3 4 5)) |
| 22:42 | clojurebot | (4 5) |
| 22:44 | kzar | tah :) |
| 22:46 | kzar | (Although it would be kind of odd for a Lisp, maybe first and next should have an optional number parameter. It would make sense and avoid drop and take being needed) |
| 22:47 | chouser | ,(split-at 3 (range 5)) |
| 22:47 | clojurebot | [(0 1 2) (3 4)] |
| 23:13 | kzar | Is the closest to "for i in [1 2 3 4 5] ..." (map (fn [i] ...) [1 2 3 4 5] ? |
| 23:14 | chouser | ,(for [i [1 2 3 4 5]] (* i 2)) |
| 23:14 | clojurebot | (2 4 6 8 10) |
| 23:17 | chouser | kzar: note that both 'map' and 'for' return lazy seqs -- neither is an imperative loop like python's 'for' |
| 23:19 | kzar | whoops I didn't realise there was a for. Yea I watched some of the videos that mentioned about lazieness, it seems like a brilliant idea that's going to fuck me over one day soon heh |
| 23:22 | defn | 'lo |
| 23:23 | kzar | laziness* damn flyspell :( |
| 23:30 | chouser | kzar: heh, could be. |
| 23:31 | chouser | kzar: usually it only causes me trouble when I'm trying to be too clever -- lazily consuming UI events or lines from an open file or something. |
| 23:31 | defn | how do you use get-in? |
| 23:31 | defn | i have a structure like [[1 2 3] [4 5 6]] |
| 23:32 | _ato | ,(get-in [0 0] [[1 2 3] [4 5 6]]) |
| 23:32 | clojurebot | nil |
| 23:32 | _ato | hmm |
| 23:32 | tomoj | backwards |
| 23:32 | tomoj | ,(get-in [[1 2 3] [4 5 6]] [0 0]) |
| 23:32 | clojurebot | 1 |
| 23:32 | _ato | ah right |
| 23:32 | _ato | of course |
| 23:33 | tomoj | ,(get-in [[1 2 3] [4 5 6]] [1 1]) |
| 23:33 | clojurebot | 5 |
| 23:33 | defn | ah cool |
| 23:33 | defn | thanks |
| 23:34 | _ato | heheh I rely on slime's argument hints in the minibuffer too much... hmm... I wonder if I can get it to do it with IRC too. ;-) |
| 23:35 | defn | i dont understand the get-in "documentation", the whole m keys thing |
| 23:36 | _ato | ,(doc get-in) |
| 23:36 | clojurebot | "([m ks]); returns the value in a nested associative structure, where ks is a sequence of keys" |
| 23:37 | _ato | m means map (an associative structure) |
| 23:37 | _ato | ,(get-in {:foo {:bar 2}} [:foo :bar]) |
| 23:37 | clojurebot | 2 |
| 23:38 | _ato | ks is the keys in the nested maps that get to the value you want |
| 23:38 | _ato | a vector can be thought of as a map between indices and values |
| 23:38 | defn | sure i mean i understand the structure |
| 23:39 | defn | but ive thought of [0 0] as being a sequence of keys |
| 23:39 | defn | never thought of* |
| 23:40 | defn | nevermind it all makes sense now |
| 23:41 | defn | ive successfully embaressed myself again |
| 23:41 | defn | no need to worry |
| 23:46 | fanatico | why does `get-in` take [m ks] instead of [m keys*]? |
| 23:47 | fanatico | are there any guidelines about when to write one style over the other? |
| 23:54 | fanatico | ,(defn my-get-in [x & args] (if (seq args) (recur (get x (first args)) (rest args)) x)) |
| 23:54 | clojurebot | DENIED |
| 23:55 | fanatico | ,((fn [x & args] (if (seq args) (recur (get x (first args)) (rest args)) x)) [[1 2 3] [4 5]] 0 1) |
| 23:55 | clojurebot | 2 |