<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<link rel="self" href="/Atom/" />
	<id>http://billmill.org/</id>
	<title>My Name Rhymes</title>
	<subtitle>Bill Mill blogs irregularly</subtitle>
	<updated>2008-03-19T00:14:00Z</updated>
	<author>
		<name>Bill Mill</name>
		<email>bill.mill@gmail.com</email>
		<uri>http://billmill.org/</uri>
	</author>
	<link href="http://billmill.org/" />
	<entry>
		<title>Pong in 30 Lines</title>
		<link href="http://billmill.org/pong.html" />	
		<id>http://billmill.org/pong.html</id>
		<updated>2008-03-19T00:14:00Z</updated>
		<summary type="html">&lt;a href="http://nodebox.net"&gt;NodeBox&lt;/a&gt; rocks. Copy this code into the 
nodebox window and hit apple-R to play pong.
&lt;p&gt;&lt;div class="highlight"&gt;&lt;pre&gt;size(&lt;span style="color: #009999"&gt;400&lt;/span&gt;,&lt;span style="color: #009999"&gt;400&lt;/span&gt;)
speed(&lt;span style="color: #009999"&gt;40&lt;/span&gt;)

ball_diameter &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="color: #009999"&gt;20&lt;/span&gt;
paddle_size &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="color: #009999"&gt;75&lt;/span&gt;
v_x, v_y &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; (&lt;span style="color: #009999"&gt;3&lt;/span&gt;, &lt;span style="color: #009999"&gt;4&lt;/span&gt;)
p_x, p_y &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; (&lt;span style="color: #009999"&gt;10&lt;/span&gt;, &lt;span style="color: #009999"&gt;10&lt;/span&gt;)
bounce &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="color: #009999"&gt;1.2&lt;/span&gt;
points &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; []
computer &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; WIDTH &lt;span style="font-weight: bold"&gt;/&lt;/span&gt; &lt;span style="color: #009999"&gt;2&lt;/span&gt;
compuspeed &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="color: #009999"&gt;10&lt;/span&gt;

&lt;span style="font-weight: bold"&gt;def&lt;/span&gt; &lt;span style="color: #990000; font-weight: bold"&gt;draw&lt;/span&gt;():
    &lt;span style="font-weight: bold"&gt;global&lt;/span&gt; v_x, v_y, p_x, p_y, points, bounce, computer, compuspeed
    
    &lt;span style="font-weight: bold"&gt;if&lt;/span&gt; &lt;span style="font-weight: bold"&gt;not&lt;/span&gt; &lt;span style="font-weight: bold"&gt;-&lt;/span&gt;ball_diameter &lt;span style="font-weight: bold"&gt;&amp;lt;&lt;/span&gt; p_y &lt;span style="font-weight: bold"&gt;&amp;lt;&lt;/span&gt; HEIGHT &lt;span style="font-weight: bold"&gt;+&lt;/span&gt; ball_diameter:
        text(&lt;span style="color: #bb8844"&gt;&amp;quot;Game Over&amp;quot;&lt;/span&gt;, WIDTH&lt;span style="font-weight: bold"&gt;/&lt;/span&gt;&lt;span style="color: #009999"&gt;2&lt;/span&gt;, HEIGHT&lt;span style="font-weight: bold"&gt;/&lt;/span&gt;&lt;span style="color: #009999"&gt;2&lt;/span&gt;)
        &lt;span style="font-weight: bold"&gt;if&lt;/span&gt; p_y &lt;span style="font-weight: bold"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color: #009999"&gt;0&lt;/span&gt;: text(&lt;span style="color: #bb8844"&gt;&amp;quot;You win!&amp;quot;&lt;/span&gt;, WIDTH&lt;span style="font-weight: bold"&gt;/&lt;/span&gt;&lt;span style="color: #009999"&gt;2&lt;/span&gt;, HEIGHT&lt;span style="font-weight: bold"&gt;/&lt;/span&gt;&lt;span style="color: #009999"&gt;2&lt;/span&gt;&lt;span style="font-weight: bold"&gt;+&lt;/span&gt;&lt;span style="color: #009999"&gt;20&lt;/span&gt;)
        &lt;span style="font-weight: bold"&gt;else&lt;/span&gt;:       text(&lt;span style="color: #bb8844"&gt;&amp;quot;Computer wins&amp;quot;&lt;/span&gt;, WIDTH&lt;span style="font-weight: bold"&gt;/&lt;/span&gt;&lt;span style="color: #009999"&gt;2&lt;/span&gt;, HEIGHT&lt;span style="font-weight: bold"&gt;/&lt;/span&gt;&lt;span style="color: #009999"&gt;2&lt;/span&gt;&lt;span style="font-weight: bold"&gt;-&lt;/span&gt;&lt;span style="color: #009999"&gt;20&lt;/span&gt;)
        &lt;span style="font-weight: bold"&gt;return&lt;/span&gt;

    paddle_left &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="color: #999999"&gt;min&lt;/span&gt;(&lt;span style="color: #999999"&gt;max&lt;/span&gt;(MOUSEX, &lt;span style="color: #009999"&gt;0&lt;/span&gt;), WIDTH&lt;span style="font-weight: bold"&gt;-&lt;/span&gt;paddle_size)
    ny &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; p_y &lt;span style="font-weight: bold"&gt;+&lt;/span&gt; v_y
    nx &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; p_x &lt;span style="font-weight: bold"&gt;+&lt;/span&gt; v_x
    
    &lt;span style="font-weight: bold"&gt;if&lt;/span&gt; nx &lt;span style="font-weight: bold"&gt;+&lt;/span&gt; (ball_diameter&lt;span style="font-weight: bold"&gt;/&lt;/span&gt;&lt;span style="color: #009999"&gt;2&lt;/span&gt;) &lt;span style="font-weight: bold"&gt;&amp;gt;&lt;/span&gt; computer &lt;span style="font-weight: bold"&gt;+&lt;/span&gt; paddle_size: computer &lt;span style="font-weight: bold"&gt;+=&lt;/span&gt; compuspeed
    &lt;span style="font-weight: bold"&gt;elif&lt;/span&gt; nx &lt;span style="font-weight: bold"&gt;&amp;lt;&lt;/span&gt; computer:                                 computer &lt;span style="font-weight: bold"&gt;-=&lt;/span&gt; compuspeed
    rect(computer, &lt;span style="color: #009999"&gt;0&lt;/span&gt;, paddle_size, &lt;span style="color: #009999"&gt;4&lt;/span&gt;, roundness&lt;span style="font-weight: bold"&gt;=&lt;/span&gt;&lt;span style="color: #009999"&gt;2&lt;/span&gt;)

    &lt;span style="font-weight: bold"&gt;if&lt;/span&gt; ny &lt;span style="font-weight: bold"&gt;+&lt;/span&gt; ball_diameter &lt;span style="font-weight: bold"&gt;&amp;gt;&lt;/span&gt; HEIGHT &lt;span style="font-weight: bold"&gt;and&lt;/span&gt; v_y &lt;span style="font-weight: bold"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color: #009999"&gt;0&lt;/span&gt; \
    &lt;span style="font-weight: bold"&gt;and&lt;/span&gt; paddle_left &lt;span style="font-weight: bold"&gt;&amp;lt;&lt;/span&gt; nx &lt;span style="font-weight: bold"&gt;+&lt;/span&gt; (ball_diameter &lt;span style="font-weight: bold"&gt;/&lt;/span&gt; &lt;span style="color: #009999"&gt;2&lt;/span&gt;) &lt;span style="font-weight: bold"&gt;&amp;lt;&lt;/span&gt; paddle_left &lt;span style="font-weight: bold"&gt;+&lt;/span&gt; paddle_size:
        v_y &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="font-weight: bold"&gt;-&lt;/span&gt;v_y &lt;span style="font-weight: bold"&gt;*&lt;/span&gt; bounce
        v_x &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; (nx &lt;span style="font-weight: bold"&gt;-&lt;/span&gt; paddle_left &lt;span style="font-weight: bold"&gt;-&lt;/span&gt; (paddle_size &lt;span style="font-weight: bold"&gt;/&lt;/span&gt; &lt;span style="color: #009999"&gt;2&lt;/span&gt;)) &lt;span style="font-weight: bold"&gt;*&lt;/span&gt; &lt;span style="font-weight: bold"&gt;.&lt;/span&gt;&lt;span style="color: #009999"&gt;25&lt;/span&gt;
        ny &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; HEIGHT &lt;span style="font-weight: bold"&gt;-&lt;/span&gt; ball_diameter
    &lt;span style="font-weight: bold"&gt;if&lt;/span&gt; ny &lt;span style="font-weight: bold"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color: #009999"&gt;0&lt;/span&gt; &lt;span style="font-weight: bold"&gt;and&lt;/span&gt; v_y &lt;span style="font-weight: bold"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color: #009999"&gt;0&lt;/span&gt; \
    &lt;span style="font-weight: bold"&gt;and&lt;/span&gt; computer &lt;span style="font-weight: bold"&gt;&amp;lt;&lt;/span&gt; nx &lt;span style="font-weight: bold"&gt;+&lt;/span&gt; (ball_diameter &lt;span style="font-weight: bold"&gt;/&lt;/span&gt; &lt;span style="color: #009999"&gt;2&lt;/span&gt;) &lt;span style="font-weight: bold"&gt;&amp;lt;&lt;/span&gt; computer &lt;span style="font-weight: bold"&gt;+&lt;/span&gt; paddle_size:
        v_y &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="font-weight: bold"&gt;-&lt;/span&gt;v_y &lt;span style="font-weight: bold"&gt;*&lt;/span&gt; bounce
        v_x &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; (nx &lt;span style="font-weight: bold"&gt;-&lt;/span&gt; computer &lt;span style="font-weight: bold"&gt;-&lt;/span&gt; (paddle_size &lt;span style="font-weight: bold"&gt;/&lt;/span&gt; &lt;span style="color: #009999"&gt;2&lt;/span&gt;)) &lt;span style="font-weight: bold"&gt;*&lt;/span&gt; &lt;span style="font-weight: bold"&gt;.&lt;/span&gt;&lt;span style="color: #009999"&gt;25&lt;/span&gt;
        ny &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="color: #009999"&gt;0&lt;/span&gt;
    &lt;span style="font-weight: bold"&gt;elif&lt;/span&gt; nx &lt;span style="font-weight: bold"&gt;+&lt;/span&gt; ball_diameter &lt;span style="font-weight: bold"&gt;&amp;gt;&lt;/span&gt; WIDTH &lt;span style="font-weight: bold"&gt;or&lt;/span&gt; nx &lt;span style="font-weight: bold"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color: #009999"&gt;0&lt;/span&gt;:
        v_x &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="font-weight: bold"&gt;-&lt;/span&gt;v_x
        
    mx &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="color: #999999"&gt;max&lt;/span&gt;(&lt;span style="color: #009999"&gt;0&lt;/span&gt;, &lt;span style="color: #999999"&gt;min&lt;/span&gt;(MOUSEX, WIDTH &lt;span style="font-weight: bold"&gt;-&lt;/span&gt; paddle_size))
    rect(mx, HEIGHT&lt;span style="font-weight: bold"&gt;-&lt;/span&gt;&lt;span style="color: #009999"&gt;4&lt;/span&gt;, paddle_size, &lt;span style="color: #009999"&gt;4&lt;/span&gt;, roundness&lt;span style="font-weight: bold"&gt;=&lt;/span&gt;&lt;span style="color: #009999"&gt;2&lt;/span&gt;)

    p_x &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; nx
    p_y &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; ny
    oval(p_x, p_y, ball_diameter, ball_diameter)
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;
&lt;p&gt;I'd never written a game before, and they say you aren't allowed if you 
don't start with pong, so here it is. I was actually just playing around with 
motion in NodeBox for a seperate project, and did this for fun.
</summary>
		<content type="html">&lt;a href="http://nodebox.net"&gt;NodeBox&lt;/a&gt; rocks. Copy this code into the 
