1:10 technomancy: I'm trying to read-line from a socket... the docs imply that it works on streams, but it doesn't work with the java.net.SocketInputStream that I get back from (.getInputStream socket)
1:11 maybe I need a reader? how does that work?
1:14 Cark: use an InputStreamReader
1:16 technomancy: nope, not quite: No matching method found: readLine for class java.io.InputStreamReader
1:16 Cark: that's only the first step i guess let me see
1:17 durka42: perhaps a BufferedReader?
1:17 Cark: ah there you go
1:18 still need the InputStreamReader though
1:18 technomancy: I guess there's still a ways to go before claims of low-ceremony can hold. =\
1:18 thanks tho
1:18 durka42: i wonder if contrib.duck-streams/reader can handle sockets
1:18 technomancy: was about to wonder aloud about duck-streams...
1:18 will peruse the source
1:19 durka42: " Argument may be an instance of Reader,
1:19 BufferedReader, InputStream, ...."
1:19 Cark: (-> (.getInputStream socket) InputStreamReader. BufferedReader.) will get something which you can readline from i suppose
1:22 that's how they do it in duck-streams anyways
1:24 technomancy: I'd like something clean; duck-streams looks best.
1:24 of course, that means figuring out how to put contrib on my path. grrr...
1:25 durka42: just add the jar to the classpath
1:26 Cark: funny i'd rather avoid the dependency. Seems longer but it conveys the meaning pretty well
1:27 you only need it in one place in your code, so there's no need for more abstraction
1:27 except maybe for the polution of your ns form
1:27 technomancy: well, I'm sure I'll be using other things from contrib eventually
1:27 there's no need to go into that level of detail just to say "I want a line. From this socket... capiche?"
1:27 Cark: hehe sure, that's matter of opinion anyways
1:28 durka42: yeah, one of my gripes about java is the long lines of nested constructors just to say something like that
1:29 technomancy: it's pretty silly. good thing we've got duck-streams.
1:29 Cark: there's no nesting required with clojure !
1:29 technomancy: there was talk of duck-streams going into core; is that right?
1:29 durka42: anyway, (Thread/sleep)
1:29 goodnight
1:29 Cark: bye durka
1:32 technomancy: what's the function to find if a symbol has a binding?
1:32 (boundp in CL)
1:39 Cark: i don't think there's a way
1:45 technomancy: heh; all the google hits are for clojure Emacs code
1:45 clojurebot: bound?
1:45 clojurebot: excusez-moi
1:58 hiredman: ,(find-var (symbol "println"))
1:58 clojurebot: java.lang.IllegalArgumentException: Symbol must be namespace-qualified
1:59 hiredman: ,(find-var (symbol (name *ns*) "println"))
1:59 clojurebot: java.lang.IncompatibleClassChangeError
2:00 hiredman: ,(find-var (symbol (str *ns*) "println"))
2:00 clojurebot: nil
2:01 technomancy: thanks hiredman
2:02 * technomancy wonders why symbol takes strings; seems odd
2:02 hiredman: well
2:02 it makes symbols
2:03 technomancy: oh, totally misread that.
2:03 so it's like intern
2:05 thanks
2:05 time for some shut-eye for /me
2:55 hiredman: java.io.FileNotFoundException: Could not locate hiredman/clojurebot/core__init.class or hiredman/clojurebot/core.clj on classpath: (clojurebot.clj:0)
2:55 damn
3:09 ,(doc partition)
3:09 clojurebot: "([n coll] [n step coll]); Returns a lazy sequence of lists of n items each, at offsets step apart. If step is not supplied, defaults to n, i.e. the partitions do not overlap."
3:23 Lau_of_DK: Top of the morning gents
3:24 kotarak: Morning Lau.
7:23 mibu: anyone knows how to change parentheses' color to DimGray in clojure-mode?
8:20 Chousuke: hmm
8:29 Lau_of_DK: Chousuke: Thinking out loud?
8:31 Chousuke: Just wondering what exactly does *print-dup* do :/
8:31 and what's the point of *print-readably*
8:33 kotarak: I think it prints things like, eg. sorted-map, as #=(sorted-map ....). So it can be read again. Otherwise it's printed as {} and would result in a hash-map when read.
8:34 Chousuke: also, for documenting these variables, would it be enough to simply add the documentation at the end of core.clj?
8:35 kotarak: Why at the end?
8:37 Chousuke: well, adding the documentation is easier if I can use set-meta! and defmacro
8:38 kotarak: Is that so much easier than a #^{:doc ...} where the are def'd?
8:38 Chousuke: yes, because some of them are def'd in java code.
8:38 kotarak: Ok. That's a problem, I guess.
10:01 edw: The documentation to COND is written in such a way as to suggest it looks like a traditional COND. Or, alternatively, I am not reading the definition closely enough. "Takes a set of test/expr pairs." That screams "(cond (test expr) (test expr))" to me. If it did work like a traditional CONS, how would it best be described?
10:08 Chousuke: hmm
10:10 well, it doesn't work like COND in CL; but I wonder how to best describe that.
10:12 edw: Right. In fewer then a jillion words.
10:13 Oof! s/then/than/
10:14 Chousuke: you could mention that "the result expressions are not wrapped in an implicit do block"
10:14 but that would probably confuse CL'ers even more...
10:15 edw: This BTW is one of the regrets McCarthy expressed re: the original LISP design.
10:15 arbscht_: clhs uses a modified BNF for a reason :)
10:15 edw: A series of alternating test and expression forms?
10:15 Chousuke: "cond takes an even number of forms, interpreted pairwise as a single test expression and a single result expression."
10:16 edw: A series of alternating test and expression expressions?
10:16 kotarak: How about not taking notions of CL over to Clojure? A "pair" in the CL is completely uninteresting in Clojure.
10:16 edw: Yes, we saw the movie.
10:18 kotarak, oh language notion guardian, does the concept "form" exist in Clojure?
10:19 And does "expression" imply a "normal", non-macro, non-special form?
10:20 kotarak: edw: I didn't say I am a guardian of what so ever. I just made a suggestion, that leaving notions from CL at CL and read Clojure as Clojure. Maybe then it's easier to get along with the syntax.
10:25 edw: But your comment does bring up a good point. What is the vocabulary that people should be using to discuss concepts in Clojure. Taking Scheme as an example, a "procedure" is something that computes the value of a function, a definition much different than most other programming languages, and I'm careful when discussing Scheme to respect that definition. In Clojure, a "function" computes a function, so I use that word.
10:29 The "don't use pair" rule is a no-brainer, given the explicit discarding of pairs in Clojure. I didn't think the "pairwise" usage in Chousuke's comment was a technical usage, simply a plain-English usage, those my jumping down your throat.
10:29 s/those/thus/
11:03 wlr: kotarak: you said 'A "pair" in the CL is completely uninteresting in Clojure.' A "pair" is a Scheme, not, CL, term. Also the closest, but different, concept in CL for Clojure's cond arguments is "property list".
11:04 Lau_of_DK: Good evening gents
11:05 kotarak: wlr: I have only Scheme background, no CL. So if pair is not CL term, then be it. I just suggest, that looking at the code as Clojure code and not as language X code, could help to overcome such problems.
11:06 I remember this troll, who started on the google group with "Why does (define (foo bar) ...) not work?".
11:08 wlr: kotarak: i agree with your larger point, just a one-time nitpick regarding the details. :)
11:28 edw: kotarak: So if you have no CL background and therefore have no knowledge of whether or not "pair" is an "interesting" concept in CL, why did you write what you did? If you're going to play the part of a know-it-all, you should probably make sure you do in fact know it all in whatever domain you're swinging your dong.
11:28 rhickey: edw: we don't talk to each other like that here
11:29 there's no reason not to be respectful
11:30 edw: I apologize.
11:37 The example for the `def' special form uses a `defn' as an example.
11:37 karmazilla: newsflash: textjure* now has a GUI for opening and switching between files! :D
11:38 Lau_of_DK: Wohoo :) Where are you hosting it ?
11:38 kotarak: \o/
11:39 karmazilla: on github: http://
11:40 Lau_of_DK: Oh yea.. Right next to http://
11:40 I'll check it out :)
11:41 karmazilla: it's only an editor for people who don't need all these modern bells and wistles such as syntax color, indenting, and... oh, I don't know, _closing_ files :)
11:42 Chouser: heh. well, karmazilla, you have now touched more lines of textjure than I have. Congrats!
11:46 karmazilla: are you able to use textjure to work on textjure code yet, or is it still too young?
11:46 bah
11:47 * durka42 is impressed
11:49 Chouser: karmazilla: are you able to use textjure to work on textjure code yet, or are the features you need not quite there?
12:04 danlarkin: hiredman: checking my RSS feed now... you know you don't have to push to github every time you commit :-p
13:23 Lau_of_DK: Good evening gents
13:26 danlarkin: afternoon Lau
13:26 Lau_of_DK: :)
13:30 danlarkin: What are you working on these days?
13:30 danlarkin: a yet-to-be-released port of django to clojure
13:31 mostly-port
13:31 some things I'm changing as I go
13:32 Cark: lisppaste8: url
13:32 lisppaste8: To use the lisppaste bot, visit http://
13:33 danlarkin: I think I will be using clojureql to build the ORM
13:33 lisppaste8: cark pasted "huh ?" at http://
13:34 Lau_of_DK: danlarkin: Sounds very interesting, got it hosted somewhere?
13:34 Cark: anybody has an idea on why this is not working ?
13:34 when evaluationg the macroexpanded form it works but not the macro itself
13:34 Lau_of_DK: danlarkin: And also very interesting about CQL - I would be very interested in all feedback you might have
13:36 Chousuke: Cark: why do you evaluate the AbstractAction?
13:36 Cark: ahhh yes must be that !
13:37 right that's it, thanks
13:37 danlarkin: Lau_of_DK: no, it's not hosted anywhere yet, I want to have it at least to a "usable" state before I put it up anywhere. I don't expect anyone to use it, but I at least want to add docstrings and stuff before I release it for others to see
13:38 antifuchs: danlarkin: sounds like a big project.
13:38 Lau_of_DK: So ehm... Hurry up and add some docstrings :)
13:38 antifuchs: (also, yay, would be very interested in seeing it)
13:38 danlarkin: antifuchs: it is... probably too big
13:38 I'm very happy with my progress so far, though
13:39 Lau_of_DK: danlarkin: How much do I get for free when using cjango, compared to compojure?
13:40 danlarkin: definitely not calling it cjango :)
13:40 Lau_of_DK: hehe, sorry :|
13:40 Chousuke: congo? :(
13:41 antifuchs: djosure?
13:41 Chousuke: clango!
13:41 danlarkin: 100% no way it's ending in -jure
13:41 antifuchs: tee hee
13:43 Lau_of_DK: Clangojure, pronounced like Klank-GO-sjuuuure
13:43 danlarkin: Lau_of_DK: are you familiar with django at all?
13:44 Lau_of_DK: No, I just skimmed their website
13:44 danlarkin: Lau_of_DK: that would help illustrate what you get "for free"
13:44 ah
13:44 Lau_of_DK: And how are you porting it? Do I get both Clojure and Python overhead?
13:44 danlarkin: no no
13:44 I'm rewriting it
13:46 cmvjkl_: what's the easiest way to check and see if a variable is a number?
13:47 there's not a specific function for it is there?
13:47 danlarkin: it is a lot of work though, so I would like some help eventually :)
13:47 Cark: in the rewriting department i'd love to see a port of hunchentoot
13:47 Chousuke: cmvjkl_: number? perhaps
13:47 (doc number?)
13:47 clojurebot: Returns true if x is a Number; arglists ([x])
13:47 cmvjkl_: oh man, there is.
13:48 my fault, but to be honest, there should be an easier way to look that up too...under the data structures page for 'numbers', that isn't listed at all.
13:48 Lau_of_DK: danlarkin: Thats sounds like a huge job - You should consider doing a 'linus' on it :)
13:49 danlarkin: Lau_of_DK: and what is a 'linus"?
13:50 Chousuke: cmvjkl_: find-doc is your friend )
13:50 Lau_of_DK: danlarkin: Thats a 'delegate wildly' approach to writing software
13:50 which means, Git :)
13:50 danlarkin: it's in git :) just not anywhere except my computer
13:50 cmvjkl_: oh man i didn't realize that existed either. thanks!
13:52 danlarkin: really the only people who could help with the major stuff at this point are those extremely familiar with django and all the python tricks they use, and with a working knowledge of clojure
13:52 which might be like
13:52 only me
13:52 hahah
13:57 Lau_of_DK: hehe - Im really biting my tongue not to say something right now :)
13:57 danlarkin: a python diss?
13:58 * Lau_of_DK seals his lips
13:58 danlarkin: bah!
13:59 Chousuke: I think everyone knows Lau_of_DK's opinion of python by now.
13:59 I also think you're wrong, but I'm not willing to debate that here.
14:00 danlarkin: yes no sense in flame wars
14:11 Lau_of_DK: danlarkin: It was actually a mounting flamewar which got me into SBCL from C# :)
14:11 danlarkin: ha
14:11 so maybe there is sense in flamewars?
14:12 Lau_of_DK: or maybe I just caught a break :)
14:13 I mean, all the stuff being said was lame and hurtful, but one guy shot of some Lisp to prove his point, which he did well enough
14:15 danlarkin: well that's good
14:15 it's rare for something positive to come of bickering
14:17 Lau_of_DK: True
14:25 danlarkin: the only feature I haven't been able to match 100% from django yet is their url dispatch can use named groups
14:25 and java's regex engine doesn't have named groups
14:25 antifuchs: might try porting cl-ppcre (:
14:26 danlarkin: haha
14:26 antifuchs: hey, it would be neat to compare speeds
14:26 danlarkin: I think I'll stick with unnamed groups until someone else does the heavy lifting
14:32 antifuchs: are you familiar with django at all? or are you just interested in the project in general
14:33 antifuchs: danlarkin: I am working on a rails project, and am hearing left and right that django would be much better
14:33 that is most of the familiarity I have with django itself (:
14:34 danlarkin: well I've never used rails myself, but I know a lot of people that have moved rails->django, and zero django->rails :)
14:34 antifuchs: yeah, I bet
14:34 ((-:
14:35 danlarkin: right now I could use joshua choi to help me use his fnparse library :)
14:36 antifuchs: anyway, I would love to have something lispy (and sane enough to show to my teammates and not have to tell them that the ANSI committee didn't think this concept would one day dominate the world) to do this in (:
14:40 danlarkin: maybe I'll post to the group when I decide to put it on github
14:41 Lau_of_DK: You do that - Im looking forward to seeing it
14:41 Which license are you putting it under?
14:41 danlarkin: BSD
14:41 Lau_of_DK: Why?
14:42 danlarkin: because I like free code
14:42 Lau_of_DK: So why not EPL?
14:42 Or LGPL?
14:42 danlarkin: why not just BSD
14:43 bsd is compatible with both of those licenses
14:43 Lau_of_DK: Arent you forcing me to answer your question now?
14:45 danlarkin: are you asking me why I don't want a more restrictive license?
14:46 antifuchs: may be interesting to get a lawyerly opinion on whether lgpl is more compatible with clojure code than with cl code
14:46 * apage43 personally thinks less restrictive licenses jive better with clojure
14:46 Lau_of_DK: I understand GPL, LGPL, CPL and EPL fairly well, and I understand EPL to be very free, without any unessarcy restrictions. But I dont understand BSD or what it offers compared to one of the others
14:47 antifuchs: AIUI, lgpl has very explicit terms defined that probably don't work with languages that have macroexpand
14:48 IANAL and have been told this only by nonlawyers wo took this issue with regards to CL code up to rms, also not a lawyer
14:48 mattrepl: BSD is short and very free: http://
14:48 antifuchs: so well. lawyers would be nice to have... especially those who know lisp (:
14:48 * apage43 likes zlib =P
14:49 apage43: also i keep trying to get my paralegal buddy into lisp but meh
14:50 danlarkin: mattrepl: that version is known as the 3-clause BSD
14:50 an author can omit any (or all) of the 3 clauses at one's leisure
14:50 mattrepl: the simplified one is mentioned in the text as well.. just remove the third clause about endorsement
14:51 danlarkin: I'm using 3 clauses for clojure-json
14:51 mattrepl: danlarkin: interesting. hadn't heard of that, thought it was only the third one.
14:52 danlarkin: mattrepl: well it's customary to use either 1 & 2 or 1, 2 & 3... but it's up to the author. The license could say "You can't use this work on tuesdays" and it would be just as binding
14:53 apage43: http://
14:53 mattrepl: =)
15:41 rhickey: is (educe iter enum) too subtle/cute/quirky for "Runs the enumeration into the iteratee and returns the result", for LFEs i nthe style of: http://
15:43 Lau_of_DK: Too cute for what purpose? A presentation of sorts?
15:45 * mattrepl hopes streams
15:53 rhickey: (educe ((comp (ifilter even?) (imap inc)) (ifold + 0))
15:53 (ecat (erange 100) (erange 100)))
15:53 5000
15:54 Chouser: what's the etymology of 'educe'?
15:54 danlarkin: looks like haskell with parens
15:54 Chouser: oh, i see
15:55 rhickey: danlarkin: the Haskell looks a lot worse, IMO
15:56 Chouser: "lead out", also a pun on reduce
15:59 lisppaste8: rhickey pasted "LFE stuff" at http://
15:59 rhickey: for those wanting to play along ^^
16:01 AWizzArd: rhickey: could you maybe add something like (defn pipe [& fs] (apply comp (reverse fs))) to Clojure? Or is that not needed iyo?
16:02 rhickey: AWizzArd: I haven't needed it yet
16:02 AWizzArd: in some situations it could make things a bit more readable than comp, and easier to think about
16:04 rhickey: That LFE stuff is as simple as I can make it, and yet I'm still concerned about the complexity of te model and ability of people to write their own enums/iters
16:04 plus I hate the names
16:05 danlarkin: I'll say I hate the names too... even though I have no better ones
16:08 rhickey: "iteratee" in the original work is particularly bad. I think accumulator might be better
16:09 kotarak: how is io-scope (or what it is called now) coming along?
16:10 rhickey: kotarak: io-scope is fine, and a nice idea in general. I think it handles the resources management problem at least as well as LFEs
16:10 kotarak: will it be included soon?
16:10 rhickey: just looking at LFEs for feasibility, also they are purely functional while streams are very much not
16:16 Chousuke: I find that LFE stuff difficult to understand :/
16:17 AWizzArd: rhickey: can you already say something about the performance?
16:18 rhickey: AWizzArd: of LFEs?
16:19 AWizzArd: yes
16:21 rhickey: less overhead than seqs
16:21 AWizzArd: actually they could be interesting for a proxy server/request broker that I will soon begin to implement
16:21 rhickey: but the value is not perf, but resource management safety when used with resource-based sources
16:21 Chousuke: It seems to me that first you compose "iterator transformers" (ifilter and imap), then feed an "iterator operation" (ifold) to produce the final iterator that will consume the enumeration somehow. but it still escapes me how educe works. ...hmmh
16:22 could seriously use some kind of visualisation of what the hell is happening. :)
16:24 rhickey: enums are logical collections of items represented by a function that, when passed an iter, feeds each item to the iter. An iter can accumulate anything it wants to, and can signal early termination of the enumeration
16:25 Chousuke: so a single iterator can gobble multiple items of the enumeration
16:25 rhickey: imap and ifilter are iter transformers, yes
16:26 still missing is ichain, which will allow a set of iters to act sequentially as one iter
16:26 Chousuke: at one "step" that is, before yielding output to to the "next" level in the transformation chain? or does every transformer have access to all of the enumeration somehow?
16:27 rhickey: Chousuke: one item at a time, unlike the paper which passed 'chunks' of items
16:28 but a stage could collapse (like ifilter) or even expand in passing to next stage
16:29 Chousuke: defining those things looks really cumbersome though :/
16:30 rhickey: Chousuke: I agree, the model is rather involved
16:31 but the usage is straightforward
17:25 dnolen: is it possible to get the name of a namespace object as a string? I've looked at the API but I don't see anything applicable.
17:25 kotarak: (doc ns-name)
17:25 clojurebot: Returns the name of the namespace, a symbol.; arglists ([ns])
17:25 kotarak: (doc name)
17:25 clojurebot: Returns the name String of a symbol or keyword.; arglists ([x])
17:27 dnolen: kotarak thanks, i see it now on the clojure page on namespaces, still getting used to getting around.
17:28 kotarak: dnolen: np, find-doc in the repl is also helpful to investigate such things.
18:19 karmazilla: Chouser: have a minute?
18:33 durka42: kotarak: i have a proposal for a gorilla feature
18:53 blbrown: here is rich hickey from?
18:56 drewr: blbrown: NYC.
19:10 dnolen: is it possible to convert a list/vector of keys and values into a hash-map?
19:11 durka42: (doc zipmap)
19:11 clojurebot: Returns a map with the keys mapped to the corresponding vals.; arglists ([keys vals])
19:11 durka42: is that what you meant?
19:11 Chousuke: ,(apply hash-map '(:a 1 :b 2))
19:11 clojurebot: {:b 2, :a 1}
19:13 dnolen: chousuke thanks, zipmap looks useful as well durka.
19:15 hiredman: ,(doc zipmap)
19:15 clojurebot: "([keys vals]); Returns a map with the keys mapped to the corresponding vals."
19:54 jli: Is it just me, or does blip.tv not allow skipping to part of the video you haven't downloaded yet?
20:15 blbrown: what can be done with the 'doc' meta data. Is there a javadoc like tool in clojure?
20:16 Chouser: blbrown: doc and find-doc use it.
20:16 (doc find-doc)
20:16 clojurebot: Prints documentation for any var whose documentation or name contains a match for re-string-or-pattern; arglists ([re-string-or-pattern])
20:16 blbrown: Chouser, but there isn't a javadoc tool, I guess I could write my own
20:30 gnuvince_: What tool do you guys use to profile Clojure code?
20:36 blbrown: This is my first real clojure app, only like 800 lines, http://
20:39 gnuvince_: I really ought to get a Java book to learn about Swing so that I could make interfaces for the (small) apps I write.
20:40 Cark: there are tons of nice tutorials at sun
20:41 blbrown: I would use swt. I am done with swing
20:42 Cark: swing is no good ?
20:43 blbrown: Cark, I don't think so, and SWT is so much cleaner and easier to work with. There are also plug and play widgets that come with SWT like a working web browser
20:44 gnuvince_: Is SWT shipped with the JRE?
20:44 blbrown: Nope, Eclipse is based on SWT, so it is here. http://
20:45 but then again, I haven't tried swing with clojure, clojure may improve on swing
20:51 lisppaste8: gnuvince pasted "Does that look okay?" at http://
21:08 rhickey pasted "scope blocks" at http://
21:09 rhickey: io-scope has evolved into ^^
21:10 general system for resource management
21:10 Chouser: exits first, then succeeds/fails
21:10 rhickey: reverse order of declaration
21:11 Chouser: wow
21:11 rhickey: irrespective of cause
21:15 antifuchs: rhickey: wouldn't it make more sense to be by order of arguments?
21:15 blbrown: is that feature found in other languages
21:15 rhickey: antifuchs: I don't think so
21:15 antifuchs: unix shells with their trap function/
21:15 aperotte: Chouser: I saw your discussion on the google group about adding post-init to gen-class, has there been any more discussion on it?
21:16 rhickey: blbrown: D has a similar feature, but you can't control the scopes, they are the nearest enclosing language-level block
21:16 antifuchs: rhickey: hm, why?
21:17 aperotte: Chouser: I've come up against the same issue trying to use the restlets library and was wondering if there was a way around the issue
21:18 antifuchs: I think boa is the default for many things... it seems pretty exceptional to have stuff come out in reverse order sometimes
21:19 rhickey: antifuchs: not sure what you mean by boa here, but most times resources are freed in reverse order
21:20 antifuchs: ah, that's true
21:20 rhickey: in any case, you have control as it is based on the order of calls to when-scope
21:21 antifuchs: I'm used to resources getting freed through stacking of with- forms, but as a cleanup thing it does make sense.
21:23 rhickey: stacking with-s unwinds in reverse too
21:37 scope names ok?
21:38 danlarkin: I think so
21:38 so in your example, you're just putting a few when-scopes in a function for convenience, right? There's no semantics involved with that?
21:39 or.. not semantics, I mean it could just be in the body of the (scope) form?
21:40 rhickey: danlarkin: just trying to demonstrate it is a truly dynamic scope, not just lexical
21:40 danlarkin: mmhmm
21:41 rhickey: the different when-scopes happen due to different scope termination situations
21:42 :exits matches any, :fails matches exits w/exception, :succeeds matches exit normally
21:43 when-scope not within any scope throws exception
21:43 so nested contexts can create, register, and return resources knowing they will get cleaned up
21:46 danlarkin: I like this
21:50 hiredman: very useful
21:57 blbrown: You guys might be able to help me. In lisp/clojure, I think of 'macros' as DEFINE's in C (#define ABC 123), a syntax for replacing values in code. Is this true or is it a lot more complex.
21:58 apage43: a lot more complex
22:00 see http://
22:00 Chouser: well, it's the same core idea, though
22:01 apage43: Chouser: well, far from a "#define ABC 123". I don't think i've ever seen a lisp macro used to store a constant =P
22:01 Chouser: two big differences are that #define produces text instead of structured code/data (s-exprs). The other is that lisp macros can use any *function* defined earlier, not just other macros.
22:02 apage43: the #define rabbit hole goes deeper than that, though. :-)
22:02 apage43: of course
22:02 but #define is still not near as powerful
22:03 also complex #define's are terrrrible to debug
22:04 Chouser: yes, of course, that's all true.
22:05 but it's not a completely unrelated concept, like for example Excel macros.
22:15 and I've used #define to add control structures, just like lisp macros. 'foreach'
22:15 but yes, terrible
22:20 danlarkin: Chouser: oh jeez. that's awful
22:26 blbrown: look at the linux kernel source...that is some scary use of macros
22:58 I also never totally understood when you should write a macro and when just a function would do
22:59 danlarkin: in lisps?
23:00 Cark: you mean in the linux kernel or using clojure ?
23:00 danlarkin: you only need a macro if you want to control evaluation of forms
23:00 blbrown: in lisps
23:00 Cark: danlarkin : nope, you can do this with high order functions
23:01 blbrown: danlarkin, I think I see what you are saying. When I need more than a <function-call args>?
23:01 Cark: you need macros to make your code pretty, that's about it
23:01 danlarkin: Cark: functions can't control evaluation of their arguments
23:01 durka42: or to avoid repetition
23:02 Cark: (defn my-if [cond-fn true-fn false-fn] ....)
23:02 that's what i mean
23:02 of course that's ugly
23:02 though not that ugly with clojure
23:02 durka42: true, but what about lazy and/or
23:03 Cark: same thing
23:03 durka42: short-circuiting is the word i was looking for
23:03 oh if you wrap everything in a #() i suppose
23:03 Cark: (defn my-or [& list-of-predicate-functions] ...)
23:03 so really, maccros are only there to make it pretty
23:04 danlarkin: Cark: (defn my-if [cond-fn true-fn false-fn] ....) doesn't control evaluation of arguments, cond-fn, true-fn and false-fn will all be evaluated. They won't be /executed/ unless you call them, but they're still evaluated
23:04 durka42: if you want to use things that won't resolve as symbols you need a macro
23:04 apage43: Cark: somewhat. the my-or and my-if would a, have to take -functions-, which means using them uses more stack space than the macro version
23:05 Cark: hehe sure, but that's implementation detail
23:07 i beleive in some smalltalks that's how if is defined
23:09 danlarkin: the point is i can still call (if #(identity true) #(identity 1) #(/ 1 0))
23:09 i mean "my-if"
23:09 danlarkin: There are things macros can do that functions cannot, and those things rely on delaying (or canceling) evaluation of arguments. Sure, "if" could be written with functions, but that would be a different language
23:10 Cark: of course noone would rewrite an if function, that's only an exemple of controling evaluation using high order functions
23:11 what's really bad in this my-if thing, is that it's leaking implementation detail
23:11 that's why you want a macro
23:11 so the user don't need to know oh that works
23:11 *how
23:12 Chouser: but users generally do need to know if the thing they're calling is a macro or a function
23:12 Cark: ahh true
23:12 apage43: eh, not as such, they just need to know what the thing they're calling returns
23:12 Chouser: macros can do things like capture names, which fns cannot
23:13 apage43: no, the fact that 'and' short-circuits is sometimes important.
23:13 macros can do things at compile-time, which fns cannot. Clojure uses this for 'proxy', for example.
23:13 Cark: chouser : going purely functional you wouldn't need to capture names at all
23:14 blbrown: this is a good discussion, someone save it.
23:14 durka42: clojurebot: logs
23:14 clojurebot: logs is http://
23:14 Cark: chouser : hum you could use function calls directly in your source file, and call the api
23:14 like creating namespaces and such
23:15 of course macros are nice don't get me wrong !
23:15 durka42: that might be difficult without the . macro
23:15 Chouser: but usages of 'proxy' aren't at the top level, so if it were a function it couldn't do anything at compile time.
23:16 Cark: right, though that's specific to clojure
23:17 apage43: anyway
23:17 the end purpose of macros is to allow you to write -less code-
23:17 which they can do in ways functions cannot
23:17 Cark: and prettier !
23:18 Chouser: I'm pretty sure name capture would still be useful in a pure functional language.
23:18 Cark: well you do it this way : (my-hf (fn [captured-name] ....))
23:19 Chouser: Cark: ah, you're right. Good point.
23:20 Cark: i couple months ago i wanted to have the prog1 macro included in clojure
23:21 then some person (andre thieme?) reminded me that this could be done with a function
23:23 Chouser: so yes, macros are for simplifing code that cannot be simplified sufficiently using a function.
23:25 Cark: nice flamme war on c.l.l ...thei're talking a bit about clojure and implementing lisp on the jvm
23:27 gnuvince_: lik?
23:27 link
23:28 Cark: hum i'm reading from a newsgroup reader =/ ... it's "Making lisp popular - can it be done" in comp.lang.lisp
23:29 durka42: http://
23:29 bah, cut before &q to lose the highlighting
23:33 danlarkin: jeez
23:33 these people are _angry_
23:36 Cark: that's c.l.l for you =)
23:36 still they're very helpfull
23:37 ...usually