#clojure log - Apr 18 2009

The Joy of Clojure
Main Clojure site
Google Group
List of all logged dates

0:01 danlarkin: generationkill: yes

0:02 generationkill: In one of the examples on clojure.org; clojure.xml/parse is applied to "build.xml" from the clojure directory...

0:02 the returned value contains things like {... :contents nil}

0:02 which is not the same as {...}

0:20 durka42: can you call jython from clojure?

0:23 cp2: probably

0:24 i dont see why not

0:24 its just another library

0:35 generationkill: ,(find-doc "enumeration")

0:35 clojurebot: ------------------------- clojure.core/enumeration-seq ([e]) Returns a seq on a java.lang.Enumeration

0:36 generationkill: So enclojure is the best IDE these days?

0:40 durka42: vim :p

0:42 generationkill: How do you search and access the vast Java library documentation? (I'm a Java/JVM noob)

0:53 durka42: generationkill: google :)

0:53 also clojurebot has some shortcuts

0:53 ~javadoc java.util.concurrent

0:53 fail

0:53 well... you get the idea

0:55 generationkill: fact: each google search wastes 1 kJ of energy, on average. Save the trees, etc.!

0:55 durka42: i remember that article

0:55 it was a very dubious fact

0:56 slashus2: riight

0:58 generationkill: I wonder if each search distributes its workload among many nodes

0:58 so even if your search took 0.2 seconds, maybe hundreds of nodes were involved

0:59 cp2: ~paste

0:59 clojurebot: lisppaste8, url

0:59 lisppaste8: To use the lisppaste bot, visit http://paste.lisp.org/new/clojure and enter your paste.

1:00 generationkill: It's not dubious, google says so: http://googleblog.blogspot.com/2009/01/powering-google-search.html

1:02 lisppaste8: cp2 pasted "*what*" at http://paste.lisp.org/display/78777

1:04 cp2: hrm

1:04 now that i look at that stack trace again it looks like something to do with BCEL

1:04 but evidently caused by my code...somewhere

1:09 Constant THAT = (Constant) o2;

1:09 this is the problematic code in BCEL

1:09 so now i need to find out what is causing a Constant's equality to be compared with just a vanilla Object instance

1:46 danlarkin: so...srsly? you still can't set the java user agent

1:47 cp2: afaik you can with URLConnection

1:48 danlarkin: not anywhere I can find

1:50 oh, perhaps just by setting the User-Agent header... I'll try that

1:50 cp2: yes, thats what i mean

1:53 danlarkin: cp2: thanks, success. This is a sign I need to go to bed

1:53 cp2: :)

1:53 danlarkin: when I miss things like that :)

1:53 cp2: sleep is for the week

1:53 1:53AM, i am not flinching

1:53 wow

1:53 weak*

1:53 haha

2:08 durka42: i would say sleep is more for the weekend

2:22 jli: I tried to use Common Lisp to play with the Netflix dataset. I wanted to make a hash table for each user, keys being movies they've seen and values being their ratings for them

2:24 so that's ~480,000 hash tables. in the middle of filling them by reading the data (~100,000,000 ratings), both SBCL and clisp crashed. clisp gave an out-of-memory error and seg faulted and sbcl gave a "heap exhausted" error.

2:25 my friend using Python had no problem building 480,000 hash tables and sticking all the ratings across them, so I was disappointed. any guesses as to how well clojure would handle it?

2:29 cp2: quite well if you go lazy

2:34 jli: hm, that's an interesting idea..

7:05 noidi: kotarak, i'm having some trouble installing vimclojure (thanks for writing it, seems very cool already judging by the screenshots and docs!)

7:05 kotarak: noidi: hi, what kind of trouble?

7:05 noidi: kotarak, in ftplugin/clojure.vim, the line if exists("b:vimclojure_namespace")

7:05 evaluates to false

7:06 so i don't get the keybindings or omnifunc

7:06 do you know what might be wrong?

7:06 kotarak: yes, maybe it does evaluate to false. Did you start the ng-server?

7:07 noidi: yes

7:07 java com.martiansoftware.nailgun.NGServer

7:07 NGServer started on, port 2113.

7:07 kotarak: Ok.

7:07 noidi: /home/noid/code/clojure/clojure.jar:/home/noid/code/clojure-contrib/clojure-contrib.jar:/home/noid/code/vimclojure/vimclojure.jar:

7:07 that's my $CLASSPATH

