<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	>
<channel>
	<title>Comments on: Becoming Lisp</title>
	<atom:link href="http://osteele.com/archives/2004/09/becoming-lisp/feed" rel="self" type="application/rss+xml" />
	<link>http://osteele.com/archives/2004/09/becoming-lisp</link>
	<description>Languages of the real and artificial.</description>
	<pubDate>Tue, 06 Jan 2009 11:53:23 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7</generator>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
		<item>
		<title>By: Cheap Airsoft Electric Guns</title>
		<link>http://osteele.com/archives/2004/09/becoming-lisp/comment-page-1#comment-70</link>
		<dc:creator>Cheap Airsoft Electric Guns</dc:creator>
		<pubDate>Fri, 08 Aug 2008 00:09:29 +0000</pubDate>
		<guid isPermaLink="false">http://osteele.com/2004/09/10/becoming-lisp#comment-70</guid>
		<description>I agree, python is becoming more like lisp every day. I think that python is a great platform but it needs some things to work better for ME. Everyone has their own needs and uses.</description>
		<content:encoded><![CDATA[<p>I agree, python is becoming more like lisp every day. I think that python is a great platform but it needs some things to work better for ME. Everyone has their own needs and uses.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: jon</title>
		<link>http://osteele.com/archives/2004/09/becoming-lisp/comment-page-1#comment-69</link>
		<dc:creator>jon</dc:creator>
		<pubDate>Fri, 13 Jun 2008 07:26:37 +0000</pubDate>
		<guid isPermaLink="false">http://osteele.com/2004/09/10/becoming-lisp#comment-69</guid>
		<description>wow! nice article. thanks for sharing.</description>
		<content:encoded><![CDATA[<p>wow! nice article. thanks for sharing.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Oliver Steele</title>
		<link>http://osteele.com/archives/2004/09/becoming-lisp/comment-page-1#comment-68</link>
		<dc:creator>Oliver Steele</dc:creator>
		<pubDate>Sun, 19 Sep 2004 04:42:32 +0000</pubDate>
		<guid isPermaLink="false">http://osteele.com/2004/09/10/becoming-lisp#comment-68</guid>
		<description>Chris Dean and JJC: What sorts of things do you use macros for in Lisp?

I used to use macros for a several different things in Lisp.  Many of them I switched to closures or multimethods for even when I still did most of my work in Lisp.  Other uses of macros (for example, reader macros) rarely turned out to be worth the trouble of maintaining or integrating with other libraries.

The use of macros that I found the most powerful was to define new top-level defining forms, but metaprogramming works pretty well for this, and so does having a literal syntax for finite maps (or "dicts" or "hashes".  I found Lisp's MAKE-HASHTABLE a poor substitute for this.

The other use of macros in my work was to define new binding forms such as with-open-file or with-graphics-context.  Python doesn't have a good replacement for this.

JJC: "Just because Python has a lambda operator, it does /not/ mean it supports functional programming."  What did you have in mind?  (BTW, Python has had lambda for years.  What it's added lately are Haskell-style list comprehensions, generators, and libraries such as itertools.)</description>
		<content:encoded><![CDATA[<p>Chris Dean and <span class="caps">JJC</span>: What sorts of things do you use macros for in Lisp?</p>
<p>I used to use macros for a several different things in Lisp.  Many of them I switched to closures or multimethods for even when I still did most of my work in Lisp.  Other uses of macros (for example, reader macros) rarely turned out to be worth the trouble of maintaining or integrating with other libraries.</p>
<p>The use of macros that I found the most powerful was to define new top-level defining forms, but metaprogramming works pretty well for this, and so does having a literal syntax for finite maps (or &#8220;dicts&#8221; or &#8220;hashes&#8221;.  I found Lisp&#8217;s <span class="caps">MAKE</span>-HASHTABLE a poor substitute for this.</p>
<p>The other use of macros in my work was to define new binding forms such as with-open-file or with-graphics-context.  Python doesn&#8217;t have a good replacement for this.</p>
<p><span class="caps">JJC</span>: &#8220;Just because Python has a lambda operator, it does /not/ mean it supports functional programming.&#8221;  What did you have in mind?  (BTW, Python has had lambda for years.  What it&#8217;s added lately are Haskell-style list comprehensions, generators, and libraries such as itertools.)</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Oliver Steele</title>
		<link>http://osteele.com/archives/2004/09/becoming-lisp/comment-page-1#comment-67</link>
		<dc:creator>Oliver Steele</dc:creator>
		<pubDate>Sun, 19 Sep 2004 04:32:14 +0000</pubDate>
		<guid isPermaLink="false">http://osteele.com/2004/09/10/becoming-lisp#comment-67</guid>
		<description>Brice: I think you've hit the nail on the head with your comment that different tools are appropriate for different teams (and for different projects, and different contexts --- I wouldn't have written a rendering engine in Python, or PyWordnet in assembly).

Still, it would be nice if the different tools for different teams could be hosted in one language.

If you start with a superset of the features you need, subsetting it requires policies, conventions, and, ideally, tool support --- something like &lt;a href="http://checkstyle.sourceforge.net/"&gt;Checkstyle&lt;/a&gt; or &lt;a href="http://innig.net/macker/"&gt;Macker&lt;/a&gt; that can be run as a supplement to the compiler to create a composite compiler that compiles a subset of the full language, or like the language devels in &lt;a href="http://www.drscheme.org/"&gt;DrScheme&lt;/a&gt;.

If you start with a subset of the features you need, you end up writing what would have been the compiler expansion of these features into your source code, using a precompiler, or implementing these features with metaobject programming.  But you can only do the last if the language has metaobject programming features to begin with, which reduces this problem to the previous case, where you want the language to have these features, but you want to restrict their use, or the use of the features they create, to certain libraries.  Something like Macker for language features seems like it would be appropriate here.</description>
		<content:encoded><![CDATA[<p>Brice: I think you&#8217;ve hit the nail on the head with your comment that different tools are appropriate for different teams (and for different projects, and different contexts &#8212; I wouldn&#8217;t have written a rendering engine in Python, or PyWordnet in assembly).</p>
<p>Still, it would be nice if the different tools for different teams could be hosted in one language.</p>
<p>If you start with a superset of the features you need, subsetting it requires policies, conventions, and, ideally, tool support &#8212; something like <a href="http://checkstyle.sourceforge.net/">Checkstyle</a> or <a href="http://innig.net/macker/">Macker</a> that can be run as a supplement to the compiler to create a composite compiler that compiles a subset of the full language, or like the language devels in <a href="http://www.drscheme.org/">DrScheme</a>.</p>
<p>If you start with a subset of the features you need, you end up writing what would have been the compiler expansion of these features into your source code, using a precompiler, or implementing these features with metaobject programming.  But you can only do the last if the language has metaobject programming features to begin with, which reduces this problem to the previous case, where you want the language to have these features, but you want to restrict their use, or the use of the features they create, to certain libraries.  Something like Macker for language features seems like it would be appropriate here.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: JJC</title>
		<link>http://osteele.com/archives/2004/09/becoming-lisp/comment-page-1#comment-66</link>
		<dc:creator>JJC</dc:creator>
		<pubDate>Sun, 19 Sep 2004 02:57:12 +0000</pubDate>
		<guid isPermaLink="false">http://osteele.com/2004/09/10/becoming-lisp#comment-66</guid>
		<description>[In order to tone down the amount of hostile commentary, I've decided to require email addresses for comments, and I've edited out the ad hominem attacks in the following comment.  If the author would like to resubmit the comment with an email address, I'll replace the edited version by the original.]

[Ad-hominem comment deleted.] Just because Python has a lambda operator, it does /not/ mean it supports functional programming.
And why do you think little recipes are impressive?
I think that something like creating a free CLIM, now /that's/ impressive.
Python midshare is huge compared to Lisp. [Ad-hominem comment deleted.] It means O'Reilly supports you, but so what?
Please go see what the Common Lisp community is doing at http://www.cliki.net.
Besides, sorry, but no CL macros. No code that reads code in the language code was written. Data is code - code is data. That's Lisp.</description>
		<content:encoded><![CDATA[<p>[In order to tone down the amount of hostile commentary, I&#8217;ve decided to require email addresses for comments, and I&#8217;ve edited out the ad hominem attacks in the following comment.  If the author would like to resubmit the comment with an email address, I&#8217;ll replace the edited version by the original.]</p>
<p>[Ad-hominem comment deleted.] Just because Python has a lambda operator, it does /not/ mean it supports functional programming.<br />
And why do you think little recipes are impressive?<br />
I think that something like creating a free <span class="caps">CLIM</span>, now /that&#8217;s/ impressive.<br />
Python midshare is huge compared to Lisp. [Ad-hominem comment deleted.] It means O&#8217;Reilly supports you, but so what?<br />
Please go see what the Common Lisp community is doing at <a href="http://www.cliki.net" rel="nofollow">http://www.cliki.net</a>.<br />
Besides, sorry, but no CL macros. No code that reads code in the language code was written. Data is code - code is data. That&#8217;s Lisp.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Brice Tebbs</title>
		<link>http://osteele.com/archives/2004/09/becoming-lisp/comment-page-1#comment-65</link>
		<dc:creator>Brice Tebbs</dc:creator>
		<pubDate>Mon, 13 Sep 2004 00:09:57 +0000</pubDate>
		<guid isPermaLink="false">http://osteele.com/2004/09/10/becoming-lisp#comment-65</guid>
		<description>I think it comes down to having the right number of tools. Each one you add to your toolbox has to be worth the weight of carrying it around. I wouldn't want to give up on virtual functions, operator overloading or constructor/destructors in c++. But that doesn't mean that each new tool we add makes the situation better. I think templates are great for making generic collection classes but I have also seen them used to make code that is obscure and almost impossible to debug through. Sure, that's the fault of the coder and not the tool. Guns don't kill people, People do. However, I think you have to be careful to avoid a point where you have allowed too many different tools into your project for the members of the team to use and play nicely with. Establishing best practices for using any tool/feature can take a significant amount of time in any group. Sometimes I joke that all the productivity gain from using things like C++ is lost in the time spent debating about how to use these features.  Of course, might be making an argument for smaller teams as much as for holding the line on language features...</description>
		<content:encoded><![CDATA[<p>I think it comes down to having the right number of tools. Each one you add to your toolbox has to be worth the weight of carrying it around. I wouldn&#8217;t want to give up on virtual functions, operator overloading or constructor/destructors in c++. But that doesn&#8217;t mean that each new tool we add makes the situation better. I think templates are great for making generic collection classes but I have also seen them used to make code that is obscure and almost impossible to debug through. Sure, that&#8217;s the fault of the coder and not the tool. Guns don&#8217;t kill people, People do. However, I think you have to be careful to avoid a point where you have allowed too many different tools into your project for the members of the team to use and play nicely with. Establishing best practices for using any tool/feature can take a significant amount of time in any group. Sometimes I joke that all the productivity gain from using things like C++ is lost in the time spent debating about how to use these features.  Of course, might be making an argument for smaller teams as much as for holding the line on language features&#8230;</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Oliver Steele</title>
		<link>http://osteele.com/archives/2004/09/becoming-lisp/comment-page-1#comment-64</link>
		<dc:creator>Oliver Steele</dc:creator>
		<pubDate>Sun, 12 Sep 2004 22:32:31 +0000</pubDate>
		<guid isPermaLink="false">http://osteele.com/2004/09/10/becoming-lisp#comment-64</guid>
		<description>Hi, Brice, and thanks!

Your comment was very interesting, and raised a lot of issues --- especially the difference between &lt;em&gt;readability&lt;/em&gt; and &lt;em&gt;writability&lt;/em&gt;, and the difference (which you hint at) between &lt;em&gt;features&lt;/em&gt; and &lt;em&gt;paradigms&lt;/em&gt;.  Those are worthy of a longer answer; I'm not going to try at all in this comment.

Two points:

1. Features increase the &lt;em&gt;range&lt;/em&gt; of readability.  Each feature makes it possible to write both more-readable and less-readable programs than one could write without it.  Consider Python &lt;code&gt;_&2d;new__&lt;/code&gt;.  A program with &lt;code&gt;__new__&lt;/code&gt; strewn throughout is &lt;em&gt;less&lt;/em&gt; readable than it otherwise would be.  A program that uses a named tuple class (which can be &lt;a href="http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/303439"&gt;implemented with a single &lt;code&gt;__new__&lt;/code&gt;&lt;/a&gt;) can be &lt;em&gt;more&lt;/em&gt; readable than one that doesn't --- especially if the one that doesn't uses what is basically a source-level expansion of the named tuple implementation, each place a named tuple would be appropriate.

Consider virtual functions (or method overriding, in an OO language).  Virtual functions make it easier to write readable programs, because they move the switch statements or function pointers that would otherwise be necessary out of the problem domain code.  (In fact, virtual functions are a way of moving this dispatch code out of the program source entirely, to the language implementation).  But virtual functions also make it easier to write unreadable programs --- it can be very hard to find which implementation of a method is called under which circumstances.

I'd rather have the &lt;em&gt;possibility&lt;/em&gt; of working with readable programs than the &lt;em&gt;certainty&lt;/em&gt; of avoiding unreadable programs, but it depends on who you're working with and where the code you read is coming from.

2. "source code from different projects doesn't seem like it's written in the same language": Maybe this is a &lt;em&gt;good&lt;/em&gt; thing!  Consider the case where the best language for one project is Prolog and the best language for another project is Haskell.  Then there's two choices: Use &lt;em&gt;completely&lt;/em&gt; different languages for different projects, or using the wrong language for some projects because it's the right language for others.  Language features give you a third choice: use different &lt;em&gt;libraries and extensions&lt;/em&gt; for different projects.  It's not clear that &lt;em&gt;seeming&lt;/em&gt; like different projects are in different languages is as bad as the alternatives: &lt;em&gt;being&lt;/em&gt; in different languages, or being in the &lt;em&gt;wrong&lt;/em&gt; language!</description>
		<content:encoded><![CDATA[<p>Hi, Brice, and thanks!</p>
<p>Your comment was very interesting, and raised a lot of issues &#8212; especially the difference between <em>readability</em> and <em>writability</em>, and the difference (which you hint at) between <em>features</em> and <em>paradigms</em>.  Those are worthy of a longer answer; I&#8217;m not going to try at all in this comment.</p>
<p>Two points:</p>
<p>1. Features increase the <em>range</em> of readability.  Each feature makes it possible to write both more-readable and less-readable programs than one could write without it.  Consider Python <code>&lt;em&gt;&amp;2d;new&lt;/em&gt;_</code>.  A program with <code>&lt;i&gt;new&lt;/i&gt;</code> strewn throughout is <em>less</em> readable than it otherwise would be.  A program that uses a named tuple class (which can be <a href="http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/303439">implemented with a single <code>&lt;i&gt;new&lt;/i&gt;</code></a>) can be <em>more</em> readable than one that doesn&#8217;t &#8212; especially if the one that doesn&#8217;t uses what is basically a source-level expansion of the named tuple implementation, each place a named tuple would be appropriate.</p>
<p>Consider virtual functions (or method overriding, in an OO language).  Virtual functions make it easier to write readable programs, because they move the switch statements or function pointers that would otherwise be necessary out of the problem domain code.  (In fact, virtual functions are a way of moving this dispatch code out of the program source entirely, to the language implementation).  But virtual functions also make it easier to write unreadable programs &#8212; it can be very hard to find which implementation of a method is called under which circumstances.</p>
<p>I&#8217;d rather have the <em>possibility</em> of working with readable programs than the <em>certainty</em> of avoiding unreadable programs, but it depends on who you&#8217;re working with and where the code you read is coming from.</p>
<p>2. &#8220;source code from different projects doesn&#8217;t seem like it&#8217;s written in the same language&#8221;: Maybe this is a <em>good</em> thing!  Consider the case where the best language for one project is Prolog and the best language for another project is Haskell.  Then there&#8217;s two choices: Use <em>completely</em> different languages for different projects, or using the wrong language for some projects because it&#8217;s the right language for others.  Language features give you a third choice: use different <em>libraries and extensions</em> for different projects.  It&#8217;s not clear that <em>seeming</em> like different projects are in different languages is as bad as the alternatives: <em>being</em> in different languages, or being in the <em>wrong</em> language!</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Chris Dean</title>
		<link>http://osteele.com/archives/2004/09/becoming-lisp/comment-page-1#comment-63</link>
		<dc:creator>Chris Dean</dc:creator>
		<pubDate>Sun, 12 Sep 2004 04:21:27 +0000</pubDate>
		<guid isPermaLink="false">http://osteele.com/2004/09/10/becoming-lisp#comment-63</guid>
		<description>Python is great - a wonderful language and environment.
But it seems to me that until it has macros it will
never really be as nice as Lisp.</description>
		<content:encoded><![CDATA[<p>Python is great - a wonderful language and environment.<br />
But it seems to me that until it has macros it will<br />
never really be as nice as Lisp.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Brice Tebbs</title>
		<link>http://osteele.com/archives/2004/09/becoming-lisp/comment-page-1#comment-62</link>
		<dc:creator>Brice Tebbs</dc:creator>
		<pubDate>Sat, 11 Sep 2004 04:31:46 +0000</pubDate>
		<guid isPermaLink="false">http://osteele.com/2004/09/10/becoming-lisp#comment-62</guid>
		<description>Oliver,

You're way smarter than me on topics like this. But its been bothering me a little to see all these new features become part of python. While I think overall they have done a good job of adding features while maintaining the cleanliness of the language, it seems like now we are starting to get too many possible paradigms in one coding environment. Power in a language is usually always good for writing code but not always for reading it. C++'s biggest weakness imho is that there are so many different ways to (u&#124;abu)se templates, references and the like that source code from different projects doesn't even seem like its written in the same language.

At Cyan we had our orignal build scripts written in perl and we replaced them all with python when we realized that no one had a clue how they worked. Even the people who had never used python could figure out the python code.

So I worry that to the extent python can work like (c/ada/modula) AND (lisp/scheme/etc) we might end up with code that is more obscure.

What do you think?</description>
		<content:encoded><![CDATA[<p>Oliver,</p>
<p>You&#8217;re way smarter than me on topics like this. But its been bothering me a little to see all these new features become part of python. While I think overall they have done a good job of adding features while maintaining the cleanliness of the language, it seems like now we are starting to get too many possible paradigms in one coding environment. Power in a language is usually always good for writing code but not always for reading it. C++&#8217;s biggest weakness imho is that there are so many different ways to (u|abu)se templates, references and the like that source code from different projects doesn&#8217;t even seem like its written in the same language.</p>
<p>At Cyan we had our orignal build scripts written in perl and we replaced them all with python when we realized that no one had a clue how they worked. Even the people who had never used python could figure out the python code.</p>
<p>So I worry that to the extent python can work like (c/ada/modula) <span class="caps">AND </span>(lisp/scheme/etc) we might end up with code that is more obscure.</p>
<p>What do you think?</p>
]]></content:encoded>
	</item>
</channel>
</rss>
