2010-07-28
| 00:00 | daaku | wwmorgan: aww.. i kept searching for clojurerc -- that's probably what i want |
| 00:00 | seancron | Does anyone have any suggestions on using agents to look up hosts repeatedly? |
| 00:42 | slyrus | one of the things that I often misabuse ASDF for is the location of project-relative files (data files, etc...). How can I locate a file relative to some directory that's on the CLASSPATH? |
| 00:45 | tomoj | (.getResource (clojure.lang.RT/baseLoader) "<CLASSPATH-relative filename>") |
| 00:46 | tomoj | or (.getResourceAsStream ...) |
| 00:46 | slyrus | thanks tomoj |
| 00:49 | slyrus | ah, that and a lein resources directory and I'm good to go. great! |
| 01:27 | gstamp | hrmm. hash-combine doesn't have a doc string. I assume it creates a new hash from two existing hashes? |
| 01:55 | dublindan | http://clojure-games.org (a very very early work in progress) |
| 02:35 | slyrus | ok, name me two actors/actresses |
| 02:36 | ttmrichter | slyrus: Aishwarya Rai, Steve Buscemi. |
| 02:36 | ttmrichter | (I would pay loads of money to see those together in a movie.) |
| 02:37 | slyrus | ("Steve Buscemi" "Things to Do in Denver When You're Dead" "Andy García" "The Pink Panther 2" "Aishwarya Rai") |
| 02:38 | slyrus | not in a movie together, but close... |
| 02:39 | ttmrichter | So why did you want two actors/actresses? |
| 02:39 | slyrus | (map :name (graph/find-node *actor-film-graph* (get-actor-node "Aishwarya Rai") (get-actor-node "Steve Buscemi"))) |
| 02:39 | slyrus | my kevin-bacon-solver |
| 02:39 | ttmrichter | A six degrees of Kevin Bacon with movie stars? |
| 02:39 | slyrus | yeah |
| 02:39 | ttmrichter | Dammit! |
| 02:39 | ttmrichter | What's your data source? |
| 02:39 | slyrus | freebase |
| 02:40 | slyrus | 100k movies, 75k actors, or so. |
| 02:40 | ttmrichter | OK, let's see if I can't break it. |
| 02:40 | ttmrichter | Peter Falk and Bipasha Bipu |
| 02:41 | ttmrichter | Doris Day and Faye Wong |
| 02:42 | slyrus | ("Faye Wong" "2046" "Takuya Kimura" "Howl's Moving Castle" "Lauren Bacall" "Young Man with a Horn" "Doris Day") |
| 02:42 | ttmrichter | Damn! |
| 02:42 | slyrus | unfortunately, the Peter Falk search turned up empty... |
| 02:42 | ttmrichter | Hah! |
| 02:42 | ttmrichter | NOBODY stars with Peter Falk! |
| 02:42 | ttmrichter | Except through Columbo! |
| 02:42 | ttmrichter | Where everybody stars with Peter Falk! :D |
| 02:42 | absalom | Mikhail Gorbachev did... |
| 02:43 | slyrus | well, that's not true, it's just that Bipasha Bipu isn't in there. |
| 02:43 | slyrus | is the spelling right? |
| 02:43 | ttmrichter | Oh. |
| 02:43 | ttmrichter | I... think so? |
| 02:43 | ttmrichter | Let me check. |
| 02:43 | slyrus | ("Peter Falk" "The Thing About My Folks" "Olympia Dukakis" "The Great New Wonderful" "Naseeruddin Shah" "Dus Kahaniyaan" "Bipasha Basu") |
| 02:43 | slyrus | basu? |
| 02:43 | ttmrichter | Ah, my bad. |
| 02:43 | ttmrichter | Basu. |
| 02:44 | slyrus | the ya go |
| 02:44 | slyrus | s/the/there/ |
| 02:44 | sexpbot | there ya go |
| 02:44 | ttmrichter | Gong Li and Charlie Chaplin. |
| 02:45 | slyrus | ("Charlie Chaplin" "A King in New York" "Phil Brown" "Johnny Kapahala: Back on Board" "Cary-Hiroyuki Tagawa" "Memoirs of a Geisha" "Gong Li") |
| 02:46 | ttmrichter | Man, that's shorter than I expected. |
| 02:46 | ttmrichter | I guess that goes to show how inbred the movie industry is, right? |
| 02:47 | Chousuke | what happens if it can't find a connection? |
| 02:47 | slyrus | yeah, don't ask me to run the graph-distance-matrix to compute all pairwise distances though :) |
| 02:47 | slyrus | Chousuke: the universal no connection answer, the empty list :) |
| 02:47 | Chousuke | heh |
| 03:05 | LauJensen | Good morning all |
| 03:07 | unfo- | morning LauJensen |
| 03:16 | slyrus | if anyone wants to try out cinematograph, it's here: http://github.com/slyrus/cinematograph |
| 03:28 | slyrus | or you can just keep throwing pairs of actors/movies at me and I'll tell you how they're connected :) |
| 03:28 | ragnard | (doc declare) |
| 03:28 | clojurebot | "([& names]); defs the supplied var names with no bindings, useful for making forward declarations." |
| 03:29 | ragnard | sorry, missed the repl |
| 04:41 | raek | does anyone know what seqs are chunked? |
| 05:45 | cais2002 | hi, is there a quick guide on how to create my own task for leiningen? |
| 05:49 | raek | http://github.com/technomancy/leiningen/blob/master/PLUGINS.md |
| 05:49 | raek | this is what I know of |
| 05:51 | raph_amiard | Hi there |
| 05:51 | raph_amiard | i want to know, if i want simple syntax highlighting for clojure in vim |
| 05:51 | raph_amiard | i don't want slimv nor vimclojure/gorilla |
| 05:51 | raph_amiard | in my opinion they are complicated and way too big and buggy for my tastes |
| 05:52 | raph_amiard | what are my options ? |
| 05:54 | cais2002 | raph_amiard: I am using vimclojure and mainly just for syntax highlighting and Ctrl+N for autocompletion. you can ignore those adv features |
| 05:55 | raph_amiard | yeah well you're probably right |
| 05:56 | raph_amiard | but i find installation to be seriously horrible but i guess i can just grab the vimclojure's syntax file ? |
| 06:01 | bonega | Hi - Can anybody share some good thoughts regarding -> and ->> |
| 06:01 | bonega | I understand the usage - but have a hard time deciding when it's appropriate |
| 06:02 | bonega | I am using Forth in my job - so I am a bit damaged... |
| 06:02 | raek | (f1 a (f2 c (f3 e (f4 x) f d) b) <--- not very readable |
| 06:03 | bonega | Try working in forth ;) |
| 06:03 | bonega | Nah - more if there exists some consensus at what complexitivity level it becomes appropriate |
| 06:03 | raek | bonega: if you know forth then I don't have to explain why the -> syntax is no neat... |
| 06:04 | raek | if the code looks simpler and more readable, go for it |
| 06:05 | bonega | yes ty - I am only worried for the ones that have to work with my code... |
| 06:05 | raek | imo, you should expect clojure programmers to understand -> |
| 06:06 | raek | it might be overkill to use it for just 2 forms, but for 3 or more I don't see why it should be bad |
| 06:08 | bonega | I hate having to base my decisions on what feels right :( |
| 06:09 | bonega | raph_amiard: You should really use a editor that is parens aware and have REPL integration |
| 06:09 | bonega | I am a vim user myself, but couldn't seem to get vim setup right for Clojure |
| 06:09 | bonega | So for the moment I am using Eclipse and Counterclockwise |
| 06:10 | bartj | bonega, having tried vim to get working with Clojure for nearly 6 months, and using it - I know it is highly frustrating |
| 06:10 | bOR__ | stupid simple question. If I want a global var to return a new random number (def myvar (rand)), how should I write it? |
| 06:10 | cais2002 | raph_amiard: I just followed the instructions and ignored the ng server related stuff |
| 06:10 | bartj | bonega, my best suggestion to you is to use emacs - paredit, etc just rocks |
| 06:11 | bonega | I have no time learning another OS ;) |
| 06:11 | bOR__ | (def myrand (first (take 1 (repeatedly #(rand))))) doesn't seem to work :). |
| 06:12 | raph_amiard | bonega: I used emacs for 1 year for clojure |
| 06:12 | raph_amiard | bonega: still hate it in the end though |
| 06:13 | raph_amiard | bonega: but the lisp integration is wonderfull |
| 06:13 | raph_amiard | i guess i'm gonna try emacs with vimpulse |
| 06:13 | raph_amiard | maybe it'll be enough |
| 06:14 | bOR__ | I'll just go for (defn myvar [] (rand)) |
| 06:14 | bonega | That's an abomination |
| 06:14 | bOR__ | would have liked a dev solution. |
| 06:14 | bOR__ | def. |
| 06:15 | Nikelandjelo | bOR__: (def myvar (fn [] (rand) ) ) |
| 06:15 | raek | bOR__: your first example always gives the same value |
| 06:16 | raek | it evalueates (first ...) and binds that value to the var |
| 06:16 | bOR__ | raek - that I noticed. |
| 06:16 | bonega | please don't call it something like myvar - it's still a rand function |
| 06:16 | bOR__ | bonega - it is just a simple example of something else. |
| 06:16 | bonega | roger |
| 06:17 | raek | bOR__: how do you want to use it? |
| 06:17 | Lajla | , |
| 06:17 | clojurebot | Lajla: Excuse me? |
| 06:17 | bOR__ | was using iterate to generate a stream of a certain process, noticed that the x in the iterate function would stay the same if I did a (def myvar (iterate (partial + 2) (rand-int 10))) |
| 06:18 | raek | rand-int is only called once |
| 06:19 | bOR__ | raek - yes, but how can I get it to be called each time I look up the def? |
| 06:19 | Lajla | raek, I long to consume your mortal soul. |
| 06:19 | bOR__ | (count (take-while (partial some #(= (:rat %) :healthy)) burrow-stream)) is what I'm using it for. |
| 06:20 | bOR__ | counting the time till a whole gerbil burrow is infected with the plague ;). |
| 06:20 | raek | bOR__: you wrap everything in a defn insead |
| 06:20 | bOR__ | *nod*, that was my solution. |
| 06:20 | raek | functions run code, values are fixed |
| 06:20 | bOR__ | was wondering if there was a way to def it. |
| 06:20 | bOR__ | good point. |
| 06:21 | raek | this could be of use maybe: (defn make-rand-int-seq [] (repeatedly rand-int)) |
| 06:22 | raek | (let [a-rand-seq (repeatedly rand-int)] [(take 4 a-rand-seq) (take 7 a-rand-seq)]) |
| 06:22 | raek | ,(let [a-rand-seq (repeatedly rand-int)] [(take 4 a-rand-seq) (take 7 a-rand-seq)]) |
| 06:22 | clojurebot | java.lang.RuntimeException: java.lang.IllegalArgumentException: Wrong number of args (0) passed to: core$rand-int |
| 06:22 | raek | ,(let [a-rand-seq (repeatedly #(rand-int 10))] [(take 4 a-rand-seq) (take 7 a-rand-seq)]) |
| 06:22 | clojurebot | [(4 5 4 4) (4 5 4 4 2 3 8)] |
| 06:22 | raek | then multiple processes can share the same sequence of random numbers |
| 06:22 | bOR__ | thanks raek, but iterate is the one I wanted. put an infected flea in a burrow with rats, process a timestep, process another timestep on the result of the first process, etc. |
| 06:23 | serp_ | ,(take 5 (repeatedly (partial rand-int 10))) |
| 06:23 | clojurebot | (0 9 9 3 2) |
| 06:23 | bOR__ | ah, raek - yep. |
| 06:25 | Lajla | serp_, my beloved, I've crossed oceans of time to be with you. |
| 06:28 | zmila | ,(bit-not 65535) |
| 06:28 | clojurebot | -65536 |
| 06:51 | raph_amiard | Re here |
| 06:51 | raph_amiard | i'm trying to make slime work with liebke's cljr swank command |
| 06:51 | raph_amiard | but i'm hitting a wall :/ |
| 06:51 | raph_amiard | "make client process failed: connection refused, :name, SLIME Lisp, :buffer, nil, :host, 127.0.0.1, :service, 4005" |
| 06:52 | raph_amiard | when i launch "cljr swank 4005", it's just hanging in there so i imagine it's working |
| 06:55 | raek | i haven't used cljr, but when you start swank in other ways (from the repl, or with lein swank, etc) it usually prints a line that says that it is listening on a port |
| 06:55 | raph_amiard | okay |
| 06:55 | raph_amiard | i have got no such line, nothing at all. |
| 06:56 | raph_amiard | that means few debug information too .. |
| 06:56 | raek | try connecting to the port with telnet or something to check if there is something listening |
| 06:56 | raph_amiard | good idea |
| 06:56 | raph_amiard | i'm also maybe gonna try starting a swank server with leiningen |
| 06:56 | raph_amiard | to see if it works there |
| 06:57 | raek | what is cljr, btw? a packet manager? |
| 06:57 | raph_amiard | well it is a very cool project from liebke, the guy who does incanter |
| 06:58 | raek | ah, read on the project page |
| 06:58 | raph_amiard | http://github.com/liebke/cljr |
| 06:58 | raph_amiard | basically it's a clojure environnement for things that don't fit in the leiningen project model |
| 06:58 | raek | to make starting a repl for things that are not projects easy, right? |
| 06:58 | raph_amiard | yeah exactly |
| 06:58 | raek | neat |
| 06:59 | raph_amiard | yeah also the ability to install libs system wide is very cool |
| 07:00 | raek | well, now clojure has the best of both worlds, then... |
| 07:00 | raph_amiard | so much of my activity with clojure is fast scripting, testing out ideas |
| 07:00 | raph_amiard | yeah i hope |
| 07:00 | raph_amiard | i don't know leiningen so well though |
| 07:00 | raph_amiard | but it seems really good |
| 07:02 | raph_amiard | yeah well i think cljr swank server is not working |
| 07:08 | raek | :( |
| 07:43 | gfrlog | can I access a public instance variable of a java object in clojure? Or does there have to be a method to call? |
| 07:45 | raek | (. instance field) |
| 07:45 | gfrlog | works perfectly, thanks |
| 07:45 | rhudson | I think (.field instance) works too |
| 07:46 | gfrlog | oh geez it does |
| 07:46 | gfrlog | I thought I had tried that |
| 07:46 | gfrlog | but I actually hadn't |
| 07:47 | raek | yeah, the (.field instance) is probably preferred |
| 07:48 | raek | all of this is documented here: http://clojure.org/java_interop |
| 07:48 | gfrlog | thanks; I'm mostly familiar with the interop. Just don't deal with public variables often |
| 07:49 | raek | ok. yeah, setters and getters are more common |
| 07:49 | raek | if it has getters, consider using bean |
| 07:49 | gfrlog | right |
| 07:50 | gfrlog | I found a bug in bean actually; at least in older versions (I think 1.1?) |
| 07:50 | raek | oh |
| 07:50 | raek | what does it do? have you created a ticket? |
| 07:51 | gfrlog | should I check it on the master branch before creating a ticket? |
| 07:51 | gfrlog | bean returns a map |
| 07:51 | gfrlog | and if you try to access a nonexisting key it throws an NPE |
| 07:51 | gfrlog | I assume that's a bug |
| 07:51 | chouser | it's on master, but I'm not sure if it's a bug. |
| 07:51 | gfrlog | there's certainly no warning about it in |
| 07:52 | gfrlog | (doc bean) |
| 07:52 | clojurebot | "([x]); Takes a Java object and returns a read-only implementation of the map abstraction based upon its JavaBean properties." |
| 07:52 | chouser | you can give a "notfound" value to return... |
| 07:52 | chouser | hm |
| 07:52 | gfrlog | you can? |
| 07:52 | gfrlog | (bean 128 99) |
| 07:52 | gfrlog | ,(bean 128 88) |
| 07:52 | clojurebot | java.lang.IllegalArgumentException: Wrong number of args (2) passed to: core$bean |
| 07:52 | chouser | , (:foo (bean Object) :bar) |
| 07:52 | clojurebot | :bar |
| 07:53 | gfrlog | yes but |
| 07:53 | gfrlog | ,(:foo {}) |
| 07:53 | clojurebot | nil |
| 07:53 | gfrlog | why would we want different behavior? |
| 07:54 | gfrlog | ,((bean "jokes") :foo :bar) |
| 07:54 | clojurebot | :bar |
| 07:54 | chouser | ,(:foo (assoc (bean Object) :a :b)) |
| 07:54 | clojurebot | java.lang.reflect.InvocationTargetException |
| 07:54 | gfrlog | that's fine because the docs say it's read-only |
| 07:54 | chouser | huh. that returns nil for me |
| 07:54 | chouser | ,(:a (assoc (bean Object) :a :b)) |
| 07:54 | clojurebot | java.lang.reflect.InvocationTargetException |
| 07:55 | chouser | and that returns :b |
| 07:55 | gfrlog | what version are you using? |
| 07:55 | chouser | gfrlog: you're probably right that it's a bug. best to start by mentioning it on the google group. |
| 07:55 | chouser | gfrlog: some recent master. |
| 07:56 | gfrlog | does your recent master throw the NPE as well? |
| 07:56 | chouser | yes |
| 07:56 | gfrlog | okay |
| 07:56 | gfrlog | I'll try the google group, but last time I tried posting it never got there |
| 07:56 | gfrlog | is there some extra registration process I'm unaware of? |
| 07:57 | chouser | hm, no -- your first few posts should be held in a queue until manually approved (to reduce spam) but no other registration. |
| 07:58 | gfrlog | hmm |
| 07:58 | gfrlog | okay |
| 07:58 | gfrlog | I guess my post wasn't clever enough |
| 07:58 | chouser | heh |
| 07:58 | gfrlog | ,(bean Object) |
| 07:58 | clojurebot | java.lang.reflect.InvocationTargetException |
| 07:59 | gfrlog | ,(bean (Object.)) |
| 07:59 | clojurebot | {:class java.lang.Object} |
| 07:59 | chouser | ah |
| 07:59 | chouser | ,(:foo (assoc (bean "") :a :b)) |
| 07:59 | clojurebot | nil |
| 07:59 | chouser | ,(:a (assoc (bean "") :a :b)) |
| 07:59 | clojurebot | :b |
| 07:59 | gfrlog | your clojure lets you call bean on a class? |
| 07:59 | chouser | yup |
| 07:59 | gfrlog | ,(assoc (bean "") :a :b) |
| 07:59 | clojurebot | {:a :b, :bytes #<byte[] [B@1f1df3f>, :class java.lang.String, :empty true} |
| 07:59 | gfrlog | I wonder what "read-only" means |
| 08:00 | chouser | you can't call setters of the bean object |
| 08:00 | gfrlog | okay, so it doesn't mean anything important in clojure, just if you were thinking of doing fruity java things with it? |
| 08:00 | chouser | I think so, at least that's how I read it. |
| 08:01 | chouser | and since the thing bean returns allows assoc, I don't see how someone could justify the NPE at all. |
| 08:01 | gfrlog | yeah |
| 08:02 | gfrlog | ,(:haha (assoc (bean "") :a :B)) |
| 08:02 | clojurebot | nil |
| 08:02 | rhudson | ,(class (assoc (bean "") :a :b)) |
| 08:02 | clojurebot | clojure.lang.PersistentArrayMap |
| 08:03 | gfrlog | ,(class (bean "")) |
| 08:03 | clojurebot | clojure.core.proxy$clojure.lang.APersistentMap$0 |
| 08:09 | rhudson | Hmm. The implementation's creating a map of accessor functions 'pmap , then just indexing on 'k as ((pmap k)). No entry for k => NPE |
| 08:15 | gfrlog | I don't suppose you can compile java code from within clojure can you? |
| 08:16 | bortreb | grflog: sure, use something like lancet |
| 08:16 | gfrlog | okay, I'll look into it, thanks |
| 08:17 | bortreb | examples are a little thin right now so if you want a working example i can send you one |
| 08:17 | gfrlog | I can't object to that |
| 08:17 | raek | I guess you could also run a leiningen plugin from clojure |
| 08:17 | gfrlog | I've never dynamically compiled java code from java even, so I'd have similar questions there |
| 08:25 | bortreb | ok, I packed up a project I'm working on at www.rlmcintyre.com/probes.tar.bz2 for you |
| 08:25 | gfrlog | cool, thanks! |
| 08:26 | bortreb | it also shows how to use clojure as a command line script |
| 08:26 | bortreb | just unpack it and change the shebang line on the quake file at the base, then run "quake -c" |
| 08:27 | bortreb | question: I want to sign the contributor agreement, but how do I fill out the form |
| 08:30 | bortreb | like, do I put under project name, github? or clojure-contrib? help pls... |
| 08:30 | bortreb | gfrlog: you also have to change quake-conf too, sorry |
| 08:36 | raek | bortreb: project name should be "clojure", "clojure-contrib" or both |
| 08:37 | lozh | Anyone know if emacs/slime/paredit has something to comment out the top level form your point is in? |
| 08:37 | raek | some of the things listed on the page didn't have their own fields, so I wrote them on a blank space on the paper |
| 08:37 | bortreb | but it also says to include your assembla and github usernames, so how would he know which is which? |
| 08:38 | bortreb | oh ok |
| 08:38 | gfrlog | botreb: I think your server has stopped responding |
| 08:38 | gfrlog | I got 58% through the download |
| 08:38 | raek | I wrote something like "github username: raek" "assebla username: raek" |
| 08:38 | bortreb | oh noes maybe wget -c ? let me look for a sec |
| 08:38 | raek | this form will not be read by a machine |
| 08:39 | gfrlog | I also tried loading it in a browser initially, and that didn't work either |
| 08:39 | raek | so, anything a human can understand will do, I suppose |
| 08:39 | bortreb | yeah, I'm being silly |
| 08:41 | raek | well, the form does not contain all fields... |
| 08:42 | bortreb | maybe a pdf on the website showing one acceptably filled out would allievate confusion |
| 08:43 | bortreb | wow my server actually did crash |
| 08:45 | gfrlog | and just now wget retried so many times that it just spit out "Giving up." and stopped |
| 08:46 | bortreb | server's back |
| 08:46 | gfrlog | also for some reason after each try it said "probes.tar.bz2 has sprung into existence." -- I'm not sure what that means |
| 08:46 | gfrlog | and it's done |
| 08:46 | gfrlog | thanks |
| 08:47 | gfrlog | heading out now |
| 08:47 | bortreb | see ya |
| 09:35 | brandonw | hmm |
| 09:35 | brandonw | oh i think i have been unbanned :) |
| 09:36 | brandonw | i tried an auto-away message script that monitors your screen session. apparently that creates some kind of spam and i was temp-banned from this channel |
| 09:40 | raek | welcome back |
| 10:05 | brandonw | unless technomancy worked his magic and somehow got me unbanned :) |
| 10:23 | eckroth | I don't want "patterns" in my code, but I find myself doing this alot (for records): (assoc this :xs (conj (:xs this) x)) ; is there a shortened version of this, and do others do this often as well? |
| 10:24 | ztellman | (update-in hash [:xs] #(conj % x)) |
| 10:26 | eckroth | ztellman: ah perfect, thanks |
| 10:26 | ztellman | eckroth: no problem, I always thought that was really awkward until I discovered update-in |
| 10:26 | eckroth | ztellman: exactly |
| 10:28 | chouser | ,(update-in {:a [1]} [:a] conj 2) |
| 10:28 | clojurebot | {:a [1 2]} |
| 10:28 | mefesto | does it also work w/out the annonomus func? |
| 10:28 | chouser | you don't need the anon fn |
| 10:28 | ztellman | chouser's right |
| 10:28 | ztellman | I always use anonymous functions, but that's a bad habit |
| 10:36 | rbe | hi |
| 10:37 | rbe | can someone point me to a documentation for &v (without space) please? |
| 10:37 | lozh | slighly unfortunate that #(fn x %) is shorter than (partial fn x) |
| 10:40 | rbe | ,(binding [a 111] (let [[&a b] [1 2]] (list a b))) |
| 10:40 | clojurebot | java.lang.Exception: Unable to resolve var: a in this context |
| 10:40 | rbe | this works in clojure 1.2 |
| 10:40 | rbe | (111 2) |
| 10:41 | eckroth | chouser: thanks; right after I replaced the pattern with update-in, your comment let me delete a lot of #(... % ...) :) |
| 10:41 | chouser | :-) |
| 10:41 | raek | ,(binding [a 111] (let [[& a b] [1 2]] (list a b))) |
| 10:41 | clojurebot | java.lang.RuntimeException: java.lang.RuntimeException: java.lang.Exception: Unsupported binding form, only :as can follow & parameter |
| 10:42 | raek | nevermind |
| 11:00 | Bahman | Hi all! |
| 11:00 | Lajla | Ahh, Bahman, my one true love, let me worship Your Shadow. |
| 11:03 | Lajla | ttmrichter, ahh, my one true love, never did I love one such as I do you. |
| 11:03 | ttmrichter | Keep it down! My wife's like two feet away from me! |
| 11:06 | Lajla | ttmrichter, ah, your wife, my one true love, never had I loved one such as I love her. |
| 11:25 | tashafa | hello all |
| 11:25 | wakko10warner | does anyone here know how to get bobot++ to run with free node. |
| 11:26 | wakko10warner | I think that bobot++ allows lispy scripting and I want to use it. |
| 11:26 | cemerick | tashafa: my gawd, he's got voice! ;-) |
| 11:27 | wakko10warner | ,(println "help wakko with bobotpp") |
| 11:27 | clojurebot | help wakko with bobotpp |
| 11:29 | tashafa | cemerick: finally figured it out |
| 11:32 | dnolen | lancepantz: ping |
| 11:32 | tashafa | cemerick: your tweet about irc and clojure highlighting made me try again |
| 11:32 | cemerick | heh |
| 11:35 | cemerick | tashafa: entirely tangentially: "[Emacs crashed opening the large file.] The file opened quickly on Windows, even my 32-bit XP box, using Notepad++." http://www.johndcook.com/blog/2010/07/28/miscellaneous-emacs-adventures/ |
| 12:01 | tashafa | cemerick: ha |
| 12:39 | jfields | ,(do (defn x [{y :k} {z y}] z) (println (x {:k :v} {:v :s}))) |
| 12:39 | clojurebot | DENIED |
| 12:41 | raek | ,(let [x (fn [{y :k} {z y}] z)] (println (x {:k :v} {:v :s}))) |
| 12:41 | clojurebot | :s |
| 12:44 | bortreb | So I've been trying to get clojure to work as a command line scripting language for some time |
| 12:44 | bortreb | and finally came up with this pun that gets it to work |
| 12:45 | Raynes | -> (def x (fn [{y :k} {z y}] z)) |
| 12:45 | sexpbot | => #'net.licenser.sandbox.box3508/x |
| 12:45 | Raynes | -> (println (x {:k :v} {:v :s}))) |
| 12:45 | sexpbot | => :s nil |
| 12:45 | bortreb | ":";exec java -cp '.:./lib/*' clojure.main $0 $*; |
| 12:45 | bortreb | what do you guys think? |
| 12:45 | bortreb | just replace the #! with ":"; and everything works |
| 12:46 | bortreb | I got the idea from http://www.emacswiki.org/emacs/EmacsScripts |
| 12:46 | raek | bortreb: seen this? http://en.wikibooks.org/wiki/Clojure_Programming/Tutorials_and_Tips#Shebang_Scripting_in_Clojure |
| 12:46 | raek | I dunno what works best |
| 12:46 | jfields | raek, you got the idea for what I was trying to do |
| 12:47 | jfields | I'm destructuring once and using the result to destructure again, is that insane or expected? |
| 12:47 | jfields | I'm deciding if I want to do that in my prod code. |
| 12:47 | raek | but I guess this has ben thunk upon before |
| 12:49 | raek | btw, that example is a bit outdated... clojure.lang.Script is not used anymore |
| 12:49 | bortreb | using a #!/usr/bin/env clj directly is lame because you have to have your own clj executable |
| 12:50 | bortreb | and using #!/usr/bin/env java args just doesn't work at all under ubuntu since you can only put one argument on the shebang line |
| 12:51 | bortreb | their rediculous three line thing works but is equivalent to my ":"; |
| 12:51 | jstirrell` | test |
| 12:54 | bortreb | should I add it to the wiki or is it bad ? |
| 13:01 | jstirrell` | Hi guys, I'm new and have a question: I have a sequence of hash maps. each hash has a :type. the first hash in the sequence has a type :date. after that there are any number of :time and :text types (a :text type will always be paired with a :time type but the occurence of :date is unpredictable). I need to process all these so I end up with a collection of structs which each contain a :date :time and :text. Any hint |
| 13:01 | jstirrell` | s on how I might go about doing this? I initially tried using a loop but that no longer seems like the way to go |
| 13:04 | bortreb | can you give an example? |
| 13:04 | nickik | I don't get what you want to do with this data |
| 13:04 | nickik | yeah plz |
| 13:06 | jstirrell` | shure |
| 13:07 | jstirrell` | I'm parsing an html page which has a number of messages on the page |
| 13:07 | jstirrell` | I end up with a bunch of hashes, each with a type corresponding to a div on that page |
| 13:08 | pdk | hm can you try pastebinning the code with some sample data to run it on that doesn't reveal anything secret about the project |
| 13:08 | jstirrell` | sure (nothing's really secret, just trying to make it as easy as possible to explain :) |
| 13:17 | jstirrell` | http://pastebin.com/2QhKhuNp |
| 13:17 | jstirrell` | ok so that is just the printed seq i'm working with |
| 13:17 | jstirrell` | the first represents the date (and time but i don't need the time here) |
| 13:19 | jstirrell` | after that the seqs alternate between messege-sender and message-text until the next day is reached |
| 13:19 | jstirrell` | I would like to end up with a sequnce of hashes that look like {:date "blah" :time "blah |
| 13:20 | jstirrell` | " :text "blah" :sender "blah"} |
| 13:21 | jstirrell` | This is my first miserable attempt: http://pastebin.com/HPFUZCc7 |
| 13:24 | pdk | do you have the input you fed to that code to produce the result you got in the 2nd pastebin jstirrell` |
| 13:25 | bortreb | I'm still confused :( it looks like it always goes (time, from, text) or is that not the case? |
| 13:26 | jstirrell` | pdk, the first pastebin is what the result of the first binding in the loop looks like |
| 13:27 | pdk | hm do you mean it's output or is that what you fed to it in a sequence |
| 13:27 | jstirrell` | bortreb, it goes (date, time, from, text, time, from, text, time, from, text ... ,date, time, from, text, |
| 13:28 | jstirrell` | that's just the output of another function i used to print the relevent results of the parsed html |
| 13:29 | jstirrell` | so yeah that would be what i'm feeding the function I'm trying to create here |
| 13:30 | bortreb | can you have two dates in a row? |
| 13:30 | jstirrell` | no |
| 13:30 | jstirrell` | the dates only show up if there are messages for that date |
| 13:30 | jstirrell` | and the messages for a date will be "under" that date |
| 13:31 | bortreb | ok |
| 13:31 | bortreb | then how about starting off with (partition-by date? your-sequence) |
| 13:32 | jstirrell` | yeah actually that makes a lot of sense :) |
| 13:32 | bortreb | then you get a sequence of (date not-dates) |
| 13:32 | jstirrell` | cool yeah then it should be easy to assoc the rest with that date |
| 13:33 | bortreb | oh it doesn't actually do what I thought |
| 13:33 | pdk | hmm |
| 13:33 | bortreb | ,(partition-by even? [2 1 1 1 2 1 1]) |
| 13:33 | clojurebot | ((2) (1 1 1) (2) (1 1)) |
| 13:34 | bortreb | but still very close |
| 13:34 | pdk | is it considered bad form to use let within a doseq if the let binding values are based on the iterator of doseq |
| 13:35 | bortreb | ,(partition 2 (partition-by even? [2 1 1 1 2 1 1])) |
| 13:35 | clojurebot | (((2) (1 1 1)) ((2) (1 1))) |
| 13:35 | bortreb | even better |
| 13:35 | jstirrell` | sweet yeah i THINK i should be able to figure out something from that, thanks for the help |
| 13:36 | bortreb | no problem :) |
| 13:39 | raek | jstirrell`: this is an idea I had: http://gist.github.com/495481 |
| 13:40 | raek | warning: not tested, but compiles |
| 13:40 | raek | a more "manual" solution, perhaps |
| 13:41 | raek | this keeps "state" in form of parameters |
| 13:57 | candera | Can anyone tell me why my catch block in this http://gist.github.com/495545 isn't working? |
| 13:57 | candera | I would expect the fn to return nil, but it throws. |
| 13:59 | mefesto | i'm not sure _why_ but the NumberFormatException is wrapped in a RuntimeException |
| 13:59 | raek | ah, this makes sense... |
| 13:59 | mefesto | and the try/catch isn't catching RuntimeException |
| 13:59 | raek | *map* is lazy |
| 14:00 | candera | I saw the RuntimeException, but sort of ignored it figuring it to be REPL noise. |
| 14:00 | raek | the exception gets thrown after the nfe-test call is done |
| 14:00 | rsh | what is the name of that function that takes a seq and a value, and inserts that value between each element of the seq? |
| 14:00 | raek | ...when the repl forces the lazy-seq to realize |
| 14:00 | raek | rsh: interpose |
| 14:00 | rsh | thanks |
| 14:00 | candera | raek: No, in this case I would think the call to every? would force the seq. |
| 14:00 | bortreb | beat me to it |
| 14:01 | candera | I get the same results with a doall in there. |
| 14:01 | raek | hrm |
| 14:01 | raek | the lazy-seq catches the exception anyway |
| 14:02 | raek | it doesn't know that it is evaluated in the try-catch |
| 14:02 | mefesto | i think fn's need to wrap checked exceptions |
| 14:02 | candera | That said, catching RuntimeException *does* work properly, so good call on that. |
| 14:02 | mefesto | including anon fns |
| 14:02 | mefesto | because fn's need to be able to be used a Runnables which do not throw checked exceptions |
| 14:02 | candera | mefesto: Ah, okay, that sort of makes sense. |
| 14:02 | mefesto | ... that's my guess anyway |
| 14:02 | raek | exceptions plus lazy sequences really don't work well together... |
| 14:04 | candera | Thanks! |
| 14:06 | jweiss | I'm a little confused about *ns*. at my repl, if i run (in-ns 'foo) and then at the next repl prompt, type *ns* to get the current ns, it fails. but if i do *ns* when the repl first starts, it prints "#<Namespace user>" |
| 14:07 | mefesto | jweiss: clojure.core/*ns* |
| 14:07 | jweiss | ahh |
| 14:07 | mefesto | when you switched ns it didn't include clojure.core |
| 14:08 | jweiss | also, in my code, how do i refer to the namespace that the code is part of? |
| 14:08 | raek | jweiss: if you use ns instead of in-ns, it will create the namespace if it doesn't exist |
| 14:08 | jweiss | i could refer to it by name, but if i rename the namespace i have to edit in more than 1 place |
| 14:08 | jweiss | raek: i think in-ns creates it |
| 14:09 | raek | hrm... |
| 14:09 | raek | but ns does the refer-clojure part? |
| 14:10 | mefesto | raek is right, it'll implicitly refer 'clojure unless otherwise specified |
| 14:11 | technomancy | what's the regex character class for "all letters, unicode-aware"? |
| 14:13 | Nikelandjelo | Can somebody explain, why does candera's example http://gist.github.com/495545 throw RuntimeException instead of NumberFormatException? |
| 14:14 | Nikelandjelo | As I understande it wraps NumberFormatException in RuntimeException. But why? |
| 14:15 | raek | technomancy: I think it is \p{L} |
| 14:15 | raek | just looking at http://java.sun.com/javase/6/docs/api/java/util/regex/Pattern.html |
| 14:15 | raek | L is the unicode class for letters, anyway |
| 14:15 | technomancy | raek: thanks! |
| 14:15 | technomancy | bummer that \w doesn't just DTRT |
| 14:16 | Kaali | Is there a way to load a clojure library dynamically to a swank session? I guess I should modify the classpath somehow? |
| 14:17 | raek | a library that was not on the classpath before? |
| 14:18 | Kaali | Yes |
| 14:18 | Kaali | Just downloaded criterium git repository, and don't really want to add it to my project.clj. |
| 14:19 | Kaali | Nor do I want to restart my swank session. |
| 14:19 | raek | I know that it is possible to do some ClassLoader magic, but I have never done it |
| 14:19 | raek | you have the source? |
| 14:19 | Kaali | I noticed that add-classpath is deprecated |
| 14:19 | qbg | ,(doc add-classpath) |
| 14:19 | clojurebot | "([url]); DEPRECATED Adds the url (String or URL object) to the classpath per URLClassLoader.addURL" |
| 14:20 | raek | then one possible solution is to eval all the files by hand... |
| 14:20 | raek | not very fun to do, though |
| 14:20 | Kaali | Yeah, it will be more convenient to restart my session than that ;) |
| 14:20 | technomancy | Kaali: the only hack that really works is to put a dir on your classpath and unzip your jars there. but it's annoying; most people just restart. |
| 14:21 | raek | yes, what about putting it in your src/ dir temporarily? |
| 14:21 | Kaali | raek: That sounds like a workable solution |
| 14:21 | raek | then require it and then delete it |
| 14:23 | Kaali | Nice and "clean" solution. |
| 14:24 | raek | why was add-classpath deprecated anyway? |
| 14:25 | raek | it can obviously be useful when doing dynamic development and a new lib has to be added to the classpath |
| 14:25 | qbg | It doesn't add it to the system classpath |
| 14:26 | qbg | That can cause a few issues IIRC |
| 14:29 | rsh | is there a built in case statement in 1.2 that doesn't throw an error when nothing matches? |
| 14:29 | nickik | how do i atach a docstring to a (fn ....) |
| 14:30 | Nikelandjelo | If any exception is thrown in map function it always throws RuntimeException. Is it specially designed? |
| 14:30 | qbg | rsh: case takes a default expression argument |
| 14:31 | slyrus | raek: I was bitter when add-classpath was deprecated, but I've learned to live without it. lein swank, for better or worse, seems to do the job well enough for me. |
| 14:33 | qbg | nickik: Why do you want a docstring on an anonymous function? |
| 14:33 | raek | nickik: docstring usually go on the metadata of the var |
| 14:33 | raek | ,(meta #'inc) |
| 14:33 | clojurebot | {:ns #<Namespace clojure.core>, :name inc, :file "clojure/core.clj", :line 766, :arglists ([x]), :added "1.0", :inline #<core$inc__inliner clojure.core$inc__inliner@d408f0>, :doc "Returns a number one greater than num."} |
| 14:34 | raek | ,(meta inc) |
| 14:34 | clojurebot | {:ns #<Namespace clojure.core>, :name inc, :file "clojure/core.clj", :line 766, :arglists ([x]), :added "1.0", :inline #<core$inc__inliner clojure.core$inc__inliner@d408f0>, :doc "Returns a number one greater than num."} |
| 14:34 | raek | in newer versions, fns can have metadata too |
| 14:34 | raek | the vars are generally where one would look for it |
| 14:36 | nickik | I have a macro that does something like (def NAME (A-FUNCTION (fn .....) other stuff)) and i want a docstring on that |
| 14:36 | mefesto | Nikelandjelo: LazySeq wraps any exception in a RuntimeException |
| 14:36 | mefesto | Nikelandjelo: http://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/LazySeq.java#L37 |
| 14:36 | qbg | nickik: Then you put the docstring on the metadata of NAME |
| 14:37 | Nikelandjelo | mefesto: I see |
| 14:38 | jweiss | what's the diff between (defn ^{:foo :bar} [] :baz) and (defn #^{:foo :bar} [] :baz) |
| 14:38 | Nikelandjelo | mefesto: But if I want to catch special exception, I have to write some ugly stuff with retrieveing real exception from RuntimeException and throwing it further? |
| 14:38 | raek | nickik: http://github.com/clojure/clojure-contrib/blob/master/src/main/clojure/clojure/contrib/def.clj |
| 14:38 | jweiss | looks like the reader macro is different in the docs than when i wrote this metadata |
| 14:38 | raek | those are examples of how this has been done before |
| 14:38 | qbg | jweiss: The second is deprecated in 1.2 |
| 14:38 | mefesto | Nikelandjelo: only if it throws a checked exception, i think subclasses of runtime exception will just pass through |
| 14:38 | seancron | Can anyone tell me why my agents are not working in http://gist.github.com/495738 ? |
| 14:39 | jweiss | qbg: ok so just the ^ is the 'correct' way? |
| 14:39 | qbg | ^ is the idiomatic way now |
| 14:39 | jweiss | k thx |
| 14:39 | qbg | It looks nicer too |
| 14:40 | nickik | like this (fn ^"BLABLA" ....) |
| 14:40 | Nikelandjelo | mefesto: It doesn't work in both case: NullPointerException (unchecked) and IOException (checked) |
| 14:40 | Nikelandjelo | mefesto: if I want to catch them |
| 14:41 | mefesto | Nikelandjelo: I guess all exceptions then :( |
| 14:51 | Nikelandjelo | Is handling exception in java way is idiomatic in clojure. Or it exists only for some kind of compatibility? |
| 14:53 | Kaali | There is often a need for me to either transform keys of a map or the values. Am I missing a function here, or is there some kind of an idiomatic way to do it? |
| 14:55 | nickik | My macro produces this as a output. How can I add a docstring here? (def cdoubler (with-constraints (fn ([n] (* 2 n))) positiv)) |
| 15:01 | technomancy | Nikelandjelo: it's idiomatic to use Exceptions, but creating your own Exception subclasses is usually inadvisable. |
| 15:01 | technomancy | see clojure.contrib.condition and error-kit for better ways to handle that problem |
| 15:03 | Nikelandjelo | technomancy: I'm asking because map is one of the popular functions (imho) and handling exception with map seems to be ugly |
| 15:04 | Chousuke | nickik: you'll need to attach the :doc metadata to the cdoubler symbol in your macro |
| 15:04 | Chousuke | nickik: using with-meta |
| 15:05 | Chousuke | nickik: but that looks a lot like a precondition, are you aware of that feature? |
| 15:05 | nickik | im working on the lib to make pre and post conditions usful |
| 15:05 | nickik | :) |
| 15:05 | nickik | trammel |
| 15:05 | Chousuke | I see. |
| 15:06 | seancron | Can anyone see why my agent send-off is not working in http://gist.github.com/495738 ? |
| 15:06 | nickik | i hoped to avoid the (with-meta ) |
| 15:07 | cmihai | Hi. I'm having some issues setting up Clojure / SLIME / swank-clojure and it's passing the wrong number of arguments when running running compile-and-load-file. I've understood this problem can be solved with swank-clojure-1.2.1.jar, and connecting manually but I can't find the thing anywhere. All I have is 1.1.0. Any tips? |
| 15:07 | Nikelandjelo | seancron: Does it trow exception? |
| 15:07 | cmihai | Actually, is there some authoritative documentation on the subject? All I've managed to find so far was umh.. let's just say confusing. |
| 15:07 | seancron | Nikelandjelo: Nope. It doesn't change the state at all |
| 15:08 | Chousuke | seancron: did you test lookup-dns outside an agent? |
| 15:08 | Chousuke | seancron: ie. does it actually work :) |
| 15:08 | seancron | Chousuke: Yeah. It worked before with just one host. I'm trying to make it support multiple host lookups |
| 15:08 | Nikelandjelo | seancron: Why don't you pass host into send-off? |
| 15:09 | Chousuke | Nikelandjelo: the host is the agent's value |
| 15:09 | raek | cmihai: the official docs for swank-clojure http://github.com/technomancy/swank-clojure |
| 15:09 | raek | swank-clojure.el |
| 15:09 | raek | Previous versions of Swank Clojure bundled an Elisp library called swank-clojure.el that provided ways to launch your swank server from within your Emacs process. While swank-clojure is still distributed with the project, it's a much more error-prone way of doing things than the method outlined above. |
| 15:09 | Chousuke | seancron: why are you using agents for something like that though? seems a bit overkill to me. |
| 15:10 | Nikelandjelo | Chousuke: Oh, sorry :) |
| 15:10 | Chousuke | seancron: I mean, the code pattern looks a bit suspicious to me |
| 15:10 | Chousuke | seancron: oh, hm, are you sure there is no race in the cache clearing that might be giving you errors? |
| 15:11 | seancron | Chousuke: Yeah, I'm new to Clojure and functional programming so it's probably not ideal at all. I'm doing this as a side project to try out Clojure |
| 15:11 | seancron | Chousuke: I've tried it with just one host and it doesn't work either |
| 15:13 | seancron | Chousuke: If you can think of any other ways to lookup the hosts concurrently I'd be glad to hear them |
| 15:14 | Chousuke | well it seems like you could just use futures |
| 15:15 | Chousuke | that way you can just look up a host like normal and the user can just deref the future when the result is actually needed |
| 15:16 | raek | cmihai: my tip to get slime and swank working is to start swank outside emacs as described in the link |
| 15:16 | raek | and the use slime-connect from emacs to connect to it |
| 15:17 | raek | beware that there are a lof of outdated tutorials 'round the net |
| 15:17 | raek | the getting started guide on clojure's wiki should be up to date too |
| 15:18 | seancron | Chousuke: My ultimate goal is to do these lookups every 10 seconds and log the results in a CSV file |
| 15:19 | cmihai | raek: I've noticed. I still failed to find swank-clojure-1.2.1.jar, but I'm building the toolkit to build it (hopefully..). |
| 15:19 | raek | cmihai: how do you indend to start swank? manually? |
| 15:20 | cmihai | Manually, elpa, git builds, some script from the internets.. tried it all :-) |
| 15:20 | raek | do you use leiningen or cljr? |
| 15:20 | cmihai | Just finished setting up cljr now. |
| 15:21 | cmihai | Still haven't gotten into lein yet. |
| 15:21 | raek | I have unfortunately never used cljr, but I know how to get it working with leiningen |
| 15:21 | raek | you could use it to download the latest version of swank-clojure |
| 15:22 | cmihai | Which fork? I got technomancy's git hub, but I'd need to build that :-). |
| 15:22 | raek | http://clojars.org/repo/swank-clojure/swank-clojure/1.2.0-SNAPSHOT/swank-clojure-1.2.0-20100308.145053-1.jar |
| 15:22 | cmihai | Kind of an issue, since I haven't used lein and such before :-) |
| 15:22 | raek | there are jars on clojars |
| 15:23 | raek | lein will automatically download the jar files you need |
| 15:23 | raek | but you could download that and use it |
| 15:23 | seancron | Chousuke: Do you think the problem might be that lookup-dns returns 0 on a successful lookup? |
| 15:23 | raek | and then start a repl with "java -cp clojure.jar:clojure-contrib.jar:swank-clojure.jar clojure.main" |
| 15:23 | cmihai | Aha, thanks, found the jars :-) |
| 15:24 | raek | then you'll have to run something like: |
| 15:24 | raek | (ns my-app (:use [swank.swank :as swank])) |
| 15:24 | raek | (swank/start-repl) |
| 15:25 | raek | then you should be able to connect to it with emacs using slime-connect |
| 15:25 | cmihai | Thanks mate :-). I'll give that a try then. |
| 15:25 | raek | np. |
| 15:26 | Chousuke | seancron: er, right? |
| 15:26 | Chousuke | seancron: the return value of the function you send to an agent becomes the agent's new value |
| 15:26 | Chousuke | seancron: so the agent's value on a successful lookup would of course be 0 |
| 15:27 | Chousuke | seancron: if that's what the function returns |
| 15:28 | seancron | Chousuke: Yeah. Never mind. I thought returning a 0 might be causing an error. |
| 15:29 | Chousuke | seancron: you could try running agent-errors on the agents to see if there are any exceptions thrown in lookup-dns |
| 15:35 | seancron | Chousuke: No exceptions. agent-error returns nil |
| 15:39 | chouser | this is rather intriguing: http://olabini.com/blog/2010/07/preannouncing-seph/ |
| 15:39 | chouser | "Seph will steal/has stolen Clojures persistent data structures, all the concurrency primitives and the STM." |
| 15:46 | Chousuke | seancron: hmm :/ |
| 15:49 | seancron | Chousuke: I'm not committed to using agents. Do you think futures is a better choice for this type of parallel dns lookup? |
| 15:54 | Chousuke | seancron: well I suppose it depends on what you're doing but in general agents are intended to be a long-lived "identity" that changes its value over time |
| 15:55 | Chousuke | seancron: but you seem to be using them as a convenient way to get off-the-main-thread execution, where futures are a better conceptual fit |
| 15:58 | cmihai | Sorry, still can't figure it out, with cljr or leiningen (which I can't figure out how to run...) |
| 15:59 | cmihai | I'm guessing it needs more stuff in CLASSPATH |
| 15:59 | technomancy | cmihai: are you on Windows? |
| 15:59 | cmihai | Linux |
| 16:00 | technomancy | it's very easy to run Leiningen if you're not on Windows. what problems are you having? |
| 16:00 | technomancy | I mean, to just install and run it. It may be tricky to do certain things. |
| 16:01 | seancron | Chousuke: Well I want to repeatedly lookup the hosts to see when they're up or down |
| 16:02 | cmihai | http://paste.lisp.org/display/112914 |
| 16:02 | cmihai | Hm.. yeah, looks for 1.2.0 |
| 16:02 | technomancy | cmihai: did you follow the instructions for self-install? |
| 16:03 | technomancy | sorry, I've just never heard of anyone having a hard time installing leiningen unless they were on Windows. |
| 16:03 | technomancy | need to take off, but you can email the leiningen mailing list if you hit issues that aren't covered in the readme |
| 16:04 | cmihai | K. |
| 16:08 | cmihai | Did run self-install though. |
| 16:08 | slyrus | anyone around use fnparse? |
| 16:08 | cmihai | Aha, the jar files are corrupt |
| 16:08 | slyrus | cmihai: are you trying to self-install from the git HEAD? |
| 16:08 | jfields | chouser, Chousuke, et al. Do you think using a destructured value in the next destructure is a bad idea? e.g: (let [x (fn [{y :k} {z y}] z)] (println (x {:k :v} {:v :s}))) |
| 16:09 | cmihai | No, I used the self-install command, but the downloaded jars are full of html :-) |
| 16:10 | slyrus | yes, but you used the self-install command from some particular version of leiningen. if that was the head, it won't work. |
| 16:10 | cmihai | Aha the jar contains: Octocat is sad That page doesn't exist! |
| 16:10 | cmihai | Fuck me. |
| 16:10 | slyrus | you need to check out a pre-1.2.1 version, do lein self-install, then I think you can checkout master |
| 16:11 | slyrus | there's no jar for 1.2.1 in the repo. I was griping at technomancy about this yesterday. it's a trivial fix. |
| 16:11 | chouser | jfields: wow, that's subtle |
| 16:12 | chouser | jfields: my first instinct is that it wouldn't work. I see now why it does, but I guess I wouldn't even be sure future implementations of destructuring would support it. |
| 16:12 | jfields | chouser, I can actually use that in some prod code, it's exactly what I want, but it seems like it might work by accident. |
| 16:12 | chouser | yeah |
| 16:13 | chouser | I can see that it could be useful, but we usually think of fn args as binding simultaneously. |
| 16:13 | chouser | and you're neatly skirting that little assumption. |
| 16:14 | jfields | chouser, yeah, like you I didn't think it would work either, which is why I'm concerned that it wont always. =) |
| 16:14 | cmihai | Yeah, sorry, I can't figure this out at all. The more things I fix the more errors come up, and I'm getting dizzy. Maybe another day :-) |
| 16:15 | slyrus | cmihai: git checkout 3dc47c1382ae3f05e3ae79267d9d3aa3120b13d8 ; lein self-install |
| 16:15 | jfields | chouser, thanks for your input. I guess I'll use it for now. it should be obvious when it stops working, so i guess it's not a risk. |
| 16:16 | chouser | heh. ok. |
| 16:16 | chouser | I guess personally I wouldn't. It wouldn't be that hard to do the second part in a separate 'let', right? |
| 16:17 | technomancy | slyrus: it is documented now at least. |
| 16:18 | slyrus | technomancy: ah, good. |
| 16:19 | jfields | chouser, the actual prod code is: (defmethod decode :ack [_ {id :id} {order id}] (assoc order :type :ack :to :client)) |
| 16:21 | jfields | chouser, I could just grab the map in the fn body, but it doesn't seem necessary. Or maybe it is. I can't see anything that's motivating me to go either way. I think the sequential destrucure reads a bit better. |
| 16:22 | chouser | (defmethod decode :ack [_ {id :id} ordermap] (assoc (get order id) :type :ack :to :client)) ; would be the "other way"? |
| 16:22 | chouser | er |
| 16:22 | chouser | (defmethod decode :ack [_ {id :id} ordermap] (assoc (get ordermap id) :type :ack :to :client)) |
| 16:22 | cmihai | slyrus: Wow, amazing. |
| 16:23 | jfields | chouser, yes. |
| 16:23 | cmihai | I tried doing the same fix by hand, but failed with the -SNAPSHOT thing btw. |
| 16:23 | cmihai | It worked with the older git revision. Thanks a bunch |
| 16:23 | slyrus | yw |
| 16:24 | cmihai | Now to remember what the hell I installed this for |
| 16:24 | cmihai | Installing thee things is like tracing a java error... |
| 16:24 | cmihai | Oh, right, getting swank-clojure working. |
| 16:24 | cmihai | And that to get slime. |
| 16:26 | technomancy | cmihai: so... why didn't you just use the install instructions in the readme? you don't need a checkout at all. |
| 16:26 | cmihai | Bloody hell, that was easy :-) |
| 16:26 | cmihai | technomancy: I'm pretty sure I did.... |
| 16:27 | cmihai | I think I must have gotten the wrong lein script at *some* point. |
| 16:30 | cmihai | I personally don't like this auto-magic download stuff to something called .m2, whatever. I tends to fail in unpredictable ways.. Anyway, nevermind, slime-connect works, and I can run the bloody thing from emacs. Mission accomplished. Thanks. |
| 16:38 | slyrus | cmihai: I'm with you, man. I'm a big fan of (other than the name) the checkouts directory though! |
| 16:40 | tomoj | does that mean you'd rather download the source repo for each dep for a project you want to use (and for each of their deps...) and symlink them into checkouts/ than run `lein deps` ? |
| 16:41 | cmihai | Yup. |
| 16:42 | slyrus | tomoj: yes |
| 16:42 | tomoj | leiningen itself has 27 deps |
| 16:42 | tomoj | sounds like fun |
| 16:42 | slyrus | tomoj: auto-dependency-chaining leads to things like leiningen having 27 deps! I view that as a bug not a feature.. |
| 16:43 | cmihai | Gives me better control over what I'm using, and lets me actually understand what I'm doing and why. Like I've said, I didn't actually want leiningen at this point, just to get a IDE for Clojure up and running (emacs + slime). And that proved to be a PITA. |
| 16:44 | tomoj | ok, but when you actually want to run someone else's code or publish your code as a library? |
| 16:44 | cmihai | And the way it failed (by downloading a .html page to a .jar without any kind of checking) was quite.. troublesome. |
| 16:44 | tomoj | that is troublesome |
| 16:45 | cmihai | So every time there's a dead URL or even a captive portal |
| 16:45 | cmihai | I run the risk of nuking all my jars? |
| 16:45 | raek | cmihai: did you try to use the bare swank-clojure jar? |
| 16:45 | raek | do get swank running, you really only need that one plus clojure and contrib |
| 16:45 | raek | ...if you want to do things manually |
| 16:47 | cmihai | Tried with cljr swank, it wouldn't start. didn't bother to figure out what main class to load |
| 16:48 | raek | if you have the swank jar file, you can start swank by hand |
| 16:48 | raek | it's just clojure... |
| 16:49 | raek | the main class is clojure.main to start the clojure repl |
| 16:49 | cmihai | I mean with swank-clojure |
| 16:49 | raek | java -cp 'dir-with-jars/*' clojure.main |
| 16:49 | raek | you start it in clojure |
| 16:49 | raek | I don't think it has a main class |
| 16:50 | cmihai | Oh. |
| 16:50 | cmihai | Didn't know that :-) |
| 16:50 | raek | (require 'swank.swank) (swank.swank/start-repl) |
| 16:50 | raek | it's under the section "embedding" in the swank readme |
| 16:51 | raek | which in this case should be read as "starting swank manually" |
| 16:51 | raek | the most common way is to start swank with some tool that sets the classpath automatically |
| 16:53 | slyrus | cmihai: of course if you follow the path I took, you'll figure all this stuff out, then finally succumb and just start using lein swank (and even lein deps to an extent) |
| 16:57 | cmihai | slyrus: yeah, that worked, thanks. |
| 16:59 | cmihai | I'll go with that until I figure all this stuff out. Like I said, atm I just want a slimy emacs + basic clojure & contrib, and learn the basics. I'd rather have my environment setup and editor first, then learn the language, then the internals. |
| 16:59 | cmihai | Should not be too different from CLISP I guess. Documentation is kind of lacking though. Any books worth getting? |
| 17:05 | cmihai | Oh, and maybe a minor question, how can I use it a scripted interpreter? Eg: send it something like clojure '(+ 3 1)' |
| 17:09 | raek | java -cp 'yada yada yada' clojure.main -e "(+ 3 1)" |
| 17:10 | dnolen | cmihai: raek: that is going to be painfully slow. I highly recommend using cake if you don't want to buy into a particular IDE, or Vim, Emacs. cake uses persistent VMs so it's fast |
| 17:10 | dnolen | and supports: cake eval '(println (+ 4 5))' |
| 17:11 | dnolen | I'm an Emacs person myself, but cake opens so doors for people who prefer text editors like TextMate |
| 17:13 | dnolen | http://github.com/ninjudd/cake |
| 17:13 | lancepantz | dnolen: i saw your github tickets, are you using the gem install? |
| 17:13 | dnolen | lancepantz: everything is working beautifully now, ninjudd dropped a bunch of patches, 0.3.4 is slick |
| 17:15 | lancepantz | dnolen: awesome, its still kinda flaky at times, i'm working on a bunch of tests, but that's just become an excuse to add new features to the test task |
| 17:16 | cmihai | I'm an Emacs guy, so it has to be slime. I've got that setup already, and now it works with clojure too. So I'm fine with that. I'll look into cake, thanks. |
| 17:16 | lancepantz | cake supports swank as well |
| 17:17 | lancepantz | C-c C-k updates the persistent jvm as well |
| 17:17 | cmihai | Got a url handy for cake btw? |
| 17:18 | dnolen | lancepantz: yeah I can see that there are issues, but I think the ground work is there for getting good Clojure support in simpler environments with cake. |
| 17:18 | lancepantz | http://github.com/ninjudd/cake |
| 17:18 | cmihai | Ah, emacs-cake not clojure? |
| 17:19 | cmihai | Oh. :-) |
| 17:19 | dnolen | I'm not going to use it much myself, but I'm thinking about putting a basic TextMate bundle together for people who want a simpler install 1) gem install cake 2) install TextMate Clojure bundle 3) hack |
| 17:20 | cmihai | Strange, I grepped github for cake written in clojure and no hits. |
| 17:24 | Lajla | ahh, technomaz, I have crossed oceans of time to be with you. |
| 17:30 | jweiss | I'm trying to sharpen my FP skills by getting rid of imperative constructs where possible. I have a list of "tests" to run, and a list of "results". My "execute" function needs to go through the list of tests, and build up results. but it's not a simple map function. Each test depends on the entire result set to date. is there a FP way to do this (without loop/recur)? |
| 17:33 | gregh | start with a function that takes a result set and a sequence of tests, and runs the first test in the sequence |
| 17:34 | gregh | call itself recursively with the new result set, and the rest of the sequence of tests |
| 17:34 | gregh | standard initial and termination conditions apply |
| 17:34 | jweiss | gregh: ok, that's pretty much what i have now, minor quibble between a recursive fn and loop/recur |
| 17:37 | gregh | yeah, it's a pretty fine line |
| 17:38 | gregh | clojure provides loop/recur as a limited version of tail recursion just because the jvm doesn't allow the real thing |
| 17:40 | jweiss | yeah i was thinking more along the lines of a function like map, where it makes a lazy seq of results |
| 17:40 | pdk | ,(binding [x 1] x) |
| 17:40 | clojurebot | java.lang.Exception: Unable to resolve var: x in this context |
| 17:40 | pdk | that is so dumb |
| 17:41 | pdk | (doc binding |
| 17:41 | clojurebot | EOF while reading |
| 17:41 | pdk | (doc binding) |
| 17:41 | clojurebot | "([bindings & body]); binding => var-symbol init-expr Creates new bindings for the (already-existing) vars, with the supplied initial values, executes the exprs in an implicit do, then re-establishes the bindings that existed before. The new bindings are made in parallel (unlike let); all init-exprs are evaluated before the vars are bound to their new values." |
| 17:42 | pdk | ok whats the workaround |
| 17:42 | dnolen | pdk, *already existing* vars |
| 17:42 | pdk | ah heh figures |
| 17:42 | jweiss | it probably fails in the init |
| 17:42 | pdk | i saw some little footnote on the site that said root bindings were optional and i guess i took it out of context then |
| 17:43 | pdk | prob applies to something else |
| 17:51 | shoover | is this technically a race condition on *loaded-libs* since it's dereferenced outside a transaction and then updated later? http://github.com/clojure/clojure/blob/master/src/clj/clojure/core.clj#L4757 |
| 17:57 | technomancy | cmihai: the problem is that curl silently fails on 404s; I thought it would give an error message |
| 17:58 | technomancy | cmihai: could you create a bug report? |
| 17:58 | technomancy | (btw; self-install is a special case since it has to be implemented in the shell; you'd never see HTML-files-as-jars from a lein deps run) |
| 18:09 | lancepantz | is it considered bad form to copy a function from contrib into your src? in the case where that's all the project will ever use from contrib |
| 18:11 | lancepantz | i'm playing around with difform, it has contrib 1.1 as a dep all for a single one line function |
| 18:11 | technomancy | cmihai: anyway, what I meant about the instructions is that it works better if you download the stable version of the lein script |
| 18:11 | lancepantz | so then i end up with contrib 1.1 and 1.2 in as well as a clojure 1.1 jar in my lib |
| 18:12 | technomancy | slyrus: I'm not sold on the name of the checkouts dir; open to suggestions |
| 18:12 | slyrus | lib-src? |
| 18:16 | jweiss | is there a more concise way to express (if x x 0) ? |
| 18:16 | jweiss | well that's pretty concise, but more obvious i guess |
| 18:16 | cmihai | technomancy: Yeah. I'll dig a bit deeper tomorrow, I'm shutting down for the night now :-). |
| 18:17 | technomancy | jweiss: (or x 0) |
| 18:24 | neotyk | ,((fn [f & {:as options}] (f options)) (fn [& {:as options}] (println options)) :a 1) |
| 18:24 | clojurebot | java.lang.IllegalArgumentException: No value supplied for key: {:a 1} |
| 18:25 | neotyk | How do one make {:as options} fall through? |
| 18:28 | neotyk | in example :a 1 gets converted to map, is there a way to splice it? |
| 18:33 | arohner | neotyk: I don't know what you mean by fall through or split it |
| 18:39 | slyrus | hmm.. in what interface would I find second? |
| 18:41 | neotyk | arohner: ((fn [& {:as a}] (println a)) :key "value") |
| 18:42 | neotyk | so :key "value" gets converted to map named a |
| 18:42 | neotyk | what if from that fn I would like to call another fn with [& {:as |
| 18:42 | neotyk | *** a}] ? |
| 18:43 | neotyk | how would I splice a that was converted from :key "value" to |
| 18:43 | neotyk | *** {:key "value"} back to :key "value" |
| 18:46 | arohner | oh, apply |
| 18:47 | arohner | hrm, though that gets weird with maps |
| 18:47 | slyrus | or, put another way, what interfaces do I need to support s.t. (let [[x1 x2] my-obj] ...) works? |
| 18:47 | slyrus | I thought nth would be enough, but apparently that's not the case |
| 18:48 | slyrus | oh, I think I need to support next |
| 18:48 | neotyk | ,((fn [f & {:as options}] (apply f options)) (fn [{a :a}] (println a)) :a :b) |
| 18:48 | clojurebot | nil |
| 18:49 | neotyk | would expect :b |
| 18:49 | neotyk | sorry, not that example |
| 18:51 | neotyk | here it is |
| 18:51 | neotyk | ,((fn [f & {:as options}] (apply f options)) (fn [& {:as options}] (println options)) :a :b) |
| 18:51 | clojurebot | java.lang.IllegalArgumentException: No value supplied for key: [:a :b] |
| 18:53 | arohner | ,((fn [f & {:as options}] (apply f (flatten (seq options)))) (fn [& {:as options}] (println options)) :a :b) |
| 18:53 | clojurebot | {:a :b} |
| 18:53 | arohner | since it's a map, you need to flatten before applying |
| 18:53 | arohner | if those were seqs/vectors, the flatten wouldn't be necessary |
| 18:53 | neotyk | arohner: thank you very much :) |
| 19:22 | lancepantz | this is the clojure project i've been working on, if anyone cares. finally got it into production. http://blog.geni.com/2010/07/new-beta-feature-revisions.html |
| 20:09 | slyrus | yay: (add-bond (reduce add-atom (make-molecule) [c1 c2]) c1 c2) finally works. |
| 21:03 | aldebrn | I sort of wish #"string" yielded a raw string, rather than compiling to a Pattern, so that I could do (format #"<b>%s</b>" bolded-statement), e.g. |
| 21:04 | aldebrn | Well, that example was horrible, I meant something involving escapes: (format #"{\em %s}" emph-statement) |
| 21:08 | Bahman | Hi all! |
| 21:20 | eckroth | is there some advantage to using (fn) over #() ? |
| 21:21 | rhudson | I'd say the longer the function, the more appropriate fn is |
| 21:21 | eckroth | rhudson: sure, because of the % issue |
| 21:21 | eckroth | rhudson: but is (fn [_] (blah)) better than #(blah) ? |
| 21:22 | rhudson | also, nested anonymous functions |
| 21:22 | eckroth | rhudson: like, in how its executed? performance difference? debugging issues? |
| 21:23 | rhudson | The reader translates the #() form into the fn form, so they run identically |
| 21:23 | eckroth | rhudson: ah ok |
| 21:23 | rhudson | #(blah) is better than (fn [] (blah)) |
| 21:24 | eckroth | rhudson: I see in rhickey's ant code that he used (fn [_] (blah)) http://clojure.googlegroups.com/web/ants.clj |
| 21:24 | eckroth | rhudson: though perhaps that's no longer idiomatic |
| 21:25 | rhudson | Note that (fn [_] blah) is a function that takes one argument that's ignored; #(blah) is 0-argument |
| 21:25 | eckroth | rhudson: but #(blah %) is 1-argument? so it checks inside and counts % ? |
| 21:26 | rhudson | right |
| 21:26 | rhudson | #(blah %1 %2) is a 2-arg function |
| 21:26 | eckroth | rhudson: as is #(blah %2) I suppose |
| 21:26 | eckroth | rhudson: 2-arg that is |
| 21:27 | rhudson | I would guess so; dunno |
| 21:27 | eckroth | ,(#(print %2) 1) |
| 21:27 | clojurebot | java.lang.IllegalArgumentException: Wrong number of args (1) passed to: sandbox$eval500439$fn |
| 21:28 | eckroth | ,(#(print %2) 1 11) |
| 21:28 | clojurebot | 11 |
| 21:28 | rhudson | hah |
| 22:16 | lancepantz | anyone know what i could have done to aquamacs that would make M-s print a beta? |
| 22:19 | lancepantz | well, (setq mac-option-modifier 'meta) fixed it |
| 22:57 | tomoj | lancepantz: was it a ß? |
| 22:57 | lancepantz | yep |
| 22:58 | lancepantz | don't know how it got unbound, bizzare |
| 22:58 | tomoj | that's just mac's default thing |
| 22:58 | tomoj | option for extra characters |
| 22:58 | tomoj | oh you mean the variable, dunno |
| 22:58 | lancepantz | yeah |
| 23:18 | cais2002 | hi guys, did any of you encounter a StackOverflowError with latest 1.2.0-master-20100727.210144-91? at clojure.lang.Keyword.intern(Keyword.java:39) |
| 23:19 | cais2002 | it does not happen for 1.2.0-beta1 |
| 23:37 | daaku | i've been searching for a bit, but can't seem to find any code coverage libraries, anyone know if one exists? |
| 23:38 | lancepantz | daaku: i don't believe so |
| 23:38 | daaku | lancepantz: cool, thanks |
| 23:39 | lancepantz | daaku: i was looking at something, i think it may have been swank or clojure-test-mode that basically assumed that tests for the foo ns were going to be in test_foo |
| 23:40 | daaku | lancepantz: i don't get how that would translate to code coverage info |
| 23:41 | lancepantz | it just made me assume that there wasn't a code coverage library |
| 23:44 | scottj | Is there a version of -> that with more than two args isn't defined in terms of itself? |
| 23:46 | scottj | and can you monkey patch functions? :) like add a new arity function to an existing one from core? |
| 23:48 | tomoj | you can, but you shouldn't |
| 23:53 | ttmrichter | There's nothing wrong with monkey-patching that a good caning wouldn't solve. |