nodebox window and hit apple-R to play pong.
&lt;p&gt;&lt;div class="highlight"&gt;&lt;pre&gt;size(&lt;span style="color: #009999"&gt;400&lt;/span&gt;,&lt;span style="color: #009999"&gt;400&lt;/span&gt;)
speed(&lt;span style="color: #009999"&gt;40&lt;/span&gt;)

ball_diameter &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="color: #009999"&gt;20&lt;/span&gt;
paddle_size &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="color: #009999"&gt;75&lt;/span&gt;
v_x, v_y &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; (&lt;span style="color: #009999"&gt;3&lt;/span&gt;, &lt;span style="color: #009999"&gt;4&lt;/span&gt;)
p_x, p_y &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; (&lt;span style="color: #009999"&gt;10&lt;/span&gt;, &lt;span style="color: #009999"&gt;10&lt;/span&gt;)
bounce &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="color: #009999"&gt;1.2&lt;/span&gt;
points &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; []
computer &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; WIDTH &lt;span style="font-weight: bold"&gt;/&lt;/span&gt; &lt;span style="color: #009999"&gt;2&lt;/span&gt;
compuspeed &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="color: #009999"&gt;10&lt;/span&gt;

&lt;span style="font-weight: bold"&gt;def&lt;/span&gt; &lt;span style="color: #990000; font-weight: bold"&gt;draw&lt;/span&gt;():
    &lt;span style="font-weight: bold"&gt;global&lt;/span&gt; v_x, v_y, p_x, p_y, points, bounce, computer, compuspeed
    
    &lt;span style="font-weight: bold"&gt;if&lt;/span&gt; &lt;span style="font-weight: bold"&gt;not&lt;/span&gt; &lt;span style="font-weight: bold"&gt;-&lt;/span&gt;ball_diameter &lt;span style="font-weight: bold"&gt;&amp;lt;&lt;/span&gt; p_y &lt;span style="font-weight: bold"&gt;&amp;lt;&lt;/span&gt; HEIGHT &lt;span style="font-weight: bold"&gt;+&lt;/span&gt; ball_diameter:
        text(&lt;span style="color: #bb8844"&gt;&amp;quot;Game Over&amp;quot;&lt;/span&gt;, WIDTH&lt;span style="font-weight: bold"&gt;/&lt;/span&gt;&lt;span style="color: #009999"&gt;2&lt;/span&gt;, HEIGHT&lt;span style="font-weight: bold"&gt;/&lt;/span&gt;&lt;span style="color: #009999"&gt;2&lt;/span&gt;)
        &lt;span style="font-weight: bold"&gt;if&lt;/span&gt; p_y &lt;span style="font-weight: bold"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color: #009999"&gt;0&lt;/span&gt;: text(&lt;span style="color: #bb8844"&gt;&amp;quot;You win!&amp;quot;&lt;/span&gt;, WIDTH&lt;span style="font-weight: bold"&gt;/&lt;/span&gt;&lt;span style="color: #009999"&gt;2&lt;/span&gt;, HEIGHT&lt;span style="font-weight: bold"&gt;/&lt;/span&gt;&lt;span style="color: #009999"&gt;2&lt;/span&gt;&lt;span style="font-weight: bold"&gt;+&lt;/span&gt;&lt;span style="color: #009999"&gt;20&lt;/span&gt;)
        &lt;span style="font-weight: bold"&gt;else&lt;/span&gt;:       text(&lt;span style="color: #bb8844"&gt;&amp;quot;Computer wins&amp;quot;&lt;/span&gt;, WIDTH&lt;span style="font-weight: bold"&gt;/&lt;/span&gt;&lt;span style="color: #009999"&gt;2&lt;/span&gt;, HEIGHT&lt;span style="font-weight: bold"&gt;/&lt;/span&gt;&lt;span style="color: #009999"&gt;2&lt;/span&gt;&lt;span style="font-weight: bold"&gt;-&lt;/span&gt;&lt;span style="color: #009999"&gt;20&lt;/span&gt;)
        &lt;span style="font-weight: bold"&gt;return&lt;/span&gt;

    paddle_left &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="color: #999999"&gt;min&lt;/span&gt;(&lt;span style="color: #999999"&gt;max&lt;/span&gt;(MOUSEX, &lt;span style="color: #009999"&gt;0&lt;/span&gt;), WIDTH&lt;span style="font-weight: bold"&gt;-&lt;/span&gt;paddle_size)
    ny &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; p_y &lt;span style="font-weight: bold"&gt;+&lt;/span&gt; v_y
    nx &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; p_x &lt;span style="font-weight: bold"&gt;+&lt;/span&gt; v_x
    
    &lt;span style="font-weight: bold"&gt;if&lt;/span&gt; nx &lt;span style="font-weight: bold"&gt;+&lt;/span&gt; (ball_diameter&lt;span style="font-weight: bold"&gt;/&lt;/span&gt;&lt;span style="color: #009999"&gt;2&lt;/span&gt;) &lt;span style="font-weight: bold"&gt;&amp;gt;&lt;/span&gt; computer &lt;span style="font-weight: bold"&gt;+&lt;/span&gt; paddle_size: computer &lt;span style="font-weight: bold"&gt;+=&lt;/span&gt; compuspeed
    &lt;span style="font-weight: bold"&gt;elif&lt;/span&gt; nx &lt;span style="font-weight: bold"&gt;&amp;lt;&lt;/span&gt; computer:                                 computer &lt;span style="font-weight: bold"&gt;-=&lt;/span&gt; compuspeed
    rect(computer, &lt;span style="color: #009999"&gt;0&lt;/span&gt;, paddle_size, &lt;span style="color: #009999"&gt;4&lt;/span&gt;, roundness&lt;span style="font-weight: bold"&gt;=&lt;/span&gt;&lt;span style="color: #009999"&gt;2&lt;/span&gt;)

    &lt;span style="font-weight: bold"&gt;if&lt;/span&gt; ny &lt;span style="font-weight: bold"&gt;+&lt;/span&gt; ball_diameter &lt;span style="font-weight: bold"&gt;&amp;gt;&lt;/span&gt; HEIGHT &lt;span style="font-weight: bold"&gt;and&lt;/span&gt; v_y &lt;span style="font-weight: bold"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color: #009999"&gt;0&lt;/span&gt; \
    &lt;span style="font-weight: bold"&gt;and&lt;/span&gt; paddle_left &lt;span style="font-weight: bold"&gt;&amp;lt;&lt;/span&gt; nx &lt;span style="font-weight: bold"&gt;+&lt;/span&gt; (ball_diameter &lt;span style="font-weight: bold"&gt;/&lt;/span&gt; &lt;span style="color: #009999"&gt;2&lt;/span&gt;) &lt;span style="font-weight: bold"&gt;&amp;lt;&lt;/span&gt; paddle_left &lt;span style="font-weight: bold"&gt;+&lt;/span&gt; paddle_size:
        v_y &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="font-weight: bold"&gt;-&lt;/span&gt;v_y &lt;span style="font-weight: bold"&gt;*&lt;/span&gt; bounce
        v_x &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; (nx &lt;span style="font-weight: bold"&gt;-&lt;/span&gt; paddle_left &lt;span style="font-weight: bold"&gt;-&lt;/span&gt; (paddle_size &lt;span style="font-weight: bold"&gt;/&lt;/span&gt; &lt;span style="color: #009999"&gt;2&lt;/span&gt;)) &lt;span style="font-weight: bold"&gt;*&lt;/span&gt; &lt;span style="font-weight: bold"&gt;.&lt;/span&gt;&lt;span style="color: #009999"&gt;25&lt;/span&gt;
        ny &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; HEIGHT &lt;span style="font-weight: bold"&gt;-&lt;/span&gt; ball_diameter
    &lt;span style="font-weight: bold"&gt;if&lt;/span&gt; ny &lt;span style="font-weight: bold"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color: #009999"&gt;0&lt;/span&gt; &lt;span style="font-weight: bold"&gt;and&lt;/span&gt; v_y &lt;span style="font-weight: bold"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color: #009999"&gt;0&lt;/span&gt; \
    &lt;span style="font-weight: bold"&gt;and&lt;/span&gt; computer &lt;span style="font-weight: bold"&gt;&amp;lt;&lt;/span&gt; nx &lt;span style="font-weight: bold"&gt;+&lt;/span&gt; (ball_diameter &lt;span style="font-weight: bold"&gt;/&lt;/span&gt; &lt;span style="color: #009999"&gt;2&lt;/span&gt;) &lt;span style="font-weight: bold"&gt;&amp;lt;&lt;/span&gt; computer &lt;span style="font-weight: bold"&gt;+&lt;/span&gt; paddle_size:
        v_y &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="font-weight: bold"&gt;-&lt;/span&gt;v_y &lt;span style="font-weight: bold"&gt;*&lt;/span&gt; bounce
        v_x &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; (nx &lt;span style="font-weight: bold"&gt;-&lt;/span&gt; computer &lt;span style="font-weight: bold"&gt;-&lt;/span&gt; (paddle_size &lt;span style="font-weight: bold"&gt;/&lt;/span&gt; &lt;span style="color: #009999"&gt;2&lt;/span&gt;)) &lt;span style="font-weight: bold"&gt;*&lt;/span&gt; &lt;span style="font-weight: bold"&gt;.&lt;/span&gt;&lt;span style="color: #009999"&gt;25&lt;/span&gt;
        ny &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="color: #009999"&gt;0&lt;/span&gt;
    &lt;span style="font-weight: bold"&gt;elif&lt;/span&gt; nx &lt;span style="font-weight: bold"&gt;+&lt;/span&gt; ball_diameter &lt;span style="font-weight: bold"&gt;&amp;gt;&lt;/span&gt; WIDTH &lt;span style="font-weight: bold"&gt;or&lt;/span&gt; nx &lt;span style="font-weight: bold"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color: #009999"&gt;0&lt;/span&gt;:
        v_x &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="font-weight: bold"&gt;-&lt;/span&gt;v_x
        
    mx &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="color: #999999"&gt;max&lt;/span&gt;(&lt;span style="color: #009999"&gt;0&lt;/span&gt;, &lt;span style="color: #999999"&gt;min&lt;/span&gt;(MOUSEX, WIDTH &lt;span style="font-weight: bold"&gt;-&lt;/span&gt; paddle_size))
    rect(mx, HEIGHT&lt;span style="font-weight: bold"&gt;-&lt;/span&gt;&lt;span style="color: #009999"&gt;4&lt;/span&gt;, paddle_size, &lt;span style="color: #009999"&gt;4&lt;/span&gt;, roundness&lt;span style="font-weight: bold"&gt;=&lt;/span&gt;&lt;span style="color: #009999"&gt;2&lt;/span&gt;)

    p_x &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; nx
    p_y &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; ny
    oval(p_x, p_y, ball_diameter, ball_diameter)
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;
&lt;p&gt;I'd never written a game before, and they say you aren't allowed if you 
don't start with pong, so here it is. I was actually just playing around with 
motion in NodeBox for a seperate project, and did this for fun.
</content>
	</entry>
	<entry>
		<title>Functional Roman Numerals in Python</title>
		<link href="http://billmill.org/python_roman.html" />	
		<id>http://billmill.org/python_roman.html</id>
		<updated>2008-01-12T17:52:00Z</updated>
		<summary type="html">Just as a quck note, I thought I'd post the cleanest python I could come up 
