<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="wordpress/1.5.1-alpha" -->
<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/"
>

<channel>
	<title>PDI^2</title>
	<link>http://riffraff.blogsome.com</link>
	<description>Propulsione d'Improbabilità Infinita</description>
	<pubDate>Mon, 23 Aug 2010 09:38:17 +0000</pubDate>
	<generator>http://wordpress.org/?v=1.5.1-alpha</generator>
	<language>en</language>

		<item>
		<title>Uno spell Corrector in perl6, parte 2</title>
		<link>http://riffraff.blogsome.com/2007/05/15/uno-spell-corrector-in-perl6-parte-2/</link>
		<comments>http://riffraff.blogsome.com/2007/05/15/uno-spell-corrector-in-perl6-parte-2/#comments</comments>
		<pubDate>Tue, 15 May 2007 09:08:38 +0000</pubDate>
		<dc:creator>gabriele</dc:creator>
		
	<category>perl6</category>
		<guid>http://riffraff.blogsome.com/2007/05/15/uno-spell-corrector-in-perl6-parte-2/</guid>
		<description><![CDATA[	Abbiamo già visto come scrivere delle funzioni per creare le mutazioni di una stringa usando ler regex di perl6, ma abbiamo anche detto che questo non funzionerà nel pugs attuale.
	Quindi vediamo un&#8217;implementazione alternativa degli stessi metodi, basata su Str.substr. L&#8217;unica cosa da tenere a mente è che questo metodo fa side effect modificando la stringa [...]]]></description>
			<content:encoded><![CDATA[	<p><a href="http://riffraff.blogsome.com/2007/05/12/spell-corrector-in-perl6-parte-1/">Abbiamo già visto </a>come scrivere delle funzioni per creare le mutazioni di una stringa usando ler regex di perl6, ma abbiamo anche detto che questo non funzionerà nel pugs attuale.</p>
	<p>Quindi vediamo un&#8217;implementazione alternativa degli stessi metodi, basata su <tt>Str.substr</tt>. L&#8217;unica cosa da tenere a mente è che questo metodo fa side effect modificando la stringa corrente, e restituendo la sottostringa eliminata. </p>
	<p>IMO sarebbe stato meglio se il metodo restituisse una coppia di valori <tt>($modificata,$eliminata)</tt> ma non si è voluta rompere la compatibilità con perl5.</p>
	<p>Ad ogni modo, l&#8217;assegnazione tra stringhe effettua una copia, quindi per evitare di fare side effect useremo semplicemente una copia della stringa. Il codice dovrebbe essere autoesplicativo:</p>
	<pre>
# 'abc' -> 'ac'
sub deletion($word) {
  (^$word.chars).map: {substr(my $tmp = $word,$_,1)=''; $tmp};
}
	
# 'abc' -> 'adc'
sub substitution($word) {
  gather {
    for (0..$word.chars-1) X @ALPHA {
      substr(my $tmp = $word,$_[0],1)=$_[1];
      take $tmp;
    }
  }
}
	
# 'abc' -> 'abbc'
sub insertion($word) {
  gather {
    for (0..$word.chars) X @ALPHA {
      substr(my $tmp = $word,$_[0],0)=$_[1];
      take $tmp;
     }
  }
}
	
# 'abc' -> 'acb'
sub transposition($w) {
  gather for ^$w.chars {
    my $tmp=$w;
    my $removed =(substr($tmp,$_,1)='');
    substr($tmp,$_+1,0)=$removed;
    take $tmp;
  }
}
</pre>
	<p>Ricordate che il valore restituito da una funzione è l&#8217;ultimo calcolato, come in ruby e lisp vari, quindi implicitamente noi restituiamo il valore di <tt>gather</tt></p>
	<p>&Egrave; ora possibile definire una funzione <tt>edits1</tt> che restituisca tutte le possibili variazioni di una singola lettera per una parola, in questo modo::</p>
	<pre>
sub edits1($w) {
  transposition($w),insertion($w),substitution($w),deletion($w)
}
</pre>
	<p>il <em>comma operator</em> cioè la virgola,  concatenate gli array e quindi la funzione restituisce semplicemente un grosso array con tutte le variazioni.</p>
	<p>Paragonando questo codice a quello di norvig noterete che lui usa i Set in <tt>edits1</tt> mentre noi usiamo semplici liste, ma va bene perché non ci sono duplicati tra le variazioni. Federico<a href="http://www.pixzone.com/blog/223/spell-corrector-aka-google-suggest-in-erlang-first-part/vvv"> credo faccia la stessa cosa</a> in erlang <img src='http://riffraff.blogsome.com/wp-images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  </p>
	<p>Ora serve una funzione <tt>known(@array)</tt> che selezioni gli elementi della lista che sono parole valide. Ricordate che abbiamo una variabile  <tt>%WORDS{word}=>number</tt> che abbiamo inizializzato con le parole del vocabolario e la loro frequenza.</p>
	<p>La funzione <tt>known</tt> usando questo dizionario diviene molto semplice:</p>
	<p><tt><br />
sub known(@words) {<br />
  @words.grep:  { %NWORDS{$_}<br />
}<br />
</tt></p>
	<p>E <tt>correct($word)</tt> diventa:</p>
	<pre>
sub correct($word) {
  my @values =  known([$word]) or             # the word is known
                              known(edits1($word)) or # a single letter variation is known
                              [$word];                                # we don't have suggestions
	
  # single argument max() doesn't work yet
  @values.max: {%NWORDS{$^a} < => %NWORDS{$^b}}
}
</pre>
	<p>L&#8217;ultima linea potrebbe essere più carina ma il codice è comunque abbastanza semplice e pulito.</p>
	<p>Per gli ultimi pezzetti aspettate un po&#8217; o implementateli da soli <img src='http://riffraff.blogsome.com/wp-images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />
</p>
]]></content:encoded>
			<wfw:commentRss>http://riffraff.blogsome.com/2007/05/15/uno-spell-corrector-in-perl6-parte-2/feed/</wfw:commentRss>
	</item>
		<item>
		<title>spell corrector in perl6, parte 1</title>
		<link>http://riffraff.blogsome.com/2007/05/12/spell-corrector-in-perl6-parte-1/</link>
		<comments>http://riffraff.blogsome.com/2007/05/12/spell-corrector-in-perl6-parte-1/#comments</comments>
		<pubDate>Sat, 12 May 2007 14:45:55 +0000</pubDate>
		<dc:creator>gabriele</dc:creator>
		
	<category>perl6</category>
		<guid>http://riffraff.blogsome.com/2007/05/12/spell-corrector-in-perl6-parte-1/</guid>
		<description><![CDATA[	(english version here)
	Se leggete GoTo 10 (o reddit o mezza blogosfera) avrete visto lo spell corrector in 20 righe di python di peter norvig.
Siccome sembra che il mio LoTY, almeno per ora, sia perl6, ho provato a riscriverlo. 
	L&#8217;idea è semplice: sio costruisce un database di parole esistenti e della loro frequenza, poi correct(&#8221;word&#8221;) verifica [...]]]></description>
			<content:encoded><![CDATA[	<p>(english version <a href="http://www.riffraff.info/2007/5/10/a-spell-corrector-in-perl6-part-1">here)</a></p>
	<p>Se leggete GoTo 10 (o reddit o mezza blogosfera) avrete visto lo <a href="http://www.norvig.com/spell-correct.html">spell corrector in 20 righe di python di peter norvig</a>.<br />
Siccome sembra che il mio <acronym title="Language of The Year">LoTY</acronym>, almeno per ora, sia perl6, ho provato a riscriverlo. </p>
	<p>L&#8217;idea è semplice: sio costruisce un database di parole esistenti e della loro frequenza, poi <tt>correct(&#8221;word&#8221;)</tt> verifica se &#8220;word&#8221; è nel database, o se c&#8217;è una variazione della parola, o una variazione della variazione. </p>
	<p>Se c&#8217;è più di una variazione si restituisce quella più comune (&#8221;cinera&#8221; -> &#8220;cinema&#8221; piuttosto che &#8220;cinerea&#8221;).</p>
	<p>Se non si trova niente, viene restituita la parola (volevi veramente dire &#8220;1337&#8243;).</p>
	<p>La variazioni possibili sono 4, </p>
	<ul>
	<li> inserimento: &#8216;cio&#8217; -> &#8216;ciao&#8217;</li>
	<li> sostituzione: &#8216;fipo&#8217; -> &#8216;filo&#8217;</li>
	<li> eliminazione: &#8217;sessso&#8217; -> &#8217;sesso&#8217;</li>
	<li> scambio: &#8216;maer&#8217; -> &#8216;mare&#8217;</li>
	</ul>
	<p>Il codice python usa list comprehension per iterare e manipola le stringhe come array per creare le variazioni. Ogni variazione viene immagazzinata all&#8217;interno di un oggetto <tt>Set</tt>, che è un oggetto iterabile che non ammette duplicati.</p>
	<p>In perl6 non c&#8217;è una classe <tt>Set</tt> builtin (ma c&#8217;e n&#8217;è una come estensione in pugs), quindi invece di usare gli insiemi ho usato le <tt>Junction</tt>.<br />
Una Junction è una <em>superposizione</em> di vari oggetti: <tt>any(1,2,3)</tt> crea un oggetto che multiplexa le operazioni su tutti gli oggetti contenuti, e che quindi ad esempio in un&#8217;operazione di confronto &#8220;<tt>if any(1,2,3) >2</tt>&#8221; farebbe   eseguire il blocco if, perché uno degli elementi rispetta la condizione (alternativamente potremmo usare junction <tt>all</tt>, <tt>none</tt> o <tt>one</tt>).</p>
	<p>Invece di trafficare con le stringhe come fa norvig in perl6 possiamo implementare le operazioni più facilmente con <tt>Str.subst(regexp,replacement)</tt>, ed usare la forma <tt>gather/for</tt> per l&#8217;iterazione e l&#8217;estrazione dei risultati.</p>
	<p>L&#8217;implementazione delle 4 operazioni sarà dunque:</p>
	<pre>
# 'abc' -> 'ac'
sub deletion($w) {
    gather take $w.subst(/<at ($_)>./,'&#8217;) for ^$w.chars
}
</at></pre>
	<p><tt>gather</tt> crea uno scope dove agirà <tt>take</tt>. Una chiamata a quet&#8217;ultima inserità l&#8217;argomento in un array implicito che verrà poi restituito da<br />
<tt>gather</tt>.<br />
il for statement modifer itera su di un oggetto iterabile, in questo caso si tratta di un range 0..numero_caratteri che viene creato tramite l&#8217;operatore <tt>^</tt> detto <em>upto operator</em>.</p>
	<p>L&#8217;espressione regolare è semplice: <tt>at(N)</tt> è una zero-width assertion che ha successo all&#8217; N-esimo elemento, che poi catturiamo con &#8220;.&#8221; e rimpiazziamo con una stringa vuota, cancellandolo.</p>
	<p>Le sostituzioni sono altrettanto semplici:</p>
	<pre>
# 'abc' -> 'adc'
sub substitution($w) {
    gather take $w.subst(/<at ($_[0])>./,$_[1]) for ^$w.chars X @ALPHA
}
</at></pre>
	<p>l&#8217;unica differenza rilveante è che usiamo il <em>cross operator</em> &#8220;<tt>X</tt>&#8220;. Il cross operator genera un prodotto cartesiano di due oggetti iterabili, quindi <tt>&#8216;a&#8217;..b&#8217; X 1..2</tt> genera ((&#8217;a',1),(&#8217;a',2),(&#8217;b',1),(&#8217;b',2)).<br />
Il codice all&#8217;interno del for è: rimpiazza il carattere N-esimo con tutti quelli nell&#8217;alfabeto (<tt>@ALPHA=&#8217;a&#8217;..&#8217;z&#8217;</tt>).</p>
	<p>L&#8217;inserimento fa la stessa cosa senza eliminare un carattere, ed effettua un&#8217;iterazione in più per aggiungere un carattere anche a fine stringa:</p>
	<p># &#8216;abc&#8217; -> &#8216;abbc&#8217;<br />
sub insertion($w) {<br />
    gather take $w.subst(/<at ($_[0])>/,$_[1]) for ^($w.chars+1) X @ALPHA<br />
}</p>
	<p>Infine, lo scambio usa una <tt>subst</tt> leggermente differente, dove il rimpiazzo è un blocco, che accederà agli elementi catturati:</p>
	<pre>
# 'abc' -> 'acb'
sub transposition($w) {
    gather take $w.subst(/<at ($_)>(.)(.)/,{&#8221;$1$0&#8243;})  for ^$w.chars
}
</at></pre>
	<p>Semplicemente prende i caratteri N e N+1, e li scambia.</p>
	<p>Un&#8217;implementazione semplice e pulita, imo. Peccato che in realtà non funzioni, perché pugs non permette l&#8217;interpolazione di variabili in una regexp, per ora.</p>
	<p>Per l&#8217;implementazione funzionante aspettate la seconda parte o pensateci da voi <img src='http://riffraff.blogsome.com/wp-images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </at>
</p>
]]></content:encoded>
			<wfw:commentRss>http://riffraff.blogsome.com/2007/05/12/spell-corrector-in-perl6-parte-1/feed/</wfw:commentRss>
	</item>
		<item>
		<title>motivi per cui pugs è -Ofun</title>
		<link>http://riffraff.blogsome.com/2007/05/04/motivi-per-cui-pugs-e-ofun/</link>
		<comments>http://riffraff.blogsome.com/2007/05/04/motivi-per-cui-pugs-e-ofun/#comments</comments>
		<pubDate>Fri, 04 May 2007 10:14:41 +0000</pubDate>
		<dc:creator>gabriele</dc:creator>
		
	<category>perl6</category>
	<category>pugs</category>
		<guid>http://riffraff.blogsome.com/2007/05/04/motivi-per-cui-pugs-e-ofun/</guid>
		<description><![CDATA[	Perché tu vai su #perl6 e dici &#8220;ma subst non è implementata? Va bene se ne metto una versione scema in Prelude.pm?&#8221; e larry wall ti risponde &#8220;si va bene&#8221; (log). 
	Dopo di che passi ad implementarla, usando una quantità di tempo incredibilmente superiore alle aspettative, navigando in haskell, pseudo haskell, meta haskell, perl5 e [...]]]></description>
			<content:encoded><![CDATA[	<p>Perché tu vai su <a href="irc://irc.freenode.net/perl6">#perl6</a> e dici &#8220;<em>ma subst non è implementata? Va bene se ne metto una versione scema in Prelude.pm?</em>&#8221; e larry wall ti risponde &#8220;<em>si va bene</em>&#8221; (<a href="http://moritz.faui2k3.org/irclog/out.pl?channel=perl6;date=2007-05-02#id_l472">log</a>). </p>
	<p>Dopo di che passi ad implementarla, usando una quantità di tempo incredibilmente superiore alle aspettative, navigando in haskell, pseudo haskell, meta haskell, perl5 e perl6, sotto la guida di gaal, moritz &#038; fglock. Ed avendo cura di infilarci una discussione su italiano, ebraico e ungherese, tanto per soddisfare il linguista che è in te. </p>
	<p>E finisci per definire un pezzettino delle specifiche di perl6, in modo che assomigli di più a ruby (<a href="http://moritz.faui2k3.org/irclog/out.pl?channel=perl6;date=2007-05-03#id_l343">log</a>) <img src='http://riffraff.blogsome.com/wp-images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
	<p><strong>UPDATE:</strong></p>
	<p>ripensandoci, forse è simpatico se vi faccio vedere il codice di subst <img src='http://riffraff.blogsome.com/wp-images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
	<pre>
<font color=\"#a52a2a\"> 1 </font>    method subst(<font color=\"#008b8b\">$rule</font>, <font color=\"#008b8b\">$replacement</font>) is primitive is safe {
	
<font color=\"#a52a2a\"> 2 </font>        <font color=\"#a52a2a\"><b>my</b></font> (<font color=\"#008b8b\">$rgx</font>,<font color=\"#008b8b\">$adv</font>,<font color=\"#008b8b\">$dup</font> = self);
<font color=\"#a52a2a\"> 3 </font>
<font color=\"#a52a2a\"> 4 </font>        <font color=\"#a52a2a\"><b>if</b></font> <font color=\"#008b8b\">$rule</font>.isa(Str) {
	
<font color=\"#a52a2a\"> 5 </font>          <font color=\"#008b8b\">$rgx</font> =  <font color=\"#ff00ff\">&quot;</font><font color=\"#ff00ff\">&lt;&#8217;</font><font color=\"#008b8b\">$rule</font><font color=\"#ff00ff\">&#8216;&gt;</font><font color=\"#ff00ff\">&quot;</font>;
<font color=\"#a52a2a\"> 6 </font>        }
<font color=\"#a52a2a\"> 7 </font>        <font color=\"#a52a2a\"><b>else</b></font> {
	
<font color=\"#a52a2a\"> 8 </font>          <font color=\"#008b8b\">$rgx</font> = Pugs::Internals::rule_pattern(<font color=\"#008b8b\">$rule</font>);
<font color=\"#a52a2a\"> 9 </font>          <font color=\"#008b8b\">$adv</font> = Pugs::Internals::rule_adverbs(<font color=\"#008b8b\">$rule</font>);
<font color=\"#a52a2a\">10 </font>        }
	
<font color=\"#a52a2a\">11 </font>
<font color=\"#a52a2a\">12 </font>        <font color=\"#a52a2a\"><b>my</b></font> <font color=\"#008b8b\">$advstr</font> = <font color=\"#008b8b\">$adv</font>.<font color=\"#a52a2a\"><b>map</b></font>: { <font color=\"#ff00ff\">&quot;</font><font color=\"#ff00ff\">:</font><font color=\"#008b8b\">$_[</font><font color=\"#ff00ff\">0</font><font color=\"#008b8b\">]</font><font color=\"#ff00ff\">&quot;</font>~<font color=\"#ff00ff\">&quot;</font><font color=\"#ff00ff\">(</font><font color=\"#008b8b\">$_[</font><font color=\"#ff00ff\">1</font><font color=\"#008b8b\">]</font><font color=\"#ff00ff\">)</font><font color=\"#ff00ff\">&quot;</font>}.<font color=\"#a52a2a\"><b>join</b></font> <font color=\"#a52a2a\"><b>if</b></font> <font color=\"#008b8b\">$adv</font>;
	
<font color=\"#a52a2a\">13 </font>        <font color=\"#a52a2a\"><b>my</b></font> <font color=\"#008b8b\">$apply</font> = <font color=\"#ff00ff\">&#8216;</font><font color=\"#ff00ff\">()</font><font color=\"#ff00ff\">&#8216;</font> <font color=\"#a52a2a\"><b>if</b></font> <font color=\"#008b8b\">$replacement</font> ~~ Code;
<font color=\"#a52a2a\">14 </font>        <font color=\"#a52a2a\"><b>my</b></font> <font color=\"#008b8b\">$op</font>=<font color=\"#ff00ff\">&quot;</font><font color=\"#ff00ff\">s</font><font color=\"#008b8b\">$advstr</font><font color=\"#ff00ff\">/</font><font color=\"#008b8b\">$rgx</font><font color=\"#ff00ff\">/</font><font color=\"#6a5acd\">\$</font><font color=\"#ff00ff\">replacement</font><font color=\"#008b8b\">$apply</font><font color=\"#ff00ff\">/</font><font color=\"#ff00ff\">&quot;</font>;
	
<font color=\"#a52a2a\">15 </font>
<font color=\"#a52a2a\">16 </font>        <font color=\"#a52a2a\"><b>eval</b></font>(<font color=\"#ff00ff\">&#8216;</font><font color=\"#ff00ff\">$dup ~~ </font><font color=\"#ff00ff\">&#8216;</font>~<font color=\"#008b8b\">$op</font>);
<font color=\"#a52a2a\">17 </font>        <font color=\"#008b8b\">$dup</font>
<font color=\"#a52a2a\">18 </font>    }
	</pre>
	<p>le dichiarazioni &#8220;<tt>is primitive is safe</tt>&#8221; sono per pugs, e sono una delle cose che mi poiace in perl6. Concettualmente si possono attaccare un sacco di metadati a una funzione, in questo caso ci limitiamo a dire che è una funzione di basso livello e che può essere usata all&#8217;interno di <tt>eval()</tt>, quindi ad esempio attraverso <a href="http://run.pugscode.org">run.pugscode.org</a> o lambdabot. </p>
	<p>I puristi della OO e dei linguaggi dinamici dovrebbero arrabbiarsi per quei blocchi condizionali che fanno un check sul tipo, ma purtroppo è l&#8217;unica soluzione a cui sono arrivato. </p>
	<p>Ora: in perl6 è possibile usare una espressione regolare all&#8217;interno di un&#8217;altra in questo modo: <tt>/< $regex>/</tt> ma questo non è implementato in pugs, motivo per cui devo ricostruire la cosa a colpi di string interpolation &#038; eval. </p>
	<p>Altra cosa curiosa è che in pugs non si può risalire facilmente ad una rappresentazione di una regex per cui valga <tt>eval($regex.qualcosa())==$regex</tt>. In ruby ad esempio, <tt>Regexp#to_s</tt> restituisce una rappresentazione eval&#8217;abile, perché le Regexp sono essenzialmente solo delle stringhe. </p>
	<p>In Perl6 invece una Rule (non le chiamiamo più regex perché sono molto di più) è più simile ad un programma che a una stringa, con tanto di regole di scope, argomenti, ereditarietà etc.</p>
	<p>IMHO questo non significa che non si possa avere una rappresentazione in forma di stringa, ma per ora dalla regia dicono di no. </p>
	<p>Questo per quanto riguarda il secondo ramo dell&#8217;<tt>if</tt>. </p>
	<p>Il primo ramo sfrutta invece un&#8217;altra nuova caratteristica di Perl6, ovvero una sintassi speciale per effettuare il match di una stringa letterale, per cui<br />
<tt> &#8220;hello&#8221; </tt> matcha <tt>/he..o/</tt>, matcha <tt>/< 'hello'>/</tt> ma non matcha <tt>/< 'he..o'>/. </p>
	<p>Ovviamente anche questo lo impacchettiamo nell&#8217;eval. </p>
	<p>Infine facciamo la porcata di aggiungere un </tt><tt>&#8220;()&#8221;</tt> per forzare l&#8217;applicazione di <tt>$replacement</tt> in caso questo sia un blocco di codice invece che una string. </p>
	<p>Confusionario, lo so, ma pensate che quando l&#8217;interpolazione di una rule in un&#8217;altra sarà possibile tutto si ridurrà a una riga <img src='http://riffraff.blogsome.com/wp-images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
	<p>Per concludere, <a href="http://svn.pugscode.org/pugs/t/builtins/strings/subst.t">il testcase</a></p>
]]></content:encoded>
			<wfw:commentRss>http://riffraff.blogsome.com/2007/05/04/motivi-per-cui-pugs-e-ofun/feed/</wfw:commentRss>
	</item>
		<item>
		<title>Perle Perl6 n° 2</title>
		<link>http://riffraff.blogsome.com/2007/03/19/p344/</link>
		<comments>http://riffraff.blogsome.com/2007/03/19/p344/#comments</comments>
		<pubDate>Mon, 19 Mar 2007 12:17:51 +0000</pubDate>
		<dc:creator>gabriele</dc:creator>
		
	<category>perl6</category>
	<category>pugs</category>
	<category>lettura</category>
		<guid>http://riffraff.blogsome.com/2007/03/19/p344/</guid>
		<description><![CDATA[	Forse cose come questa sono un errore di percorso:
	
# warning: codice inutile e volutamente oscurato, benché valido
=&lt;&gt;!====&lt;&gt;====&lt;&gt;

	ciò perché in perl6 si può usare =&lt;&gt; per leggere una riga, in modo analogo a &lt;&gt; in perl5, credo. 
	Ed esiste un simpatico operatore === che rappresenta l&#8217;uguaglianza con semantica eterna, che è un modo perverso per dire [...]]]></description>
			<content:encoded><![CDATA[	<p>Forse cose come questa sono un errore di percorso:</p>
	<pre>
# warning: codice inutile e volutamente oscurato, benché valido
=&lt;&gt;!====&lt;&gt;====&lt;&gt;
</pre>
	<p>ciò perché in perl6 si può usare <tt>=&lt;&gt;</tt> per leggere una riga, in modo analogo a <tt>&lt;&gt;</tt> in perl5, credo. </p>
	<p>Ed esiste un simpatico operatore <tt>===</tt> che rappresenta l&#8217;uguaglianza con <em>semantica eterna</em>, che è un modo perverso per dire che confronta l&#8217;identità degli oggetti invece che la loro rappresentazione (i.e. <tt>&#8220;ciao&#8221;</tt> e <tt>&#8220;ciao&#8221;</tt> possono essere oggetti diversi ma <tt>$s</tt> e <tt>$s</tt> sono lo stesso). </p>
	<p>Infine, è possibile concatenare gli operatori di comparazione, in modo da avere, come in python: <tt>a &lt; b &gt; c</tt>.</p>
	<p>Nell&#8217;angolo di <em>pugs culture</em> voglio invece perlarvi del file <a href="http://svn.openfoundry.org/pugs/READTHEM">READTHEM</a> che si trova nel trunk svn, in pratica un file di consigli per la lettura, sia informatici, come <em>Advanced Topics in Types and Programming Languages</em>  che non.</p>
	<p>Esempio: Il Silmarillion, che ha delle strane connessioni con pugs, come dimostrano <a href="http://svn.openfoundry.org/pugs/src/Pugs/Val.hs">header </a>in giro per i sorgenti, o strane parafrasi di <a href="http://feather.perl6.nl/~audreyt/osdc/mariner.xul">Eärendil  il marinaio</a>
</p>
]]></content:encoded>
			<wfw:commentRss>http://riffraff.blogsome.com/2007/03/19/p344/feed/</wfw:commentRss>
	</item>
		<item>
		<title>Perle Perl6 n° 1</title>
		<link>http://riffraff.blogsome.com/2007/03/13/p339/</link>
		<comments>http://riffraff.blogsome.com/2007/03/13/p339/#comments</comments>
		<pubDate>Tue, 13 Mar 2007 09:51:32 +0000</pubDate>
		<dc:creator>gabriele</dc:creator>
		
	<category>perl6</category>
		<guid>http://riffraff.blogsome.com/2007/03/13/p339/</guid>
		<description><![CDATA[	Tanto per dire, quando nei messaggi di commit trovi cose come questa capisci che perl6/pugs sono decisamente aldilà della tua comprensione. Notare l&#8217;uso sbarazzino della punteggiatura:
	* SigMonoid: audreyt++ points out that
  &#58;($x)  :+:  &#58;($x, $y?)  = &#58;($x, $y?),    and not &#58;($x)
]]></description>
			<content:encoded><![CDATA[	<p>Tanto per dire, quando nei messaggi di commit trovi cose come questa capisci che perl6/pugs sono decisamente aldilà della tua comprensione. Notare l&#8217;uso sbarazzino della punteggiatura:</p>
	<blockquote><p>* SigMonoid: audreyt++ points out that<br />
  &#58;($x)  :+:  &#58;($x, $y?)  = &#58;($x, $y?),    and not &#58;($x)</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://riffraff.blogsome.com/2007/03/13/p339/feed/</wfw:commentRss>
	</item>
		<item>
		<title>Groovy 1.0, D 1.0, Perl 6,  Java 7 e Ruby 1.8</title>
		<link>http://riffraff.blogsome.com/2007/01/04/groovy-10-d-10-perl-6-java-7-e-ruby-18/</link>
		<comments>http://riffraff.blogsome.com/2007/01/04/groovy-10-d-10-perl-6-java-7-e-ruby-18/#comments</comments>
		<pubDate>Thu, 04 Jan 2007 08:56:32 +0000</pubDate>
		<dc:creator>gabriele</dc:creator>
		
	<category>java</category>
	<category>perl6</category>
	<category>pugs</category>
		<guid>http://riffraff.blogsome.com/2007/01/04/groovy-10-d-10-perl-6-java-7-e-ruby-18/</guid>
		<description><![CDATA[	Pare che questa sia stata una settimana intensa sul fronte dei linguaggi di programmazione, ed è una cosa buona. 
	In particolare è una cosa buona per me, visto che oggi ho tempo di scrivere questo post mentre domani me ne torno nella terra degli unni, il che significherà un probabile /away di un mese dal [...]]]></description>
			<content:encoded><![CDATA[	<p>Pare che questa sia stata una settimana intensa sul fronte dei linguaggi di programmazione, ed è una cosa buona. </p>
	<p>In particolare è una cosa buona per me, visto che oggi ho tempo di scrivere questo post mentre domani me ne torno nella terra degli unni, il che significherà un probabile <tt>/away</tt> di un mese dal mondo tecnologico. Siccome voglio chiudere in bellezza vi lascio qualcosa di corposo da leggere.</p>
	<p><strong>Pugs &#038; teoria dei numeri</strong><br />
Ma dicevo, settimana intensa sul fronte programmatorio. Anzitutto l&#8217;Autore è diventato committer di <a href="http://svn.pugscode.org/">pugs</a>, dimostrando che effettivamente il commit bit viene dato via con estrema facilità.<br />
In particolare il suo ultimo contributo è stato il problema numero 32, implementare l&#8217;algoritmo di euclide per il minimo comune multiplo:<br />
<code></p>
	<pre>
# Perl6 impone l'ottimizzazione delle tail call, per cui
# non abbiamo bisogno di scrivere la routine in forma iterativa.
# Ale' !
	
multi sub gcd(Int $a, Int $b){
    return $a if $b == 0;
    return gcd($b,$a % $b);
}
	
is gcd(36,63), 9, \"We should be able to find the gcd of 36 and 63\";
is gcd(63,36), 9, \".. and viceversa\";
is gcd(0,5)  , 5, '.. and that gcd(0,$x) is $x';
is gcd(0,0)  , 0, '.. even when $x is 0';
</pre>
	<p></code><br />
Notate la finezza per cui gcd è definito come un multimetodo, perché in teoria è possibile definire la funzione in qualsiasi <a href="http://it.wikipedia.org/wiki/Anello_commutativo">anello commutativo</a>, non solo per gli interi. </p>
	<p>Ovviamente io so che esiste una cosa chiamata <em>anello commutativo</em>, ma non mi ricordo cosa sia veramente e questa nota è un semplice plagio da wikipedia. </p>
	<p>Il che tra l&#8217;altro mi da l&#8217;occasione di far notare che <em>la definizione di numero primo su en.wikipedia è sbagliata</em>.<br />
Uno (1) non è un numero primo, per definizione un numero primo è un numero positivo divisibile solo per se stesso e per 1 ma diverso da uno (o -1).<br />
Questo perché, se usiamo questa definizione poi ci viene fuori il fantastico teorema fondamentale dell&#8217;aritmetica che è:</p>
	<blockquote><p>
Ogni numero naturale diverso da 1 o è un numero primo o si può esprimere come prodotto di numeri primi. Tale rappresentazione è unica a meno dell&#8217;ordine in cui compaiono i fattori.
</p></blockquote>
	<p>Il motivo di questo delirio era ovviamente <a href="http://en.wikipedia.org/wiki/Prime_number">la soluzione del problema 31</a>.</p>
	<p>Tornando a Perl6, forse l&#8217;Autore potrà raccontare ai suoi nipotini che se una subroutine dichiarata come <tt>Bool</tt> converte automaticamente un valore di ritorno <tt>undef</tt> in <tt>False</tt> è merito suo. Larry sembrava ponderoso sull&#8217;argomento, ma ci sono speranze. </p>
	<p><strong>Groovy 1.0</strong><br />
E a proposito di linguaggi con dichiarazioni di tipo opzionali, <a href="http://groovy.codehaus.org/">Groovy</a> ha finalmente raggiunto la versione 1.0.<br />
Per parte mia, ritengo che Groovy sia un linguaggino carino, mi piace un sacco che abbiano la variabile implicita <tt>&#8220;it&#8221;</tt> nei blocchi, ad esempio, che permette di scrivere</p>
	<pre>
[1,2,3].each { print it}
</pre>
	<p>Ma in fondo è solo un poco interessante dialetto di ruby per la JVM.<br />
Il Lettore arguto potrebbe obiettare che ruby è solo un poco interessante dialetto del lisp o di smalltalk per unix, ma ho fiducia che i Lettori arguti non siano dei rompipalle. </p>
	<p><strong>D 1.0</strong><br />
Più interessante è invece il linguaggio D, che<a href="http://developers.slashdot.org/developers/07/01/01/2041256.shtml"> raggiunge la 1.0 </a>, e mi han fatto notare che adesso c&#8217;è anche un pacchetto debian di <acronym title="Gnu D compiler">gdc</acronym>.  </p>
	<p>L&#8217;Autore invita a notare che gdc è un anagramma di gcd, e questo ovviamente non è un caso.</p>
	<p>IMHO D è un&#8217;ottimo esempio di linguaggio di sistema moderno. Design By Contract, libreria ricca (regexp, socket, thread), strutture dati come array dinamici ed hash integrate, OOP fatta in modo sensato, supporto unicode etc..</p>
	<p>Ma perché D prenda piede ha bisogno di un progettone open source che lo traini (server ftp/http/whatever, nuova implementazione di X11, linguaggio usato per nuke&#8217;em forever&#8230;) , e questo non verrà fuori a brevissimo tempo, temo.<br />
Python e Ruby ci hanno messo una decina d&#8217;anni a sfondare.<br />
E nel frattempo la concorrenza non se ne sta ferma, con il nuovo C++ in arrivo, il nuovo C# e i futuri Java, quindi imo il futuro di D non è particolarmente brillante.<br />
Ma speriamo che mi sbagli. </p>
	<p><strong>Java 7</strong><br />
Guardiamoci in faccia, la comunità Java si è data una svegliata, hanno corretto, o provato a correggere, il linguaggio dove aveva delle falle troppo grosse (generic, autoboxing etc), hanno esteso la libreria dove ce n&#8217;era bisogno (<tt>java.util.concurrent</tt> etc), hanno cercato di abbracciare le richieste della comunità (JVM open source, invokedynamic).<br />
E in java 7 ci saranno anche le closure, cosa <a href="http://riffraff.blogsome.com/2006/08/19/java-7-dolphin-avra-le-closure/">che già sapeva </a>, ma quello che non sapevo è il modo con cui esse si integreranno con le api precedenti. </p>
	<p>In pratica, la closure viene utilizzata per costruire un&#8217;oggetto anonimo che viene poi infilato dentro l&#8217;interfaccia che già esisteva per i metodi. Ok, non si è capito, intendo dire che ad esempio una funzione <tt>startComputation(Runnable r)</tt> può essere richiamata con una closure come argomento, che verrà poi convertita automaticamente nel metodo <tt>run</tt> di un oggetto <tt>Runnable</tt> creato al volo.<br />
Ovviamente, affinché il compilatore sia in grado di gestire correttamente la cosa è necessario che riesca a capire in che metodo mettere il blocco, quindi perché la cosa funzioni l&#8217;interfaccia deve fornire un solo metodo, come fa <tt>Runnable</tt> con <tt>run</tt>. </p>
	<p>Per il resto è bello vedere come queste closure siano <em>identiche</em> ai blocchi in ruby, ad esempio non vengono segnalate nell&#8217;eccezioni come funzioni aggiuntive, il <tt>return</tt> da una closure esce dal blocco esterno ad essa invece che dalla closure, se si mettono come argomenti speciali si può usare una sintassi più carina etc..<br />
Vabè, ma è inutile che ve ne parli io, andatevi a leggere l&#8217;<a href="http://www.artima.com/lejava/articles/neal_gafter_closures.html">intervista a neal gafter</a></p>
	<p><strong>Conclusione</strong><br />
Siamo al 4 gennaio, e già c&#8217;è un sacco di roba a cui pensare.<br />
In più <a href="http://www.neropercaso.it">lawrence</a> ha scelto erlang  come <acronym title="language of the year">LoTY</acronym>, il che suggerisce che si potrebbe seguirlo.<br />
E poi mi sono impegnato a rendermi utile con sette gruppi di persone differenti.<br />
Ed avrei due o tre progettini da portare avanti.<br />
E devo prendere una cavolo di laurea (&#8221;oh no, di nuovo!&#8221; [cit]) .</p>
	<p>Ma se ne parla da febbraio,  da febbraio.
</p>
]]></content:encoded>
			<wfw:commentRss>http://riffraff.blogsome.com/2007/01/04/groovy-10-d-10-perl-6-java-7-e-ruby-18/feed/</wfw:commentRss>
	</item>
		<item>
		<title>99 problems in perl6: viaggio tra i blocchi</title>
		<link>http://riffraff.blogsome.com/2006/12/30/99-problems-in-perl6-viaggio-tra-i-blocchi/</link>
		<comments>http://riffraff.blogsome.com/2006/12/30/99-problems-in-perl6-viaggio-tra-i-blocchi/#comments</comments>
		<pubDate>Sat, 30 Dec 2006 14:13:02 +0000</pubDate>
		<dc:creator>gabriele</dc:creator>
		
	<category>ruby</category>
	<category>personale</category>
	<category>perl6</category>
		<guid>http://riffraff.blogsome.com/2006/12/30/99-problems-in-perl6-viaggio-tra-i-blocchi/</guid>
		<description><![CDATA[	Nel repository subversion di pugs si è materializzata una lista di 99 problemini di programmazione, list ispirata da una in Common Lisp, a sua volta ispirata da una in prolog.
	Sicché ieri notte mi è venuta l&#8217;idea di provare a risolverne qualcuno, tra cui il semplice problema 28, che si compone di due parti, la prima [...]]]></description>
			<content:encoded><![CDATA[	<p>Nel repository subversion di pugs si è materializzata una lista di 99 <a href="http://svn.pugscode.org/pugs/t/examples/99problems/">problemini di programmazione</a>, list ispirata da una in Common Lisp, a sua volta ispirata da una in prolog.</p>
	<p>Sicché ieri notte mi è venuta l&#8217;idea di provare a risolverne qualcuno, tra cui il semplice <a href="http://svn.pugscode.org/pugs/t/examples/99problems/problem28.t">problema 28</a>, che si compone di due parti, la prima delle quali è: ordina una lista di liste in base alla lunghezza degli elementi.<br />
In ruby sarebbe:</p>
	<pre>
&gt;&gt; a=[[1,2,3,4,5],[1,2],[1],[1,2,3],[4,3,2,1]]
=&gt; [[1, 2, 3, 4, 5], [1, 2], [1], [1, 2, 3], [4, 3, 2, 1]]
&gt;&gt; a.sort
=&gt; [[1], [1, 2], [1, 2, 3], [1, 2, 3, 4, 5], [4, 3, 2, 1]]
</pre>
	<p>Ma c&#8217;è il problema che l&#8217;ultimo elemento non è ben posizionato, perché?<br />
Perché <tt>Enumerable#sort</tt> si appoggia al metodo <tt>&lt;=&gt;</tt> degli argomenti, che è definito per gli interi, le stringhe, gli array e così via in modo ragionevole. Si tratta di un classico caso di progettazione OO ben fatta. Solo che per gli <tt>Array</tt> è definito in un modo simile:</p>
	<pre>
class Array
 def &lt;=&gt;(other)
  each_with_index do |elem,i|
   res= elem &lt;=&gt; other[i]
   return res unless res.zero?
  end
 end
end
</pre>
	<p>In pratica <em>&#8220;confronta gli elementi uno a uno finché sono uguali, se sono diversi restituisci il risultato&#8221;</em>.</p>
	<p>Ciò significa che per ottenere un risultato sensato dobbiamo applicare una funzione di comparazione ad hoc, in questo modo</p>
	<pre>
&gt;&gt; a.sort_by {|e| e.size}
=&gt; [[1], [1, 2], [1, 2, 3], [4, 3, 2, 1], [1, 2, 3, 4, 5]]
</pre>
	<p>In perl6 la cosa dovrebbe essere, altrettanto banalmente</p>
	<pre>
pugs&gt; my @a=[1,2,3,4,5],[1,2],[1],[1,2,3],[4,3,2,1]
(#&lt;Array :0x11face4&gt;,
 #&lt;Array :0x17e53e4&gt;,
 #&lt;Array :0x17e53dc&gt;,
 #&lt;Array :0x11fc644&gt;,
 #&lt;Array :0x11fd1ac&gt;)
pugs&gt; @a.sort
((1,), (1, 2), (1, 2, 3), (1, 2, 3, 4, 5), (4, 3, 2, 1))
</pre>
	<p>Ma otteniamo lo stesso errore che avevamo in ruby, sebbene la logica sottiostante sia differente.<br />
Andiamo per gradi: cosa è <tt>sort()</tt>?<br />
Si tratta di una multi sub (funzione generica in CLOS, multimetodo nel resto del mondo) cioè di una funzione che è definita un sacco di volte per differenti tipi, e il cui dispatch viene poi fatto a runtime.<br />
<tt>sort</tt> può ricevere in input una funzione di due parametri (classica sort)  di un parametro (shwartzian transform, come <tt>sort_by</tt> in ruby o <tt>sort(key=foo)</tt> in python) o nessun input, usando di default l&#8217;operatore <tt>cmp</tt></p>
	<p><tt>cmp</tt> è l&#8217;equivalente generico di <tt>&lt;=&gt;</tt> che in perl è limitato ai tipi numerici.<br />
Insomma, di fondo la sort funziona esattamente allo stesso modo. </p>
	<p>Possiamo quindi usare lo stesso approccio usato in ruby, ordinare usando un  comparatore a argomento singolo.<br />
Sappiate che, per ragioni a me ignote, la lunghezza di una lista in perl6 si ottiene con <tt>+$lista</tt>. Un blocco in linea ottiene l&#8217;argomento attraverso <tt>$_</tt> quindi sperimentiamo usando la funzione <tt>map</tt>:</p>
	<pre>
pugs&gt; map {+$_}, @list
(5, 2, 1, 3, 4)
</pre>
	<p>Perfetto, andiamo al <tt>sort</tt>:</p>
	<pre>
pugs> sort {+$_}, @list
((4, 3, 2, 1), (1, 2, 3), (1,), (1, 2), (1, 2, 3, 4, 5))
</pre>
	<p>Ma che cavolo di ordinamento è?<br />
E qui viene la parte divertente: parlando con larry wall su #perl6 scopro che la sort di un solo argomento non è che funzioni proprio benissimo in questo momento storico. Ok, non mi do per vinto, proviamo con quella di due  argomenti.</p>
	<p>Ora, come li prendo due argomenti un una sub in linea?<br />
In Perl6 esistono due modi per definire delle funzioni/closure in linea, la sintassi che abbiamo appena usato, con i blocchi in stile perl5, e quella con la freccetta:</p>
	<pre>
pugs&gt; my $fun= -&gt; @l { +@l }
-&gt;{Syn \"block\" {App &#038;prefix:+ (: Var \"@l\")}}
pugs&gt; $fun(@list)
5
pugs&gt; $fun(@list[0])
5
pugs&gt; $fun(@list[1])
</pre>
	<p>Proviamo il sort:</p>
	<pre>
pugs&gt; my $comparator= -&gt; $a,$b { +$a < => +$b }
-&gt;{Syn &#8220;block&#8221; {App &#038;infix:&gt;=&gt; (:
                                App &#038;prefix:+ (: Var &#8220;$a&#8221;), App &#038;prefix:+ (: Var
 &#8220;$b&#8221;))}}
pugs&gt; sort $comparator, @list
((1,), (1, 2), (1, 2, 3), (4, 3, 2, 1), (1, 2, 3, 4, 5))
</pre>
	<p>Ops, scusate in linea:</p>
	<pre>
pugs&gt; sort(-&gt; $a,$b { +$a &lt;=&gt; +$b }, @list)
((1,), (1, 2), (1, 2, 3), (4, 3, 2, 1), (1, 2, 3, 4, 5))
</pre>
	<p>Perfetto funziona. Solo che è complicatissimo da scrivere ed illegibile. </p>
	<p>E questo ci da l&#8217;occasione di introdurre una cosa che a me piace tantissimo in perl6, le variabili segnaposto, che ci permettono di riscrivere il tutto come:</p>
	<pre>
pugs&gt; sort {$^a &lt;=&gt; $^b}, @list
((1,), (1, 2), (1, 2, 3), (4, 3, 2, 1), (1, 2, 3, 4, 5))
</pre>
	<p>Ora, il codice dovrebbe essere ovvio, l&#8217;unica cosa strana è la presenza di quelle due variabili con nomi assurdi, <tt>$^a</tt> e <tt>$^b</tt>, che sono appunto le variabili segnaposto.<br />
In pratica nei &#8220;bare block&#8221; ovvero nei blocchi senza lista di argomenti esplicita, viene definita una lista implicita basata sulle variabili segnaposto, quelle con il &#8220;^&#8221;, ordinate lessicograficamente. </p>
	<p>Si tratta a mio giudizio di una soluzione che permette di ottenere codice molto compatto e chiaro, e perfettamente in linea con la politica per cui implicito e meglio che esplicito. Chissà che non venga adottata in altri linguaggi, prima o poi.
</p>
]]></content:encoded>
			<wfw:commentRss>http://riffraff.blogsome.com/2006/12/30/99-problems-in-perl6-viaggio-tra-i-blocchi/feed/</wfw:commentRss>
	</item>
		<item>
		<title>Post Archivio n. 7</title>
		<link>http://riffraff.blogsome.com/2006/03/21/post-archivio-n-7/</link>
		<comments>http://riffraff.blogsome.com/2006/03/21/post-archivio-n-7/#comments</comments>
		<pubDate>Tue, 21 Mar 2006 08:54:31 +0000</pubDate>
		<dc:creator>gabriele</dc:creator>
		
	<category>ruby</category>
	<category>personale</category>
	<category>blogosfera</category>
	<category>pugs</category>
		<guid>http://riffraff.blogsome.com/2006/03/21/post-archivio-n-7/</guid>
		<description><![CDATA[	è tardi! è tardi! ripeteva il nabaztag. 
	
Salvatore Cariello si accorge che gli internauti stanno virando salla semplice ricerca di keyword (&#8221;gnocca&#8221;) ad una più articolata (&#8221;dove trovo una gran gnocca&#8221;). Sono stato un pioniere, già nel 2003 usavo google per dimostrare agli amici che 1 non è un numero primo.
	 blog italirubyci in aumento, [...]]]></description>
			<content:encoded><![CDATA[	<p>è tardi! è tardi! ripeteva il <a href="http://www.nabaztag.com/">nabaztag</a>. </p>
	<ul>
<li><a href="http://www.seotalk.it/2006/03/cosa-cercano-gli-utenti.html">Salvatore Cariello si accorge </a>che gli internauti stanno virando salla semplice ricerca di keyword (&#8221;gnocca&#8221;) ad una più articolata (&#8221;dove trovo una gran gnocca&#8221;). Sono stato un pioniere, già nel 2003 usavo google per dimostrare agli amici che <a href="http://www.google.it/search?hs=4pb&#038;hl=it&#038;client=firefox-a&#038;rls=org.mozilla%3Ait%3Aofficial&#038;q=%22perch%C3%A9+1+non+%C3%A8+primo%22&#038;btnG=Cerca&#038;meta=">1 non è un numero primo</a>.</li>
	<li> blog italirubyci in aumento, volevo fare un link dump ma mi sono perso l&#8217;opml.. comincio a pensare che ci voglia un&#8217;aggregatore, se qualcuno lo scrive (nah, planet no).</li>
	<li>in un giorno ho scoperto che due mie idee per diventare ultramiliardario nel tempo libero esistono già, sigh. Consiglio però la lettura di <a href="http://blog.acmelab.org/?p=35">questo ottimo articolo </a> che spiega come per fare soldi con internet <em>oggi</em> ci voglia un&#8217;idea da 5 dollari. Di quelle che gli amici ti dicono <em>&#8220;ah cazzo, e ci hai pure pensato?&#8221;</em>, e che non diresti mai ad un membro del sesso opposto (<em>&#8220;sai ho inventato datey.org, un sito che serve a xyz&#8221;</em>) perché ti vergogneresti</li>
	<li> Luca Conti fa notare che fra un po&#8217; forse ci sarà <a href="http://www.pandemia.info/2006/03/20/digg_30_in_italiano.html">digg in italiano</a>, prima che ci sia un digg italiano. </li>
	<li> se usate ancora win32 e non vi piace il software di masterizzazione interno, e non avete voglia di stare li a crackare nero (che poi magari avete originale ma datato da qualche parte) consiglio l&#8217;uso di <a href="http://www.cdburnerxp.se/">CD Burner XP PRO 3</a> (freeware)</li>
	<li>C&#8217;è ancora <a href="http://duckdown.blogspot.com/2006/03/more-thoughts-on-ruby-and-why-it-isnt.html">che dice che ruby non è <em>enterprise ready</em></a>. Un disastro ferroviario in attesa di avvenire, secondo questo tizio.<br />
<tt>self.notes < < "verificare se mcgovern è un demente"</tt></tt></li>
	<li><a href="http://pugs.blogs.com/pugs/2006/03/intermission_ag.html">Audrey Tang e Koichi Sasada a scrivere codice insieme</a> per far si che Pugs possa usare YARV come backend. Sono quasi spaventato. </li>
	</ul>
]]></content:encoded>
			<wfw:commentRss>http://riffraff.blogsome.com/2006/03/21/post-archivio-n-7/feed/</wfw:commentRss>
	</item>
		<item>
		<title>Perl6? Python 2.5, quantomeno..</title>
		<link>http://riffraff.blogsome.com/2006/01/14/perl6-python-25-quantomeno/</link>
		<comments>http://riffraff.blogsome.com/2006/01/14/perl6-python-25-quantomeno/#comments</comments>
		<pubDate>Sat, 14 Jan 2006 00:30:31 +0000</pubDate>
		<dc:creator>gabriele</dc:creator>
		
	<category>python</category>
	<category>perl6</category>
		<guid>http://riffraff.blogsome.com/2006/01/14/perl6-python-25-quantomeno/</guid>
		<description><![CDATA[	Un nuovo articolo su perl6, per chi non avesse mai voluto indagare sul perché sia necessario un perl nuovo, e volesse saperne di più è un&#8217;ottima lettura.

Perché io, di fondo, guardo con ammirazione a perl6.
Fondamentalmente perché contiene tutto, ma in un modo molto.. beh.. perlish.
	Ad esempio, perl6 ha le macro, come lisp o dylan, ma [...]]]></description>
			<content:encoded><![CDATA[	<p>Un <a href="http://www.perl.com/pub/a/2006/01/12/what_is_perl_6.html?CMP=OTC-BD0016219291&#038;ATT=What+is+Perl+6">nuovo articolo su perl6</a>, per chi non avesse mai voluto indagare sul perché sia necessario un perl nuovo, e volesse saperne di più è un&#8217;ottima lettura.<br />
<a id="more-94"></a><br />
Perché io, di fondo, guardo con ammirazione a perl6.<br />
Fondamentalmente perché contiene <strong>tutto</strong>, ma in un modo molto.. beh.. perlish.</p>
	<p>Ad esempio, perl6 ha le macro, come lisp o dylan, ma le macro non nascono dall&#8217;idea (che è ovvia in lisp) di manipolare direttamente l&#8217;albero sintattico (perché, suvvia, la sintassi dei dialetti lisp è una metasintassi), bensì partendo da quello che il perl ha sempre fatto, e che è poi una delle idee fondamentali che si sono propagate a ruby/python/php/etc, ovvero manipolare stringhe tramite espressioni regolari. </p>
	<p>Ok, le regexp in perl6 sono una cosa che non c&#8217;entra niente con quelle di perl5, eppure sono una evoluzione abbastanza naturale di quelle. </p>
	<p>E poi ci sono i multimetodi. Non mi spiego come uno possa progettare un linguaggio moderno senza multimetodi, ma questo è materiale per un altro post.  E ci sono le junction!</p>
	<p>Ma la cosa davvero interessante è che perl6/parrot sono stati vaporware per un lunghissimo tempo, ed ora comincianmo a materializzarsi. &Egrave;  uscito da poco parrot 0.4.1, che comincia ad essere usabile, e non solo, parlando di performance va già come un treno. </p>
	<p><strong>Intermezzo</strong><br />
Ah, ho detto di recente che cosa fichissima è <a href="http://www.atdot.net/yarv">YARV</a>?<br />
Ho anche inviato una patch di una (1) linea.<br />
Il che per uno che non ha ancora capito una mazza del codice è una cosa notevolissima.  Di nuovo c&#8217;è il fatto che sembra finalmente qualcuno si sia messo a ripulire il codice per eliminare i warning.<br />
Mi chiedo se potranno mai essere rimossi quelli relativi all&#8217;uso di <tt>longjmp</tt> ma in fondo chi se ne frega.</p>
	<p><strong>Nel frattempo, in un posto lontano</strong><br />
Ho anche dato un&#8217;occhiata al <a href="http://www.python.org/dev/doc/devel/whatsnew/whatsnew25.html">What&#8217;s new in python 2.5 </a>, che è molto succulento. </p>
	<p>La prima cosa di cui si parla è la possibilità di effettuare currying, o &#8220;applicazione parziale&#8221; tramite una funzione di libreria.<br />
Per chi non sapesse così, è un&#8217;idea assolutamente semplice e geniale che viene dai linguaggi funzionali e che consiste nel creare una funzione partendo da una esistente e passandogli <em>solo un po&#8217;</em> di argomenti.<br />
Ad esempio, una cosa così:</p>
	<pre>
def stampa(s1,s2):
 print s1,s2
	
stampa_hello=partial(stampa,s1=\"Hello\")
stampa_hello(\" world\") #=> \"Hello World\"
</pre>
	<p>Sapete qual&#8217;è la cosa interessante? Non tanto che questo meccanismo sia finito nella libreria standard di python, ma che sia builtin in perl6 <img src='http://riffraff.blogsome.com/wp-images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  . Ah, le affinità elettive.</p>
	<p>L&#8217;altra cosa che ho trovato interessante è il <a href="http://www.python.org/dev/doc/devel/whatsnew/node4.html">pacchetto di cambiamenti relativi ai generatori</a>.<br />
Il più lampante è che <tt>yield</tt> diventa un&#8217;espressione invece che essere uno statement.<br />
Il che in sostanza vuol dire poter scrivere:</p>
	<pre>
def stuff():
 res= yield value
</pre>
	<p>non dirò che ruby funziona già così, perché non è vero, ma diciamo che ci si è avvicinati un po&#8217;.<br />
E pure questo c&#8217;è in perl6.</p>
	<p>Ed anche se nel documento non c&#8217;è, pare che py 2.5 avrà anche una <a href="http://mail.python.org/pipermail/python-dev/2005-September/056846.html">espressione condizionale ternaria</a>, la possibilità di scrivere:</p>
	<pre>
foo=  if condizione allora qualcosa else altro
</pre>
	<p>Insomma quello che in C e derivati è <tt>foo?bar:baz</tt>.<br />
La sintassi è diversa ma il risultato uguale. </p>
	<p><strong>Ah, le affinità elettive.</strong>
</p>
]]></content:encoded>
			<wfw:commentRss>http://riffraff.blogsome.com/2006/01/14/perl6-python-25-quantomeno/feed/</wfw:commentRss>
	</item>
		<item>
		<title>Haskell is..</title>
		<link>http://riffraff.blogsome.com/2005/09/10/10/</link>
		<comments>http://riffraff.blogsome.com/2005/09/10/10/#comments</comments>
		<pubDate>Sat, 10 Sep 2005 08:11:40 +0000</pubDate>
		<dc:creator>gabriele</dc:creator>
		
	<category>haskell</category>
	<category>perl</category>
	<category>pugs</category>
		<guid>http://riffraff.blogsome.com/2005/09/10/10/</guid>
		<description><![CDATA[Haskell is..]]></description>
			<content:encoded><![CDATA[	<p>&#8220;faster than C++, more concise than Perl, more regular than Python, more flexible than Ruby, more typeful than C#, more robust than Java, and has absolutely nothing in common with PHP.&#8221;</p>
	<p>(secondo  <a href="http://use.perl.org/~autrijus">Autrijus Tang</a>, letta in <a href="http://perl.com/pub/a/2005/09/08/autrijus-tang.html">questa intervista </a>su perl.com)
</p>
]]></content:encoded>
			<wfw:commentRss>http://riffraff.blogsome.com/2005/09/10/10/feed/</wfw:commentRss>
	</item>
	</channel>
</rss>

