<HTML><BODY style="word-wrap: break-word; -khtml-nbsp-mode: space; -khtml-line-break: after-white-space; "><DIV><DIV>On Dec 4, 2006, at 19:06, Corey Sweeney wrote:</DIV><BR><BLOCKQUOTE type="cite"><DIV><SPAN class="gmail_quote">On 12/4/06, <B class="gmail_sendername">John Quigley</B> <<A href="mailto:jquigley@jquigley.com">jquigley@jquigley.com</A>> wrote:</SPAN><BR><BR><BLOCKQUOTE class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">I think the general feeling is that we should remain as the Chicago Lisp. I'm happy with that, though I do recognize the problems<BR>associated with a group becoming 'pigeon-holed;' if you meet long enough, there's only so many topics one can discuss about a certain technology.</BLOCKQUOTE></DIV></BLOCKQUOTE><DIV><BR class="khtml-block-placeholder"></DIV><DIV>Of course, the flip side is being thinly spread over too many things. Oh, and John, I apologize as this will duplicate a lot of what I wrote to you in a private e-mail.</DIV><BR><BLOCKQUOTE type="cite"><DIV><DIV>Hmm, I'm confused. Lets establish some terminology to help clarify:<BR><BR>Scheme is a dialect of lisp<BR>Common lisp is a dialect of lisp <BR>{emacs lisp is too}<BR><BR>So let's use "lisp" without any further constraints to refer to the "family" of lisp languages.</DIV></DIV></BLOCKQUOTE><DIV><BR class="khtml-block-placeholder"></DIV><DIV>Kent Pitman, "Lambda, the Ultimate Political Party" <<A href="http://tinyurl.com/y5ou9j">http://tinyurl.com/y5ou9j</A>>:</DIV><DIV><BR class="khtml-block-placeholder"></DIV><P style="margin: 0.0px 0.0px 16.0px 0.0px"><BLOCKQUOTE type="cite"><P style="margin: 0.0px 0.0px 16.0px 0.0px"><FONT class="Apple-style-span" face="Times" size="4"><SPAN class="Apple-style-span" style="font-size: 16px;">``If they're all Lisps, presumably they're all built around some common core. Right?''</SPAN></FONT></P><P style="margin: 0.0px 0.0px 16.0px 0.0px"><FONT class="Apple-style-span" face="Times" size="4"><SPAN class="Apple-style-span" style="font-size: 16px;">Not necessarily. Some years ago, when I was first becoming involved with language standards, I did a personal study of languages in the Lisp family to determine whether there was a common core of operators that were present throughout the family with the same name and semantics.</SPAN></FONT></P></BLOCKQUOTE></P><DIV>In case you haven't heard of Kent Pitman before (sorry to be repetitive if you already have), he was the editor of the ANSI standard for Common Lisp, the effort to take what was at the time of the start of the standardization process, any number of divergent Lisp dialects and try to come up with something common. I think he would be in a very good position to know how similar or not all of those various lisp dialects where.</DIV><DIV><BR class="khtml-block-placeholder"></DIV><DIV>Corey wrote:</DIV><BR><BLOCKQUOTE type="cite"><DIV><DIV>Now scheme is a impure functional language (i.e. it has a "set" command), just like Common lisp is a impure functional language. <BR>I believe ML is a pure functional language. {i don't actually use it though, so don't quote me on that}<BR></DIV></DIV></BLOCKQUOTE><DIV><BR class="khtml-block-placeholder"></DIV><DIV>Scheme, from comp.lang.functional FAQ <<A href="http://tinyurl.com/yl6gln">http://tinyurl.com/yl6gln</A>>:</DIV><DIV><BR class="khtml-block-placeholder"></DIV><DIV><BLOCKQUOTE type="cite"><DIV>[...] in (strict) functional languages such as SML or Scheme, [...] it is more common to find such programs written with an explicit loop, often expressed recursively. Nevertheless, there is still no need to update the values of the variables involved: [...]</DIV><DIV><BR class="khtml-block-placeholder"></DIV><DIV>Scheme:</DIV><DIV><FONT class="Apple-style-span" color="#000000"><FONT class="Apple-style-span" face="Courier New">(define sum</FONT></FONT></DIV><DIV><FONT class="Apple-style-span" color="#000000"><FONT class="Apple-style-span" face="Courier New"> (lambda (from total)</FONT></FONT></DIV><DIV><FONT class="Apple-style-span" color="#000000"><FONT class="Apple-style-span" face="Courier New"> (if (= 0 from)</FONT></FONT></DIV><DIV><FONT class="Apple-style-span" color="#000000"><FONT class="Apple-style-span" face="Courier New"> total</FONT></FONT></DIV><DIV><FONT class="Apple-style-span" color="#000000"><FONT class="Apple-style-span" face="Courier New"> (sum (- from 1) (+ total from)))))</FONT></FONT></DIV><DIV><FONT class="Apple-style-span" color="#000000"><FONT class="Apple-style-span" face="Courier New">(sum 10 0)</FONT></FONT></DIV></BLOCKQUOTE></DIV><DIV><BR class="khtml-block-placeholder"></DIV><DIV>Common Lisp, from something as "general purpose knowledge" as Wikipedia <<A href="http://tinyurl.com/zql2x">http://tinyurl.com/zql2x</A>>:</DIV><DIV><BR class="khtml-block-placeholder"></DIV><BLOCKQUOTE type="cite"><P style="margin-top: 0px; margin-right: 0px; margin-bottom: 6px; margin-left: 0px; "><FONT class="Apple-style-span" size="3"><SPAN class="Apple-style-span" style="font-size: 12.7px;">Lastly, the Scheme standards documents require </SPAN></FONT><A href="http://en.wikipedia.org/wiki/Tail_recursion"><FONT class="Apple-style-span" size="3"><SPAN class="Apple-style-span" style="font-size: 12.7px;"><FONT class="Apple-style-span" color="#0033B3">tail-call optimization</FONT></SPAN></FONT></A><SPAN class="Apple-style-span" style="line-height: 19px;"><FONT class="Apple-style-span" size="3"><SPAN class="Apple-style-span" style="font-size: 12.7px; line-height: normal;">, which the CL standard does not. Most CL implementations do offer tail-call optimization, although often only when the programmer uses an optimization directive. Nonetheless, common CL coding style does not favor the ubiquitous use of recursion that Scheme style prefers -- what a Scheme programmer would express with tail recursion, a CL user would usually express with an iterative expression in </SPAN></FONT><FONT class="Apple-style-span" face="Courier" size="3"><SPAN class="Apple-style-span" style="font-size: 10.3px; line-height: normal;">do</SPAN></FONT><FONT class="Apple-style-span" size="3"><SPAN class="Apple-style-span" style="font-size: 12.7px; line-height: normal;">, </SPAN></FONT><FONT class="Apple-style-span" face="Courier" size="3"><SPAN class="Apple-style-span" style="font-size: 10.3px; line-height: normal;">dolist</SPAN></FONT><FONT class="Apple-style-span" size="3"><SPAN class="Apple-style-span" style="font-size: 12.7px; line-height: normal;">, </SPAN></FONT><FONT class="Apple-style-span" face="Courier" size="3"><SPAN class="Apple-style-span" style="font-size: 10.3px; line-height: normal;">loop</SPAN></FONT><FONT class="Apple-style-span" size="3"><SPAN class="Apple-style-span" style="font-size: 12.7px; line-height: normal;">, or (more recently) with the </SPAN></FONT><FONT class="Apple-style-span" face="Courier" size="3"><SPAN class="Apple-style-span" style="font-size: 10.3px; line-height: normal;">iterate</SPAN></FONT><FONT class="Apple-style-span" size="3"><SPAN class="Apple-style-span" style="font-size: 12.7px; line-height: normal;"> package.</SPAN></FONT></SPAN></P></BLOCKQUOTE><DIV><BR class="khtml-block-placeholder"></DIV><DIV>"Most" Common Lispniks would write an iterative, i.e. non-functional, version, such as the following:</DIV><DIV><BR class="khtml-block-placeholder"></DIV><DIV><FONT class="Apple-style-span" color="#000000" face="Courier New">(loop for i from 1 upto 10 summing i)</FONT></DIV><DIV><FONT class="Apple-style-span" color="#000000"><BR class="khtml-block-placeholder"></FONT></DIV><DIV><SPAN class="Apple-style-span">When the most exposure to lisp I had was the usual cursory intro from a comparative languages course and a intro to AI course in college, I had the impression that everything in lisp was always recursion. Having been reintroduced by Paul Graham's <I>ANSI Common Lisp</I>, I was under the impression that doing things like using <FONT class="Apple-style-span" face="Courier New">setq</FONT> should be done only in emergencies. I forget how he phrases it. Something like pretending that it incurs a cost to the function or something like that. But that's why I'm personally glad that Peter Siebel wrote <FONT class="Apple-style-span" color="#000000"><I>Practical Common Lisp</I><FONT class="Apple-style-span" color="#000000">, as it focuses more on getting useful stuff done, and shows quite a bit of the "just get stuff done" aspects of the language.</FONT></FONT></SPAN></DIV><DIV><BR class="khtml-block-placeholder"></DIV><DIV>Common Lisp and Scheme do come from different communities. I think it is interesting to note that most all the many divergent lisp dialects that were used at one time <<A href="http://tinyurl.com/y7puru">http://tinyurl.com/y7puru</A>>, 3Lisp, Flavors, Franz Lisp, Interlisp, Lisp 1.5, LOOPS, XLisp, ZetaLisp, etc., have been subsumed by Common Lisp. However, Scheme remains distinct. I think that is indicative of the differences between the languages and the communities. But like is mentioned in the comp.lang.functional FAQ (ibid):</DIV><DIV><BR class="khtml-block-placeholder"></DIV><BLOCKQUOTE type="cite"><P style="margin: 0.0px 0.0px 16.0px 0.0px"><FONT class="Apple-style-span" face="Times" size="4"><SPAN class="Apple-style-span" style="font-size: 16px;">It is often possible to write functional-style programs in an imperative language, and vice versa. It is then a matter of opinion whether a particular language can be described as functional or not.</SPAN></FONT></P></BLOCKQUOTE><DIV>If one wants to slide far enough down the slippery slope, even C/C++ could be considered functional languages because one can write such code without using assignment (or iteration (...)).</DIV><DIV><BR class="khtml-block-placeholder"></DIV><DIV><FONT class="Apple-style-span" color="#000000"><FONT class="Apple-style-span" face="Courier New">int sum(int from, int total)</FONT></FONT></DIV><DIV><FONT class="Apple-style-span" color="#000000"><FONT class="Apple-style-span" face="Courier New">{</FONT></FONT></DIV><DIV><FONT class="Apple-style-span" color="#000000"><FONT class="Apple-style-span" face="Courier New"> if (from == 0) {</FONT></FONT></DIV><DIV><FONT class="Apple-style-span" color="#000000"><FONT class="Apple-style-span" face="Courier New"> return total;</FONT></FONT></DIV><DIV><FONT class="Apple-style-span" color="#000000"><FONT class="Apple-style-span" face="Courier New"> } else {</FONT></FONT></DIV><DIV><FONT class="Apple-style-span" color="#000000"><FONT class="Apple-style-span" face="Courier New"> sum(from - 1, total + from);</FONT></FONT></DIV><DIV><FONT class="Apple-style-span" color="#000000"><FONT class="Apple-style-span" face="Courier New"> }</FONT></FONT></DIV><DIV><FONT class="Apple-style-span" color="#000000"><FONT class="Apple-style-span" face="Courier New">}</FONT></FONT></DIV><DIV><BR class="khtml-block-placeholder"></DIV><DIV>Many C/C++ compilers support tail-call optimizations, too. However, "most" C/C++ programmers would not write sum like this, using a for loop instead, just like "most" Common Lispniks. Probably because both of these languages consider tail-call optimization as a viable optimization technique (not explicitly mentioned in the standard), not a fundamental aspect of the language (unlike Scheme, which does explicitly require this behavior in the standard). "Most" Schemers would, however, use the recursive version.</DIV><DIV><BR class="khtml-block-placeholder"></DIV><DIV>Corey wrote:</DIV><BR><BLOCKQUOTE type="cite"><DIV><DIV>I would personally prefer having some room for non-lisp languages, but I would still be ok with constraining ourselfs to lisp ( i.e. no ML or haskel (or erlang ;) ). I would have a issue though if we were to constrain ourselfs to the common lisp dialect.</DIV></DIV></BLOCKQUOTE><DIV><BR class="khtml-block-placeholder"></DIV><DIV>I personally would not have an issue with including many divergent dialects in the lisp family. In fact, I would love it if somebody could get Paul Graham to come talk about Arc, the newest vaporware member of the family. I suppose I would have an issue with a lisp group which was not cognizant of the distinctions, though.</DIV><BR><BLOCKQUOTE type="cite"><DIV>Question. Does Allegroserve *require* you to buy allegro common lisp? You might alienate some potential helpers that way.<BR></DIV></BLOCKQUOTE><DIV><BR class="khtml-block-placeholder"></DIV><DIV>No. There is Portable AllegroServe <<A href="http://portableaserve.sourceforge.net">http://portableaserve.sourceforge.net</A>/>. It works with:</DIV><BLOCKQUOTE type="cite"><UL><LI style="margin: 0.0px 0.0px 0.0px 0.0px"><FONT class="Apple-style-span" color="#000000">CMU Common Lisp</FONT></LI><LI style="margin: 0.0px 0.0px 0.0px 0.0px"><FONT class="Apple-style-span" color="#000000">Steel Bank Common Lisp</FONT></LI><LI style="margin: 0.0px 0.0px 0.0px 0.0px"><FONT class="Apple-style-span" color="#000000">GNU clisp (only single-threaded operation)</FONT></LI><LI style="margin: 0.0px 0.0px 0.0px 0.0px"><FONT class="Apple-style-span" color="#000000">OpenMCL</FONT></LI><LI style="margin: 0.0px 0.0px 0.0px 0.0px"><FONT class="Apple-style-span" color="#000000">Xanalys Lispworks</FONT></LI><LI style="margin: 0.0px 0.0px 0.0px 0.0px"><FONT class="Apple-style-span" color="#000000">MCL</FONT></LI><LI style="margin: 0.0px 0.0px 0.0px 0.0px"><FONT class="Apple-style-span" color="#000000">Scieneer Common Lisp (slightly broken as of 2004-02-29)</FONT></LI><LI style="margin: 0.0px 0.0px 0.0px 0.0px"><FONT class="Apple-style-span" color="#000000">Corman Common Lisp (with non-standard install method, might be broken as of 2004-02-29)</FONT></LI><LI style="margin: 0.0px 0.0px 0.0px 0.0px"><FONT class="Apple-style-span" color="#000000">Allegro Common Lisp</FONT></LI></UL></BLOCKQUOTE><DIV>The only reason I mentioned it was that it is an entire HTTP server in CL, as opposed to only part of it, as one would find with something like mod_lisp. But as others have mentioned, there are lots of other alternatives. Personally, I am looking for a lisp group because I like lisp and don't have enough excuse to use it at work. In fact, I think it would be sweet if we could get our hands on an old Symbolics machine and have everything be lisp, from the raw iron all the way up. But I'm strange like that. I don't expect a Linux group to host its web-server on a box running something other than Linux and I like my lisp groups to use as much lisp as possible.</DIV><DIV><BR class="khtml-block-placeholder"></DIV><DIV>Corey wrote:</DIV><BR><BLOCKQUOTE type="cite"><DIV>Also as I mentioned before {in person}, having just implemented a wiki in scheme, I would probably be able to give some guidance if you decide to do a wiki.<BR></DIV></BLOCKQUOTE><DIV><BR class="khtml-block-placeholder"></DIV><DIV>And there is CLiki <<A href="http://www.cliki.net/CLiki">http://www.cliki.net/CLiki</A>> and The Common Lisp Directory <<A href="http://tinyurl.com/y3fkb6">http://tinyurl.com/y3fkb6</A>>, both written in CL.</DIV><DIV><BR class="khtml-block-placeholder"></DIV><DIV>Corey wrote:</DIV><BR><BLOCKQUOTE type="cite"><DIV><DIV>This is probably too big of a project, but I'll toss out the idea anyway. What about writing a common lisp "interpreter" in scheme?</DIV></DIV></BLOCKQUOTE><BR></DIV><DIV><SPAN class="Apple-style-span">Yeah, you're right. It probably <FONT class="Apple-style-span" color="#000000"><B>is</B><FONT class="Apple-style-span" color="#000000"> too big of a project. Sure, we could knock out the basics of the language, what with lexical scoping and closures coming for free from Scheme, and adding dynamic scoping (special variables) in a few lines of code. Sure, CL style macros would be a day or two at best. Pathnames, logical pathnames, packages, and reader macros aren't even worth mentioning. CLOS would be a week or two. A full meta-object protocol might take another week. Maybe two. Adding CL style conditions would probably be two weeks, maybe three tops. But doing things like getting </FONT><FONT class="Apple-style-span" color="#000000" face="Courier New">unwind-protect</FONT><FONT class="Apple-style-span" color="#000000"> and </FONT><FONT class="Apple-style-span" color="#000000" face="Courier New">call/cc</FONT><FONT class="Apple-style-span" color="#000000"> to play well together might be a bit harder <<A href="http://tinyurl.com/y8pl6r">http://tinyurl.com/y8pl6r</A>>.</FONT></FONT></SPAN></DIV></BODY></HTML>