with to solve the &lt;a href="http://billmill.org/roman.html"&gt;roman numerals&lt;/a&gt; 
problem I discussed earlier. It tries to use a functional style while actually 
avoiding recursion. To do so, I wrote an iterative python unfold:
&lt;p&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span style="font-weight: bold"&gt;def&lt;/span&gt; &lt;span style="color: #990000; font-weight: bold"&gt;unfold&lt;/span&gt;(f, x):
    res &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; []                       
    &lt;span style="font-weight: bold"&gt;while&lt;/span&gt; &lt;span style="color: #009999"&gt;1&lt;/span&gt;:
        &lt;span style="font-weight: bold"&gt;try&lt;/span&gt;:
            w, x &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; f(x)
            res&lt;span style="font-weight: bold"&gt;.&lt;/span&gt;append(w)
        &lt;span style="font-weight: bold"&gt;except&lt;/span&gt; &lt;span style="color: #990000; font-weight: bold"&gt;TypeError&lt;/span&gt;:
            &lt;span style="font-weight: bold"&gt;return&lt;/span&gt; res
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;And then the answer becomes:
&lt;p&gt;&lt;div class="highlight"&gt;&lt;pre&gt;numerals &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; [(&lt;span style="color: #bb8844"&gt;&amp;quot;M&amp;quot;&lt;/span&gt;, &lt;span style="color: #009999"&gt;1000&lt;/span&gt;), (&lt;span style="color: #bb8844"&gt;&amp;quot;CM&amp;quot;&lt;/span&gt;, &lt;span style="color: #009999"&gt;900&lt;/span&gt;), (&lt;span style="color: #bb8844"&gt;&amp;quot;D&amp;quot;&lt;/span&gt;, &lt;span style="color: #009999"&gt;500&lt;/span&gt;), (&lt;span style="color: #bb8844"&gt;&amp;quot;CD&amp;quot;&lt;/span&gt;, &lt;span style="color: #009999"&gt;400&lt;/span&gt;),
    (&lt;span style="color: #bb8844"&gt;&amp;quot;C&amp;quot;&lt;/span&gt;, &lt;span style="color: #009999"&gt;100&lt;/span&gt;),  (&lt;span style="color: #bb8844"&gt;&amp;quot;XC&amp;quot;&lt;/span&gt;, &lt;span style="color: #009999"&gt;90&lt;/span&gt;),  (&lt;span style="color: #bb8844"&gt;&amp;quot;L&amp;quot;&lt;/span&gt;, &lt;span style="color: #009999"&gt;50&lt;/span&gt;),  (&lt;span style="color: #bb8844"&gt;&amp;quot;XL&amp;quot;&lt;/span&gt;, &lt;span style="color: #009999"&gt;40&lt;/span&gt;),
    (&lt;span style="color: #bb8844"&gt;&amp;quot;X&amp;quot;&lt;/span&gt;, &lt;span style="color: #009999"&gt;10&lt;/span&gt;),   (&lt;span style="color: #bb8844"&gt;&amp;quot;IX&amp;quot;&lt;/span&gt;, &lt;span style="color: #009999"&gt;9&lt;/span&gt;),   (&lt;span style="color: #bb8844"&gt;&amp;quot;V&amp;quot;&lt;/span&gt;, &lt;span style="color: #009999"&gt;5&lt;/span&gt;),   (&lt;span style="color: #bb8844"&gt;&amp;quot;IV&amp;quot;&lt;/span&gt;, &lt;span style="color: #009999"&gt;4&lt;/span&gt;),
    (&lt;span style="color: #bb8844"&gt;&amp;quot;I&amp;quot;&lt;/span&gt;, &lt;span style="color: #009999"&gt;1&lt;/span&gt;)]

&lt;span style="font-weight: bold"&gt;def&lt;/span&gt; &lt;span style="color: #990000; font-weight: bold"&gt;next&lt;/span&gt;(x):
    &lt;span style="font-weight: bold"&gt;for&lt;/span&gt; n &lt;span style="font-weight: bold"&gt;in&lt;/span&gt; numerals:
        &lt;span style="font-weight: bold"&gt;if&lt;/span&gt; n[&lt;span style="color: #009999"&gt;1&lt;/span&gt;] &lt;span style="font-weight: bold"&gt;&amp;lt;=&lt;/span&gt; x: &lt;span style="font-weight: bold"&gt;return&lt;/span&gt; (n[&lt;span style="color: #009999"&gt;0&lt;/span&gt;], x&lt;span style="font-weight: bold"&gt;-&lt;/span&gt;n[&lt;span style="color: #009999"&gt;1&lt;/span&gt;])

&lt;span style="font-weight: bold"&gt;def&lt;/span&gt; &lt;span style="color: #990000; font-weight: bold"&gt;romanize&lt;/span&gt;(n):
    &lt;span style="font-weight: bold"&gt;return&lt;/span&gt; &lt;span style="color: #bb8844"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span style="font-weight: bold"&gt;.&lt;/span&gt;join(unfold(next, n))
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Compare to the haskell I posted before:
&lt;p&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span style="color: #990000; font-weight: bold"&gt;romanize&lt;/span&gt; &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; concat &lt;span style="font-weight: bold"&gt;.&lt;/span&gt; unfoldr next
    &lt;span style="font-weight: bold"&gt;where&lt;/span&gt; next &lt;span style="color: #009999"&gt;0&lt;/span&gt; &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="color: #445588; font-weight: bold"&gt;Nothing&lt;/span&gt;
          next x &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="color: #445588; font-weight: bold"&gt;Just&lt;/span&gt; &lt;span style="font-weight: bold"&gt;$&lt;/span&gt; second (x&lt;span style="font-weight: bold"&gt;-&lt;/span&gt;) &lt;span style="font-weight: bold"&gt;$&lt;/span&gt; head &lt;span style="font-weight: bold"&gt;$&lt;/span&gt; filter ((&lt;span style="font-weight: bold"&gt;&amp;lt;=&lt;/span&gt;x) &lt;span style="font-weight: bold"&gt;.&lt;/span&gt; snd) numerals
          numerals &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; [(&lt;span style="color: #bb8844"&gt;&amp;quot;M&amp;quot;&lt;/span&gt;, &lt;span style="color: #009999"&gt;1000&lt;/span&gt;), (&lt;span style="color: #bb8844"&gt;&amp;quot;CM&amp;quot;&lt;/span&gt;, &lt;span style="color: #009999"&gt;900&lt;/span&gt;), (&lt;span style="color: #bb8844"&gt;&amp;quot;D&amp;quot;&lt;/span&gt;, &lt;span style="color: #009999"&gt;500&lt;/span&gt;), (&lt;span style="color: #bb8844"&gt;&amp;quot;CD&amp;quot;&lt;/span&gt;, &lt;span style="color: #009999"&gt;400&lt;/span&gt;),
                      (&lt;span style="color: #bb8844"&gt;&amp;quot;C&amp;quot;&lt;/span&gt;, &lt;span style="color: #009999"&gt;100&lt;/span&gt;),  (&lt;span style="color: #bb8844"&gt;&amp;quot;XC&amp;quot;&lt;/span&gt;, &lt;span style="color: #009999"&gt;90&lt;/span&gt;),  (&lt;span style="color: #bb8844"&gt;&amp;quot;L&amp;quot;&lt;/span&gt;, &lt;span style="color: #009999"&gt;50&lt;/span&gt;),  (&lt;span style="color: #bb8844"&gt;&amp;quot;XL&amp;quot;&lt;/span&gt;, &lt;span style="color: #009999"&gt;40&lt;/span&gt;),
                      (&lt;span style="color: #bb8844"&gt;&amp;quot;X&amp;quot;&lt;/span&gt;, &lt;span style="color: #009999"&gt;10&lt;/span&gt;),   (&lt;span style="color: #bb8844"&gt;&amp;quot;IX&amp;quot;&lt;/span&gt;, &lt;span style="color: #009999"&gt;9&lt;/span&gt;),   (&lt;span style="color: #bb8844"&gt;&amp;quot;V&amp;quot;&lt;/span&gt;, &lt;span style="color: #009999"&gt;5&lt;/span&gt;),   (&lt;span style="color: #bb8844"&gt;&amp;quot;IV&amp;quot;&lt;/span&gt;, &lt;span style="color: #009999"&gt;4&lt;/span&gt;),
                      (&lt;span style="color: #bb8844"&gt;&amp;quot;I&amp;quot;&lt;/span&gt;, &lt;span style="color: #009999"&gt;1&lt;/span&gt;)]
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The "where" idiom allows you to group helper functions and constants 
underneath the main function, and the unimportance of function order means you 
can highlight the high-level logic. The haskell code is much shorter and 
tighter than the python.
&lt;p&gt;Having powerful iterative functions like unfoldr in the standard library is 
another clear win for Haskell; it took me more lines to define unfold than it 
did to define both next() and romanize(). (By the by, some googling failed to 
turn up a previous python implementation of unfold(); I think this code gets a 
lot uglier without it. I also don't see any obvious way to do it with 
itertools.)
&lt;p&gt;On the other hand, I find the simplicity of the python next() appealing, 
with its constructive instead of declarative approach. It's a less generic 
solution that's intuitively simpler (for me, still an imperative thinker).  
&lt;p&gt;You could match the haskell more exactly:
&lt;p&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span style="font-weight: bold"&gt;from&lt;/span&gt; &lt;span style="color: #555555"&gt;itertools&lt;/span&gt; &lt;span style="font-weight: bold"&gt;import&lt;/span&gt; ifilter

&lt;span style="font-weight: bold"&gt;def&lt;/span&gt; &lt;span style="color: #990000; font-weight: bold"&gt;second&lt;/span&gt;(f, (a, b)): &lt;span style="font-weight: bold"&gt;return&lt;/span&gt; (a, f(b))

