<?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>SlashCode &#187; lisp</title>
	<atom:link href="http://davideaversa.it/slashcode/tag/lisp/feed/" rel="self" type="application/rss+xml" />
	<link>http://davideaversa.it/slashcode</link>
	<description></description>
	<lastBuildDate>Thu, 03 May 2012 14:28:53 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Scheme &#8211; Lezione 7 &#8211; Le Porte</title>
		<link>http://davideaversa.it/slashcode/2009/11/scheme-lezione-7-le-porte/</link>
		<comments>http://davideaversa.it/slashcode/2009/11/scheme-lezione-7-le-porte/#comments</comments>
		<pubDate>Fri, 06 Nov 2009 11:43:02 +0000</pubDate>
		<dc:creator>THeK3nger</dc:creator>
				<category><![CDATA[Lisp/Scheme]]></category>
		<category><![CDATA[lisp]]></category>
		<category><![CDATA[porte]]></category>
		<category><![CDATA[programmazione]]></category>
		<category><![CDATA[scheme]]></category>

		<guid isPermaLink="false">http://davideaversa.it/slashcode/?p=470</guid>
		<description><![CDATA[<div><a href="http://davideaversa.it/slashcode/2009/11/scheme-lezione-7-le-porte/"><img title="Scheme &#8211; Lezione 7 &#8211; Le Porte" src="http://davideaversa.it/slashcode/wp-content/uploads/2009/11/gate-150x150.jpg" alt="Scheme &#8211; Lezione 7 &#8211; Le Porte"  width="200" height="200" /></a></div><br/>Torniamo sulla terra. Lasciamo per un momento tutti i concetti &#8220;teorici&#8221; e ingegneristici della programmazione Scheme per tornare ad alcuni aspetti pratici. E&#8217; importante, in qualunque linguaggio di programmazione, saper gestire abilmente l&#8217;input/output, sia quello &#8220;utente&#8221; sia quello &#8220;file&#8221;. Soprattutto in scheme, linguaggio con particolari vocazioni per il data-mining, saper leggere escrivere file diventa fondamentale. <a href='http://davideaversa.it/slashcode/2009/11/scheme-lezione-7-le-porte/' class='excerpt-more'>[...]</a>]]></description>
			<content:encoded><![CDATA[<div style="height:33px;" class="really_simple_share robots-nocontent snap_nopreview"><div class="really_simple_share_facebook_like" style="width:100px;"><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fdavideaversa.it%2Fslashcode%2F2009%2F11%2Fscheme-lezione-7-le-porte%2F&amp;layout=button_count&amp;show_faces=false&amp;width=100&amp;action=like&amp;colorscheme=light&amp;send=false&amp;height=27" 
						scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:100px; height:27px;" allowTransparency="true"></iframe></div><div class="really_simple_share_google1" style="width:90px;"><div class="g-plusone" data-size="medium" data-href="http://davideaversa.it/slashcode/2009/11/scheme-lezione-7-le-porte/" ></div></div><div class="really_simple_share_twitter" style="width:110px;"><a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
						data-text="Scheme &#8211; Lezione 7 &#8211; Le Porte" data-url="http://davideaversa.it/slashcode/2009/11/scheme-lezione-7-le-porte/" 
						data-via=""  ></a></div></div>
		<div style="clear:both;"></div><p><img class="alignleft size-thumbnail wp-image-471" title="Cancello" src="http://davideaversa.it/slashcode/wp-content/uploads/2009/11/gate-150x150.jpg" alt="Cancello" width="150" height="150" />Torniamo sulla terra. Lasciamo per un momento tutti i concetti &#8220;teorici&#8221; e ingegneristici della programmazione Scheme per tornare ad alcuni aspetti pratici.</p>
<p>E&#8217; importante, in qualunque linguaggio di programmazione, saper gestire abilmente l&#8217;input/output, sia quello &#8220;utente&#8221; sia quello &#8220;file&#8221;. Soprattutto in scheme, linguaggio con particolari vocazioni per il <em>data-mining, </em>saper leggere escrivere file diventa fondamentale.</p>
<p>Per leggere flussi dati in ingresso o in uscita Scheme utilizza le <strong>porte</strong>.</p>
<p>Le porte sono canali connessi alle varie periferiche di uscita/ingresso del sistema. Possono essere usate sia per leggere o scrivere su stdin/stdout (come scanf e printf in C) sia per leggere da file.</p>
<p><strong>CREARE UNA PORTA</strong></p>
<p>Creare una porta è semplicissimo:</p>
<div class="codecolorer-container scheme dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br /></div></td><td><div class="scheme codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">open-input-file</span> str<span style="color: #66cc66;">&#41;</span> <span style="color: #808080; font-style: italic;">;Per un file in lettura.</span><br />
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">open-output-file</span> str<span style="color: #66cc66;">&#41;</span> <span style="color: #808080; font-style: italic;">;Pre un file in scrittura.</span></div></td></tr></tbody></table></div>
<p>Ovviamente al posto di <em>str</em> ci va il percorso del file che si vuole aprire.</p>
<p><strong>LEGGERE</strong></p>
<p>Per leggere si utilizza semplicemente il comando:</p>
<div class="codecolorer-container scheme dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="scheme codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">read</span> port<span style="color: #66cc66;">&#41;</span></div></td></tr></tbody></table></div>
<p>Dove <em>port</em> è la porta che abbiamo aperto in precedenza.</p>
<p>Il comando</p>
<div class="codecolorer-container scheme dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="scheme codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #66cc66;">&#40;</span>eof<span style="color: #66cc66;">-</span>object port<span style="color: #66cc66;">&#41;</span></div></td></tr></tbody></table></div>
<p>ci dice, invece, se abbiamo raggiunto la fine del file.</p>
<p><strong>NOTA: Se nessuna porta è specificata Scheme leggerà dallo standard input (terminale).</strong></p>
<p><strong>SCRIVERE:</strong></p>
<p>Analogamente alla lettura Scheme offre i seguenti comandi per scrivere:</p>
<div class="codecolorer-container scheme dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br /></div></td><td><div class="scheme codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">write</span> obj port<span style="color: #66cc66;">&#41;</span> &nbsp; &nbsp;<span style="color: #808080; font-style: italic;">;Scrive l'oggetto obj sulla porta port</span><br />
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">display</span> obj port<span style="color: #66cc66;">&#41;</span> <span style="color: #808080; font-style: italic;">;Mostra l'oggetto obj attraverso la porta port</span><br />
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">newline</span> port<span style="color: #66cc66;">&#41;</span> <span style="color: #808080; font-style: italic;">;Scrive una linea vuota sulla porta port</span></div></td></tr></tbody></table></div>
<p>Come nel caso della lettura anche qui, se non specifichiamo la porta, Scheme effettuerà la scrittura sullo standard output (ovvero sul terminale).</p>
<p>Questa lezione termina quì. L&#8217;uso delle porta in Scheme è veramente molto semplice. Appena posso posterò degli esempi.</p>
<p>Alla prossima.</p>
 <p><a href="http://davideaversa.it/slashcode/?flattrss_redirect&amp;id=470&amp;md5=971d9c092567290041c77b049988cb2c" title="Flattr" target="_blank"><img src="http://davideaversa.it/slashcode/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://davideaversa.it/slashcode/2009/11/scheme-lezione-7-le-porte/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=thek3nger&amp;popout=1&amp;url=http%3A%2F%2Fdavideaversa.it%2Fslashcode%2F2009%2F11%2Fscheme-lezione-7-le-porte%2F&amp;language=it_IT&amp;category=text&amp;title=Scheme+%26%238211%3B+Lezione+7+%26%238211%3B+Le+Porte&amp;description=Torniamo+sulla+terra.+Lasciamo+per+un+momento+tutti+i+concetti+%26%238220%3Bteorici%26%238221%3B+e+ingegneristici+della+programmazione+Scheme+per+tornare+ad+alcuni+aspetti+pratici.+E%26%238217%3B+importante%2C+in+qualunque+linguaggio+di+programmazione%2C+saper...&amp;tags=lisp%2Cporte%2Cprogrammazione%2Cscheme%2Cblog" type="text/html" />
	</item>
		<item>
		<title>Scheme &#8211; Lezione 6 &#8211; Complessita&#8217;</title>
		<link>http://davideaversa.it/slashcode/2009/10/scheme-lezione-6-complessita/</link>
		<comments>http://davideaversa.it/slashcode/2009/10/scheme-lezione-6-complessita/#comments</comments>
		<pubDate>Sat, 31 Oct 2009 17:53:11 +0000</pubDate>
		<dc:creator>THeK3nger</dc:creator>
				<category><![CDATA[Lisp/Scheme]]></category>
		<category><![CDATA[complessità]]></category>
		<category><![CDATA[lisp]]></category>
		<category><![CDATA[scheme]]></category>

		<guid isPermaLink="false">http://davideaversa.it/slashcode/?p=448</guid>
		<description><![CDATA[<div><a href="http://davideaversa.it/slashcode/2009/10/scheme-lezione-6-complessita/"><img title="Scheme &#8211; Lezione 6 &#8211; Complessita&#8217;" src="http://davideaversa.it/slashcode/wp-content/uploads/2009/10/frattale-150x150.jpg" alt="Scheme &#8211; Lezione 6 &#8211; Complessita&#8217;"  width="200" height="200" /></a></div><br/>Dopo aver visto come funziona la ricorsione in Scheme dobbiamo valutare un altro aspetto molto rilevante: il costo. Non tutto ciò che logicamente funziona funziona poi all&#8217;atto pratico. Ad esempio, se ripescate la funzione ricorsiva della Funzione di Fibonacci e provate a farla partire noterete che già con numeri relativamente bassi (come 100) il sistema <a href='http://davideaversa.it/slashcode/2009/10/scheme-lezione-6-complessita/' class='excerpt-more'>[...]</a>]]></description>
			<content:encoded><![CDATA[<div style="height:33px;" class="really_simple_share robots-nocontent snap_nopreview"><div class="really_simple_share_facebook_like" style="width:100px;"><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fdavideaversa.it%2Fslashcode%2F2009%2F10%2Fscheme-lezione-6-complessita%2F&amp;layout=button_count&amp;show_faces=false&amp;width=100&amp;action=like&amp;colorscheme=light&amp;send=false&amp;height=27" 
						scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:100px; height:27px;" allowTransparency="true"></iframe></div><div class="really_simple_share_google1" style="width:90px;"><div class="g-plusone" data-size="medium" data-href="http://davideaversa.it/slashcode/2009/10/scheme-lezione-6-complessita/" ></div></div><div class="really_simple_share_twitter" style="width:110px;"><a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
						data-text="Scheme &#8211; Lezione 6 &#8211; Complessita&#8217;" data-url="http://davideaversa.it/slashcode/2009/10/scheme-lezione-6-complessita/" 
						data-via=""  ></a></div></div>
		<div style="clear:both;"></div><p><img class="alignleft size-thumbnail wp-image-460" title="frattale" src="http://davideaversa.it/slashcode/wp-content/uploads/2009/10/frattale-150x150.jpg" alt="frattale" width="150" height="150" />Dopo aver visto come funziona la ricorsione in Scheme dobbiamo valutare un altro aspetto molto rilevante: <strong>il costo</strong>. Non tutto ciò che logicamente funziona funziona poi all&#8217;atto pratico. Ad esempio, se ripescate la funzione ricorsiva della <strong><em>Funzione di Fibonacci</em></strong> e provate a farla partire noterete che già con numeri relativamente bassi (come 100) il sistema inizierà a intasarsi e non darà alcun risultato se non quello di dover killare il processo.</p>
<p>Perché questo? Perché l&#8217;implementazione dell&#8217;algoritmo, sebbene sia vera e matematicamente corretta, necessita un numero troppo elevato di calcoli o di memoria.</p>
<p>Iniziamo col dare dei cenni sulla complessità di un algoritmo. La complessità di un algoritmo è definita asintoticamente con un infinito di ordine superiore a una funzione f(x). In questo caso si dice che l&#8217;algoritmo ha complessità dell&#8217;ordine di f(x).</p>
<p>Cosa significa? E&#8217; semplice. Supponete di far valere 1 il costo di ogni operazione base come somma, prodotto, cdr, car e via dicendo (ovviamente è un approssimazione). Supponete di stabilire un contatore che sommi il costo di ogni operazione eseguita. Supponete poi di eseguire questa funzione (con relativo contatore) per un imput di dimensione 1, poi per un input di dimensione 2, poi per un input di dimensione 3 e così via. La serie di numeri che otterrete non sarà altro che i valori di una funzione f(x)al variare di x. La complessità si riduce quindi all&#8217;ordine di infinito di questa funzione.</p>
<p>Data l&#8217;asintoticità della definizione, solitamente si trascurano i valori per x piccolo e si approssima molto per x che tende a infinito.</p>
<p>Senza addentrarci nei particolari sappiate che in ogni algoritmo esiste un operazione, detta <strong>operazione dominante</strong>, la quale complessità è uguale alla complessità dell&#8217;algoritmo nella sua interezza.</p>
<p>Negli algoritmi ricorsivi l&#8217;operazione dominante è <strong>la ricorsione</strong>. Per trovare la complessità di una funzione in scheme (che sono per definizione tutte ricorsive) ci basta quindi sapere quante volte una funzione chiama la ricorsione.</p>
<p>Questo può essere molto complicato, ma è giusto che impariate a identificare almento i casi semplici. Questo può essere fatto molto semplicemente.</p>
<p>Supponiamo di voler calcolare la complessità dell&#8217;algoritmo <strong>fattoriale</strong> visto qualche lezione fa. L&#8217;espressione ricorsiva del fattoriale è la seguente:</p>
<p><img class="aligncenter size-full wp-image-457" title="Fattoriale" src="http://davideaversa.it/slashcode/wp-content/uploads/2009/10/CodeCogsEqn.gif" alt="Fattoriale" width="168" height="57" />Per trovare il costo basta seguire la formula:</p>
<p><img class="aligncenter size-full wp-image-458" title="CodeCogsEqn(2)" src="http://davideaversa.it/slashcode/wp-content/uploads/2009/10/CodeCogsEqn2.gif" alt="CodeCogsEqn(2)" width="392" height="57" />Questo perché il costo di f(0) è chiaramente unitario. Il costo di f(n), per il principio dell&#8217;operazione è solamente il costo della ricorsione e il costo della ricorsione non è altro che 1 più il costo di tutte le altre funzioni invocate.</p>
<p>Ma siamo arrivati ad una suluzione? Ancora no. Dobbiamo esplicitare il costo ovvero toglierlo dalla sua forma ricorsiva. Per fare ciò possiamo semplicemente espandere la seconda equazione.</p>
<ul>
<li>C[f(n)]</li>
<li>1 + C[f(n-1)]</li>
<li>2 + C[f(n-2)</li>
<li> ...</li>
<li> n + C[f(0)]</li>
<li> n+1</li>
<li>che è asintoticamente O(n)</li>
</ul>
<p>Il costo è quindi lineare. (Non esattamente&#8230; ma per non mettere troppa carne al fuoco farò alcune precisazioni al riguardio nella prossima appendice).</p>
<p>Una funzione con complessità lineare è solitamente una funzione discretamente veloce e potente.</p>
<p>Vediamo ora la stessa cosa con la Funzione di Fibonacci.</p>
<p><img class="aligncenter size-full wp-image-459" title="Costo Fibonacci" src="http://davideaversa.it/slashcode/wp-content/uploads/2009/10/CodeCogsEqn3.gif" alt="Costo Fibonacci" width="331" height="79" /></p>
<p>La situazione è leggermente più complessa. Per esplicitare la funzione possiamo comunque espandere C[f(n)] ma non conviene in questo caso. Facciamo un ragionamento più sottile. Cerchiamo di calcolare direttamente il costo totale. Sappiamo che ogni ricorsione chiama due ricorsioni. Alla prima ricorsione avremo costo totale<strong> 1</strong>, alla seconda avremo il costo totale di prima più il costo delle due nuove ricorsioni ovvero<strong> 1 + 2</strong>. Alla terza avremo il costo di prima  più le due ricorsioni nuove lanciate da ognuna delle due ricorsione precedenti ovvero <strong>1 + 2 + 4</strong> (il costo di prima più le due ricorsioni nuove lanciate da ognuna delle due ricorsione precedenti).</p>
<p>Notiamo che abbiamo una serie geometrica che possiamo riassumere in <strong>2^n+1 &#8211; 1</strong> che asintoticamente è <strong>O(2^n)</strong>.</p>
<p>Il costo è <strong>esponenziale</strong>. Un algoritmo esponenziale può solitamente calcolare solo input molto piccoli. Ecco perché il nostro algoritmo di Fibonacci si bloccava anche con numeri piccoli come 100.</p>
<p>Come possiamo allora migliorare questo algoritmo? Esistono tecniche un po&#8217; più elaborate che permettono di eseguire algoritmi simili lanciando solo una ricorsione al posto delle due &#8220;canoniche&#8221;. Queste tecniche le esploreremo più in là in quanto necessitano di un po&#8217; di esperienza.</p>
<p>Per il momento vi basti intuire che algoritmi che eseguono troppe ricorsioni contemporaneamente sono spesso troppo costosi per essere utili. Infatti abbiamo visto che basta lanciare due ricorsioni in vece di una per fare esplodere il costo da lineare ad esponenziale.</p>
<p>Non vi serve saper calcolare la complessità di tutto ma vi basta intuire quando un algoritmo sta diventando troppo costoso. Questo è basilare per ogni programmatore, anche al di là di Scheme.</p>
<p>Provate a calcolare il costo di altre funzioni di esempio che ho dato in precedenza. Postate il costo che avete ottenuto nei commenti e vedrò di verificare se avete indovinato.</p>
 <p><a href="http://davideaversa.it/slashcode/?flattrss_redirect&amp;id=448&amp;md5=0b78f9e9fc9cb2c030c7606fcc1c72e6" title="Flattr" target="_blank"><img src="http://davideaversa.it/slashcode/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://davideaversa.it/slashcode/2009/10/scheme-lezione-6-complessita/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=thek3nger&amp;popout=1&amp;url=http%3A%2F%2Fdavideaversa.it%2Fslashcode%2F2009%2F10%2Fscheme-lezione-6-complessita%2F&amp;language=it_IT&amp;category=text&amp;title=Scheme+%26%238211%3B+Lezione+6+%26%238211%3B+Complessita%26%238217%3B&amp;description=Dopo+aver+visto+come+funziona+la+ricorsione+in+Scheme+dobbiamo+valutare+un+altro+aspetto+molto+rilevante%3A+il+costo.+Non+tutto+ci%C3%B2+che+logicamente+funziona+funziona+poi+all%26%238217%3Batto+pratico.+Ad+esempio%2C...&amp;tags=complessit%C3%A0%2Clisp%2Cscheme%2Cblog" type="text/html" />
	</item>
		<item>
		<title>Scheme &#8211; Lezione 5 &#8211; Ancora Ricorsione</title>
		<link>http://davideaversa.it/slashcode/2009/10/scheme-lezione-6-ancora-ricorsione/</link>
		<comments>http://davideaversa.it/slashcode/2009/10/scheme-lezione-6-ancora-ricorsione/#comments</comments>
		<pubDate>Fri, 16 Oct 2009 18:47:47 +0000</pubDate>
		<dc:creator>THeK3nger</dc:creator>
				<category><![CDATA[Lisp/Scheme]]></category>
		<category><![CDATA[lisp]]></category>
		<category><![CDATA[programmazione]]></category>
		<category><![CDATA[scheme]]></category>

		<guid isPermaLink="false">http://slashcode.wordpress.com/?p=352</guid>
		<description><![CDATA[<div><a href="http://davideaversa.it/slashcode/2009/10/scheme-lezione-6-ancora-ricorsione/"><img title="Scheme &#8211; Lezione 5 &#8211; Ancora Ricorsione" src="http://davideaversa.it/slashcode/wp-content/uploads/2009/10/escher-mani-150x150.jpg" alt="Scheme &#8211; Lezione 5 &#8211; Ancora Ricorsione"  width="200" height="200" /></a></div><br/>Nella scorsa lezione abbiamo visto come funziona la semplice ricorsione applicata a funzioni numeriche. La ricorsione è però molto più potente e ci permette di operari anche con oggetti che non siano solamente numeri. Diamo quindi ora una definizione di algoritmo ricorsivo meno formale ma che serve a decifrare meglio il problema a livello pratico. <a href='http://davideaversa.it/slashcode/2009/10/scheme-lezione-6-ancora-ricorsione/' class='excerpt-more'>[...]</a>]]></description>
			<content:encoded><![CDATA[<div style="height:33px;" class="really_simple_share robots-nocontent snap_nopreview"><div class="really_simple_share_facebook_like" style="width:100px;"><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fdavideaversa.it%2Fslashcode%2F2009%2F10%2Fscheme-lezione-6-ancora-ricorsione%2F&amp;layout=button_count&amp;show_faces=false&amp;width=100&amp;action=like&amp;colorscheme=light&amp;send=false&amp;height=27" 
						scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:100px; height:27px;" allowTransparency="true"></iframe></div><div class="really_simple_share_google1" style="width:90px;"><div class="g-plusone" data-size="medium" data-href="http://davideaversa.it/slashcode/2009/10/scheme-lezione-6-ancora-ricorsione/" ></div></div><div class="really_simple_share_twitter" style="width:110px;"><a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
						data-text="Scheme &#8211; Lezione 5 &#8211; Ancora Ricorsione" data-url="http://davideaversa.it/slashcode/2009/10/scheme-lezione-6-ancora-ricorsione/" 
						data-via=""  ></a></div></div>
		<div style="clear:both;"></div><p><img class="alignleft size-thumbnail wp-image-389" title="Escher - Mani che Disegnano se Stesse" src="http://davideaversa.it/slashcode/wp-content/uploads/2009/10/escher-mani-150x150.jpg" alt="Escher - Mani che Disegnano se Stesse" width="150" height="150" />Nella scorsa lezione abbiamo visto come funziona la semplice ricorsione applicata a funzioni numeriche. La ricorsione è però molto più potente e ci permette di operari anche con oggetti che non siano solamente numeri.</p>
<p>Diamo quindi ora una definizione di algoritmo ricorsivo meno formale ma che serve a decifrare meglio il problema a livello pratico.</p>
<p>Supponiamo che ci sia una funzione F che risolva un problema su un input P di dimensione N. N può essere il numero di elementi di una lista, il numero di nodi di un grafo o di un albero, il numero di byte in un file e qualunque altra cosa. Chiamiamo P-N un qualunque ingresso di dimensione N e chiamiamo F(P-N) l&#8217;algoritmo che opera sull&#8217;input P. Inoltre definiamo con K un qualunque  P fissato (ad esempio una lista vuota, oppure una lista con 2 elementi, oppure un albero senza sotto-albero destro, etc&#8230;</p>
<p>Da questo ricaviamo che un algoritmo ricorsivo è tale se e solo se:</p>
<ul>
<li>F(K) ha un risultato immediato (<em>passo base</em>)</li>
<li>F(P-N) può essere calcolato immediatamente conoscendo il risultato di F(P-M) dove M è minore di N. (<em>passo ricorsivo</em>)</li>
</ul>
<p>Questo cosa vuol dire. Vuol dire che un algoritmo ricorsivo ricava il risultato su un input di dimensione N grazie al risultato che ottiene su un sotto insieme dell&#8217;input iniziale di dimensione M.</p>
<p>Come al solito l&#8217;esempio chiarisce molto più di mille parole. Supponiamo di voler scrivere l&#8217;algoritmo ricorsivo per invertire una lista ovvero mettere in testa l&#8217;ultimo elemento, in seconda posizione il penultimo e così via.</p>
<pre>
<div class="codecolorer-container scheme dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br /></div></td><td><div class="scheme codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">define</span> <span style="color: #66cc66;">&#40;</span>rovescia lista<span style="color: #66cc66;">&#41;</span><br />
&nbsp; <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cond</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">null?</span> lista<span style="color: #66cc66;">&#41;</span> '<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">else</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">append</span> <span style="color: #66cc66;">&#40;</span>rovescia <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cdr</span> lista<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">list</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">car</span> lista<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><br />
&nbsp; <span style="color: #66cc66;">&#41;</span><br />
<span style="color: #66cc66;">&#41;</span></div></td></tr></tbody></table></div>
</pre>
<p>L&#8217;algoritmo non fa altro che appendere l&#8217;elemento di testa della lista in coda alla sottolista rovesciata. Ovvero, supponiamo di avere la lista (1 2 3 4) e di volerla rovesciare. Prendendo il primo elemento della lista avremo (1) e la sottolista (2 3 4). Supponiamo di avere la sottolista già rovesciata, ovvero (4 3 2). Ci accorgiamo che per avere la lista originale rovesciata ci basta prendere (1) e metterlo in coda a (4 3 2).</p>
<p>Il problema si riduce quindi a rovesciare (2 3 4). Ma questo a sua volta si riduce a rovesciare (3 4). Che a sua volta si riduce a rovesciare (4). Ma (4) è già rovesciato. E quindi abbiamo concluso.</p>
<p>Ecco un altro esempio:</p>
<pre>
<div class="codecolorer-container scheme dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br /></div></td><td><div class="scheme codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">define</span> <span style="color: #66cc66;">&#40;</span>presente x lista<span style="color: #66cc66;">&#41;</span><br />
&nbsp; &nbsp;<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cond</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">null?</span> lista<span style="color: #66cc66;">&#41;</span> #f<span style="color: #66cc66;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">=</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">car</span> lista<span style="color: #66cc66;">&#41;</span> x<span style="color: #66cc66;">&#41;</span> #t<span style="color: #66cc66;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">else</span> <span style="color: #66cc66;">&#40;</span>presente x <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cdr</span> lista<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><br />
&nbsp; &nbsp;<span style="color: #66cc66;">&#41;</span><br />
<span style="color: #66cc66;">&#41;</span></div></td></tr></tbody></table></div>
</pre>
<p>Questo algoritmo verifica se l&#8217;elemento x è presente nella lista <em>lista</em>. Ancora più semplicemente possiamo applicare il seguente ragionamento ricorsivo:</p>
<ul>
<li>Se x è il primo elemento della lista allora l&#8217;elemento x è presente. (<em>caso ase</em>)</li>
<li>Se la lista è vuota allora l&#8217;argomento non è presente. (<em>caso base</em>)</li>
<li>Altrimenti verifico se è presente nel resto della lista. (<em>caso ricorsivo</em>)</li>
</ul>
<p>Questo è un esempio di ragionamento ricorsivo. In pratica si sposta il problema ad un qualcosa di <em>più piccolo</em> rispetto all&#8217;input originale.</p>
<p>Come ultimo esempio vi cito questo:</p>
<pre>
<div class="codecolorer-container scheme dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br /></div></td><td><div class="scheme codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">define</span> <span style="color: #66cc66;">&#40;</span>sommalista lista<span style="color: #66cc66;">&#41;</span><br />
&nbsp; <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cond</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">null?</span> lista<span style="color: #66cc66;">&#41;</span> <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">else</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">+</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">car</span> lista<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>sommalista <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cdr</span> lista<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><br />
&nbsp; <span style="color: #66cc66;">&#41;</span><br />
<span style="color: #66cc66;">&#41;</span></div></td></tr></tbody></table></div>
</pre>
<p>L&#8217;algoritmo non fa altro che sommare tutti gli elementi di una lista. Anche in questo caso il ragionamento ricorsivo è semplice.</p>
<ul>
<li>Se la lista è vuota la somma è ZERO. (<em>caso base</em>)</li>
<li>Altrimenti la somma è uguale al primo elemento più la somma del resto della lista.</li>
</ul>
<p>Torneremo a parlare di ricorsione ancora e ancora. Cerco di fare il possibile per trattarla in modo comprensibile nonostante gli spazi &#8220;ristretti&#8221; di un blog.</p>
<p>La prossima lezione affronterà un tema molto importante. Il costo della ricorsione. Cercheremo di trovare un modo semplice per capire quanto costa a livello di prestazioni un algoritmo ricorsivo e come evitare che diventi troppo esoso.</p>
 <p><a href="http://davideaversa.it/slashcode/?flattrss_redirect&amp;id=352&amp;md5=72450343757dbf944788e338c71d8ea7" title="Flattr" target="_blank"><img src="http://davideaversa.it/slashcode/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://davideaversa.it/slashcode/2009/10/scheme-lezione-6-ancora-ricorsione/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=thek3nger&amp;popout=1&amp;url=http%3A%2F%2Fdavideaversa.it%2Fslashcode%2F2009%2F10%2Fscheme-lezione-6-ancora-ricorsione%2F&amp;language=it_IT&amp;category=text&amp;title=Scheme+%26%238211%3B+Lezione+5+%26%238211%3B+Ancora+Ricorsione&amp;description=Nella+scorsa+lezione+abbiamo+visto+come+funziona+la+semplice+ricorsione+applicata+a+funzioni+numeriche.+La+ricorsione+%C3%A8+per%C3%B2+molto+pi%C3%B9+potente+e+ci+permette+di+operari+anche+con+oggetti+che...&amp;tags=lisp%2Cprogrammazione%2Cscheme%2Cblog" type="text/html" />
	</item>
		<item>
		<title>Scheme &#8211; Lezione 4 &#8211; Ricorsione Semplice</title>
		<link>http://davideaversa.it/slashcode/2009/10/scheme-lezione-4-ricorsione-semplice/</link>
		<comments>http://davideaversa.it/slashcode/2009/10/scheme-lezione-4-ricorsione-semplice/#comments</comments>
		<pubDate>Wed, 14 Oct 2009 16:25:27 +0000</pubDate>
		<dc:creator>THeK3nger</dc:creator>
				<category><![CDATA[Lisp/Scheme]]></category>
		<category><![CDATA[lisp]]></category>
		<category><![CDATA[programmazione]]></category>
		<category><![CDATA[scheme]]></category>

		<guid isPermaLink="false">http://slashcode.wordpress.com/?p=333</guid>
		<description><![CDATA[<div><a href="http://davideaversa.it/slashcode/2009/10/scheme-lezione-4-ricorsione-semplice/"><img title="Scheme &#8211; Lezione 4 &#8211; Ricorsione Semplice" src="http://davideaversa.it/slashcode/wp-content/uploads/2009/10/PrintGallery-150x150.jpg" alt="Scheme &#8211; Lezione 4 &#8211; Ricorsione Semplice"  width="200" height="200" /></a></div><br/>Ora che conosciamo tutte le basi di Scheme dobbiamo iniziare la parte più difficile, abituare la nostra testa a ragionare secondo il modello funzionale. Per fare questo non possiamo prescindere dall&#8217;uso di un linguaggio un po più matematico ma che, vi assicuro, dopo l&#8217;impatto iniziale si rivelerà piuttosto automatico (e se avete dubbi potete sempre <a href='http://davideaversa.it/slashcode/2009/10/scheme-lezione-4-ricorsione-semplice/' class='excerpt-more'>[...]</a>]]></description>
			<content:encoded><![CDATA[<div style="height:33px;" class="really_simple_share robots-nocontent snap_nopreview"><div class="really_simple_share_facebook_like" style="width:100px;"><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fdavideaversa.it%2Fslashcode%2F2009%2F10%2Fscheme-lezione-4-ricorsione-semplice%2F&amp;layout=button_count&amp;show_faces=false&amp;width=100&amp;action=like&amp;colorscheme=light&amp;send=false&amp;height=27" 
						scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:100px; height:27px;" allowTransparency="true"></iframe></div><div class="really_simple_share_google1" style="width:90px;"><div class="g-plusone" data-size="medium" data-href="http://davideaversa.it/slashcode/2009/10/scheme-lezione-4-ricorsione-semplice/" ></div></div><div class="really_simple_share_twitter" style="width:110px;"><a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
						data-text="Scheme &#8211; Lezione 4 &#8211; Ricorsione Semplice" data-url="http://davideaversa.it/slashcode/2009/10/scheme-lezione-4-ricorsione-semplice/" 
						data-via=""  ></a></div></div>
		<div style="clear:both;"></div><p><img class="size-thumbnail wp-image-370 alignleft" title="Escher-Recursion" src="http://davideaversa.it/slashcode/wp-content/uploads/2009/10/PrintGallery-150x150.jpg" alt="Escher-Recursion" width="150" height="150" />Ora che conosciamo tutte le basi di Scheme dobbiamo iniziare la parte più difficile, abituare la nostra testa a ragionare secondo il modello funzionale. Per fare questo non possiamo prescindere dall&#8217;uso di un linguaggio un po più matematico ma che, vi assicuro, dopo l&#8217;impatto iniziale si rivelerà piuttosto automatico (e se avete dubbi potete sempre chiedere su LQH).</p>
<p>La base di scheme, come sapete, è funzionale. In quanto linguaggio funzionale esso va programmato secondo i canoni della teoria delle <strong>funzioni ricorsive</strong>. Le funzioni ricorsive sono un argomento molto esteso ma di importanza fondamentale nella teoria della calcolabilità. In questa lezione non ci occuperemo della totalità delle funzioni ricorsive ma ci limiteremo a trattare il sottoinsieme delle <strong>funzioni ricorsive primitive</strong>. Queste funzioni ricorsive hanno, fra le tante, la non trascurabile proprietà di <strong>terminare sempre</strong>. Ovvero data una qualunque funzione ricorsiva primitiva e un qualsiasi input la funzione cesserà la propria esecuzione restituendoci un risultato.</p>
<p>Senza addentrarci troppo nella teoria sappiate che una funzione ricorsiva è una funzione nella quale esiste un caso in cui la soluzione è diretta e nel caso generale il risultato è ricavabile passando ad un&#8217;altra funzione tutti gli argomenti della funzione ricorsiva più il risultato della stessa calcolato su un insieme più piccolo degli argomenti originali. Ovvero:</p>
<p><img class="aligncenter" title="Ricorsione1" src="http://upload.wikimedia.org/math/4/7/8/478d4ba0e664d6b22429e8dee9ca00ed.png" alt="" width="247" height="23" /></p>
<p style="text-align:center;"><img class="aligncenter" title="Ricorsione2" src="http://upload.wikimedia.org/math/4/3/0/430f546ae76e9a2c612ef4a4305693f8.png" alt="" width="421" height="21" /></p>
<p style="text-align:left;">Detto così sembra enormemente complicato. In realtà nella maggior parte dei casi una funzione ricorsiva può essere riportata alla ricorsione di una funzione ad un argomento e quindi.</p>
<p style="text-align:left;"><a href="http://slashcode.files.wordpress.com/2009/10/codecogseqn.gif"><img class="aligncenter size-full wp-image-334" title="CodeCogsEqn" src="http://slashcode.files.wordpress.com/2009/10/codecogseqn.gif" alt="CodeCogsEqn" width="75" height="20" /></a><a href="http://slashcode.files.wordpress.com/2009/10/codecogseqn5.gif"><img class="aligncenter size-full wp-image-338" title="CodeCogsEqn(5)" src="http://slashcode.files.wordpress.com/2009/10/codecogseqn5.gif" alt="CodeCogsEqn(5)" width="164" height="20" /></a></p>
<p style="text-align:left;">Se anche così la cosa vi crea problemi cercherò di risolverli con il più semplice degli esempi: il fattoriale. Ricordate inoltre che la funzione <em>g(y,x)</em> solitamente è implicita.</p>
<p style="text-align:left;">Il fattoriale espresso ricorsivamente apparirà come:</p>
<p style="text-align:left;"><a href="http://slashcode.files.wordpress.com/2009/10/codecogseqn3.gif"><img class="aligncenter size-full wp-image-336" title="CodeCogsEqn(3)" src="http://slashcode.files.wordpress.com/2009/10/codecogseqn3.gif" alt="CodeCogsEqn(3)" width="137" height="20" /></a><a href="http://slashcode.files.wordpress.com/2009/10/codecogseqn4.gif"><img class="aligncenter size-full wp-image-337" title="CodeCogsEqn(4)" src="http://slashcode.files.wordpress.com/2009/10/codecogseqn4.gif" alt="CodeCogsEqn(4)" width="289" height="20" /></a></p>
<p style="text-align:left;">Che penso sia di facile interpretazione.</p>
<p style="text-align:left;">I casi in cui risaliamo direttamente al risultato si chiamano <strong>casi base</strong>, i casi in cui è necessario usare la ricorsione sono detti <strong>casi ricorsivi</strong>.</p>
<p style="text-align:left;">Poiché questo è un corso di Scheme vediamo come trasportare questa funzione matematica in una funzione di Scheme. Il passo è semplice.</p>
<pre>
<div class="codecolorer-container scheme dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br /></div></td><td><div class="scheme codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">define</span> <span style="color: #66cc66;">&#40;</span>fattoriale y<span style="color: #66cc66;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cond</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">=</span> y <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">else</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">*</span> y <span style="color: #66cc66;">&#40;</span>fattoriale <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">-</span> y <span style="color: #cc66cc;">1</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><br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#41;</span><br />
<span style="color: #66cc66;">&#41;</span></div></td></tr></tbody></table></div>
</pre>
<p>Come vedete ci basta inserire in un COND tutti i casi base e tutti i casi ricorsivi. Il caso base, in questo esempio, equivale a y=0, in questo caso infatti il fattoriale è semplicemente 1. Se y non è nulla allora dobbiamo eseguire il passo ricorsivo. Notate che in questo caso la funzione <em>g(y,x)</em> è semplicemente la funzione prodotto.</p>
<p>Il meccanismo di funzionamento è semplice. Le chiamate ricorsive hanno sempre due stati:</p>
<ul>
<li>Uno stato di crescita in cui si fanno le chiamate ricorsive inserendo tutto sullo stack.</li>
<li>Uno stato di calcolo in cui partendo dalla cima dello stack si effettuano i calcoli ripercorrendo le varie chiamate ricorsive a ritroso.</li>
</ul>
<p>Nel caso di funzioni ricorsive semplici questi stati sono raggruppati in due fasi distinte. Lo stato di crescita continua fino al raggiungimento di un caso base dopo il quale tutte le chiamate sullo stack terminano a <strong>cascata</strong>.</p>
<p>Facciamo un esempio. Riprendiamo la nostra funzione <em>fattoriale </em>e vediamo come si comporta nel fare il fattoriale di 4.</p>
<p>La prima chiamata sarà</p>
<pre><code class="codecolorer scheme dawn"><span class="scheme"><span style="color: #66cc66;">&#40;</span>fattoriale <span style="color: #cc66cc;">4</span><span style="color: #66cc66;">&#41;</span></span></code></pre>
<p>A questo punto si entra nel COND. Y è chiaramente diverso da zero, quindi viene eseguito il ramo else. La funzione esegue:</p>
<pre><code class="codecolorer scheme dawn"><span class="scheme"><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">*</span> <span style="color: #cc66cc;">4</span> <span style="color: #66cc66;">&#40;</span>fattoriale <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#41;</span></span></code></pre>
<p>A questo punto viene invocato nuovamente <em>fattoriale</em>. L&#8217;esecuzione corrente viene quindi sospesa mentre viene avviata una nuova esecuzione di fattoriale. A questo punto i passi vengono rieseguiti nella nuova chiamata. Y è ancora diverso da zero quindi viene eseguito ancora il ramo else.</p>
<pre><code class="codecolorer scheme dawn"><span class="scheme"><span style="color: #66cc66;">&#40;</span> <span style="color: #66cc66;">*</span> <span style="color: #cc66cc;">4</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #66cc66;">*</span> <span style="color: #cc66cc;">3</span> <span style="color: #66cc66;">&#40;</span>fattoriale <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#41;</span></span></code></pre>
<p>Viene aggiunta una nuova chiamata in pila. E così via.</p>
<pre><code class="codecolorer scheme dawn"><span class="scheme"><span style="color: #66cc66;">&#40;</span> <span style="color: #66cc66;">*</span> <span style="color: #cc66cc;">4</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #66cc66;">*</span> <span style="color: #cc66cc;">3</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #66cc66;">*</span> <span style="color: #cc66cc;">2</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #66cc66;">*</span> <span style="color: #cc66cc;">1</span> <span style="color: #66cc66;">&#40;</span>fattoriale <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></code></pre>
<p>A questo punto però ci troviamo nella situazione in cui la nuova chiamata di <em>fattoriale</em> è esattamente il caso base. A questo punto la chiamata termina restituendo 1 senza eseguire una nuova chiamata a <em>fattoriale</em>.</p>
<pre><code class="codecolorer scheme dawn"><span class="scheme"><span style="color: #66cc66;">&#40;</span> <span style="color: #66cc66;">*</span> <span style="color: #cc66cc;">4</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #66cc66;">*</span> <span style="color: #cc66cc;">3</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #66cc66;">*</span> <span style="color: #cc66cc;">2</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #66cc66;">*</span> <span style="color: #cc66cc;">1</span> <span style="color: #cc66cc;">1</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></code></pre>
<p>Inizia così la fase di calcolo e distruzione. Terminata l&#8217;ultima chiamata di fattoriale si riprende dalla chiamata precedente che non fa altro che calcolare 1 x 1 e terminare. E così via a cascata fino alla chiamata originale che termina con il risultato complessivo. Ovvero 24.</p>
<p>Questo è il meccanismo generale di una funzione ricorsiva.</p>
<p><strong>RICAPITOLANDO</strong></p>
<ul>
<li>Una funzione ricorsiva è una funzione che richiama se stessa su una porzione più piccola degli argomenti.</li>
<li>Una funzione ricorsiva primitiva <strong>termina sempre</strong>.</li>
<li>Una funzione ricorsiva primitiva è sempre composta da uno o più casi base e uno o più casi ricorsivi.</li>
<li>Una funzione ricorsiva senza casi ricorsivi non è ricorsiva. Una funzione senza casi base non termina mai.</li>
<li>Una funzione ricorsiva presenta nella sua esecuzione due stati: <strong>uno stato di crescita </strong>e <strong>uno stato di calcolo e distruzione</strong>.</li>
</ul>
<p><strong>RISORSE</strong></p>
<p>Allego di seguito un file Scheme che contiene alcune piccole funzioni ricorsive numeriche. Potete dargli un occhiata, prima però potete provare a farle da voi. Le funzioni sono:</p>
<ul>
<li>Fattoriale (fatto)</li>
<li>Serie di Fibonacci</li>
<li>Moltiplicazione</li>
<li>Somma</li>
<li>Elevazione a potenza</li>
</ul>
<p>Il file lo trovate <a href="http://dl.getdropbox.com/u/89889/Lezione%204.scm">QUI</a>.</p>
<p>Nella prossima lezione continueremo questo argomento cercando di chiarire molti altri aspetti pratici di una funzione ricorsiva e vedremo come applicarla a compiti più complessi del semplice calcolo delfattoriale di un numero.</p>
 <p><a href="http://davideaversa.it/slashcode/?flattrss_redirect&amp;id=333&amp;md5=672b7e55b62100dbcef6adc4df10e71d" title="Flattr" target="_blank"><img src="http://davideaversa.it/slashcode/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://davideaversa.it/slashcode/2009/10/scheme-lezione-4-ricorsione-semplice/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=thek3nger&amp;popout=1&amp;url=http%3A%2F%2Fdavideaversa.it%2Fslashcode%2F2009%2F10%2Fscheme-lezione-4-ricorsione-semplice%2F&amp;language=it_IT&amp;category=text&amp;title=Scheme+%26%238211%3B+Lezione+4+%26%238211%3B+Ricorsione+Semplice&amp;description=Ora+che+conosciamo+tutte+le+basi+di+Scheme+dobbiamo+iniziare+la+parte+pi%C3%B9+difficile%2C+abituare+la+nostra+testa+a+ragionare+secondo+il+modello+funzionale.+Per+fare+questo+non+possiamo+prescindere...&amp;tags=lisp%2Cprogrammazione%2Cscheme%2Cblog" type="text/html" />
	</item>
		<item>
		<title>Scheme &#8211; Tavola Funzioni Numeriche</title>
		<link>http://davideaversa.it/slashcode/2009/10/scheme-tavola-funzioni-numeriche/</link>
		<comments>http://davideaversa.it/slashcode/2009/10/scheme-tavola-funzioni-numeriche/#comments</comments>
		<pubDate>Wed, 14 Oct 2009 11:22:07 +0000</pubDate>
		<dc:creator>THeK3nger</dc:creator>
				<category><![CDATA[Lisp/Scheme]]></category>
		<category><![CDATA[lisp]]></category>
		<category><![CDATA[programmazione]]></category>
		<category><![CDATA[scheme]]></category>

		<guid isPermaLink="false">http://slashcode.wordpress.com/?p=331</guid>
		<description><![CDATA[<div><a href="http://davideaversa.it/slashcode/2009/10/scheme-tavola-funzioni-numeriche/"><img title="Scheme &#8211; Tavola Funzioni Numeriche" src="http://davideaversa.it/slashcode/wp-content/uploads/2009/10/math-150x150.png" alt="Scheme &#8211; Tavola Funzioni Numeriche"  width="200" height="200" /></a></div><br/>Mettiamo una pausa alle lezioni per mostrare un elenco piuttosto esaustivo delle funzioni di utilità generale che possiamo richiamare durante la programmazione. Le funzioni, come abbiamo già visto, sono tutte in notazione prefissa. Inoltre, a differenza di altri linguaggi, Scheme possiede molte funzioni matematiche, anche complesse, di default, senza dover importare nessun modulo o libreria. <a href='http://davideaversa.it/slashcode/2009/10/scheme-tavola-funzioni-numeriche/' class='excerpt-more'>[...]</a>]]></description>
			<content:encoded><![CDATA[<div style="height:33px;" class="really_simple_share robots-nocontent snap_nopreview"><div class="really_simple_share_facebook_like" style="width:100px;"><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fdavideaversa.it%2Fslashcode%2F2009%2F10%2Fscheme-tavola-funzioni-numeriche%2F&amp;layout=button_count&amp;show_faces=false&amp;width=100&amp;action=like&amp;colorscheme=light&amp;send=false&amp;height=27" 
						scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:100px; height:27px;" allowTransparency="true"></iframe></div><div class="really_simple_share_google1" style="width:90px;"><div class="g-plusone" data-size="medium" data-href="http://davideaversa.it/slashcode/2009/10/scheme-tavola-funzioni-numeriche/" ></div></div><div class="really_simple_share_twitter" style="width:110px;"><a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
						data-text="Scheme &#8211; Tavola Funzioni Numeriche" data-url="http://davideaversa.it/slashcode/2009/10/scheme-tavola-funzioni-numeriche/" 
						data-via=""  ></a></div></div>
		<div style="clear:both;"></div><p><img class="alignleft size-thumbnail wp-image-431" title="Matematica" src="http://davideaversa.it/slashcode/wp-content/uploads/2009/10/math-150x150.png" alt="Matematica" width="150" height="150" />Mettiamo una pausa alle lezioni per mostrare un elenco piuttosto esaustivo delle funzioni di utilità generale che possiamo richiamare durante la programmazione.</p>
<p>Le funzioni, come abbiamo già visto, sono tutte in notazione prefissa. Inoltre, a differenza di altri linguaggi, Scheme possiede molte funzioni matematiche, anche complesse, di default, senza dover importare nessun modulo o libreria.</p>
<p>Un altra differenza con le funzioni di altri linguaggi consiste nel poter calcolare direttamente un gran numero di argomenti. Queste funzioni hanno quindi un numero di parametri potenzialmente infinito. La funzione &#8220;addizione&#8221;, per esempio, prende un numero qualunque di parametri e li sommatutti mentre con la notazione ordinaria (a + b) possiamo sommare soltanto due elementi alla volta.</p>
<p>Vediamo quindi una prima lista di funzioni. Sono <strong>funzioni numeriche</strong> ovvero che lavorano con numeri.</p>
<table border="0">
<tbody>
<tr>
<th>Funzioni</th>
<th>Risultato</th>
</tr>
<tr>
<td>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">(+ arg1 arg2 ... argN)</div></div>
</td>
<td>Somma tutti gli argomenti.</td>
</tr>
<tr>
<td>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">(- arg1 arg2 ... argN)</div></div>
</td>
<td>Sottrae ad arg1 tutti gli argomenti.</td>
</tr>
<tr>
<td>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">(* arg1 arg2 ... argN)</div></div>
</td>
<td>Moltiplica tutti gli argomenti.</td>
</tr>
<tr>
<td>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">(/ arg1 arg2 arg3... argN)</div></div>
</td>
<td>Divide ad arg1 tutti gli argomenti.</td>
</tr>
<tr>
<td>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">(log arg)</div></div>
</td>
<td>Logaritmo naturale di arg</td>
</tr>
<tr>
<td>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">(exp arg)</div></div>
</td>
<td>Esponenziale di arg</td>
</tr>
<tr>
<td>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">(sin arg)</div></div>
</td>
<td>Seno di arg</td>
</tr>
<tr>
<td>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">(cos arg)</div></div>
</td>
<td>Coseno di arg</td>
</tr>
<tr>
<td>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">(tan arg)</div></div>
</td>
<td>Tangente di arg</td>
</tr>
<tr>
<td>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">(asin arg)</div></div>
</td>
<td>Arcoseno di arg</td>
</tr>
<tr>
<td>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">(acos arg)</div></div>
</td>
<td>Arcocoseno di arg</td>
</tr>
<tr>
<td>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">(atan arg)</div></div>
</td>
<td>Arcotangente di arg</td>
</tr>
<tr>
<td>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">(sqrt arg)</div></div>
</td>
<td>Radice quadrata arg</td>
</tr>
<tr>
<td>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">(expt base potenza)</div></div>
</td>
<td>Eleva la base alla potenza</td>
</tr>
<tr>
<td>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">(abs arg)</div></div>
</td>
<td>Valore assoluto di arg</td>
</tr>
<tr>
<td>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">(quotient arg1 arg2)</div></div>
</td>
<td>Restituisce la parte intera di arg1 / arg2</td>
</tr>
<tr>
<td>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">(modulo arg1 arg2)</div></div>
</td>
<td>Resto della divisione</td>
</tr>
<tr>
<td>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">(ceiling arg)</div></div>
</td>
<td>Approssimazione della parte intera per eccesso</td>
</tr>
<tr>
<td>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">(floor arg)</div></div>
</td>
<td>Approssimazione della parte intera per difetto</td>
</tr>
<tr>
<td>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">(round arg)</div></div>
</td>
<td>Approssimazione generica di arg</td>
</tr>
<tr>
<td>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">(truncate arg)</div></div>
</td>
<td>Troncamento di arg</td>
</tr>
<tr>
<td>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">(max arg1 ... argN)</div></div>
</td>
<td>Valore massimo tra arg1 e argN</td>
</tr>
<tr>
<td>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">(min arg1 ... argN)</div></div>
</td>
<td>Valore minimo tra arg1 e argN</td>
</tr>
<tr>
<td>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">(gcd arg1 ... argN)</div></div>
</td>
<td>Massimo comune divisore tra arg1..e .. argN</td>
</tr>
<tr>
<td>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">(lcd arg1 ... argN)</div></div>
</td>
<td>Minimo comune multiplo tra arg1.. e .. argN</td>
</tr>
<tr>
<td>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">(numerator arg)</div></div>
</td>
<td>Numeratore di arg</td>
</tr>
<tr>
<td>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">(denominator arg)</div></div>
</td>
<td>Denominatore di arg</td>
</tr>
</tbody>
</table>
<p>Inoltre sono disponibili queste funzioni di utilità:</p>
<table border="0">
<tbody>
<tr>
<th>Funzioni</th>
<th>Domanda</th>
</tr>
<tr>
<td>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">(zero? numero)</div></div>
</td>
<td>Il numero è uno zero?</td>
</tr>
<tr>
<td>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">(positive? numero)</div></div>
</td>
<td>Il numero è positivo?</td>
</tr>
<tr>
<td>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">(negative? numero)</div></div>
</td>
<td>Il numero è negativo?</td>
</tr>
<tr>
<td>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">(odd? numero)</div></div>
</td>
<td>Il numero è dispari?</td>
</tr>
<tr>
<td>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">(even? numero)</div></div>
</td>
<td>Il numero è pari?</td>
</tr>
</tbody>
</table>
<p>Queste tabelle sono state tratte da Wikipedia con qualche correzione e ampliamento personale.</p>
 <p><a href="http://davideaversa.it/slashcode/?flattrss_redirect&amp;id=331&amp;md5=15d911de986965aaf3a5059c6933c001" title="Flattr" target="_blank"><img src="http://davideaversa.it/slashcode/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://davideaversa.it/slashcode/2009/10/scheme-tavola-funzioni-numeriche/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=thek3nger&amp;popout=1&amp;url=http%3A%2F%2Fdavideaversa.it%2Fslashcode%2F2009%2F10%2Fscheme-tavola-funzioni-numeriche%2F&amp;language=it_IT&amp;category=text&amp;title=Scheme+%26%238211%3B+Tavola+Funzioni+Numeriche&amp;description=Mettiamo+una+pausa+alle+lezioni+per+mostrare+un+elenco+piuttosto+esaustivo+delle+funzioni+di+utilit%C3%A0+generale+che+possiamo+richiamare+durante+la+programmazione.+Le+funzioni%2C+come+abbiamo+gi%C3%A0+visto%2C+sono+tutte...&amp;tags=lisp%2Cprogrammazione%2Cscheme%2Cblog" type="text/html" />
	</item>
		<item>
		<title>Scheme &#8211; Lezione 3 &#8211; Condizioni</title>
		<link>http://davideaversa.it/slashcode/2009/10/scheme-lezione-3-condizioni/</link>
		<comments>http://davideaversa.it/slashcode/2009/10/scheme-lezione-3-condizioni/#comments</comments>
		<pubDate>Sun, 11 Oct 2009 12:24:22 +0000</pubDate>
		<dc:creator>THeK3nger</dc:creator>
				<category><![CDATA[Lisp/Scheme]]></category>
		<category><![CDATA[lisp]]></category>
		<category><![CDATA[programmazione]]></category>
		<category><![CDATA[scheme]]></category>

		<guid isPermaLink="false">http://slashcode.wordpress.com/?p=329</guid>
		<description><![CDATA[<div><a href="http://davideaversa.it/slashcode/2009/10/scheme-lezione-3-condizioni/"><img title="Scheme &#8211; Lezione 3 &#8211; Condizioni" src="http://davideaversa.it/slashcode/wp-content/uploads/2009/10/bivio3-150x150.jpg" alt="Scheme &#8211; Lezione 3 &#8211; Condizioni"  width="200" height="200" /></a></div><br/>Come in ogni linguaggio di programmazione, una delle cose essenziali per scrivere un qualunque programma è la  gestione delle condizioni. Una condizione consiste, come penso sappiate, nell&#8217;eseguire un blocco di comandi a seconda se sia rispettata o meno una data condizione. In Scheme la gestione delle condizioni è molto completa. Iniziamo quindi a vedere uno <a href='http://davideaversa.it/slashcode/2009/10/scheme-lezione-3-condizioni/' class='excerpt-more'>[...]</a>]]></description>
			<content:encoded><![CDATA[<div style="height:33px;" class="really_simple_share robots-nocontent snap_nopreview"><div class="really_simple_share_facebook_like" style="width:100px;"><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fdavideaversa.it%2Fslashcode%2F2009%2F10%2Fscheme-lezione-3-condizioni%2F&amp;layout=button_count&amp;show_faces=false&amp;width=100&amp;action=like&amp;colorscheme=light&amp;send=false&amp;height=27" 
						scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:100px; height:27px;" allowTransparency="true"></iframe></div><div class="really_simple_share_google1" style="width:90px;"><div class="g-plusone" data-size="medium" data-href="http://davideaversa.it/slashcode/2009/10/scheme-lezione-3-condizioni/" ></div></div><div class="really_simple_share_twitter" style="width:110px;"><a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
						data-text="Scheme &#8211; Lezione 3 &#8211; Condizioni" data-url="http://davideaversa.it/slashcode/2009/10/scheme-lezione-3-condizioni/" 
						data-via=""  ></a></div></div>
		<div style="clear:both;"></div><p><img class="size-thumbnail wp-image-379 alignleft" title="Bivio" src="http://davideaversa.it/slashcode/wp-content/uploads/2009/10/bivio3-150x150.jpg" alt="Bivio" width="150" height="150" />Come in ogni linguaggio di programmazione, una delle cose essenziali per scrivere un qualunque programma è la  <strong>gestione delle condizioni</strong>. Una condizione consiste, come penso sappiate, nell&#8217;eseguire un blocco di comandi a seconda se sia rispettata o meno una data condizione.</p>
<p>In Scheme la gestione delle condizioni è molto completa. Iniziamo quindi a vedere uno dei costrutti più famosi anche se in Scheme non viene molto usato: l&#8217;<strong>if</strong>.</p>
<p><strong>IF</strong></p>
<pre>
<div class="codecolorer-container scheme dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br /></div></td><td><div class="scheme codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> condizione<br />
    espressione_nel_caso_la_condizione_sia_vera<br />
    eventuale_espressione_nel_caso_la_condizione_sia_falsa<span style="color: #66cc66;">&#41;</span></div></td></tr></tbody></table></div>
</pre>
<p>Questa è la struttura dell&#8217;if. Viene valutata <em>condizione</em> e a seconda se sia vera o falsa viene eseguito rispettivamente il primo o il secondo blocco di espressioni. Guardiamo un piccolo esempio:</p>
<pre>
<div class="codecolorer-container scheme dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br /></div></td><td><div class="scheme codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #808080; font-style: italic;">; TESTIF: Verifica se A è uguale a Zero.</span><br />
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">define</span> <span style="color: #66cc66;">&#40;</span>testif a<span style="color: #66cc66;">&#41;</span><br />
&nbsp;<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">=</span> a <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">display</span> <span style="color: #ff0000;">&quot;Il valore inserito è uguale a zero.&quot;</span><span style="color: #66cc66;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">display</span> <span style="color: #ff0000;">&quot;Il valore inserito NON è uguale a zero.&quot;</span><span style="color: #66cc66;">&#41;</span><br />
&nbsp;<span style="color: #66cc66;">&#41;</span><br />
&nbsp;<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">newline</span><span style="color: #66cc66;">&#41;</span><br />
<span style="color: #66cc66;">&#41;</span></div></td></tr></tbody></table></div>
</pre>
<p>Questa funzione non fa altro che dire se il valore passato per parametro è zero oppure no. Potete subito constatare che questo costrutto è del tutto simile agli if presenti negli altri linguaggi.</p>
<p><strong>COND</strong></p>
<p>COND è il costrutto condizionale più utilizzato a causa della sua versatilità. Esso è infatti in grado di simulare abilmente sia un IF sia un CASE. Vediamo come è strutturato.</p>
<pre>
<div class="codecolorer-container scheme dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br /></div></td><td><div class="scheme codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cond</span><br />
<span style="color: #66cc66;">&#40;</span>prima_condizione espressione<span style="color: #66cc66;">&#41;</span><br />
<span style="color: #66cc66;">&#40;</span>seconda_condizione espressione<span style="color: #66cc66;">&#41;</span><br />
...<br />
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">else</span> espressione<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></div></td></tr></tbody></table></div>
</pre>
<p>Ad ogni sua applicazione vengono valutate le condizioni a partire dalla prima fino all&#8217;ultima e viene eseguito il blocco di istruzioni corrispondente alla condizione vera. Se nessuna condizione è vera viene eseguito il ramo <em>else</em>. Vediamo un esempio:</p>
<pre>
<div class="codecolorer-container scheme dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br /></div></td><td><div class="scheme codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #808080; font-style: italic;">; TESTCOND: Verifica se B è uguale a 0 o a 1.</span><br />
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">define</span> <span style="color: #66cc66;">&#40;</span>testcond b<span style="color: #66cc66;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cond</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">=</span> b <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">display</span> <span style="color: #ff0000;">&quot;B = 0&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">=</span> b <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">display</span> <span style="color: #ff0000;">&quot;B = 1&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">else</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">display</span> <span style="color: #ff0000;">&quot;NONE&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">newline</span><span style="color: #66cc66;">&#41;</span><br />
<span style="color: #66cc66;">&#41;</span></div></td></tr></tbody></table></div>
</pre>
<p>Questa funzione verifica se il parametro è 0 oppure 1 e in caso contrario risponde con NONE.</p>
<p><strong>CASE</strong></p>
<p>Questo è l&#8217;ultimo costrutto decisionale in Scheme. Si comporta in modo molto simile allo <em>switch&#8230;case</em> presente in molti altri linguaggi.</p>
<pre>
<div class="codecolorer-container scheme dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br /></div></td><td><div class="scheme codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">case</span> espressione_che_viene_valutata<br />
&nbsp; &nbsp;<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>val1<span style="color: #66cc66;">&#41;</span> espressione<span style="color: #66cc66;">&#41;</span><br />
&nbsp; &nbsp;<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>val2<span style="color: #66cc66;">&#41;</span> espressione<span style="color: #66cc66;">&#41;</span><br />
&nbsp; &nbsp;...<br />
&nbsp; &nbsp;<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">else</span> espressione<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></div></td></tr></tbody></table></div>
</pre>
<p>Viene innanzitutto valutata l&#8217;espressione. Dopodichè il valore risultante viene confrontato con la lista di valori <em>val1, </em>se il valore è contenuto in val1 viene eseguita l&#8217;espressione corrispondente altrimenti si passa a <em>val2</em>. Così via fino a <em>else</em> che viene eseguita in ogni caso.</p>
<pre>
<div class="codecolorer-container scheme dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br /></div></td><td><div class="scheme codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #808080; font-style: italic;">; TESTCASE: Verifica se C è pari o dispari compreso fra 0 e 10.</span><br />
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">define</span> <span style="color: #66cc66;">&#40;</span>testcase c<span style="color: #66cc66;">&#41;</span><br />
&nbsp;<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">case</span> c<br />
&nbsp; &nbsp; &nbsp;<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1</span> <span style="color: #cc66cc;">3</span> <span style="color: #cc66cc;">5</span> <span style="color: #cc66cc;">7</span> <span style="color: #cc66cc;">9</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">display</span> <span style="color: #ff0000;">&quot;C = DISPARI&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">2</span> <span style="color: #cc66cc;">4</span> <span style="color: #cc66cc;">6</span> <span style="color: #cc66cc;">8</span> <span style="color: #cc66cc;">10</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">display</span> <span style="color: #ff0000;">&quot;C = PARI&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">else</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">display</span> <span style="color: #ff0000;">&quot;NONE&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><br />
&nbsp;<span style="color: #66cc66;">&#41;</span><br />
&nbsp;<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">newline</span><span style="color: #66cc66;">&#41;</span><br />
<span style="color: #66cc66;">&#41;</span></div></td></tr></tbody></table></div>
</pre>
<p><strong>RICAPITOLANDO:</strong></p>
<ul>
<li><strong>IF </strong>esegue un espressione se la condizione è vera, ne esegue un altra se è falsa.</li>
<li><strong>COND</strong> esegue l&#8217;espressione corrispondente alla condizione vera o a <em>else</em> se nessuna è vera.</li>
<li><strong>CASE</strong> calcola un espressione ed esegue i comandi associati alla lista che contiene tale valore.</li>
</ul>
 <p><a href="http://davideaversa.it/slashcode/?flattrss_redirect&amp;id=329&amp;md5=f28d9959096a5547747bba21bb6f136c" title="Flattr" target="_blank"><img src="http://davideaversa.it/slashcode/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://davideaversa.it/slashcode/2009/10/scheme-lezione-3-condizioni/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=thek3nger&amp;popout=1&amp;url=http%3A%2F%2Fdavideaversa.it%2Fslashcode%2F2009%2F10%2Fscheme-lezione-3-condizioni%2F&amp;language=it_IT&amp;category=text&amp;title=Scheme+%26%238211%3B+Lezione+3+%26%238211%3B+Condizioni&amp;description=Come+in+ogni+linguaggio+di+programmazione%2C+una+delle+cose+essenziali+per+scrivere+un+qualunque+programma+%C3%A8+la%C2%A0+gestione+delle+condizioni.+Una+condizione+consiste%2C+come+penso+sappiate%2C+nell%26%238217%3Beseguire+un+blocco+di...&amp;tags=lisp%2Cprogrammazione%2Cscheme%2Cblog" type="text/html" />
	</item>
		<item>
		<title>Scheme &#8211; Lezione 2 &#8211; Manipolazione Liste</title>
		<link>http://davideaversa.it/slashcode/2009/10/scheme-lezione-2-manipolazione-liste/</link>
		<comments>http://davideaversa.it/slashcode/2009/10/scheme-lezione-2-manipolazione-liste/#comments</comments>
		<pubDate>Fri, 09 Oct 2009 17:08:28 +0000</pubDate>
		<dc:creator>THeK3nger</dc:creator>
				<category><![CDATA[Lisp/Scheme]]></category>
		<category><![CDATA[lisp]]></category>
		<category><![CDATA[programmazione]]></category>
		<category><![CDATA[scheme]]></category>

		<guid isPermaLink="false">http://slashcode.wordpress.com/?p=319</guid>
		<description><![CDATA[<div><a href="http://davideaversa.it/slashcode/2009/10/scheme-lezione-2-manipolazione-liste/"><img title="Scheme &#8211; Lezione 2 &#8211; Manipolazione Liste" src="http://davideaversa.it/slashcode/wp-content/uploads/2009/10/forbici-150x150.jpg" alt="Scheme &#8211; Lezione 2 &#8211; Manipolazione Liste"  width="200" height="200" /></a></div><br/>Continuiamo il nostro studio di Scheme analizzando un altro elemento fondamentale della programmazione Lisp: la manipolazione delle liste. Come abbiamo visto in precedenza in Scheme tutto ciò che non è un atomo (numeri, stringhe, caratteri e altri tipi base) è una lista, appare quindi chiara l&#8217;importanza che riveste la loro manipolazione nella programmazione funzionale. Per <a href='http://davideaversa.it/slashcode/2009/10/scheme-lezione-2-manipolazione-liste/' class='excerpt-more'>[...]</a>]]></description>
			<content:encoded><![CDATA[<div style="height:33px;" class="really_simple_share robots-nocontent snap_nopreview"><div class="really_simple_share_facebook_like" style="width:100px;"><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fdavideaversa.it%2Fslashcode%2F2009%2F10%2Fscheme-lezione-2-manipolazione-liste%2F&amp;layout=button_count&amp;show_faces=false&amp;width=100&amp;action=like&amp;colorscheme=light&amp;send=false&amp;height=27" 
						scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:100px; height:27px;" allowTransparency="true"></iframe></div><div class="really_simple_share_google1" style="width:90px;"><div class="g-plusone" data-size="medium" data-href="http://davideaversa.it/slashcode/2009/10/scheme-lezione-2-manipolazione-liste/" ></div></div><div class="really_simple_share_twitter" style="width:110px;"><a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
						data-text="Scheme &#8211; Lezione 2 &#8211; Manipolazione Liste" data-url="http://davideaversa.it/slashcode/2009/10/scheme-lezione-2-manipolazione-liste/" 
						data-via=""  ></a></div></div>
		<div style="clear:both;"></div><p><img class="alignleft size-thumbnail wp-image-383" title="Forbici" src="http://davideaversa.it/slashcode/wp-content/uploads/2009/10/forbici-150x150.jpg" alt="Forbici" width="150" height="150" />Continuiamo il nostro studio di Scheme analizzando un altro elemento fondamentale della programmazione Lisp: <strong>la manipolazione delle liste</strong>. Come abbiamo visto in precedenza in Scheme tutto ciò che non è un atomo (numeri, stringhe, caratteri e altri tipi base) è una lista, appare quindi chiara l&#8217;importanza che riveste la loro manipolazione nella programmazione funzionale.</p>
<p>Per fare ciò analizzaremo quella manciata di comandi che ci permettono di fare tutto.</p>
<p><strong>CAR e CDR</strong></p>
<p>Questi sono i due comandi principali. Grazie a questi comandi possiamo già fare praticamente tutto. I comandi che vedremo successivamente possono benissimo essere ricreati usando solo CDR e CAR (e CONS). Nei nostri esempi considereremo una lista di numeri (1 2 3 4 5 6).</p>
<p>Tengo a precisare che indicare una lista così:</p>
<pre><code class="codecolorer scheme dawn"><span class="scheme">'<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: #cc66cc;">4</span> <span style="color: #cc66cc;">5</span> <span style="color: #cc66cc;">6</span><span style="color: #66cc66;">&#41;</span></span></code></pre>
<p>è del tutto equivalente all&#8217;uso del comando <strong>list</strong>.</p>
<pre><code class="codecolorer scheme dawn"><span class="scheme"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">list</span> <span style="color: #cc66cc;">1</span> <span style="color: #cc66cc;">2</span> <span style="color: #cc66cc;">3</span> <span style="color: #cc66cc;">4</span> <span style="color: #cc66cc;">5</span> <span style="color: #cc66cc;">6</span><span style="color: #66cc66;">&#41;</span></span></code></pre>
<p><span style="text-decoration: underline;">EFFETTI:</span></p>
<ul>
<li><strong>CAR</strong> estrae il primo elemento della lista passata per argomento.<br />
ESEMPIO:</p>
<pre><code class="codecolorer scheme dawn"><span class="scheme"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">car</span> '<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: #cc66cc;">4</span> <span style="color: #cc66cc;">5</span> <span style="color: #cc66cc;">6</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> restituisce <span style="color: #cc66cc;">1</span></span></code></pre>
</li>
<li><strong>CDR </strong>ritorna la lista formata dalla lista passata per argomento <strong>senza</strong> il primo elemento.<br />
ESEMPIO:</p>
<pre><code class="codecolorer scheme dawn"><span class="scheme"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cdr</span> '<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: #cc66cc;">4</span> <span style="color: #cc66cc;">5</span> <span style="color: #cc66cc;">6</span><span style="color: #66cc66;">&#41;</span> restituisce <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">2</span> <span style="color: #cc66cc;">3</span> <span style="color: #cc66cc;">4</span> <span style="color: #cc66cc;">5</span> <span style="color: #cc66cc;">6</span><span style="color: #66cc66;">&#41;</span></span></code></pre>
</li>
</ul>
<p>Questi comandi inoltre godono di una proprietà particolare. Possono essere composti a piacimento inserendo una A per ogni CAR e<br />
una D per ogni CDR nella parola C*R. Detto così sembra complicato, in realtà è però molto semplice. Facciamo un esempio.</p>
<ul>
<li>(CADR lista) equivale a (CAR (CDR lista)).</li>
<li>(CADDR lista) equivale a (CAR (CDR (CDR lista))).</li>
<li>(CDADR lista) equivale a (CDR (CAR (CDR (CAR lista)))).</li>
</ul>
<p>In queste composizioni è però necessario considerare il risultato di ogni applicazione. Sia CAR che CDR prendono come argomento una lista <strong>ma mentre CDR restituisce sempre una lista CAR restituisce una lista SE E SOLO SE la lista che gli viene data è una lista di liste.</strong></p>
<p>Questo è causa di errori. Infatti non si può fare il CAR/CDR di un elemento.</p>
<p>Confusi? E&#8217; normale. Ci vuole un po per afferrare questi concetti ma risulteranno molto intuitivi dopo un po di applicazioni.</p>
<p><strong>CONS</strong></p>
<p>Cons è un altro comando essenziale. Questo comando la cui sintassi è</p>
<pre><code class="codecolorer scheme dawn"><span class="scheme"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">CONS</span> arg1 arg2<span style="color: #66cc66;">&#41;</span></span></code></pre>
<p>Non fa altro che inserire in testa alla lista <em>arg2 </em>l&#8217;elemento <em>arg1</em>.</p>
<p><strong>APPEND</strong></p>
<p>Append è un altro comodo comando la cui sintassi è identica a quella di CONS.</p>
<pre><code class="codecolorer scheme dawn"><span class="scheme"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">APPEND</span> arg1 arg2<span style="color: #66cc66;">&#41;</span></span></code></pre>
<p>Questo comando però serve a concatenare due liste dando come risultato una lista contenente prima tutti gli elementi di arg1 e poi tutti gli elementi di arg2.</p>
<p><strong>REVERSE</strong></p>
<p>Ultimo comando che userete spesso è Reverse. Questo comando inverte semplicemente l&#8217;ordine degli elementi all&#8217;interno della lista. Ad esempio:</p>
<pre><code class="codecolorer scheme dawn"><span class="scheme"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">REVERSE</span> '<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: #66cc66;">&#41;</span> restituisce <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">3</span> <span style="color: #cc66cc;">2</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span></span></code></pre>
<p><strong>RICAPITOLANDO</strong></p>
<ul>
<li><strong>CAR</strong> estrae il primo elemento di una lista.</li>
<li><strong>CDR </strong>restituisce la lista senza il primo elemento.</li>
<li><strong>CAR</strong> si applica solo a <strong>LISTE</strong> e il suo risultato è un <strong>ELEMENTO</strong> o una <strong>LISTA</strong></li>
<li><strong>CDR</strong> si applica solo a <strong>LISTE</strong> e il suo risultato è sempre una <strong>LISTA</strong>.</li>
<li><strong>CAR</strong> e <strong>CDR</strong> possono combinarsi in comandi come <strong>CADR</strong> o <strong>CADDDDR</strong> in cui ogni <strong>A</strong> indica un <strong>CAR</strong> e ogni <strong>D</strong> indica un <strong>CDR</strong>.</li>
<li><strong>CONS</strong> inserisce un elemento in testa ad una lista.</li>
<li><strong>APPEND</strong> concatena due liste.</li>
<li><strong>REVERSE</strong> inverte l&#8217;ordine degli elementi di una lista.</li>
</ul>
<p><strong>ESERCIZI E SPUNTI DI RIFLESSIONE</strong></p>
<p>Lascio qui di seguito alcuni &#8220;esercizi&#8221; per mettere alla prova la comprensione di questa lezione.</p>
<ul>
<li>Esprimere in un comando CAR/CDR una funzione che estrae il secondo elemento della seconda lista di questa lista ( (0 2) (4 3 2) (9 9 9) 9 ).</li>
<li>Date le due list LIST1 = (1 2 3) e LIST2 = (4 5 6) riflettere sulla differenza fra (CONS LIST1 LIST2) e (APPEND LIST1 LIST2).</li>
</ul>
<p>La prossima volta vedremo come affrontare decisioni e condizioni. Comincieremo cioè a scrivere le prime funzioni complete e funzionali.</p>
 <p><a href="http://davideaversa.it/slashcode/?flattrss_redirect&amp;id=319&amp;md5=2cff278a5c4c520d5f84100407e8fa7a" title="Flattr" target="_blank"><img src="http://davideaversa.it/slashcode/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://davideaversa.it/slashcode/2009/10/scheme-lezione-2-manipolazione-liste/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=thek3nger&amp;popout=1&amp;url=http%3A%2F%2Fdavideaversa.it%2Fslashcode%2F2009%2F10%2Fscheme-lezione-2-manipolazione-liste%2F&amp;language=it_IT&amp;category=text&amp;title=Scheme+%26%238211%3B+Lezione+2+%26%238211%3B+Manipolazione+Liste&amp;description=Continuiamo+il+nostro+studio+di+Scheme+analizzando+un+altro+elemento+fondamentale+della+programmazione+Lisp%3A+la+manipolazione+delle+liste.+Come+abbiamo+visto+in+precedenza+in+Scheme+tutto+ci%C3%B2+che+non+%C3%A8...&amp;tags=lisp%2Cprogrammazione%2Cscheme%2Cblog" type="text/html" />
	</item>
		<item>
		<title>Scheme &#8211; Lezione 1 &#8211; Introduzione</title>
		<link>http://davideaversa.it/slashcode/2009/10/scheme-lezione-1-introduzione/</link>
		<comments>http://davideaversa.it/slashcode/2009/10/scheme-lezione-1-introduzione/#comments</comments>
		<pubDate>Thu, 08 Oct 2009 17:47:34 +0000</pubDate>
		<dc:creator>THeK3nger</dc:creator>
				<category><![CDATA[Lisp/Scheme]]></category>
		<category><![CDATA[lisp]]></category>
		<category><![CDATA[programmazione]]></category>
		<category><![CDATA[scheme]]></category>

		<guid isPermaLink="false">http://slashcode.wordpress.com/?p=313</guid>
		<description><![CDATA[<div><a href="http://davideaversa.it/slashcode/2009/10/scheme-lezione-1-introduzione/"><img title="Scheme &#8211; Lezione 1 &#8211; Introduzione" src="http://davideaversa.it/slashcode/wp-content/uploads/2009/10/lambda-150x150.png" alt="Scheme &#8211; Lezione 1 &#8211; Introduzione"  width="200" height="200" /></a></div><br/>Scheme è uno dei principali dialetti del Lisp. E&#8217; un linguaggio multi paradigma anche se incentrato sul paradigma funzionale per questioni ereditarie. Nonostante ciò con Scheme si può fare praticamente tutto, dalla programmazione a oggetti alla programmazione imperativa, dalla funzionale ricorsiva alla sua versione &#8220;logica&#8221;. Ci tengo però a precisare che Scheme è e rimane <a href='http://davideaversa.it/slashcode/2009/10/scheme-lezione-1-introduzione/' class='excerpt-more'>[...]</a>]]></description>
			<content:encoded><![CDATA[<div style="height:33px;" class="really_simple_share robots-nocontent snap_nopreview"><div class="really_simple_share_facebook_like" style="width:100px;"><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fdavideaversa.it%2Fslashcode%2F2009%2F10%2Fscheme-lezione-1-introduzione%2F&amp;layout=button_count&amp;show_faces=false&amp;width=100&amp;action=like&amp;colorscheme=light&amp;send=false&amp;height=27" 
						scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:100px; height:27px;" allowTransparency="true"></iframe></div><div class="really_simple_share_google1" style="width:90px;"><div class="g-plusone" data-size="medium" data-href="http://davideaversa.it/slashcode/2009/10/scheme-lezione-1-introduzione/" ></div></div><div class="really_simple_share_twitter" style="width:110px;"><a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
						data-text="Scheme &#8211; Lezione 1 &#8211; Introduzione" data-url="http://davideaversa.it/slashcode/2009/10/scheme-lezione-1-introduzione/" 
						data-via=""  ></a></div></div>
		<div style="clear:both;"></div><p><strong><img class="alignleft size-thumbnail wp-image-387" title="Lambda" src="http://davideaversa.it/slashcode/wp-content/uploads/2009/10/lambda-150x150.png" alt="Lambda" width="150" height="150" />Scheme </strong>è uno dei principali dialetti del <strong>Lisp</strong>. E&#8217; un linguaggio multi paradigma anche se incentrato sul <strong>paradigma funzionale</strong> per questioni ereditarie. Nonostante ciò con Scheme si può fare praticamente tutto, dalla programmazione a oggetti alla programmazione imperativa, dalla funzionale ricorsiva alla sua versione &#8220;logica&#8221;.</p>
<p>Ci tengo però a precisare che <strong>Scheme </strong>è e rimane un linguaggio un po particolare. Diverso concettualmente da tutti i linguaggi tradizionali. Scheme è indirizzato a:</p>
<ul>
<li>Persone che sanno programmare e che vogliono espandere i loro confini in modi che non avrebbero mai immaginato.</li>
<li>Persone che non hanno mai programmato e che volgiono conoscere lo spirito intimo della programmazione.</li>
<li>Persone a cui la programmazione classica non è mai piaciuta ma amano lo spirito &#8220;matematico&#8221; della stessa.</li>
<li>Persone che amano la neuroingegneria in senso lato.</li>
</ul>
<p>A chi <strong>NON </strong>è indirizzato:</p>
<ul>
<li>Persone che sanno programmare e che non sentono il bisogno di imparare altro.</li>
<li>Persone che non hanno mai programmato e vogliono subito essere produttivi e fare qualche applicazione carina.</li>
<li>Persone la cui idea di programmazione è costruire enormi gestionali in grado di mantenere informazioni su pescherie sul mar baltico, parrucchieri per donnole, palestre e altre cose noiose (per me ovviamente).</li>
</ul>
<p>Chiariti questi punti spero di avere da ora in poi solo persone che rientrano nei primi tre punti e che non si spazientiscano se Scheme sembri strano, complicato, astratto e chi più ne ha più ne metta.</p>
<p>Iniziamo con il presentare alcuni aspetti essenziali. Lo studio di Scheme è IMPRESCINDIBILE da questi concetti.</p>
<p><strong>NOTAZIONE PREFISSA</strong></p>
<p>Scheme come in Lisp esprime <strong>tutto</strong> in <strong>notazione prefissa</strong>. In notazione prefissa bisogna prima specificare la funzione e poi tutti i suoi parametri a seguire.</p>
<p>Ad esempio 1+1 diventa:</p>
<pre><code class="codecolorer scheme dawn"><span class="scheme"><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">+</span> <span style="color: #cc66cc;">1</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span></span></code></pre>
<p>Mentre 2 + (3 * 2) + 1 diventa:</p>
<pre><code class="codecolorer scheme dawn"><span class="scheme"><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">+</span> <span style="color: #cc66cc;">2</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">*</span> <span style="color: #cc66cc;">3</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#41;</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span></span></code></pre>
<p>Questo tipo di notazione può risultare a prima vista molto complessa e inutilmente dispendiosa. E&#8217; vero e non è vero. Nelle semplici operazioni matematiche può effettivamente risultare poco intuitiva e poco chiara, tuttavia, in tutti gli altri casi questa forma permette un controllo del codice inqguagliabile. E&#8217; molto facile, ad esempio, istruire un programma a creare ed eseguire codice proprio.</p>
<p><strong>LISTE E ATOMI</strong></p>
<p>Un altra cosa da tenere in considerazione è che in Scheme <strong>tutto è una lista</strong>. Anche lo stesso programma è una lista.</p>
<p>Una lista può contenere una lista o <strong>un atomo.</strong> Un atomo è semplicemente tutto ciò che non è una lista (ad esempio stringhe, numeri, caratteri e nomi di funzioni).</p>
<p>Per generare esplicitamente una lista si può usare il comando <strong>list</strong>.</p>
<pre>
<div class="codecolorer-container scheme dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br /></div></td><td><div class="scheme codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #808080; font-style: italic;">; Lista di numeri.</span><br />
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">list</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><br />
<br />
<span style="color: #808080; font-style: italic;">; Lista di stringhe.</span><br />
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">list</span> <span style="color: #ff0000;">&quot;a&quot;</span> <span style="color: #ff0000;">&quot;b&quot;</span> <span style="color: #ff0000;">&quot;c&quot;</span><span style="color: #66cc66;">&#41;</span><br />
<br />
<span style="color: #808080; font-style: italic;">; Lista di liste.</span><br />
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">list</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">list</span> <span style="color: #cc66cc;">1</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">list</span> <span style="color: #ff0000;">&quot;a&quot;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">list</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></div></td></tr></tbody></table></div>
</pre>
<p>E via discorrendo fino ad avere contortissimi costrutti di liste piene di liste di liste. E&#8217; importante notare che data una lista (a b c d &#8230; z) Scheme interpreta <strong>sempre il primo elemento di una lista come un comando.</strong> Quindi quando vogliamo indicare una lista pura dobbiamo sempre usare come primo elemento il comando <strong>list.</strong></p>
<p><strong>DEFINIZIONI</strong></p>
<p>In <strong>Scheme</strong> tutte le definizioni, siano esse di variabili intere, stringhe, ma anche funzioni e procedure sono definite grazie al comando <strong>define.</strong></p>
<pre>
<div class="codecolorer-container scheme dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br /></div></td><td><div class="scheme codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #808080; font-style: italic;">; Variabile numerica.</span><br />
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">define</span> pippo <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">&#41;</span><br />
<br />
<span style="color: #808080; font-style: italic;">; Stringa.</span><br />
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">define</span> pluto <span style="color: #ff0000;">&quot;Ciao&quot;</span><span style="color: #66cc66;">&#41;</span></div></td></tr></tbody></table></div>
</pre>
<p>E come abbiamo detto anche le funzioni possono essere definite in questo modo.</p>
<pre><code class="codecolorer scheme dawn"><span class="scheme"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">define</span> <span style="color: #66cc66;">&#40;</span>somma a b<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">+</span> a b<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></span></code></pre>
<p>Ecco che abbiamo definito una semplice funzione <strong>somma</strong> che potrà essere richiamata così:</p>
<pre><code class="codecolorer scheme dawn"><span class="scheme"><span style="color: #66cc66;">&#40;</span>somma <span style="color: #cc66cc;">3</span> <span style="color: #cc66cc;">4</span><span style="color: #66cc66;">&#41;</span></span></code></pre>
<p>Una funzione è quindi definita secondo il formato:</p>
<pre><code class="codecolorer scheme dawn"><span class="scheme"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">define</span> <span style="color: #66cc66;">&#40;</span>nomefunzione parametro1 parametro2 .... parametroN<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>corpo della funzione<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></span></code></pre>
<p><strong>RICAPITOLANDO:</strong></p>
<ul>
<li><strong>Scheme</strong> è un dialetto del <strong>LISP</strong>.</li>
<li><strong>Scheme è un linguaggio multiparadigma</strong> incentrato però sul paradima <strong>funzionale</strong>.</li>
<li>In Scheme <strong>ogni cosa racchiusa fra parentesi è un lista.</strong></li>
<li>In Scheme<strong> ogni cosa che non è una lista si chiama Atomo</strong> (numeri, stringhe e altro).</li>
<li>In Scheme si utilizza esclusivamente la <strong>notazione prefissa</strong> anche per le operazioni aritmetiche.</li>
<li>In Scheme <strong>tutto</strong> si definisce con il comando <strong>define</strong>. Sia variabili che costanti che funzioni.</li>
<li>In Scheme il primo elemento di una lista è sempre visto come un comando.</li>
</ul>
 <p><a href="http://davideaversa.it/slashcode/?flattrss_redirect&amp;id=313&amp;md5=25b7d61c0cde00a99da133587ff06a9e" title="Flattr" target="_blank"><img src="http://davideaversa.it/slashcode/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://davideaversa.it/slashcode/2009/10/scheme-lezione-1-introduzione/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=thek3nger&amp;popout=1&amp;url=http%3A%2F%2Fdavideaversa.it%2Fslashcode%2F2009%2F10%2Fscheme-lezione-1-introduzione%2F&amp;language=it_IT&amp;category=text&amp;title=Scheme+%26%238211%3B+Lezione+1+%26%238211%3B+Introduzione&amp;description=Scheme+%C3%A8+uno+dei+principali+dialetti+del+Lisp.+E%26%238217%3B+un+linguaggio+multi+paradigma+anche+se+incentrato+sul+paradigma+funzionale+per+questioni+ereditarie.+Nonostante+ci%C3%B2+con+Scheme+si+pu%C3%B2+fare+praticamente...&amp;tags=lisp%2Cprogrammazione%2Cscheme%2Cblog" type="text/html" />
	</item>
		<item>
		<title>Lisp &#8211; Come iniziare a scrivere in Lisp</title>
		<link>http://davideaversa.it/slashcode/2008/11/lisp-come-iniziare-a-scrivere-in-lisp/</link>
		<comments>http://davideaversa.it/slashcode/2008/11/lisp-come-iniziare-a-scrivere-in-lisp/#comments</comments>
		<pubDate>Wed, 12 Nov 2008 17:39:15 +0000</pubDate>
		<dc:creator>THeK3nger</dc:creator>
				<category><![CDATA[Lisp/Scheme]]></category>
		<category><![CDATA[emacs]]></category>
		<category><![CDATA[gcl]]></category>
		<category><![CDATA[guida]]></category>
		<category><![CDATA[lisp]]></category>

		<guid isPermaLink="false">http://slashcode.wordpress.com/?p=138</guid>
		<description><![CDATA[<div><a href="http://davideaversa.it/slashcode/2008/11/lisp-come-iniziare-a-scrivere-in-lisp/"><img title="Lisp &#8211; Come iniziare a scrivere in Lisp" src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/fa/Parentesi_Tonde.svg/70px-Parentesi_Tonde.svg.png" alt="Lisp &#8211; Come iniziare a scrivere in Lisp"  width="" /></a></div><br/>Nel corso di Modelli e Complessità che sto seguendo è stato introdotto il Lisp (List Processor o meglio Lots of Infuriating &#38; Silly Parenthesis) come esempio di linguaggio funzionale. Come ho accennato in passato la programmazione funzionale è un tipo di paradigma che pone l&#8217;accento sulla definizione di funzioni poichè il flusso del programma assume <a href='http://davideaversa.it/slashcode/2008/11/lisp-come-iniziare-a-scrivere-in-lisp/' class='excerpt-more'>[...]</a>]]></description>
			<content:encoded><![CDATA[<div style="height:33px;" class="really_simple_share robots-nocontent snap_nopreview"><div class="really_simple_share_facebook_like" style="width:100px;"><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fdavideaversa.it%2Fslashcode%2F2008%2F11%2Flisp-come-iniziare-a-scrivere-in-lisp%2F&amp;layout=button_count&amp;show_faces=false&amp;width=100&amp;action=like&amp;colorscheme=light&amp;send=false&amp;height=27" 
						scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:100px; height:27px;" allowTransparency="true"></iframe></div><div class="really_simple_share_google1" style="width:90px;"><div class="g-plusone" data-size="medium" data-href="http://davideaversa.it/slashcode/2008/11/lisp-come-iniziare-a-scrivere-in-lisp/" ></div></div><div class="really_simple_share_twitter" style="width:110px;"><a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
						data-text="Lisp &#8211; Come iniziare a scrivere in Lisp" data-url="http://davideaversa.it/slashcode/2008/11/lisp-come-iniziare-a-scrivere-in-lisp/" 
						data-via=""  ></a></div></div>
		<div style="clear:both;"></div><div class="wp-caption alignleft" style="width: 80px"><img title="Parentesi" src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/fa/Parentesi_Tonde.svg/70px-Parentesi_Tonde.svg.png" alt="Vi verrà lo sturbo." width="70" height="93" /><p class="wp-caption-text">Vi verrà lo sturbo.</p></div>
<p>Nel corso di <strong>Modelli e Complessità</strong> che sto seguendo è stato introdotto il <strong>Lisp</strong> (<em>List Processor</em> o meglio <em>Lots of Infuriating &amp; Silly Parenthesis</em>) come esempio di <strong>linguaggio funzionale</strong>.</p>
<p>Come ho accennato in passato la <strong>programmazione funzionale</strong> è un tipo di paradigma che pone l&#8217;accento sulla definizione di funzioni poichè <strong>il flusso del programma assume la forma di valutazione di funzioni matematiche</strong> e in particolare delle <strong>funzioni ricorsive.</strong></p>
<p>Senza addentrarci troppo in tecnicismi di informatica teorica passiamo subito ad affrontare la &#8220;pratica&#8221; con il linguaggio Lisp.</p>
<p><span id="more-138"></span></p>
<p>E&#8217; importante precisare però che il Lisp, sebbene funzionale, può benissimo essere usato come linguaggio imperativo. Tuttavia non affronteremo questo argomento in questo momento.</p>
<p>In questo <em>tutorial </em>useremo come shell di interprete <strong>GCL </strong>(<em>GNU Common Lisp</em>) e come editor <strong>Emacs </strong>(utilizzeremo Emacs non solo perchè è esso stesso scritto in Lisp <img src='http://davideaversa.it/slashcode/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  ma perchè ci fornisce facilmente la colorazione della sintassi e altre cosine utili che altri editorn non forniscono).</p>
<p><strong>Installare CGL.</strong></p>
<p>Per prima cosa dobbiamo installare l&#8217;interprete. Di interpreti per il Lisp ed i relativi dialetti esistono una montagna di shell (ad esempio <strong>clisp</strong>, <strong>cmucl</strong>, e altri) ma noi useremo GCL perchè l&#8217;ho trovata la meno &#8220;incasinata&#8221; per molti comandi essenziali ed è conforme agli altri applicativi GNU.</p>
<p>Per installarla è veramente molto semplice. Basta digitare il classico</p>
<p><em>apt-get install gcl</em></p>
<p>e eventualmente</p>
<p><em>apt-get install gcl-doc</em></p>
<p>con privilegi di root (con <em>sudo </em>o <em>su</em>) per avere la nostra shell (e la sua documentazione) completamente funzionante avviabile con un semplice:</p>
<p><em>gcl</em></p>
<p><strong>Installare EMACS.</strong></p>
<p>Anche installare EMACS è qualcosa di semplicissimo, basta digitare:</p>
<p><em>apt-get install emacs emacs22-gtk</em></p>
<p><em>PS: </em>Esistono centinaia di pacchetti ed estenzioni di emacs per fargli fare qualunque cosa, dal giocare a scacchi, ad usarlo come client per MSN e Jabber, ma ovviamente credo sia roba superflua per ora!</p>
<p><strong>Scrivere il nostro primo file Lisp.</strong></p>
<p>Potremmo utilizzare il Lisp anche direttamente dalla shell gcl ma, come forse noterete, è molto più comodo scrivere su un file tutto il codice e passarlo direttamente alla shell. In questo modo potremmo salvare il nostro programma, creare moduli da riutilizzare in seguito o semplicemente evitare di riscrivere ogni volta da capo funzioni complesse.</p>
<p>Per fare questo apriamo Emacs.</p>
<p>Ora io utilizzerò le scorciatoie da tastiera, sebbene gli stessi comandi si possono fare per via grafica, perché le trovo estremamente più veloci.</p>
<p>Aprite un file (esistente o non) premendo:</p>
<p><em>CTRL + x<br />
CTRL + f</em></p>
<p>E digitando il nome del file e il relativo percorso (si può navigare facilmente con TAB).</p>
<p>Creiamo ad esempio il file <em>primo_lisp.lisp</em>.</p>
<p>Ora possiamo scrivere il programma che ci pare. Una volta finito salviamo premendo:</p>
<p><em>CTRL + x<br />
CTRL + s</em></p>
<p>Adesso che il nostro file è salvato abbiamo due modi per eseguirlo:</p>
<ol>
<li>Digitando da terminale <strong>gcl -f primo_lisp.lisp</strong></li>
<li>O ancora meglio aprendo gcl da terminale e importando il file direttamente dalla shell con il comando <strong>(load &#8220;primo_lisp.lisp&#8221;)</strong></li>
</ol>
<p>Grazie a questo secondo metodo potremo fare prove sulle funzioni definite in &#8220;primo_lisp.lisp&#8221;. Ad esempio possiamo usare due ottime funzioni di debugging:</p>
<ul>
<li>il comando <strong>(describe A)</strong> che stampa a schermo la descrizione dell&#8217;oggetto A (ovvero se è una funzione, un numero, una lista, ecc&#8230;</li>
<li>il comando <strong>(step A)</strong> che esegue le funzioni specificate in A <strong>passo per passo!!</strong> Veramente ottimo per il debug.</li>
</ul>
<p>Non vi resta che provare a scrivere alcune funzioni e provare questi comandi per prendere confidenza!</p>
 <p><a href="http://davideaversa.it/slashcode/?flattrss_redirect&amp;id=138&amp;md5=eacc442747e0ac858db0b7211cbcd918" title="Flattr" target="_blank"><img src="http://davideaversa.it/slashcode/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://davideaversa.it/slashcode/2008/11/lisp-come-iniziare-a-scrivere-in-lisp/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=thek3nger&amp;popout=1&amp;url=http%3A%2F%2Fdavideaversa.it%2Fslashcode%2F2008%2F11%2Flisp-come-iniziare-a-scrivere-in-lisp%2F&amp;language=it_IT&amp;category=text&amp;title=Lisp+%26%238211%3B+Come+iniziare+a+scrivere+in+Lisp&amp;description=Nel+corso+di+Modelli+e+Complessit%C3%A0+che+sto+seguendo+%C3%A8+stato+introdotto+il+Lisp+%28List+Processor+o+meglio+Lots+of+Infuriating+%26amp%3B+Silly+Parenthesis%29+come+esempio+di+linguaggio+funzionale.+Come...&amp;tags=emacs%2Cgcl%2Cguida%2Clisp%2Cblog" type="text/html" />
	</item>
	</channel>
</rss>