7:07 kotarak: Did you set add the line "let clj_want_gorilla = 1" to your .vimrc?

7:07 -set

7:08 noidi: let g:clj_want_gorilla = 1

7:08 kotarak: ok.

7:08 Did you configure the location of your nailgun-client?

7:08 noidi: let vimclojure#NailgunClient = "/home/noid/code/vimclojure/ng"

7:09 kotarak: Ok.

7:09 noidi: i'm running vim 7.2 on 32bit ubuntu jaunty beta

7:09 kotarak: What does the following command say when you do it manually in some shell: /home/noid/code/vimclojure/ng de.kotka.vimclojure.nails.NamespaceOfFile < some-clojure-file-here.clj

7:10 noidi: and i removed my old ~/.vim* files (temporarily of course:) to make sure that i don't have any settings or plugins that might break vimclojure

7:11 java.lang.ClassNotFoundException: de.kotka.vimclojure.nails.NamespaceOfFile

7:11 that's odd...

7:11 kotarak: Hmmm... Can you try to remove the trailing : from the classpath?

7:12 * kotarak is just guessing now...

7:13 noidi: didn't help

7:13 kotarak: hmmm....

7:13 Odd...

7:13 noidi: but this works: /home/noid/code/vimclojure/ng clojure.lang.Repl

7:14 kotarak: can you try: /home/noid/code/vimclojure/ng de.kotka.vimclojure.nails.Repl -r

7:14 Then just type something like (prn :xxx) and a Control-D

7:15 noidi: that also gives me the ClassNotFoundException

7:15 kotarak: Ok. Something is wrong with the vimclojure.jar.

7:16 noidi: I also tried starting the serve with: java -cp vimclojure.jar com.martiansoftware.nailgun.NGServer

7:16 but it didn't help

7:16 kotarak: Can you check that there a bunch of class files when you do a "jar tf vimclojure.jar"?

7:18 noidi: yes

7:18 kotarak: hmmmm....

7:18 noidi: i removed the vimclojure.jar file and did a rebuild

7:19 kotarak: Did it help?

7:19 noidi: apparently the jar i had was something left from and older installation attempt, because now it stayed under "build"

7:19 kotarak: yes. That's due to changes in the build system.

7:19 noidi: java -cp build/vimclojure.jar com.martiansoftware.nailgun.NGServer

7:20 ./ng de.kotka.vimclojure.nail.Repl -r

7:20 java.lang.ClassNotFoundException: de.kotka.vimclojure.nail.Repl

7:20 kotarak: nails <- missing s

7:21 Chousuke: nailgun is nice for the clj script

7:21 noidi: java.lang.NoClassDefFoundError: clojure/lang/IFn

7:21 Chousuke: now I get an instant repl when I type clj instead of having to wait :P

7:21 noidi: this is progress, i guess :)

7:21 kotarak: Ok. That's good! now the clojure.jar is missing.

7:22 Setup your initial classpath with the correct vimclojure.jar and you should be fine. :)

7:22 noidi: thanks a lot, kotarak!

7:22 kotarak: Chousuke: yes. Nailgun is nice. I will also look into clj-server.

7:22 noidi: np :)

7:23 noidi: maybe vimclojure could print an error message if the connection fails?

7:26 and it could also bind the keys it uses even if the connection fails

7:26 it's pretty strange to try to open the repl with \sr and end up in the insert mode with the letter under cursor replaced with r :)

7:27 (but now it works for me, thanks again!:)

7:27 kotarak: noidi: yes will work on robustness

7:29 noidi: i wish i knew vimscript so i could give a hand

7:30 but learning one new programming language (clojure) is enough work :)

8:04 kotarak, why are 'o' and 'O' commands slow when using vimclojure?

8:06 leafw: noidi, kotarak : I wonder about that too. I think it has to do with syntax evaluation, to compute the number of white space.

8:08 noidi: the weird thing is that I<cr> and A<cr> are not slow at all

8:09 and I think they should be equivalent in functionality

8:09 I think I'll just nmap o and O to those sequences for now :P

8:34 kotarak: noidi, leafw: I don't actually. On #vim no one could answer. I'll ask on vim-dev. The functions used for o/O are the same as for "normal" <CR>....

8:34 I don't know...

8:36 noidi: i must say, i'm *very* impressed with vimclojure

8:36 kotarak: noidi: thanks :D

8:37 noidi: i've always thought that these kind of features are for emacs users and their arthritic pinkies, not us vimmers :)