&lt;span style="font-weight: bold"&gt;def&lt;/span&gt; &lt;span style="color: #990000; font-weight: bold"&gt;next&lt;/span&gt;(x):
    &lt;span style="font-weight: bold"&gt;return&lt;/span&gt; second(&lt;span style="font-weight: bold"&gt;lambda&lt;/span&gt; a: x&lt;span style="font-weight: bold"&gt;-&lt;/span&gt;a, ifilter(&lt;span style="font-weight: bold"&gt;lambda&lt;/span&gt; (y, z): z &lt;span style="font-weight: bold"&gt;&amp;lt;=&lt;/span&gt; x, numerals)&lt;span style="font-weight: bold"&gt;.&lt;/span&gt;next()
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;but the result is pretty ugly. The inability to compose functions compactly
results in a lot of boilerplate, and in having to pick a lot of meaningless 
variable names that obscure what's going on. We could move the lambdas out of
the call and give them names:
&lt;p&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span style="font-weight: bold"&gt;def&lt;/span&gt; &lt;span style="color: #990000; font-weight: bold"&gt;next&lt;/span&gt;(x):
    subx &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="font-weight: bold"&gt;lambda&lt;/span&gt; a: x&lt;span style="font-weight: bold"&gt;-&lt;/span&gt;a
    ltx &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="font-weight: bold"&gt;lambda&lt;/span&gt; (y, z): z &lt;span style="font-weight: bold"&gt;&amp;lt;=&lt;/span&gt; x

    &lt;span style="font-weight: bold"&gt;return&lt;/span&gt; second(subx, ifilter(ltx, numerals)&lt;span style="font-weight: bold"&gt;.&lt;/span&gt;next())
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;And it's a little better, but I think we're now pretty far from idiomatic 
python.
&lt;p&gt;&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;The python translation of the haskell isn't bad, but I do think it loses
something. The unfold() trick works really well, and translates easily into
an imperative, pythonic implementation; I'll look for ways to use it in the 
future. And, finally, I'm pretty jealous of Haskell's function combination
abilities.
&lt;p&gt;&lt;h2&gt;Updates&lt;/h2&gt;
&lt;p&gt;In the &lt;a href="http://programming.reddit.com/info/65bpf/comments/"&gt;comments&lt;/a&gt;
at reddit, nostrademons posts a nicer unfold function:
&lt;p&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span style="font-weight: bold"&gt;def&lt;/span&gt; &lt;span style="color: #990000; font-weight: bold"&gt;unfold&lt;/span&gt;(f, x):
    &lt;span style="font-weight: bold"&gt;while&lt;/span&gt; &lt;span style="color: #999999"&gt;True&lt;/span&gt;:
        w, x &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; f(x)
        &lt;span style="font-weight: bold"&gt;yield&lt;/span&gt; w
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;And Kay Schluehr prefers the iterative solution:
&lt;p&gt;&lt;div class="highlight"&gt;&lt;pre&gt; numerals &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; ((&lt;span style="color: #bb8844"&gt;&amp;quot;M&amp;quot;&lt;/span&gt;, &lt;span style="color: #009999"&gt;1000&lt;/span&gt;), (&lt;span style="color: #bb8844"&gt;&amp;quot;CM&amp;quot;&lt;/span&gt;, &lt;span style="color: #009999"&gt;900&lt;/span&gt;), (&lt;span style="color: #bb8844"&gt;&amp;quot;D&amp;quot;&lt;/span&gt;, &lt;span style="color: #009999"&gt;500&lt;/span&gt;), (&lt;span style="color: #bb8844"&gt;&amp;quot;CD&amp;quot;&lt;/span&gt;, &lt;span style="color: #009999"&gt;400&lt;/span&gt;),
(&lt;span style="color: #bb8844"&gt;&amp;quot;C&amp;quot;&lt;/span&gt;, &lt;span style="color: #009999"&gt;100&lt;/span&gt;),(&lt;span style="color: #bb8844"&gt;&amp;quot;XC&amp;quot;&lt;/span&gt;, &lt;span style="color: #009999"&gt;90&lt;/span&gt;),(&lt;span style="color: #bb8844"&gt;&amp;quot;L&amp;quot;&lt;/span&gt;, &lt;span style="color: #009999"&gt;50&lt;/span&gt;),(&lt;span style="color: #bb8844"&gt;&amp;quot;XL&amp;quot;&lt;/span&gt;, &lt;span style="color: #009999"&gt;40&lt;/span&gt;), (&lt;span style="color: #bb8844"&gt;&amp;quot;X&amp;quot;&lt;/span&gt;, &lt;span style="color: #009999"&gt;10&lt;/span&gt;), (&lt;span style="color: #bb8844"&gt;&amp;quot;IX&amp;quot;&lt;/span&gt;, &lt;span style="color: #009999"&gt;9&lt;/span&gt;), (&lt;span style="color: #bb8844"&gt;&amp;quot;V&amp;quot;&lt;/span&gt;, &lt;span style="color: #009999"&gt;5&lt;/span&gt;), 
(&lt;span style="color: #bb8844"&gt;&amp;quot;IV&amp;quot;&lt;/span&gt;, &lt;span style="color: #009999"&gt;4&lt;/span&gt;), (&lt;span style="color: #bb8844"&gt;&amp;quot;I&amp;quot;&lt;/span&gt;, &lt;span style="color: #009999"&gt;1&lt;/span&gt;))

&lt;span style="font-weight: bold"&gt;def&lt;/span&gt; &lt;span style="color: #990000; font-weight: bold"&gt;romanize&lt;/span&gt;(n):
    roman &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; []
    &lt;span style="font-weight: bold"&gt;for&lt;/span&gt; ltr, num &lt;span style="font-weight: bold"&gt;in&lt;/span&gt; numerals:
        (k,n) &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="color: #999999"&gt;divmod&lt;/span&gt;(n, num)
        roman&lt;span style="font-weight: bold"&gt;.&lt;/span&gt;append(ltr&lt;span style="font-weight: bold"&gt;*&lt;/span&gt;k)
    &lt;span style="font-weight: bold"&gt;return&lt;/span&gt; &lt;span style="color: #bb8844"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span style="font-weight: bold"&gt;.&lt;/span&gt;join(roman)
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;David Pollak contributes a Scala unfold and romanize &lt;a
href="http://scala-blogs.org/2008/01/roman-numerals-in-scala.html"&gt;at
his blog&lt;/a&gt;.
</summary>
		<content type="html">Just as a quck note, I thought I'd post the cleanest python I could come up 
with to solve the &lt;a href="http://billmill.org/roman.html"&gt;roman numerals&lt;/a&gt; 
problem I discussed earlier. It tries to use a functional style while actually 
avoiding recursion. To do so, I wrote an iterative python unfold:
&lt;p&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span style="font-weight: bold"&gt;def&lt;/span&gt; &lt;span style="color: #990000; font-weight: bold"&gt;unfold&lt;/span&gt;(f, x):
    res &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; []                       
    &lt;span style="font-weight: bold"&gt;while&lt;/span&gt; &lt;span style="color: #009999"&gt;1&lt;/span&gt;:
        &lt;span style="font-weight: bold"&gt;try&lt;/span&gt;:
            w, x &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; f(x)
            res&lt;span style="font-weight: bold"&gt;.&lt;/span&gt;append(w)
        &lt;span style="font-weight: bold"&gt;except&lt;/span&gt; &lt;span style="color: #990000; font-weight: bold"&gt;TypeError&lt;/span&gt;:
            &lt;span style="font-weight: bold"&gt;return&lt;/span&gt; res
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;And then the answer becomes:
&lt;p&gt;&lt;div class="highlight"&gt;&lt;pre&gt;numerals &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; [(&lt;span style="color: #bb8844"&gt;&amp;quot;M&amp;quot;&lt;/span&gt;, &lt;span style="color: #009999"&gt;1000&lt;/span&gt;), (&lt;span style="color: #bb8844"&gt;&amp;quot;CM&amp;quot;&lt;/span&gt;, &lt;span style="color: #009999"&gt;900&lt;/span&gt;), (&lt;span style="color: #bb8844"&gt;&amp;quot;D&amp;quot;&lt;/span&gt;, &lt;span style="color: #009999"&gt;500&lt;/span&gt;), (&lt;span style="color: #bb8844"&gt;&amp;quot;CD&amp;quot;&lt;/span&gt;, &lt;span style="color: #009999"&gt;400&lt;/span&gt;),
    (&lt;span style="color: #bb8844"&gt;&amp;quot;C&amp;quot;&lt;/span&gt;, &lt;span style="color: #009999"&gt;100&lt;/span&gt;),  (&lt;span style="color: #bb8844"&gt;&amp;quot;XC&amp;quot;&lt;/span&gt;, &lt;span style="color: #009999"&gt;90&lt;/span&gt;),  (&lt;span style="color: #bb8844"&gt;&amp;quot;L&amp;quot;&lt;/span&gt;, &lt;span style="color: #009999"&gt;50&lt;/span&gt;),  (&lt;span style="color: #bb8844"&gt;&amp;quot;XL&amp;quot;&lt;/span&gt;, &lt;span style="color: #009999"&gt;40&lt;/span&gt;),
    (&lt;span style="color: #bb8844"&gt;&amp;quot;X&amp;quot;&lt;/span&gt;, &lt;span style="color: #009999"&gt;10&lt;/span&gt;),   (&lt;span style="color: #bb8844"&gt;&amp;quot;IX&amp;quot;&lt;/span&gt;, &lt;span style="color: #009999"&gt;9&lt;/span&gt;),   (&lt;span style="color: #bb8844"&gt;&amp;quot;V&amp;quot;&lt;/span&gt;, &lt;span style="color: #009999"&gt;5&lt;/span&gt;),   (&lt;span style="color: #bb8844"&gt;&amp;quot;IV&amp;quot;&lt;/span&gt;, &lt;span style="color: #009999"&gt;4&lt;/span&gt;),
    (&lt;span style="color: #bb8844"&gt;&amp;quot;I&amp;quot;&lt;/span&gt;, &lt;span style="color: #009999"&gt;1&lt;/span&gt;)]

&lt;span style="font-weight: bold"&gt;def&lt;/span&gt; &lt;span style="color: #990000; font-weight: bold"&gt;next&lt;/span&gt;(x):
    &lt;span style="font-weight: bold"&gt;for&lt;/span&gt; n &lt;span style="font-weight: bold"&gt;in&lt;/span&gt; numerals:
        &lt;span style="font-weight: bold"&gt;if&lt;/span&gt; n[&lt;span style="color: #009999"&gt;1&lt;/span&gt;] &lt;span style="font-weight: bold"&gt;&amp;lt;=&lt;/span&gt; x: &lt;span style="font-weight: bold"&gt;return&lt;/span&gt; (n[&lt;span style="color: #009999"&gt;0&lt;/span&gt;], x&lt;span style="font-weight: bold"&gt;-&lt;/span&gt;n[&lt;span style="color: #009999"&gt;1&lt;/span&gt;])

&lt;span style="font-weight: bold"&gt;def&lt;/span&gt; &lt;span style="color: #990000; font-weight: bold"&gt;romanize&lt;/span&gt;(n):
    &lt;span style="font-weight: bold"&gt;return&lt;/span&gt; &lt;span style="color: #bb8844"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span style="font-weight: bold"&gt;.&lt;/span&gt;join(unfold(next, n))
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Compare to the haskell I posted before:
&lt;p&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span style="color: #990000; font-weight: bold"&gt;romanize&lt;/span&gt; &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; concat &lt;span style="font-weight: bold"&gt;.&lt;/span&gt; unfoldr next
    &lt;span style="font-weight: bold"&gt;where&lt;/span&gt; next &lt;span style="color: #009999"&gt;0&lt;/span&gt; &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="color: #445588; font-weight: bold"&gt;Nothing&lt;/span&gt;
          next x &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="color: #445588; font-weight: bold"&gt;Just&lt;/span&gt; &lt;span style="font-weight: bold"&gt;$&lt;/span&gt; second (x&lt;span style="font-weight: bold"&gt;-&lt;/span&gt;) &lt;span style="font-weight: bold"&gt;$&lt;/span&gt; head &lt;span style="font-weight: bold"&gt;$&lt;/span&gt; filter ((&lt;span style="font-weight: bold"&gt;&amp;lt;=&lt;/span&gt;x) &lt;span style="font-weight: bold"&gt;.&lt;/span&gt; snd) numerals
          numerals &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; [(&lt;span style="color: #bb8844"&gt;&amp;quot;M&amp;quot;&lt;/span&gt;, &lt;span style="color: #009999"&gt;1000&lt;/span&gt;), (&lt;span style="color: #bb8844"&gt;&amp;quot;CM&amp;quot;&lt;/span&gt;, &lt;span style="color: #009999"&gt;900&lt;/span&gt;), (&lt;span style="color: #bb8844"&gt;&amp;quot;D&amp;quot;&lt;/span&gt;, &lt;span style="color: #009999"&gt;500&lt;/span&gt;), (&lt;span style="color: #bb8844"&gt;&amp;quot;CD&amp;quot;&lt;/span&gt;, &lt;span style="color: #009999"&gt;400&lt;/span&gt;),
                      (&lt;span style="color: #bb8844"&gt;&amp;quot;C&amp;quot;&lt;/span&gt;, &lt;span style="color: #009999"&gt;100&lt;/span&gt;),  (&lt;span style="color: #bb8844"&gt;&amp;quot;XC&amp;quot;&lt;/span&gt;, &lt;span style="color: #009999"&gt;90&lt;/span&gt;),  (&lt;span style="color: #bb8844"&gt;&amp;quot;L&amp;quot;&lt;/span&gt;, &lt;span style="color: #009999"&gt;50&lt;/span&gt;),  (&lt;span style="color: #bb8844"&gt;&amp;quot;XL&amp;quot;&lt;/span&gt;, &lt;span style="color: #009999"&gt;40&lt;/span&gt;),
                      (&lt;span style="color: #bb8844"&gt;&amp;quot;X&amp;quot;&lt;/span&gt;, &lt;span style="color: #009999"&gt;10&lt;/span&gt;),   (&lt;span style="color: #bb8844"&gt;&amp;quot;IX&amp;quot;&lt;/span&gt;, &lt;span style="color: #009999"&gt;9&lt;/span&gt;),   (&lt;span style="color: #bb8844"&gt;&amp;quot;V&amp;quot;&lt;/span&gt;, &lt;span style="color: #009999"&gt;5&lt;/span&gt;),   (&lt;span style="color: #bb8844"&gt;&amp;quot;IV&amp;quot;&lt;/span&gt;, &lt;span style="color: #009999"&gt;4&lt;/span&gt;),
                      (&lt;span style="color: #bb8844"&gt;&amp;quot;I&amp;quot;&lt;/span&gt;, &lt;span style="color: #009999"&gt;1&lt;/span&gt;)]
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The "where" idiom allows you to group helper functions and constants 
underneath the main function, and the unimportance of function order means you 
can highlight the high-level logic. The haskell code is much shorter and 
tighter than the python.
&lt;p&gt;Having powerful iterative functions like unfoldr in the standard library is 
another clear win for Haskell; it took me more lines to define unfold than it 
did to define both next() and romanize(). (By the by, some googling failed to 
turn up a previous python implementation of unfold(); I think this code gets a 
lot uglier without it. I also don't see any obvious way to do it with 
itertools.)
&lt;p&gt;On the other hand, I find the simplicity of the python next() appealing, 
with its constructive instead of declarative approach. It's a less generic 
solution that's intuitively simpler (for me, still an imperative thinker).  
&lt;p&gt;You could match the haskell more exactly:
&lt;p&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span style="font-weight: bold"&gt;from&lt;/span&gt; &lt;span style="color: #555555"&gt;itertools&lt;/span&gt; &lt;span style="font-weight: bold"&gt;import&lt;/span&gt; ifilter

&lt;span style="font-weight: bold"&gt;def&lt;/span&gt; &lt;span style="color: #990000; font-weight: bold"&gt;second&lt;/span&gt;(f, (a, b)): &lt;span style="font-weight: bold"&gt;return&lt;/span&gt; (a, f(b))

&lt;span style="font-weight: bold"&gt;def&lt;/span&gt; &lt;span style="color: #990000; font-weight: bold"&gt;next&lt;/span&gt;(x):
    &lt;span style="font-weight: bold"&gt;return&lt;/span&gt; second(&lt;span style="font-weight: bold"&gt;lambda&lt;/span&gt; a: x&lt;span style="font-weight: bold"&gt;-&lt;/span&gt;a, ifilter(&lt;span style="font-weight: bold"&gt;lambda&lt;/span&gt; (y, z): z &lt;span style="font-weight: bold"&gt;&amp;lt;=&lt;/span&gt; x, numerals)&lt;span style="font-weight: bold"&gt;.&lt;/span&gt;next()
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;but the result is pretty ugly. The inability to compose functions compactly
results in a lot of boilerplate, and in having to pick a lot of meaningless 
variable names that obscure what's going on. We could move the lambdas out of
the call and give them names:
&lt;p&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span style="font-weight: bold"&gt;def&lt;/span&gt; &lt;span style="color: #990000; font-weight: bold"&gt;next&lt;/span&gt;(x):
    subx &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="font-weight: bold"&gt;lambda&lt;/span&gt; a: x&lt;span style="font-weight: bold"&gt;-&lt;/span&gt;a
    ltx &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="font-weight: bold"&gt;lambda&lt;/span&gt; (y, z): z &lt;span style="font-weight: bold"&gt;&amp;lt;=&lt;/span&gt; x

    &lt;span style="font-weight: bold"&gt;return&lt;/span&gt; second(subx, ifilter(ltx, numerals)&lt;span style="font-weight: bold"&gt;.&lt;/span&gt;next())
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;And it's a little better, but I think we're now pretty far from idiomatic 
python.
&lt;p&gt;&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;The python translation of the haskell isn't bad, but I do think it loses
something. The unfold() trick works really well, and translates easily into
an imperative, pythonic implementation; I'll look for ways to use it in the 
future. And, finally, I'm pretty jealous of Haskell's function combination
abilities.
&lt;p&gt;&lt;h2&gt;Updates&lt;/h2&gt;
&lt;p&gt;In the &lt;a href="http://programming.reddit.com/info/65bpf/comments/"&gt;comments&lt;/a&gt;
at reddit, nostrademons posts a nicer unfold function:
&lt;p&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span style="font-weight: bold"&gt;def&lt;/span&gt; &lt;span style="color: #990000; font-weight: bold"&gt;unfold&lt;/span&gt;(f, x):
    &lt;span style="font-weight: bold"&gt;while&lt;/span&gt; &lt;span style="color: #999999"&gt;True&lt;/span&gt;:
        w, x &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; f(x)
        &lt;span style="font-weight: bold"&gt;yield&lt;/span&gt; w
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;And Kay Schluehr prefers the iterative solution:
&lt;p&gt;&lt;div class="highlight"&gt;&lt;pre&gt; numerals &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; ((&lt;span style="color: #bb8844"&gt;&amp;quot;M&amp;quot;&lt;/span&gt;, &lt;span style="color: #009999"&gt;1000&lt;/span&gt;), (&lt;span style="color: #bb8844"&gt;&amp;quot;CM&amp;quot;&lt;/span&gt;, &lt;span style="color: #009999"&gt;900&lt;/span&gt;), (&lt;span style="color: #bb8844"&gt;&amp;quot;D&amp;quot;&lt;/span&gt;, &lt;span style="color: #009999"&gt;500&lt;/span&gt;), (&lt;span style="color: #bb8844"&gt;&amp;quot;CD&amp;quot;&lt;/span&gt;, &lt;span style="color: #009999"&gt;400&lt;/span&gt;),
(&lt;span style="color: #bb8844"&gt;&amp;quot;C&amp;quot;&lt;/span&gt;, &lt;span style="color: #009999"&gt;100&lt;/span&gt;),(&lt;span style="color: #bb8844"&gt;&amp;quot;XC&amp;quot;&lt;/span&gt;, &lt;span style="color: #009999"&gt;90&lt;/span&gt;),(&lt;span style="color: #bb8844"&gt;&amp;quot;L&amp;quot;&lt;/span&gt;, &lt;span style="color: #009999"&gt;50&lt;/span&gt;),(&lt;span style="color: #bb8844"&gt;&amp;quot;XL&amp;quot;&lt;/span&gt;, &lt;span style="color: #009999"&gt;40&lt;/span&gt;), (&lt;span style="color: #bb8844"&gt;&amp;quot;X&amp;quot;&lt;/span&gt;, &lt;span style="color: #009999"&gt;10&lt;/span&gt;), (&lt;span style="color: #bb8844"&gt;&amp;quot;IX&amp;quot;&lt;/span&gt;, &lt;span style="color: #009999"&gt;9&lt;/span&gt;), (&lt;span style="color: #bb8844"&gt;&amp;quot;V&amp;quot;&lt;/span&gt;, &lt;span style="color: #009999"&gt;5&lt;/span&gt;), 
(&lt;span style="color: #bb8844"&gt;&amp;quot;IV&amp;quot;&lt;/span&gt;, &lt;span style="color: #009999"&gt;4&lt;/span&gt;), (&lt;span style="color: #bb8844"&gt;&amp;quot;I&amp;quot;&lt;/span&gt;, &lt;span style="color: #009999"&gt;1&lt;/span&gt;))

&lt;span style="font-weight: bold"&gt;def&lt;/span&gt; &lt;span style="color: #990000; font-weight: bold"&gt;romanize&lt;/span&gt;(n):
    roman &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; []
    &lt;span style="font-weight: bold"&gt;for&lt;/span&gt; ltr, num &lt;span style="font-weight: bold"&gt;in&lt;/span&gt; numerals:
        (k,n) &lt;span style="font-weight: bold"&gt;=&lt;/span&gt; &lt;span style="color: #999999"&gt;divmod&lt;/span&gt;(n, num)
        roman&lt;span style="font-weight: bold"&gt;.&lt;/span&gt;append(ltr&lt;span style="font-weight: bold"&gt;*&lt;/span&gt;k)
    &lt;span style="font-weight: bold"&gt;return&lt;/span&gt; &lt;span style="color: #bb8844"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span style="font-weight: bold"&gt;.&lt;/span&gt;join(roman)
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;David Pollak contributes a Scala unfold and romanize &lt;a
href="http://scala-blogs.org/2008/01/roman-numerals-in-scala.html"&gt;at
his blog&lt;/a&gt;.
</content>
	</entry>
	<entry>
		<title>Poe on Programming</title>
		<link href="http://billmill.org/poe.html" />	
		<id>http://billmill.org/poe.html</id>
		<updated>2007-12-28T01:14:00Z</updated>
		<summary type="html">One of the strongest influences on my programming has always been an essay I 
read in my sophomore year of high school, around about the same time I began to 
feel the magic of programming. Mr. Carino was a young man just out of college, 
a &lt;a href="http://en.wikipedia.org/wiki/Slayer"&gt;Slayer&lt;/a&gt; fan and ardent Twain 
admirer, and a man who would disappear mysteriously a year later. That year, 
though, he gave the most electric class I've ever taken, and one of the  works 
we read in American Literature was Edgar Allan Poe's &lt;em&gt;&lt;a 
href="http://xroads.virginia.edu/~HYPER/poe/composition.html"&gt;The Philosophy of 
Composition&lt;/a&gt;&lt;/em&gt;.
&lt;p&gt;&lt;h2&gt;Code As Poetry&lt;/h2&gt;
&lt;p&gt;In &lt;em&gt;The Philosophy of Composition&lt;/em&gt;, Poe attempts to describe exactly 
how he composed &lt;a href="http://www.eapoe.org/works/poems/ravent.htm"&gt;The 
Raven&lt;/a&gt;, simply because he's never seen such an attempt before. While we 
might be wise to doubt his motives (as did &lt;a 
href="http://books.google.com/books?id=c3l3ldtUz2EC&amp;pg=PA33&amp;lpg=PA33&amp;dq=%22it+is+difficult+for+us+to+read+that+essay+without+reflecting%22&amp;source=web&amp;ots=hR5I--IYLA&amp;sig=84W7hAjUnNYNDAddaBW3HvtGsrk"&gt;TS  
Eliot&lt;/a&gt;), it nevertheless may be interpreted to provide solid principles for 
the construction of a program.
&lt;p&gt;Before we do so, I must first convince you that code should be read as 
poetry instead of prose. Since this will always be a matter of opinion, and I 
know that many people will disagree, my argument will be short and simple.
&lt;p&gt;When you read prose, you read it as if it is being narrated to you; whether 
by a narrator, a character in the story, or many characters, the distinguishing 
characteristic of prose is its similarity to speech. We find that it is allowed 
a much greater freedom of verbosity, so long as it accomplishes its goal of 
conveying a plot to its reader.
&lt;p&gt;Poetry, on the other hand, is an abstract block of words in which every one 
must carry meaning if the poem is to be any good. We value the poem for the 
beauty not only of the story or image given, but of the way in which it is 
constructed as well. It tends to be much denser and more compact than prose.  
When you read it, you must proceed carefully and consider the meaning of each 
word, and each group of words, and pay attention for double meanings and 
allusions if you are to grasp it fully.
&lt;p&gt;To help us decide how we read code, let's go to a &lt;a 
href="http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-11.html#%_idx_730"&gt;particularly 
nice bit&lt;/a&gt; of it, and meditate on it for a moment. Did you read it as if it 
were speech, or poetry? Did it have a narrative "flow" for you, or was it 
something of an abstract block of "words"?
&lt;p&gt;Of course, code is really neither prose nor poetry; it is a distinct art 
form of which Poe could not have been aware. I like to think that it may be 
read much more closely to poetry than to prose, and we will proceed from here 
as if this were true.
&lt;p&gt;&lt;h2&gt;Unity of Impression&lt;/h2&gt;
&lt;blockquote&gt;If any literary work is too long to be read at one sitting, we must 
be content to dispense with the immensely important effect derivable from unity 
of impression- for, if two sittings be required, the affairs of the world 
interfere, and everything like totality is at once destroyed. But since, 
ceteris paribus, no poet can afford to dispense with anything that may advance 
his design, it but remains to be seen whether there is, in extent, any 
advantage to counterbalance the loss of unity which attends it. Here I say no, 
at once. What we term a long poem is, in fact, merely a succession of brief 
ones- that is to say, of brief poetical effects. It is needless to demonstrate 
that a poem is such only inasmuch as it intensely excites, by elevating the 
soul; and all intense excitements are, through a psychal necessity, brief. For 
this reason, at least, one-half of the &lt;em&gt;Paradise Lost&lt;/em&gt; is essentially 
prose- a succession of poetical excitements interspersed, inevitably, with 
corresponding depressions- the whole being deprived, through the extremeness of 
its length, of the vastly important artistic element, totality, or unity of 
effect.&lt;/blockquote&gt;
&lt;p&gt;In the first sentence of this paragraph, Poe provides an alternate metric to 
&lt;a href="http://steve-yegge.blogspot.com/2007/12/codes-worst-enemy.html"&gt;Yegge's&lt;/a&gt; 
metric of "code size" - that of "unity of impression". Beautiful code is that 
which is not composed of "a succession of brief.. poetical effects", but of 
just the poem. It is code without filler, bureaucracy, or artifice, regardless 
of how long it is.
&lt;p&gt;As a practical matter, not all programs may be written in this manner. In an 
&lt;a href="http://fxr.watson.org/fxr/source/kern/imgact_elf.c"&gt;operating system 
kernel&lt;/a&gt;, a great deal of "corresponding depressions" &amp;mdash; documentation, 
error handling, and interrupt handling &amp;mdash; must be interspersed in between 
the "poetical effects", making it "essentially prose".
&lt;p&gt;This does not change the fact that the Linux kernel or a BSD kernel is a 
thing of beauty, just as &lt;em&gt;Paradise Lost&lt;/em&gt; is great despite "the 
extremeness of its length". Instead, it should give us motivation for our 
programs, to write them with as few depressions as possible so as not to drag 
down their unity of impression.
&lt;p&gt;A great example of code as poetry is OpenBSD's &lt;a 
href="http://ftp.bg.openbsd.org/OpenBSD/src/usr.bin/tail/"&gt;tail&lt;/a&gt;&lt;sup&gt;&lt;a 
href="#footnote1"&gt;1&lt;/a&gt;&lt;/sup&gt;, which I referenced in a &lt;a 
href="http://billmill.org/reversefile.html"&gt;previous post&lt;/a&gt;. After I sat down 
with it for an hour, it was extremely clear to me what it did. In the &lt;a 
href="http://ftp.bg.openbsd.org/OpenBSD/src/usr.bin/tail/tail.c"&gt;beginning&lt;/a&gt;, 
it set out the patterns of code which would continue throughout, enabling me to 
quickly find my way to &lt;a 
href="http://ftp.bg.openbsd.org/OpenBSD/src/usr.bin/tail/reverse.c"&gt;the part 
that mattered&lt;/a&gt;, despite my relative unfamiliarity with C.
&lt;p&gt;It is a great strength of the Unix philosophy that each bit of code may be 
kept as brief, self-contained, unified, and therefore beautiful. It is a 
pleasure to work with tools which have been pared down to their bare bits 
instead of expanded to encompass ever more functionality.
&lt;p&gt;&lt;h2&gt;Design for a Purpose&lt;/h2&gt;
&lt;blockquote&gt;My next thought concerned the choice of an impression, or effect, 
to be conveyed: and here I may as well observe that throughout the 
construction, I kept steadily in view the design of rendering the work 
universally appreciable. I should be carried too far out of my immediate topic 
were I to demonstrate a point upon which I have repeatedly insisted, and which, 
with the poetical, stands not in the slightest need of demonstration- the 
point, I mean, that Beauty is the sole legitimate province of the 
poem.&lt;/blockquote&gt;
&lt;p&gt;If beauty is the sole province of poetry, I propose that data transformation 
is the sole province of the computer program. (I am not the first to do, 
although I cannot recall where I read it first). Therefore, when designing a 
program, we should at all times keep in mind the transformation which we wish 
to achieve, and discard all those parts which do not assist in that goal.
&lt;p&gt;While this seems at first straightforward, it is important to consider that 
programs are designed for humans and by humans. Unlike poetry, most code is not 
generated by its author for the appreciation of the masses. Instead, it is 
designed to fulfill a purpose, specifically to achieve a certain data 
transformation. 
&lt;p&gt;Just as very few great poems were authored by multiple people, very few 
great programs have been authored by multiple people. If we consider long 
programs to be composed of many poems separated by dull bits, their great parts 
are almost exclusively those parts over which their maintainers have slaved to 
bring to a state of terse beauty.
&lt;p&gt;If you must have many people working on a program, it is of the utmost 
importance that they all know and share an understanding of what 
&lt;em&gt;exactly&lt;/em&gt; it is that the program is intended to accomplish. Without this 
deep shared knowledge of intent, the program will lack a single impression, or 
effect, to be conveyed, and likely fail to impress.
&lt;p&gt;&lt;h2&gt;All The Rest&lt;/h2&gt;
&lt;blockquote&gt;The length, the province, and the tone, being thus determined, I 
betook myself to ordinary induction&lt;/blockquote&gt;
&lt;p&gt;Once you have determined the length, purpose, and tone of your program, the 
rest is, as they say, trivial. Poe dedicates the rest of his essay to applying 
the principles discussed in this essay, and showing how "The Raven" falls ever 
so simply out of them. If you write a program while at all times keeping in 
mind its unity of purpose and the impression you intend to convey, perhaps you 
will find some beauty in it.
&lt;p&gt;I hope that you will read the &lt;a 
href="http://xroads.virginia.edu/~HYPER/poe/composition.html"&gt;essay&lt;/a&gt; in its 
entirety; I'm sure that I have failed to do it justice here. Although it is of 
questionable merit as a method of writing the next "The Raven", perhaps it will 
help you think about how to write your next program.
&lt;p&gt;&lt;div id="footnote"&gt;&lt;h2&gt;Notes&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;sup&gt;1&lt;/sup&gt; &lt;a name="footnote1"&gt;&lt;a 
href="http://pyblosxom.svn.sourceforge.net/viewvc/pyblosxom/trunk/pyblosxom/Pyblosxom/"&gt;pybloxsom&lt;/a&gt; 
is another, and reddit readers &lt;a 
href="http://programming.reddit.com/info/63hth/comments/"&gt;provide many 
more&lt;/a&gt;.
</summary>
		<content type="html">One of the strongest influences on my programming has always been an essay I 
read in my sophomore year of high school, around about the same time I began to 
feel the magic of programming. Mr. Carino was a young man just out of college, 
a &lt;a href="http://en.wikipedia.org/wiki/Slayer"&gt;Slayer&lt;/a&gt; fan and ardent Twain 
admirer, and a man who would disappear mysteriously a year later. That year, 
though, he gave the most electric class I've ever taken, and one of the  works 
we read in American Literature was Edgar Allan Poe's &lt;em&gt;&lt;a 
href="http://xroads.virginia.edu/~HYPER/poe/composition.html"&gt;The Philosophy of 
Composition&lt;/a&gt;&lt;/em&gt;.
&lt;p&gt;&lt;h2&gt;Code As Poetry&lt;/h2&gt;
&lt;p&gt;In &lt;em&gt;The Philosophy of Composition&lt;/em&gt;, Poe attempts to describe exactly 
how he composed &lt;a href="http://www.eapoe.org/works/poems/ravent.htm"&gt;The 
Raven&lt;/a&gt;, simply because he's never seen such an attempt before. While we 
might be wise to doubt his motives (as did &lt;a 
href="http://books.google.com/books?id=c3l3ldtUz2EC&amp;pg=PA33&amp;lpg=PA33&amp;dq=%22it+is+difficult+for+us+to+read+that+essay+without+reflecting%22&amp;source=web&amp;ots=hR5I--IYLA&amp;sig=84W7hAjUnNYNDAddaBW3HvtGsrk"&gt;TS  
Eliot&lt;/a&gt;), it nevertheless may be interpreted to provide solid principles for 
the construction of a program.
&lt;p&gt;Before we do so, I must first convince you that code should be read as 
poetry instead of prose. Since this will always be a matter of opinion, and I 
know that many people will disagree, my argument will be short and simple.
&lt;p&gt;When you read prose, you read it as if it is being narrated to you; whether 
by a narrator, a character in the story, or many characters, the distinguishing 
characteristic of prose is its similarity to speech. We find that it is allowed 
a much greater freedom of verbosity, so long as it accomplishes its goal of 
conveying a plot to its reader.
&lt;p&gt;Poetry, on the other hand, is an abstract block of words in which every one 
must carry meaning if the poem is to be any good. We value the poem for the 
beauty not only of the story or image given, but of the way in which it is 
constructed as well. It tends to be much denser and more compact than prose.  
When you read it, you must proceed carefully and consider the meaning of each 
word, and each group of words, and pay attention for double meanings and 
allusions if you are to grasp it fully.
&lt;p&gt;To help us decide how we read code, let's go to a &lt;a 
href="http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-11.html#%_idx_730"&gt;particularly 
nice bit&lt;/a&gt; of it, and meditate on it for a moment. Did you read it as if it 
were speech, or poetry? Did it have a narrative "flow" for you, or was it 
something of an abstract block of "words"?
&lt;p&gt;Of course, code is really neither prose nor poetry; it is a distinct art 
form of which Poe could not have been aware. I like to think that it may be 
read much more closely to poetry than to prose, and we will proceed from here 
as if this were true.
&lt;p&gt;&lt;h2&gt;Unity of Impression&lt;/h2&gt;
&lt;blockquote&gt;If any literary work is too long to be read at one sitting, we must 
be content to dispense with the immensely important effect derivable from unity 
of impression- for, if two sittings be required, the affairs of the world 
interfere, and everything like totality is at once destroyed. But since, 
ceteris paribus, no poet can afford to dispense with anything that may advance 
his design, it but remains to be seen whether there is, in extent, any 
advantage to counterbalance the loss of unity which attends it. Here I say no, 
at once. What we term a long poem is, in fact, merely a succession of brief 
ones- that is to say, of brief poetical effects. It is needless to demonstrate 
that a poem is such only inasmuch as it intensely excites, by elevating the 
soul; and all intense excitements are, through a psychal necessity, brief. For 
this reason, at least, one-half of the &lt;em&gt;Paradise Lost&lt;/em&gt; is essentially 
prose- a succession of poetical excitements interspersed, inevitably, with 
corresponding depressions- the whole being deprived, through the extremeness of 
its length, of the vastly important artistic element, totality, or unity of 
effect.&lt;/blockquote&gt;
&lt;p&gt;In the first sentence of this paragraph, Poe provides an alternate metric to 
&lt;a href="http://steve-yegge.blogspot.com/2007/12/codes-worst-enemy.html"&gt;Yegge's&lt;/a&gt; 
metric of "code size" - that of "unity of impression". Beautiful code is that 
which is not composed of "a succession of brief.. poetical effects", but of 
just the poem. It is code without filler, bureaucracy, or artifice, regardless 
of how long it is.
&lt;p&gt;As a practical matter, not all programs may be written in this manner. In an 
&lt;a href="http://fxr.watson.org/fxr/source/kern/imgact_elf.c"&gt;operating system 
kernel&lt;/a&gt;, a great deal of "corresponding depressions" &amp;mdash; documentation, 
error handling, and interrupt handling &amp;mdash; must be interspersed in between 
the "poetical effects", making it "essentially prose".
&lt;p&gt;This does not change the fact that the Linux kernel or a BSD kernel is a 
thing of beauty, just as &lt;em&gt;Paradise Lost&lt;/em&gt; is great despite "the 
extremeness of its length". Instead, it should give us motivation for our 
programs, to write them with as few depressions as possible so as not to drag 
down their unity of impression.
&lt;p&gt;A great example of code as poetry is OpenBSD's &lt;a 
href="http://ftp.bg.openbsd.org/OpenBSD/src/usr.bin/tail/"&gt;tail&lt;/a&gt;&lt;sup&gt;&lt;a 
href="#footnote1"&gt;1&lt;/a&gt;&lt;/sup&gt;, which I referenced in a &lt;a 
href="http://billmill.org/reversefile.html"&gt;previous post&lt;/a&gt;. After I sat down 
with it for an hour, it was extremely clear to me what it did. In the &lt;a 
href="http://ftp.bg.openbsd.org/OpenBSD/src/usr.bin/tail/tail.c"&gt;beginning&lt;/a&gt;, 
it set out the patterns of code which would continue throughout, enabling me to 
quickly find my way to &lt;a 
href="http://ftp.bg.openbsd.org/OpenBSD/src/usr.bin/tail/reverse.c"&gt;the part 
that mattered&lt;/a&gt;, despite my relative unfamiliarity with C.
&lt;p&gt;It is a great strength of the Unix philosophy that each bit of code may be 
kept as brief, self-contained, unified, and therefore beautiful. It is a 
pleasure to work with tools which have been pared down to their bare bits 
instead of expanded to encompass ever more functionality.
&lt;p&gt;&lt;h2&gt;Design for a Purpose&lt;/h2&gt;
&lt;blockquote&gt;My next thought concerned the choice of an impression, or effect, 
to be conveyed: and here I may as well observe that throughout the 
construction, I kept steadily in view the design of rendering the work 
universally appreciable. I should be carried too far out of my immediate topic 
were I to demonstrate a point upon which I have repeatedly insisted, and which, 
with the poetical, stands not in the slightest need of demonstration- the 
point, I mean, that Beauty is the sole legitimate province of the 
poem.&lt;/blockquote&gt;
&lt;p&gt;If beauty is the sole province of poetry, I propose that data transformation 
is the sole province of the computer program. (I am not the first to do, 
although I cannot recall where I read it first). Therefore, when designing a 
program, we should at all times keep in mind the transformation which we wish 
to achieve, and discard all those parts which do not assist in that goal.
&lt;p&gt;While this seems at first straightforward, it is important to consider that 
programs are designed for humans and by humans. Unlike poetry, most code is not 
generated by its author for the appreciation of the masses. Instead, it is 
designed to fulfill a purpose, specifically to achieve a certain data 
transformation. 
&lt;p&gt;Just as very few great poems were authored by multiple people, very few 
great programs have been authored by multiple people. If we consider long 
programs to be composed of many poems separated by dull bits, their great parts 
are almost exclusively those parts over which their maintainers have slaved to 
bring to a state of terse beauty.
&lt;p&gt;If you must have many people working on a program, it is of the utmost 
importance that they all know and share an understanding of what 
&lt;em&gt;exactly&lt;/em&gt; it is that the program is intended to accomplish. Without this 
deep shared knowledge of intent, the program will lack a single impression, or 
effect, to be conveyed, and likely fail to impress.
&lt;p&gt;&lt;h2&gt;All The Rest&lt;/h2&gt;
&lt;blockquote&gt;The length, the province, and the tone, being thus determined, I 
betook myself to ordinary induction&lt;/blockquote&gt;
&lt;p&gt;Once you have determined the length, purpose, and tone of your program, the 
rest is, as they say, trivial. Poe dedicates the rest of his essay to applying 
the principles discussed in this essay, and showing how "The Raven" falls ever 
so simply out of them. If you write a program while at all times keeping in 
mind its unity of purpose and the impression you intend to convey, perhaps you 
will find some beauty in it.
&lt;p&gt;I hope that you will read the &lt;a 
href="http://xroads.virginia.edu/~HYPER/poe/composition.html"&gt;essay&lt;/a&gt; in its 
entirety; I'm sure that I have failed to do it justice here. Although it is of 
questionable merit as a method of writing the next "The Raven", perhaps it will 
help you think about how to write your next program.
&lt;p&gt;&lt;div id="footnote"&gt;&lt;h2&gt;Notes&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;sup&gt;1&lt;/sup&gt; &lt;a name="footnote1"&gt;&lt;a 
href="http://pyblosxom.svn.sourceforge.net/viewvc/pyblosxom/trunk/pyblosxom/Pyblosxom/"&gt;pybloxsom&lt;/a&gt; 
is another, and reddit readers &lt;a 
href="http://programming.reddit.com/info/63hth/comments/"&gt;provide many 
more&lt;/a&gt;.
</content>
	</entry>
	<entry>
		<title>Iterating Over Database Results in C#</title>
		<link href="http://billmill.org/iterate_over_database.html" />	
		<id>http://billmill.org/iterate_over_database.html</id>
		<updated>2007-12-17T01:13:00Z</updated>
		<summary type="html">&lt;p&gt;At my job, we use what is essentially a custom C# ORM. Soon after I arrived, 
we adopted this idiom to pull a DB connection from the pool and run a query:
&lt;div class="highlight"&gt;&lt;pre&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Something&lt;/span&gt;
&lt;span class="k"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;ourIdiom&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;long&lt;/span&gt; &lt;span class="n"&gt;identifier&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DBConnection&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;DBConnection&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
        &lt;span class="k"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IDataReader&lt;/span&gt; &lt;span class="n"&gt;rec&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;execQuery&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;@&amp;quot;&lt;/span&gt;
&lt;span class="s"&gt;                SELECT some, rows&lt;/span&gt;
&lt;span class="s"&gt;                FROM  Table1 t1, Table2 t2&lt;/span&gt;
&lt;span class="s"&gt;                WHERE t1.t2id = t2.id&lt;/span&gt;
&lt;span class="s"&gt;                AND   t1.id = ?&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;identifier&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
            &lt;span class="k"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rec&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Read&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
                    &lt;span class="n"&gt;doSomething&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="k"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Which is nice because it disposes of both the connection and the dataReader 
properly on failure, but ugly because it uses a whole bunch of boilerplate.  
Unfortunately, because doSomething() needs to execute inside both 
&lt;code&gt;using&lt;/code&gt; statements, and we weren't using C# 2.0 until a few months 
ago, the only way to avoid the boilerplate would have been to pass in 
delegates.
&lt;p&gt;This would have been just as ugly as keeping the boilerplate in the code, so 
we stuck with the using&lt;sup&gt;2&lt;/sup&gt; idiom.
&lt;p&gt;Since our switchover to 2.0 a few months ago, I've had an idea that I could 
make this idiom more concise and remove some boilerplate that I didn't get a 
chance to try until this week. Using 2.0's iterators, which seem awfully 
familiar from my python work, that can be reduced to:
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Something&lt;/span&gt;
&lt;span class="k"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;ourIdiom&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;long&lt;/span&gt; &lt;span class="n"&gt;identifier&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IDataReader&lt;/span&gt; &lt;span class="n"&gt;rec&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;SQL&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;Query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;@&amp;quot;&lt;/span&gt;
&lt;span class="s"&gt;            SELECT some, rows&lt;/span&gt;
&lt;span class="s"&gt;            FROM  Table1 t1, Table2 t2&lt;/span&gt;
&lt;span class="s"&gt;            WHERE t1.t2id = t2.id&lt;/span&gt;
&lt;span class="s"&gt;            AND   t1.id = ?&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;identifier&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="k"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;doSomething&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="k"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;With some fairly simple code:
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SQL&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; 
    &lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Collections&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Generic&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;IEnumerable&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;IDataReader&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="k"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;m_sql&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;ArrayList&lt;/span&gt; &lt;span class="n"&gt;m_sqlparams&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;SQL&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;SQL&lt;/span&gt; &lt;span class="nf"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;sql&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;params&lt;/span&gt; &lt;span class="kt"&gt;object&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;sqlparams&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;m_sql&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sql&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="n"&gt;m_sqlparams&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;ArrayList&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sqlparams&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;}&lt;/span&gt;

        &lt;span class="n"&gt;IEnumerator&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;IDataReader&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;IEnumerable&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;IDataReader&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;.&lt;/span&gt;&lt;span class="n"&gt;GetEnumerator&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;clsDBConnection&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;clsDBConnection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m_dbname&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
            &lt;span class="k"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IDataReader&lt;/span&gt; &lt;span class="n"&gt;rec&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;execQuery&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m_sql&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;m_sqlparams&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
                &lt;span class="k"&gt;{&lt;/span&gt;
                    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rec&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Read&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
                        &lt;span class="n"&gt;yield&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;rec&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="k"&gt;}&lt;/span&gt;
            &lt;span class="k"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;}&lt;/span&gt;

        &lt;span class="c"&gt;//this is required because IEnumerable&amp;lt;&amp;gt; inherits IEnumerable. bleh.&lt;/span&gt;
        &lt;span class="n"&gt;IEnumerator&lt;/span&gt; &lt;span class="n"&gt;IEnumerable&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetEnumerator&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;GetEnumerator&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This code should come in handy for more reasons than just its cleanliness.  
