<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Dom λ Blog</title>
	<atom:link href="http://domdefelice.com/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://domdefelice.com/blog</link>
	<description>Just another WordPress site</description>
	<lastBuildDate>Sat, 19 Feb 2011 15:46:14 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.4</generator>
		<item>
		<title>Porting a snake game from pascal to javascript</title>
		<link>http://domdefelice.com/blog/2011/02/porting-a-snake-game-from-pascal-to-javascript/</link>
		<comments>http://domdefelice.com/blog/2011/02/porting-a-snake-game-from-pascal-to-javascript/#comments</comments>
		<pubDate>Sat, 19 Feb 2011 15:46:14 +0000</pubDate>
		<dc:creator>domdefelice</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Softwares]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://domdefelice.com/blog/?p=38</guid>
		<description><![CDATA[While diving inside my old files I found a snake game I wrote in pascal when I was sixteen. Taken by a wave of nostalgia I decided to port it in javascript to make it work in a webpage. See here.]]></description>
			<content:encoded><![CDATA[<p>While diving inside my old files I found a <a href="http://en.wikipedia.org/wiki/Snake_%28video_game%29">snake game</a> I wrote in pascal when I was sixteen. Taken by a wave of nostalgia I decided to port it in javascript to make it work in a webpage. <a href="http://domdefelice.com/projects/textmode/textmode.html">See here.</a></p>
]]></content:encoded>
			<wfw:commentRss>http://domdefelice.com/blog/2011/02/porting-a-snake-game-from-pascal-to-javascript/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A scopa game in Common Lisp</title>
		<link>http://domdefelice.com/blog/2011/02/scopa-card-game-in-common-lisp/</link>
		<comments>http://domdefelice.com/blog/2011/02/scopa-card-game-in-common-lisp/#comments</comments>
		<pubDate>Mon, 07 Feb 2011 19:04:54 +0000</pubDate>
		<dc:creator>domdefelice</dc:creator>
				<category><![CDATA[Common Lisp]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Softwares]]></category>
		<category><![CDATA[lisp]]></category>

		<guid isPermaLink="false">http://domdefelice.com/blog/?p=30</guid>
		<description><![CDATA[This is a scopa game for 2 players, human vs pc, written in Common Lisp mostly for fun, and to put in practice what I learned about CL so far. This is my first &#8220;real program&#8221; (if it can be called so) in Common Lisp, so just don&#8217;t expect it to be well-designed. Comments are [...]]]></description>
			<content:encoded><![CDATA[<p>This is a <a href="http://en.wikipedia.org/wiki/Scopa">scopa</a> game for 2 players, human vs pc, written in Common Lisp mostly for fun, and to put in practice what I learned about CL so far.</p>
<p>This is my first &#8220;real program&#8221; (if it can be called so) in Common Lisp, so just don&#8217;t expect it to be well-designed. Comments are very welcome.. and don&#8217;t strive to be polite about it. <img src='http://domdefelice.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p><strong><a href="/projects/scopa/scopa.clisp">Source code</a></strong></p>
<p>Use <em>(play)</em> to play.</p>
<p>Example session at the REPL of GNU CLISP:<br />
<small><em>I lost against the PC :/</em></small></p>
<pre>
[1]> (load "scopa.clisp")
;; Loading file scopa.clisp ...
;; Loaded file scopa.clisp
T
[2]> (play)

On the table:    [7 OF COPPE],   [6 OF DENARI],   [2 OF DENARI],    [8 OF COPPE]
Your hand:     [5 OF BASTONI],  [9 OF BASTONI],  [2 OF BASTONI]
Stock: 30 cards.

It's PC turn.

Player PC plays [7 OF SPADE] taking [7 OF COPPE]

On the table:   [6 OF DENARI],   [2 OF DENARI],    [8 OF COPPE]
Your hand:     [5 OF BASTONI],  [9 OF BASTONI],  [2 OF BASTONI]
Stock: 30 cards.

It's HUMAN turn.

1) Play [2 OF BASTONI] taking [2 OF DENARI]
2) Play [5 OF BASTONI]
3) Play [9 OF BASTONI]
What do you want to do?
1
Player HUMAN plays [2 OF BASTONI] taking [2 OF DENARI]

On the table:   [6 OF DENARI],    [8 OF COPPE]
Your hand:     [5 OF BASTONI],  [9 OF BASTONI]
Stock: 30 cards.

It's PC turn.

Player PC plays [10 OF COPPE]

On the table:   [6 OF DENARI],    [8 OF COPPE],   [10 OF COPPE]
Your hand:     [5 OF BASTONI],  [9 OF BASTONI]
Stock: 30 cards.

It's HUMAN turn.

1) Play [5 OF BASTONI]
2) Play [9 OF BASTONI]
What do you want to do?
2
Player HUMAN plays [9 OF BASTONI]