8:37 kotarak: noidi, you will get used to it ;)

8:37 Ok. Another try on #vim...

10:28 duck1123: hey guys. Has anyone built any sort of "jump-to-test" command for emacs yet?

10:28 I want something where I can be editing clojure code, and hit a key combo to place poinn in the test for that function

12:08 StartsWithK: hi, i am getting a strange error after i created a class with gen-class, at runtime i get the message:

12:09 java.lang.ClassFormatError: Duplicate method name&signature in class file net/ksojat/truba/ClojureCompile

12:09 what is that?

12:09 kotarak: Maybe you declared a method, which exists already in a super-class? (just guessing)

12:09 StartsWithK: i don't have any duplicate names

12:09 hmm

12:09 Task has init method

12:09 but i set :init to init-task

12:11 is it maybe that i dont declare execute in gen-class that it can throw BuildException

12:11 how can i even declare that

12:11 kotarak: You can't, I think.

12:12 StartsWithK: ups, Task dosn't even have init(), so it can't be that

12:17 is there some kind of a tool that will dump me a .class file in readable form?

12:40 danlarkin: StartsWithK: like a disassembler?

12:49 StartsWithK: danlarkin: yes

12:50 naf3ts: comes with the jdk

12:51 javap - Java class file disassembler

12:54 StartsWithK: naf3ts: thanks

12:54 it dosn't show any duplicate method names.. strange

15:19 Lau_of_DK: Good evening gents

15:20 Im facing a rather troublesome issue. When serving up a servlet using Jetty, the connection type is automatically set to "keep-alive". This keeps the connection open for about 8 - 9 seconds, longer after the page has been displayed. How do I set the connection type to "close", so that I can rapidly close it ?

15:24 eevar: Add a header, "connection: close", or something along those lines. read the http rfc for more details. You really shouldn't worry about it, tho. you'll lose more performance than you'll gain if your site has images, javascripts and similar..

15:25 danlarkin: However if you have another server (not your app server) serving the content from disk, you should indeed have Connection: close

15:25 Lau_of_DK: I really should worry, the applet is passed through proxies, all waiting for the close signal before passing the signal on, giving me load times that are enourmous

15:26 eevar: i think you're misdiagnosing your issues

15:26 danlarkin: your app server should probably not be using keep-alive, but any proxies upstream probably should

15:26 eevar: proxies don't have to wait for connection close to relay the data

15:27 Lau_of_DK: Maybe the dont have to, but my clients proxy seem to be doing this - but you could be right of course, I could be misdiagnosing

15:28 from the rfc "A proxy server MUST NOT establish a HTTP/1.1 persistent connection with an HTTP/1.0 client (but see RFC 2068 [33] for information and discussion of the problems with the Keep-Alive header implemented by many HTTP/1.0 clients). "

16:30 quidnunc: Is there something like "->" that will pass each output item individually (i.e. to be "map"ped) to subsequent forms instead of a list of the outputs?

16:49 durka42: quidnunc might want a monad :)

16:49 http://intensivesystems.net/tutorials/monads_101.html

16:52 dreish: Yeah, that does sound eerily like the monad tutorial's first example.

17:30 quidnunc: durka42, dreish: I don't see what facilities monads provide for making this easier. Can you spell it out for me? The first example in the tutorial doesn't seem to do what I want and it isn't obvious to me how to adapt it.

17:35 dreish: It looks like what you're asking for is the sequence monad (sequence-m), but personally I don't know that I'd use it. I'd probably just do something with mapcat. I'm not sure exactly what you're trying to do, though.

17:36 quidnunc: dreish: The function composition example for the sequence monad wouldn't work because the output of the first function is a list. It is the same for ->.

17:36 dreish: That first sentence doesn't seem to logically follow from anything.

17:37 Based on my limited understanding of it, I think sequence-m wants functions that return lists.

17:37 (Or other sequences.)

17:37 quidnunc: dreish: ("->" foo bar) takes the output of foo and passes it to bar as one argument. I want a map over bar

17:38 or rather to map bar over the list returned by foo

17:38 dreish: Right, so (domonad sequence-m [a (foo), b (bar a)] b), right?

17:39 Though I'd just do (map bar (foo))

17:39 quidnunc: dreish: It's more like ("->" foo bar baz blah batetc)

17:39 dreish: It's more like ("->" foo bar baz blah bat etc)