First off, if you ever need to change the idiom for accessing the DB, it's 
stored conveniently in one place.
&lt;p&gt;Second, It makes a prepared SQL call into something like a &lt;a 
href="http://en.wikipedia.org/wiki/Thunk"&gt;thunk&lt;/a&gt;: a bit of code representing 
a future computation that can then be passed around to be performed later. An 
example:
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;setUpQueries&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nameId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;addressId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;custId&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;SQL&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;stringsWeNeed&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;object&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="k"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;SQL&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;SELECT name FROM names WHERE id=?&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nameId&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;SQL&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;SELECT addy FROM addresses WHERE id=?&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;addressId&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;SQL&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;SELECT zip FROM customers WHERE id=?&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;custId&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;strings&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;getOurStrings&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stringsWeNeed&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="n"&gt;mangleStrings&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;strings&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;getOurStrings&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;SQL&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;queries&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;strings&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;();&lt;/span&gt;
    &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SQL&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;queries&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IDataReader&lt;/span&gt; &lt;span class="n"&gt;rec&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;strings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rec&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="k"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;strings&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;While the example is silly, this property can be exploited to seperate 
declaration from execution, which I often find to be a useful pattern.
&lt;p&gt;Though I am far from the &lt;a 
href="http://www.base4.net/blog.aspx?ID=409"&gt;first person&lt;/a&gt; to discover this 
simplification, I did figure it out on my own and I thought it was neat enough 
to share.
&lt;p&gt;A quick disclaimer: the code here is modified from the original to remove 
some details, and is completely untested, and probably doesn't compile.  You 
may, however, use it or distribute it as you see fit; it's licensed under the 
&lt;a href="http://sam.zoy.org/wtfpl/"&gt;wtfpl&lt;/a&gt;.
&lt;p&gt;UPDATE: added the while(rec.Read()), which I'd forgotten
</summary>
		<content type="html">&lt;p&gt;At my job, we use what is essentially a custom C# ORM. Soon after I arrived, 