...
...

It's PC turn.

Player PC plays [4 OF DENARI]

On the table:    [8 OF SPADE],   [4 OF DENARI]
Your hand:       [2 OF COPPE]
Stock: 0 cards.

It's HUMAN turn.

1) Play [2 OF COPPE]
What do you want to do?
1
Player HUMAN plays [2 OF COPPE]
Player HUMAN collect all the remaining cards on the table.

SCORE ASSIGNMENTS
Greatest number of cards: PC
Greatest number of denari cards: PC
Settebello: PC
Prime: PC
HUMAN
0 + 0 + 0 scopas = 0
-------
PC
0 + 4 + 0 scopas = 4

On the table:    [5 OF SPADE],   [6 OF DENARI],  [3 OF BASTONI],    [3 OF SPADE]
Your hand:     [5 OF BASTONI],    [7 OF SPADE],   [10 OF SPADE]
Stock: 30 cards.

It's HUMAN turn.

1) Play [5 OF BASTONI] taking [5 OF SPADE]
2) Play [10 OF SPADE]
3) Play [7 OF SPADE]
What do you want to do?
1
Player HUMAN plays [5 OF BASTONI] taking [5 OF SPADE]

...
...

It's PC turn.

Player PC plays [5 OF DENARI]
Player PC collect all the remaining cards on the table.

SCORE ASSIGNMENTS
Greatest number of cards: PC
Greatest number of denari cards: PC
Settebello: HUMAN
Prime: PC
HUMAN
0 + 1 + 0 scopas = 1
-------
PC
4 + 3 + 2 scopas = 9

On the table:   [4 OF DENARI],    [5 OF SPADE],   [9 OF DENARI],   [10 OF SPADE]
Your hand:     [7 OF BASTONI],    [8 OF SPADE],   [1 OF DENARI]
Stock: 30 cards.

It's HUMAN turn.

1) Play [8 OF SPADE]
2) Play [1 OF DENARI]
3) Play [7 OF BASTONI]
What do you want to do?
1
Player HUMAN plays [8 OF SPADE]

...
...

It's PC turn.

Player PC plays [6 OF SPADE] taking [2 OF SPADE], [4 OF BASTONI]
Player PC collect all the remaining cards on the table.