17:40 dreish: You could write a map-> macro, or use the sequence monad. Or write out all the maps.

17:40 Actually, map-> is just a function, not a macro.

17:41 quidnunc: dreish: In the monad version you gave are you sure bar doesn't bind "a" as a list?

17:42 dreish: No, I've never used it.

17:42 I'm just reading the tutorial.

17:42 quidnunc: okay

17:42 dreish: As I said, I'd probably prefer to do this as a function.

17:46 ~paste

17:46 Yikes, no bot.

17:46 (defn map-> [s [f & more]] (if more (recur (map f s) more) (map f s)))

17:47 user=> (map-> [1 2 3] [#(+ % 1) #(* % 2)])

17:47 (4 6 8)

17:47 Smiley not intended.

17:48 kotarak: ,(map (comp #(+ % 1) #(+ % 2)) [1 2 3])

17:49 dreish: (4 5 6)

17:49 kotarak: <dreish> Yikes, no bot.

17:49 * dreish is a little slower than clojurebot, but he'll do.

17:49 kotarak: hehe ;)

17:52 quidnunc: Thanks dreish. Is it necessary that the second argument be a list?

17:52 dreish: For the way I wrote map->.

17:53 Or you could use map comp, like kotarak.

17:53 kotarak: quidnunc: you can try (defn map-> [s & [f & more]] ...) and then (map-> s f1 f2 f3)

17:53 dreish: kotarak: The recur won't work, then.

17:53 kotarak: Ah. geez....

17:53 dreish: That was why I did it that way.

17:53 * kotarak should go to bed now... It's getting late...

19:36 rabidsnail: How do I take make a new vector out of the elements of a bunch of other vectors? like [1] [2 3] [4] -> [1 2 3 4]

19:36 hiredman: (apply vector ...)

19:36 or vec

19:36 I never remember which one does what

19:38 (into [] (concat [1 2] [3 4])); also works

19:39 rabidsnail: Cool, thanks!

19:43 stuhood: ~def subvec

19:44 oh no! clojurebot... wru

19:44 hiredman: machine is down, for unknown reasons :(

19:44 stuhood: ouch

19:44 hiredman: Yeah

19:48 lisppaste8: quidnunc pasted "map->" at http://paste.lisp.org/display/78810

19:48 quidnunc: How come this recur seems to loop forever? ^

19:49 hiredman: recur with & is troublesome

19:49 more ends up being (nil)

19:49 not nil

19:49 or ()

19:49 quidnunc: I see.

19:49 hiredman: and it sticks at (nil)

19:49 quidnunc: What is the idiomatic work around?

19:50 hiredman: what is the purpose of map->?

19:51 quidnunc: hiredman: Like "->" but instead of the output list of the first form being passed to the second form, the second form is "map"-ped over the output list.

19:52 <dreish> user=> (map-> [1 2 3] [#(+ % 1) #(* % 2)])

19:52 <dreish> (4 6 8)


19:53 hiredman: Except I don't want to pass the forms as a list ((map-> foo bar baz) not (map-> foo [bar baz]))

19:53 hiredman: uh

19:53 dreish: quidnunc: Why?

19:53 What's driving all this?

19:54 hiredman: if you are passing it that way then you don't need & anyway

19:54 quidnunc: dreish: Besides not looking right to me it is not consistent with ->

19:54 hiredman: I would just compose all the mapping operations and use map

19:54 quidnunc: Also, why should the first form be different then the others

19:55 hiredman: (map (comp bar baz) foo)

19:55 something like that

19:55 quidnunc: dreish: What I am doing is trying to thread a bunch of xml-> statements

19:55 hiredman: (map (comp baz quantz) (bar foo))

19:56 if you have a pipeline you use over and over

19:56 (def op1 (partial map (comp baz quantz)))

19:57 (-> foo bar op1)

19:57 (-> foo- bar- op1)

19:57 quidnunc: No it is not the same pipeline.

19:57 hiredman: (- standing in for ' to mark foo prime)

19:58 quidnunc: Basically, I'm using xml-> to find a element in a DOM tree, then I want to continue searching from that element.

19:58 So I want to do (-> (xml1-> blah blah) (xml1-> blah blah)) but using xml-> (multiple results)

19:59 (those blah's are not the same :)

19:59 hiredman: sounds like you want reduce

19:59 quidnunc: I don't think so.

20:00 Example: Find all "span" tags that have "table" as a parent.

20:01 So I'm thinking of something like (map-> (xml-> :table) (xml-> :span))

20:01 hiredman: (reduce #(%2 %) blah [#(xml1-> % blah) (partial map some-xml1->fun)])

20:02 quidnunc: (some details omitted)

20:02 mattrepl: quidnunc: something like this: http://clojure.org/libraries#toc14

20:03 quidnunc: mattrepl: I'm using xml zip filter. I'm talking about those functions. But there seems to be no easy way to describe certain patterns (e.g. from above all span tags with table parents)

20:03 s/easy/concise

20:06 hiredman: "multi-stage filter" filter sounds exactly like what you want

20:07 quidnunc: hiredman: Does reduce return more than 1 element?

20:07 mattrepl: haven't used that library before, but zip-filter/xml-> doesn't do what you want?

20:07 hiredman: quidnunc, of course not, nothing can return more then one thing

20:08 the one thing can be some sort of collection

20:08 mattrepl: (nm, just read more of the channel log)

20:09 * mattrepl goes back to doing one thing at a time

20:12 quidnunc: mattrepl: No. At least not as far as I can tell. The trouble is describing that you want to search descendants of a node that you found through some other search. I may be able to describe properties of anscestors but that would appear to trigger a search down the tree and then back up which seems ugly and inefficient (contrast with search down the tree until you find the node you want and then continuing the search from there).

20:13 hiredman: I don't want to use xml1-> I want to use xml->. Can reduce help me there?

20:15 hiredman: Uh, never mind I missed the map in your snippet

20:17 But it won't scale to an arbitrary number of selectors.

20:17 hiredman: why not?

20:18 (reduce #(%2 %) blah [#(xml1-> % blah) (partial map some-xml1->fun) (partial map some-other-fun)])

20:18 quidnunc: Sorry, what I said was misleading: I will be repeating a lot of "partial map"s

20:19 hiredman: so?

20:19 quidnunc: Okay. I just thought (map-> (xml-> ) (xml->) (xml->)) was pretty clean.

20:20 hiredman: (map-> (xml-> ) #(xml->) #(xml->))

20:20 actually

20:20 with % and # everywhere

20:20 quidnunc: Yes

20:20 hiredman: if anything partial is cleaner

20:20 (imo)

20:20 quidnunc: Fair enough

20:20 Thanks

20:38 cp2: is there already a function to check if coll A contains all of the items in coll B

20:39 i can do a sort of hackish thing with set/difference and set/intersection and empty?

20:39 but it throws an exception in some cases

20:40 hiredman: you could do some kind of map and reduce

20:40 danlarkin: set difference is what you want, though

20:40 cp2: danlarkin: thats what i tried

20:41 beware:

20:41 clojure.set=> (intersection [1 1 2 3 4] [1 4 7])

20:41 #<CompilerException java.lang.ClassCastException: clojure.lang.LazilyPersistentVector cannot be cast to clojure.lang.IPersistentSet (NO_SOURCE_FILE:0)>

20:41 clojure.set=> (intersection [1 1 2 3 4] [1 4])

20:41 hiredman: (reduce #(and % %2) (map #(.contains B %) A))

20:41 cp2: [1 4]

20:41 i dont want that to happen though

20:41 ill try that hiredman

20:42 works fine, thank you

22:35 emacsen: Dumb question, but inside a macro, if I'm looking for a new list sexp, just use list?

22:36 Chouser: sure

22:36 or `(foo bar)

22:36 emacsen: huh?

22:36 No I mean if I'm looking for sexps inside my form

22:36 can I just use list? ?

22:37 Chouser: oh. (list? foo) yeah, that's fine

22:37 emacsen: I wasn't sure if there was a more proper way

22:38 I'm showing an example macro of a postfix version of lisp, recursively reversing the form

22:38 it's dumb as sin, but it's just an example for someone

22:39 Chouser: you could use 'sequential?' if you want to allow vectors too

22:39 emacsen: but no clj forms are vectors

22:39 you don't say [print foo]

22:40 Chouser: true

22:40 emacsen: and I will assume a vector is in the correct order

22:40 Chouser: ok

22:40 Cark: (defun blah [arg1 arg2] ...

22:40 defn even

22:41 i wonder how a postfix let form would look =)

22:41 emacsen: (foo print)

22:42 but it's dumb because you have to put the parens at the beginning :)

22:43 Cark: postfix doesn't need parenthesis

22:43 at least once the arity of functions is known

22:44 emacsen: true. well want to write this thing with me? :)

22:44 Cark: hell no =P

22:44 i'm late a project

22:44 and got another one coming on monday ...

22:44 emacsen: in clj??

22:45 Cark: yes =P

22:45 emacsen: wow!

22:46 Cark: nothing fancy

22:46 it's a licence server for an existing application i'm doing now

22:46 emacsen: flexlm too good for you?

22:47 Cark: i don't know about it

22:47 customer wants custom application, that's what he gets

22:52 hum your thing is for corporate usage

22:52 hiredman: function's don't have easily accessible arity information

22:54 emacsen: hiredman, yeah I thought I was just dumb for not seeing it

22:55 hiredman: it makes me sad

22:55 Cark: ah sorry if i misled you

22:56 it was just a random thought

23:01 emacsen: okay, I'm a total n00b, but can someone show me a (loop ..) form that lets me go through items in a seq?

23:01 I'm not getting how to do the binding for the current item

23:01 Chouser: if you're walking through a seq, you probably don't want loop/recur

23:02 Cark: what do you want to do ?

23:02 there are quite a few ways to loop over a sequence

23:02 Chouser: maybe map, for, reduce, or some such

23:02 hiredman: if you are reversing all lists, map is most likely what you want

23:02 a recursive map

23:03 emacsen: I want to go through a list and reverse it, recursively

23:04 oh

23:04 hrm...

23:06 Cark: ~paste.

23:06 ~paste?

23:06 hum

23:06 hiredman: lisppaste8, url?

23:06 lisppaste8: To use the lisppaste bot, visit http://paste.lisp.org/new/clojure and enter your paste.

23:06 emacsen: I'm not entirely sure how to do that recursively?

23:07 lisppaste8: cark pasted "untitled" at http://paste.lisp.org/display/78818

23:07 hiredman: you make a function that falls itsself on lists

23:07 and map it over your top level expression

23:07 calls

23:08 emacsen: lemme try that

23:09 Cark: though i wonder why you need to reverse

23:09 that would usually mean you did something wrong

23:09 emacsen: Cark?

23:10 Oh... That's easier to explain

23:10 hiredman: Cark, he is writting s-exprs ltr instead of rtl

23:10 emacsen: I'm on a clj list and the guy is saying for a particular application he prefers postfix notation

23:10 and he wrote a solution, but it's not lispish

23:10 Cark: ah right sorry forgot about that

23:11 emacsen: so I'm showing him that (even if it's a bad idea) he could use macros for that

23:11 hiredman: using -> is sort of postfix-ish

23:11 Chouser: ((fn r [c] (cond (list? c) (map r (reverse c)) (coll? c) (into (empty c) (map r c)) :else c)) '(1 2 [3 4 (5 6 7) 8] 9))

23:11 emacsen: rather than the way he did it, which was (in essence) to build a very dumb reader

23:12 Cark: huuu nice chouser

23:12 emacsen: chouser is hard core

23:12 Cark: ,(doc empty)

23:12 cp2: no clojurebot

23:12 hiredman: clojurebot is down

23:12 emacsen: yeah I've not seen empty before

23:12 Chouser: doesn't work with maps, dangit

23:13 Cark: doesn't empty work with lists ?

23:13 Chouser: yes, but we want to reverse lists, right?

23:13 emacsen: oh, also I don't care about coll?. I only care about list? but that's minor

23:14 Chouser: but you want to recurse into other colls, don't you?

23:14 emacsen: no

23:14 because other colls aren't lisp code

23:14 this will live in a macro

23:14 Cark: (into (empty '(1 2 3)) '(5 6 7))

23:14 (7 6 5)

23:14 Chouser: sure they are

23:14 emacsen: you don't make function calls with seqs other than list AFAIK

23:14 Cark: ah that would be a double reverse

23:14 hiredman: emacsen, lists can be inside other colls

23:15 emacsen: oh, good point

23:15 hiredman: like [(+ 1 2)] results in [3]

23:15 Cark: i think you need a code walker anyways

23:15 because of literal data

23:16 hiredman: maybe you should use zippers and write a coll-zip

23:17 Cark: this problem isn't as trivial as it seems

23:17 hiredman: hmm

23:17 emacsen: yeah

23:17 hiredman: coll-zip would be really hard

23:17 emacsen: and I'm gonna tell the guy that

23:18 hiredman: there is always ->

Logging service provided by n01se.net