we adopted this idiom to pull a DB connection from the pool and run a query:
&lt;div class="highlight"&gt;&lt;pre&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Something&lt;/span&gt;
&lt;span class="k"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;ourIdiom&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;long&lt;/span&gt; &lt;span class="n"&gt;identifier&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DBConnection&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;DBConnection&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
        &lt;span class="k"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IDataReader&lt;/span&gt; &lt;span class="n"&gt;rec&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;execQuery&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;@&amp;quot;&lt;/span&gt;
&lt;span class="s"&gt;                SELECT some, rows&lt;/span&gt;
&lt;span class="s"&gt;                FROM  Table1 t1, Table2 t2&lt;/span&gt;
&lt;span class="s"&gt;                WHERE t1.t2id = t2.id&lt;/span&gt;
&lt;span class="s"&gt;                AND   t1.id = ?&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;identifier&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
            &lt;span class="k"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rec&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Read&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
                    &lt;span class="n"&gt;doSomething&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="k"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Which is nice because it disposes of both the connection and the dataReader 
properly on failure, but ugly because it uses a whole bunch of boilerplate.  
Unfortunately, because doSomething() needs to execute inside both 
&lt;code&gt;using&lt;/code&gt; statements, and we weren't using C# 2.0 until a few months 
ago, the only way to avoid the boilerplate would have been to pass in 
delegates.
&lt;p&gt;This would have been just as ugly as keeping the boilerplate in the code, so 
we stuck with the using&lt;sup&gt;2&lt;/sup&gt; idiom.
&lt;p&gt;Since our switchover to 2.0 a few months ago, I've had an idea that I could 
make this idiom more concise and remove some boilerplate that I didn't get a 
chance to try until this week. Using 2.0's iterators, which seem awfully 
familiar from my python work, that can be reduced to:
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Something&lt;/span&gt;
&lt;span class="k"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;ourIdiom&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;long&lt;/span&gt; &lt;span class="n"&gt;identifier&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IDataReader&lt;/span&gt; &lt;span class="n"&gt;rec&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;SQL&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;Query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;@&amp;quot;&lt;/span&gt;
&lt;span class="s"&gt;            SELECT some, rows&lt;/span&gt;
&lt;span class="s"&gt;            FROM  Table1 t1, Table2 t2&lt;/span&gt;
&lt;span class="s"&gt;            WHERE t1.t2id = t2.id&lt;/span&gt;
&lt;span class="s"&gt;            AND   t1.id = ?&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;identifier&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="k"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;doSomething&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="k"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;With some fairly simple code:
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SQL&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; 
    &lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Collections&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Generic&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;IEnumerable&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;IDataReader&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="k"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;m_sql&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;ArrayList&lt;/span&gt; &lt;span class="n"&gt;m_sqlparams&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;SQL&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;SQL&lt;/span&gt; &lt;span class="nf"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;sql&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;params&lt;/span&gt; &lt;span class="kt"&gt;object&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;sqlparams&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;m_sql&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sql&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="n"&gt;m_sqlparams&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;ArrayList&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sqlparams&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;}&lt;/span&gt;

        &lt;span class="n"&gt;IEnumerator&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;IDataReader&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;IEnumerable&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;IDataReader&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;.&lt;/span&gt;&lt;span class="n"&gt;GetEnumerator&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;clsDBConnection&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;clsDBConnection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m_dbname&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
            &lt;span class="k"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IDataReader&lt;/span&gt; &lt;span class="n"&gt;rec&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;execQuery&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m_sql&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;m_sqlparams&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
                &lt;span class="k"&gt;{&lt;/span&gt;
                    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rec&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Read&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
                        &lt;span class="n"&gt;yield&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;rec&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="k"&gt;}&lt;/span&gt;
            &lt;span class="k"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;}&lt;/span&gt;

        &lt;span class="c"&gt;//this is required because IEnumerable&amp;lt;&amp;gt; inherits IEnumerable. bleh.&lt;/span&gt;
        &lt;span class="n"&gt;IEnumerator&lt;/span&gt; &lt;span class="n"&gt;IEnumerable&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetEnumerator&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;GetEnumerator&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This code should come in handy for more reasons than just its cleanliness.  