SCORE ASSIGNMENTS
Greatest number of cards: PC
Greatest number of denari cards: PC
Settebello: PC
Prime: HUMAN
HUMAN
1 + 1 + 1 scopa = 3
-------
PC
9 + 3 + 2 scopas = 14
The game is over!
The winner is PC with a score of 14!
NIL
[3]>
</pre>
<p><a href="/projects/scopa/scopa_example.txt">Entire session</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://domdefelice.com/blog/2011/02/scopa-card-game-in-common-lisp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Lesson learned: never modify literals, quote lists only for constant data</title>
		<link>http://domdefelice.com/blog/2011/02/never-modify-literal-objects/</link>
		<comments>http://domdefelice.com/blog/2011/02/never-modify-literal-objects/#comments</comments>
		<pubDate>Sun, 06 Feb 2011 08:19:48 +0000</pubDate>
		<dc:creator>domdefelice</dc:creator>
				<category><![CDATA[Common Lisp]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[lisp]]></category>

		<guid isPermaLink="false">http://domdefelice.com/blog/?p=9</guid>
		<description><![CDATA[While writing a scopa card game in Common Lisp both as a pet project and a way to practice a little lisp, I had a hard time trying to understand what was going on here: 1 2 3 4 5 6 7 8 9 10 11 &#40;defun prime-points-of-card &#40;card&#41; &#40;let &#40;&#40;prime-points '&#40;&#40;7 21&#41; &#40;6 18&#41; [...]]]></description>
			<content:encoded><![CDATA[<p>While writing a <a href="http://en.wikipedia.org/wiki/Scopa">scopa</a> card game in Common Lisp both as a pet project and a way to practice a little lisp, I had a hard time trying to understand what was going on here:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> prime-points-of-card <span style="color: #66cc66;">&#40;</span>card<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">let</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>prime-points '<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">7</span> <span style="color: #cc66cc;">21</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">6</span> <span style="color: #cc66cc;">18</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1</span> <span style="color: #cc66cc;">16</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">5</span> <span style="color: #cc66cc;">15</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">4</span> <span style="color: #cc66cc;">14</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">3</span> <span style="color: #cc66cc;">13</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">2</span> <span style="color: #cc66cc;">12</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">10</span> <span style="color: #cc66cc;">10</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">9</span> <span style="color: #cc66cc;">10</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">8</span> <span style="color: #cc66cc;">10</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cadr</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">assoc</span> <span style="color: #66cc66;">&#40;</span>card-rank card<span style="color: #66cc66;">&#41;</span> prime-points<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> prime-points <span style="color: #66cc66;">&#40;</span>deck<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">let</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>scores '<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>denari <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>coppe <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>bastoni <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>spade <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>loop for card across deck <span style="color: #b1b100;">do</span>
         <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">let</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>suit <span style="color: #66cc66;">&#40;</span>card-suit card<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
           <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setf</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cadr</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">assoc</span> suit scores<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">max</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cadr</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">assoc</span> suit scores<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
                                                 <span style="color: #66cc66;">&#40;</span>prime-points-of-card card<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">apply</span> #'+ <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">mapcar</span> #'<span style="color: #b1b100;">cadr</span> scores<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>I was expecting <em>prime-points</em> to return the <a href="http://en.wikipedia.org/wiki/Scopa#Scoring">prime points</a> of a sequence of cards, but it kept returning what seemed to me just meaningless numbers.</p>
<p>I added a couple of <em>print</em>s to inspect what was going on:<br />
<small><em>(yeah I still need to learn how to debug effectively with lisp)</em></small></p>

<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> prime-points <span style="color: #66cc66;">&#40;</span>deck<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">let</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>scores '<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>denari <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>coppe <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>bastoni <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>spade <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">print</span> scores<span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>loop for card across deck <span style="color: #b1b100;">do</span>
         <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">let</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>suit <span style="color: #66cc66;">&#40;</span>card-suit card<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
           <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setf</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cadr</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">assoc</span> suit scores<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">max</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cadr</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">assoc</span> suit scores<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
                                                 <span style="color: #66cc66;">&#40;</span>prime-points-of-card card<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">print</span> scores<span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">apply</span> #'+ <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">mapcar</span> #'<span style="color: #b1b100;">cadr</span> scores<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></div></div>

<p>and this is what I found:</p>

<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">3</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&gt;</span> <span style="color: #66cc66;">&#40;</span>prime-points #<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>DENARI <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>COPPE <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>BASTONI <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>SPADE <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>DENARI <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>COPPE <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>BASTONI <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>SPADE <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #cc66cc;">0</span>
<span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">4</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&gt;</span> <span style="color: #66cc66;">&#40;</span>prime-points #<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>DENARI <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>COPPE <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>BASTONI <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>SPADE <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>DENARI <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>COPPE <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>BASTONI <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>SPADE <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #cc66cc;">0</span>
<span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">5</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&gt;</span> <span style="color: #66cc66;">&#40;</span>prime-points <span style="color: #66cc66;">&#40;</span>deck 'stock<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>DENARI <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>COPPE <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>BASTONI <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>SPADE <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>DENARI <span style="color: #cc66cc;">21</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>COPPE <span style="color: #cc66cc;">21</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>BASTONI <span style="color: #cc66cc;">21</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>SPADE <span style="color: #cc66cc;">21</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #cc66cc;">84</span>
<span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">6</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&gt;</span> <span style="color: #66cc66;">&#40;</span>prime-points #<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>DENARI <span style="color: #cc66cc;">21</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>COPPE <span style="color: #cc66cc;">21</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>BASTONI <span style="color: #cc66cc;">21</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>SPADE <span style="color: #cc66cc;">21</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>DENARI <span style="color: #cc66cc;">21</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>COPPE <span style="color: #cc66cc;">21</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>BASTONI <span style="color: #cc66cc;">21</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>SPADE <span style="color: #cc66cc;">21</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #cc66cc;">84</span></pre></div></div>

<p><em>scores</em> was keeping its value at each call to <em>prime-points</em>!<br />
Wasn&#8217;t <em>let</em> supposed to create a <strong>new</strong> lexical scope?<br />
Yes, it is and in fact it is what <em>let</em> <em>does</em>.<br />
The problem is to understand that</p>

<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">quote</span> <span style="color: #66cc66;">&#40;</span>foo bar baz<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></div></div>

<p>and its <i>shortcut</i></p>

<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;">'<span style="color: #66cc66;">&#40;</span>foo bar baz<span style="color: #66cc66;">&#41;</span></pre></div></div>

<p>are just list literals the same way as</p>

<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;">#<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1</span> <span style="color: #cc66cc;">2</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">&#41;</span> <span style="color: #808080; font-style: italic;">; Literal array</span>
<span style="color: #ff0000;">&quot;literal string&quot;</span></pre></div></div>

<p>This means that</p>

<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">quote</span> <span style="color: #66cc66;">&#40;</span>foo bar baz<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></div></div>

<p>is not equivalent to</p>

<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">list</span> 'foo 'bar 'baz<span style="color: #66cc66;">&#41;</span></pre></div></div>

<p>In the first case, the list is literal, in the second it is generated by code.<br />
When the list is literal, the compiler could copy it into write-protected memory or share it among more functions (or more calls to the same function) hence the <strong>consequences are undefined if it is modified</strong>.</p>
<p>As <a href="http://clhs.lisp.se/Body/s_quote.htm">HyperSpec&#8217;s QUOTE page</a> states:</p>
<blockquote><p>
Special Operator QUOTE</p>
<p>Syntax:<br />
quote object => object</p>
<p>Arguments and Values:<br />
object&#8212;an object; not evaluated.</p>
<p>Description:<br />
The quote special operator just returns object.</p>
<p><strong>The consequences are undefined if literal objects (including quoted objects) are destructively modified. </strong>
</p></blockquote>
<p>Ok. This may seem trivial for anybody else, but it was not for me.</p>
<p>This is the same thing that happens in other languages.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &lt;stdio.h&gt;</span>
&nbsp;
<span style="color: #993333;">void</span> foo<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #993333;">char</span> string<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">&quot;Fresh new at every call&quot;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%s<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> string<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  string<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">++;</span>
  <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%s<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> string<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">void</span> bar<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #993333;">char</span><span style="color: #339933;">*</span> string <span style="color: #339933;">=</span> <span style="color: #ff0000;">&quot;I could be in read-only memory&quot;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%s<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> string<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  string<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">++;</span> <span style="color: #666666; font-style: italic;">// Possible segmentation fault</span>
  <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%s<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> string<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> argc<span style="color: #339933;">,</span> <span style="color: #993333;">char</span> <span style="color: #339933;">**</span>argv<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  foo<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  foo<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  foo<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  bar<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  bar<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  bar<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>This is what happens with gcc:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">dom<span style="color: #000000; font-weight: bold;">@</span>dom-laptop:~<span style="color: #000000; font-weight: bold;">/</span>Progetti<span style="color: #000000; font-weight: bold;">/</span>c$ <span style="color: #c20cb9; font-weight: bold;">gcc</span> <span style="color: #660033;">-o</span> <span style="color: #7a0874; font-weight: bold;">test</span> test.c <span style="color: #000000; font-weight: bold;">&amp;&amp;</span> .<span style="color: #000000; font-weight: bold;">/</span><span style="color: #7a0874; font-weight: bold;">test</span>
Fresh new at every call
Gresh new at every call
Fresh new at every call
Gresh new at every call
Fresh new at every call
Gresh new at every call
I could be <span style="color: #000000; font-weight: bold;">in</span> read-only memory
Errore di segmentazione
dom<span style="color: #000000; font-weight: bold;">@</span>dom-laptop:~<span style="color: #000000; font-weight: bold;">/</span>Progetti<span style="color: #000000; font-weight: bold;">/</span>c$</pre></div></div>

<p>So if you need to define a data structure the way I did, use <em>list</em> or just <em>copy-tree</em> the literal data:</p>

<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> prime-points <span style="color: #66cc66;">&#40;</span>deck<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">let</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>scores <span style="color: #66cc66;">&#40;</span>copy-tree '<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>denari <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>coppe <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>bastoni <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>spade <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>loop for card across deck <span style="color: #b1b100;">do</span>
         <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">let</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>suit <span style="color: #66cc66;">&#40;</span>card-suit card<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
           <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setf</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cadr</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">assoc</span> suit scores<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">max</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cadr</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">assoc</span> suit scores<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
                                                 <span style="color: #66cc66;">&#40;</span>prime-points-of-card card<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">apply</span> #'+ <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">mapcar</span> #'<span style="color: #b1b100;">cadr</span> scores<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></div></div>

<p>I need to thank people at <a href="https://groups.google.com/group/comp.lang.lisp/browse_thread/thread/47a0e89db9248465/">comp.lang.lisp</a> for always being friendly and very didactic to lurk at.</p>
]]></content:encoded>
			<wfw:commentRss>http://domdefelice.com/blog/2011/02/never-modify-literal-objects/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
	</channel>
</rss>