First off, if you ever need to change the idiom for accessing the DB, it's 
stored conveniently in one place.
&lt;p&gt;Second, It makes a prepared SQL call into something like a &lt;a 
href="http://en.wikipedia.org/wiki/Thunk"&gt;thunk&lt;/a&gt;: a bit of code representing 
a future computation that can then be passed around to be performed later. An 
example:
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;setUpQueries&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nameId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;addressId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;custId&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;SQL&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;stringsWeNeed&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;object&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="k"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;SQL&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;SELECT name FROM names WHERE id=?&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nameId&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;SQL&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;SELECT addy FROM addresses WHERE id=?&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;addressId&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;SQL&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;SELECT zip FROM customers WHERE id=?&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;custId&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;strings&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;getOurStrings&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stringsWeNeed&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="n"&gt;mangleStrings&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;strings&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;getOurStrings&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;SQL&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;queries&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;strings&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;();&lt;/span&gt;
    &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SQL&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;queries&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IDataReader&lt;/span&gt; &lt;span class="n"&gt;rec&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;strings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rec&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="k"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;strings&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;While the example is silly, this property can be exploited to seperate 
declaration from execution, which I often find to be a useful pattern.
&lt;p&gt;Though I am far from the &lt;a 
href="http://www.base4.net/blog.aspx?ID=409"&gt;first person&lt;/a&gt; to discover this 
simplification, I did figure it out on my own and I thought it was neat enough 
to share.
&lt;p&gt;A quick disclaimer: the code here is modified from the original to remove 
some details, and is completely untested, and probably doesn't compile.  You 
may, however, use it or distribute it as you see fit; it's licensed under the 
&lt;a href="http://sam.zoy.org/wtfpl/"&gt;wtfpl&lt;/a&gt;.
&lt;p&gt;UPDATE: added the while(rec.Read()), which I'd forgotten
</content>
	</entry>
	<entry>
		<title>Reverse File Iterator and Premature Optimization</title>
		<link href="http://billmill.org/reversefile.html" />	
		<id>http://billmill.org/reversefile.html</id>
		<updated>2007-10-03T00:30:00Z</updated>
		<summary type="html">This afternoon, I had a need for a reverse file iterator in a script I was 
writing to process a quite large log file. After some unsuccessful googling 
followed by some quick hacking, I was left with a frustratingly close, but 
nonfunctional, iterator. Instead of fixing it while I was at work, I hacked up 
a solution calling "tail" and left it for a while.&lt;p&gt;
When I came back to finish the job this evening, I figured that I ought to go 
look at the &lt;a 
href="http://www.openbsd.org/cgi-bin/cvsweb/src/usr.bin/tail"&gt;source&lt;/a&gt; of tail 
for some inspiration. Surely the unix hackers had figured this problem out long 
ago? In &lt;a 
href="http://www.openbsd.org/cgi-bin/cvsweb/src/usr.bin/tail/reverse.c?rev=1.18&amp;content-type=text/x-cvsweb-markup"&gt;reverse.c&lt;/a&gt;, 
I found the inspiration I needed:&lt;p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(;&lt;/span&gt; &lt;span class="n"&gt;pos&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;pos&lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c"&gt;/* A seek per char isn&amp;#39;t a problem with a smart stdio */&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fseeko&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pos&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SEEK_SET&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c"&gt;//snip&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;ch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;getc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fp&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="err"&gt;&amp;#39;\&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;
I had been reading the file in chunks, splitting the chunk into lines, handling 
a cache of the lines, and compensating for unfinished lines, all because I had 
buried deep down in my lizard brain the idea that an fseek per character was 
"slow". In pure python, for chrissake!&lt;p&gt;
Properly reminded of the fact that premature optimization can sneak up 
anywhere, I ended up with this code:&lt;p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;os&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;reversefile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;object&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;Iterate backwards through a file. f should be an open file handle&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_f&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;st_size&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__iter__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mf"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="ne"&gt;StopIteration&lt;/span&gt;

        &lt;span class="n"&gt;pos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;2&lt;/span&gt;
        &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;pos&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mf"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;seek&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pos&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s"&gt;n&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;end&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt;
                &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pos&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;pos&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;pos&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt; &lt;span class="mf"&gt;1&lt;/span&gt;

        &lt;span class="n"&gt;end&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;seek&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s"&gt;n&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;
You can see the whole thing, with source and some very brief tests I hacked up, 
&lt;a 
href="http://billmill.org:9561/personal_code/browser/python/reversefile/reversefile.py?rev=57"&gt;here&lt;/a&gt;.

&lt;h2&gt;update:&lt;/h2&gt;
Reddit user Brian &lt;a href="http://reddit.com/r/Python/info/6hj75/comments/c03vms4"&gt;posts a solution&lt;/a&gt; that goes much faster on his platform (I've
done no performance testing of my code, it wasn't important for me) and handles
platform linebreaks better. In other words, it's better for all purposes. Thanks
Brian, I wish I'd found that when I was googling!
</summary>
		<content type="html">This afternoon, I had a need for a reverse file iterator in a script I was 
writing to process a quite large log file. After some unsuccessful googling 
followed by some quick hacking, I was left with a frustratingly close, but 
nonfunctional, iterator. Instead of fixing it while I was at work, I hacked up 
a solution calling "tail" and left it for a while.&lt;p&gt;
When I came back to finish the job this evening, I figured that I ought to go 
look at the &lt;a 
href="http://www.openbsd.org/cgi-bin/cvsweb/src/usr.bin/tail"&gt;source&lt;/a&gt; of tail 
for some inspiration. Surely the unix hackers had figured this problem out long 
ago? In &lt;a 
href="http://www.openbsd.org/cgi-bin/cvsweb/src/usr.bin/tail/reverse.c?rev=1.18&amp;content-type=text/x-cvsweb-markup"&gt;reverse.c&lt;/a&gt;, 
I found the inspiration I needed:&lt;p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(;&lt;/span&gt; &lt;span class="n"&gt;pos&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;pos&lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c"&gt;/* A seek per char isn&amp;#39;t a problem with a smart stdio */&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fseeko&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pos&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SEEK_SET&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c"&gt;//snip&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;ch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;getc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fp&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="err"&gt;&amp;#39;\&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;
I had been reading the file in chunks, splitting the chunk into lines, handling 
a cache of the lines, and compensating for unfinished lines, all because I had 
buried deep down in my lizard brain the idea that an fseek per character was 
"slow". In pure python, for chrissake!&lt;p&gt;
Properly reminded of the fact that premature optimization can sneak up 
anywhere, I ended up with this code:&lt;p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;os&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;reversefile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;object&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;Iterate backwards through a file. f should be an open file handle&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_f&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;st_size&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__iter__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mf"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="ne"&gt;StopIteration&lt;/span&gt;

        &lt;span class="n"&gt;pos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;2&lt;/span&gt;
        &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;pos&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mf"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;seek&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pos&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s"&gt;n&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;end&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt;
                &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pos&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;pos&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;pos&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt; &lt;span class="mf"&gt;1&lt;/span&gt;

        &lt;span class="n"&gt;end&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;seek&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s"&gt;n&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;
You can see the whole thing, with source and some very brief tests I hacked up, 
&lt;a 
href="http://billmill.org:9561/personal_code/browser/python/reversefile/reversefile.py?rev=57"&gt;here&lt;/a&gt;.

&lt;h2&gt;update:&lt;/h2&gt;
Reddit user Brian &lt;a href="http://reddit.com/r/Python/info/6hj75/comments/c03vms4"&gt;posts a solution&lt;/a&gt; that goes much faster on his platform (I've
done no performance testing of my code, it wasn't important for me) and handles
platform linebreaks better. In other words, it's better for all purposes. Thanks
Brian, I wish I'd found that when I was googling!
</content>
	</entry>
</feed>
