<?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>PLNC 2010</title>
	<atom:link href="http://www.rfc1149.net/plnc2010/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.rfc1149.net/plnc2010</link>
	<description>Paradigmes et langages non classiques (INF355)</description>
	<lastBuildDate>Fri, 25 Jun 2010 11:30:28 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.4</generator>
		<item>
		<title>Haskell : TD</title>
		<link>http://www.rfc1149.net/plnc2010/2010/06/25/haskell-td/</link>
		<comments>http://www.rfc1149.net/plnc2010/2010/06/25/haskell-td/#comments</comments>
		<pubDate>Fri, 25 Jun 2010 11:30:28 +0000</pubDate>
		<dc:creator>Samuel Tardieu</dc:creator>
				<category><![CDATA[TD]]></category>
		<category><![CDATA[Haskell]]></category>

		<guid isPermaLink="false">http://www.rfc1149.net/plnc2010/?p=114</guid>
		<description><![CDATA[Calculatrice RPN
<p>Une calculatrice RPN travaille avec une pile. Les opérations (par  exemple l&#8217;addition) travaillent avec les valeurs au sommet de la pile  et les y remettent (comme en Factor).</p>
<p>Le but de cet exercice est de factoriser un maximum de code et de  limiter la duplication.</p>
Types de base
<p>Le mot-clé « type » permet de déclarer [...]]]></description>
			<content:encoded><![CDATA[<h2>Calculatrice RPN</h2>
<p>Une calculatrice RPN travaille avec une pile. Les opérations (par  exemple l&#8217;addition) travaillent avec les valeurs au sommet de la pile  et les y remettent (comme en Factor).</p>
<p>Le but de cet exercice est de factoriser un maximum de code et de  limiter la duplication.</p>
<h3>Types de base</h3>
<p>Le mot-clé « type » permet de déclarer un alias de type. Par exemple,  le type chaîne est défini comme:</p>
<pre>type String = [Char]</pre>
<p>Définir un type Stack comme étant équivalent à une liste d’entiers  courts (Int).</p>
<p>Définir un type Operator représentant une fonction travaillant sur la  pile. Un tel opérateur prend une pile en paramètre, utilise certaines  valeurs et renvoie la nouvelle pile.</p>
<h3>Fonctions</h3>
<p>Définir ensuite une fonction parseOp ayant comme signature:</p>
<pre>parseOp :: String -&gt; Operator</pre>
<p>qui, lorsqu’on lui passe les valeurs « + », « - », « * », fait ce  qu’on attend intuitivement (la division entière en Haskell est  l’opérateur préfixe « div »).</p>
<p>parseOp doit également reconnaître les  opérateurs « dup », « swap », « drop » qui, respectivement, duplique le  sommet de la pile, échange les deux valeurs au sommet de la pile, efface  l’élement au sommet de la pile. « depth » renvoie le nombre d’éléments  dans la pile au moment de l’appel, « pick » renvoie le n-ième élément de  la pile.</p>
<p>Faire ensuite une fonction eval qui prend une pile et une liste  [Operator] et appliquent les opérateurs à la suite.</p>
<p>La signature d’eval sera donc:</p>
<pre>eval :: Stack -&gt; [Operator] -&gt; Stack</pre>
<p>En utilisant <a href="http://www.haskell.org/hoogle/">Hoogle</a>, le  moteur de recherche spécialisé Haskell, on trouvera le module à importer  pour utiliser « hFlush ». De la même manière, on trouvera probablement  une fonction existante permettant de séparer une chaîne de caractères en  ses différents composants, ce qui sera utile pour implémenter « parse »  dont la signature est à deviner.</p>
<p>On pourra tester les opérations à l’aide du programme principal  suivant:</p>
<pre>repl :: Stack -&gt; IO ()
repl stack = do
  putStr "&gt; "
  hFlush stdout
  line &lt;- getLine
  newstack &lt;- return $ eval stack (parse line)
  putStrLn $ show $ reverse newstack
  repl newstack
main = repl []</pre>
<h2>Nombres de Peano</h2>
<p>Les nombres de Peano permettent de représenter les entiers  non-négatifs. 0 est défini comme Zero, 1 comme le successeur de Zero, 2  comme le successeur du successeur de Zero, etc.</p>
<p>Définir, avec « data », un type Peano comme étant un type avec deux  constructeurs, Zero (qui ne prend pas d’argument) et Succ (qui prend un  nombre de Peano).</p>
<p>On souhaite que le type Peano puisse être une instance de la classe  « Num ». Pour cela, il faut définir les opérations suivantes: « + »,  « - », « * », « signum » (qui renvoie 0, 1 ou -1 selon le signe du  nombre passé en argument), « abs » et « fromInteger ».</p>
<p>La déclaration d’instance ressemblera donc à:</p>
<pre>instance Num Peano where
  a + b = ...
  a - b = ...</pre>
<p>On souhaite également que les nombres de Peano soient regardables :  on les instancie donc avec le classe « Show » et on implémentera une  méthode « show ». Ils font également partie de « Integral », « Real » et  « Enum ».</p>
<h2>Retour sur l’interpréteur RPN</h2>
<p>Modifier l’interpréteur RPN pour qu’il utilise les nombres de Peano.  Pour cela, il faudra rendre les nombres de Peano membres de la classe  « Read », et adapter le type de la pile.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rfc1149.net/plnc2010/2010/06/25/haskell-td/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Haskell : notes de cours 1 (23 juin 2010)</title>
		<link>http://www.rfc1149.net/plnc2010/2010/06/24/haskell-notes-de-cours-1-23-juin-2010/</link>
		<comments>http://www.rfc1149.net/plnc2010/2010/06/24/haskell-notes-de-cours-1-23-juin-2010/#comments</comments>
		<pubDate>Thu, 24 Jun 2010 21:14:53 +0000</pubDate>
		<dc:creator>Samuel Tardieu</dc:creator>
				<category><![CDATA[Corrigé]]></category>
		<category><![CDATA[Haskell]]></category>

		<guid isPermaLink="false">http://www.rfc1149.net/plnc2010/?p=111</guid>
		<description><![CDATA[
module Cours1 where
&#160;
-- Importation explicite du prélude en excluant certaines constructions :
--   - Maybe et tous ses constructeurs
--   - repeat
&#160;
import Prelude hiding &#40;Maybe&#40;..&#41;, repeat&#41;
&#160;
-- Équivalence entre opérateurs et fonctions. Par exemple, (+) est la
-- fonction correspondant à l'addition et `f` ci-dessous est la version
-- opérateur de la fonction f.
&#160;
x `f` y [...]]]></description>
			<content:encoded><![CDATA[
<div class="wp_syntax"><div class="code"><pre class="haskell" style="font-family:monospace;"><span style="color: #06c; font-weight: bold;">module</span> Cours1 <span style="color: #06c; font-weight: bold;">where</span>
&nbsp;
<span style="color: #5d478b; font-style: italic;">-- Importation explicite du prélude en excluant certaines constructions :</span>
<span style="color: #5d478b; font-style: italic;">--   - Maybe et tous ses constructeurs</span>
<span style="color: #5d478b; font-style: italic;">--   - repeat</span>
&nbsp;
<span style="color: #06c; font-weight: bold;">import</span> <span style="color: #06c; font-weight: bold;">Prelude</span> <span style="color: #06c; font-weight: bold;">hiding</span> <span style="color: green;">&#40;</span><span style="color: #cccc00; font-weight: bold;">Maybe</span><span style="color: green;">&#40;</span><span style="color: #339933; font-weight: bold;">..</span><span style="color: green;">&#41;</span><span style="color: #339933; font-weight: bold;">,</span> <span style="font-weight: bold;">repeat</span><span style="color: green;">&#41;</span>
&nbsp;
<span style="color: #5d478b; font-style: italic;">-- Équivalence entre opérateurs et fonctions. Par exemple, (+) est la</span>
<span style="color: #5d478b; font-style: italic;">-- fonction correspondant à l'addition et `f` ci-dessous est la version</span>
<span style="color: #5d478b; font-style: italic;">-- opérateur de la fonction f.</span>
&nbsp;
x `f` y <span style="color: #339933; font-weight: bold;">=</span> x<span style="color: #339933; font-weight: bold;">*</span><span style="color: red;">2</span> <span style="color: #339933; font-weight: bold;">+</span> y<span style="color: #339933; font-weight: bold;">*</span><span style="color: red;">3</span>
g x y <span style="color: #339933; font-weight: bold;">=</span> x<span style="color: #339933; font-weight: bold;">*</span><span style="color: red;">2</span> <span style="color: #339933; font-weight: bold;">+</span> y<span style="color: #339933; font-weight: bold;">*</span><span style="color: red;">3</span>
x <span style="color: #339933; font-weight: bold;">+!+</span> y <span style="color: #339933; font-weight: bold;">=</span> x<span style="color: #339933; font-weight: bold;">*</span><span style="color: red;">2</span> <span style="color: #339933; font-weight: bold;">+</span> y<span style="color: #339933; font-weight: bold;">*</span><span style="color: red;">3</span>
&nbsp;
<span style="color: #5d478b; font-style: italic;">-- Liste infinie de factorielle.</span>
&nbsp;
facts <span style="color: #339933; font-weight: bold;">::</span> <span style="color: green;">&#91;</span><span style="color: #cccc00; font-weight: bold;">Integer</span><span style="color: green;">&#93;</span>
facts <span style="color: #339933; font-weight: bold;">=</span> <span style="color: red;">1</span> : <span style="color: green;">&#40;</span><span style="font-weight: bold;">zipWith</span> <span style="color: green;">&#40;</span><span style="color: #339933; font-weight: bold;">*</span><span style="color: green;">&#41;</span> <span style="color: green;">&#91;</span>1<span style="color: #339933; font-weight: bold;">..</span><span style="color: green;">&#93;</span> facts<span style="color: green;">&#41;</span>
&nbsp;
<span style="color: #5d478b; font-style: italic;">-- Application partielle de !! qui permet de récupérer le n-ième</span>
<span style="color: #5d478b; font-style: italic;">-- élément d'une liste.</span>
&nbsp;
fact <span style="color: #339933; font-weight: bold;">::</span> <span style="color: #cccc00; font-weight: bold;">Int</span> <span style="color: #339933; font-weight: bold;">-&gt;</span> <span style="color: #cccc00; font-weight: bold;">Integer</span>
fact <span style="color: #339933; font-weight: bold;">=</span> <span style="color: green;">&#40;</span>facts <span style="color: #339933; font-weight: bold;">!!</span><span style="color: green;">&#41;</span>
&nbsp;
<span style="color: #5d478b; font-style: italic;">-- Définition de la suite de Fibonacci.</span>
&nbsp;
fibos <span style="color: #339933; font-weight: bold;">::</span> <span style="color: green;">&#91;</span><span style="color: #cccc00; font-weight: bold;">Integer</span><span style="color: green;">&#93;</span>
fibos <span style="color: #339933; font-weight: bold;">=</span> <span style="color: red;">1</span> : <span style="color: red;">1</span> : <span style="color: green;">&#40;</span><span style="font-weight: bold;">zipWith</span> <span style="color: green;">&#40;</span><span style="color: #339933; font-weight: bold;">+</span><span style="color: green;">&#41;</span> fibos <span style="color: green;">&#40;</span><span style="font-weight: bold;">tail</span> fibos<span style="color: green;">&#41;</span><span style="color: green;">&#41;</span>
&nbsp;
<span style="color: #5d478b; font-style: italic;">-- Fonction constante qui, en application partielle, retourne toujours</span>
<span style="color: #5d478b; font-style: italic;">-- la même chose lorsqu'elle est finalement appliquée.</span>
&nbsp;
c <span style="color: #339933; font-weight: bold;">::</span> a <span style="color: #339933; font-weight: bold;">-&gt;</span> b <span style="color: #339933; font-weight: bold;">-&gt;</span> a
c x <span style="color: #339933; font-weight: bold;">_</span> <span style="color: #339933; font-weight: bold;">=</span> x
&nbsp;
<span style="color: #5d478b; font-style: italic;">-- Fonction qui fait la même chose avec son deuxième argument. J'y ajoute</span>
<span style="color: #5d478b; font-style: italic;">-- une seconde définition s' qui utilise la fonction identité.</span>
&nbsp;
s <span style="color: #339933; font-weight: bold;">::</span> a <span style="color: #339933; font-weight: bold;">-&gt;</span> b <span style="color: #339933; font-weight: bold;">-&gt;</span> b
s a b <span style="color: #339933; font-weight: bold;">=</span> c b a
&nbsp;
s' <span style="color: #339933; font-weight: bold;">::</span> a <span style="color: #339933; font-weight: bold;">-&gt;</span> b <span style="color: #339933; font-weight: bold;">-&gt;</span> b
s' <span style="color: #339933; font-weight: bold;">_</span> <span style="color: #339933; font-weight: bold;">=</span> <span style="font-weight: bold;">id</span>
&nbsp;
<span style="color: #5d478b; font-style: italic;">-- Équivalent de la fonction prédéfinie flip qui inverse l'ordre des</span>
<span style="color: #5d478b; font-style: italic;">-- arguments d'une fonction en prenant deux.</span>
&nbsp;
fl <span style="color: #339933; font-weight: bold;">::</span> <span style="color: green;">&#40;</span>a <span style="color: #339933; font-weight: bold;">-&gt;</span> b <span style="color: #339933; font-weight: bold;">-&gt;</span> c<span style="color: green;">&#41;</span> <span style="color: #339933; font-weight: bold;">-&gt;</span> b <span style="color: #339933; font-weight: bold;">-&gt;</span> a <span style="color: #339933; font-weight: bold;">-&gt;</span> c
fl f x y <span style="color: #339933; font-weight: bold;">=</span> f y x
&nbsp;
<span style="color: #5d478b; font-style: italic;">-- Lambda.</span>
&nbsp;
add <span style="color: #339933; font-weight: bold;">=</span> \ x y <span style="color: #339933; font-weight: bold;">-&gt;</span> x<span style="color: #339933; font-weight: bold;">+</span>y
&nbsp;
<span style="color: #5d478b; font-style: italic;">-- Nouveau type de données, affichable.</span>
&nbsp;
<span style="color: #06c; font-weight: bold;">data</span> B <span style="color: #339933; font-weight: bold;">=</span> T <span style="color: #339933; font-weight: bold;">|</span> F <span style="color: #06c; font-weight: bold;">deriving</span> <span style="color: green;">&#40;</span><span style="color: #cccc00; font-weight: bold;">Show</span><span style="color: green;">&#41;</span>
&nbsp;
<span style="color: #5d478b; font-style: italic;">-- Ce type peut être utilisé pour des comparaisons en fournissant ==.</span>
&nbsp;
<span style="color: #06c; font-weight: bold;">instance</span> <span style="color: #cccc00; font-weight: bold;">Eq</span> B <span style="color: #06c; font-weight: bold;">where</span>
         T <span style="color: #339933; font-weight: bold;">==</span> T <span style="color: #339933; font-weight: bold;">=</span> True
         F <span style="color: #339933; font-weight: bold;">==</span> F <span style="color: #339933; font-weight: bold;">=</span> True
         <span style="color: #339933; font-weight: bold;">_</span> <span style="color: #339933; font-weight: bold;">==</span> <span style="color: #339933; font-weight: bold;">_</span> <span style="color: #339933; font-weight: bold;">=</span> False
&nbsp;
<span style="color: #5d478b; font-style: italic;">-- Type option similaire à ce qu'on avait fait en Factor.</span>
&nbsp;
<span style="color: #06c; font-weight: bold;">data</span> <span style="color: #cccc00; font-weight: bold;">Maybe</span> a <span style="color: #339933; font-weight: bold;">=</span> Just a <span style="color: #339933; font-weight: bold;">|</span> Nothing
     <span style="color: #06c; font-weight: bold;">deriving</span> <span style="color: green;">&#40;</span><span style="color: #cccc00; font-weight: bold;">Show</span><span style="color: green;">&#41;</span>
&nbsp;
fromJust <span style="color: #339933; font-weight: bold;">::</span> <span style="color: #cccc00; font-weight: bold;">Maybe</span> a <span style="color: #339933; font-weight: bold;">-&gt;</span> a
fromJust <span style="color: green;">&#40;</span>Just x<span style="color: green;">&#41;</span> <span style="color: #339933; font-weight: bold;">=</span> x
fromJust Nothing <span style="color: #339933; font-weight: bold;">=</span> <span style="font-weight: bold;">error</span> <span style="background-color: #3cb371;">&quot;empty Maybe&quot;</span>
&nbsp;
app <span style="color: #339933; font-weight: bold;">::</span> <span style="color: #cccc00; font-weight: bold;">Maybe</span> a <span style="color: #339933; font-weight: bold;">-&gt;</span> <span style="color: green;">&#40;</span>a <span style="color: #339933; font-weight: bold;">-&gt;</span> <span style="color: #cccc00; font-weight: bold;">Maybe</span> b<span style="color: green;">&#41;</span> <span style="color: #339933; font-weight: bold;">-&gt;</span> <span style="color: #cccc00; font-weight: bold;">Maybe</span> b
app <span style="color: green;">&#40;</span>Just x<span style="color: green;">&#41;</span> f <span style="color: #339933; font-weight: bold;">=</span> f x
app Nothing <span style="color: #339933; font-weight: bold;">_</span> <span style="color: #339933; font-weight: bold;">=</span> Nothing
&nbsp;
<span style="color: #5d478b; font-style: italic;">-- Maybe est également un Monad si on fournit les bonnes fonctions.</span>
&nbsp;
<span style="color: #06c; font-weight: bold;">instance</span> <span style="color: #cccc00; font-weight: bold;">Monad</span> <span style="color: #cccc00; font-weight: bold;">Maybe</span> <span style="color: #06c; font-weight: bold;">where</span>
         <span style="font-weight: bold;">return</span> <span style="color: #339933; font-weight: bold;">=</span> Just
         <span style="font-weight: bold;">fail</span> <span style="color: #339933; font-weight: bold;">_</span> <span style="color: #339933; font-weight: bold;">=</span> Nothing
         <span style="color: green;">&#40;</span>Just x<span style="color: green;">&#41;</span> <span style="color: #339933; font-weight: bold;">&gt;&gt;=</span> f <span style="color: #339933; font-weight: bold;">=</span> f x
         Nothing <span style="color: #339933; font-weight: bold;">&gt;&gt;=</span> <span style="color: #339933; font-weight: bold;">_</span> <span style="color: #339933; font-weight: bold;">=</span> Nothing
&nbsp;
<span style="color: #5d478b; font-style: italic;">-- Incrémentation de n'importe quel type de Monad si on utilise minc</span>
<span style="color: #5d478b; font-style: italic;">-- avec la fonction bind (&gt;&gt;=).</span>
&nbsp;
minc <span style="color: #339933; font-weight: bold;">::</span> <span style="color: green;">&#40;</span><span style="color: #cccc00; font-weight: bold;">Monad</span> m<span style="color: #339933; font-weight: bold;">,</span> <span style="color: #cccc00; font-weight: bold;">Num</span> a<span style="color: green;">&#41;</span> <span style="color: #339933; font-weight: bold;">=&gt;</span> a <span style="color: #339933; font-weight: bold;">-&gt;</span> m a
minc <span style="color: #339933; font-weight: bold;">=</span> <span style="font-weight: bold;">return</span><span style="color: #339933; font-weight: bold;">.</span><span style="color: green;">&#40;</span><span style="color: red;">1</span><span style="color: #339933; font-weight: bold;">+</span><span style="color: green;">&#41;</span>
&nbsp;
<span style="color: #5d478b; font-style: italic;">-- Utilisation de do.</span>
&nbsp;
mcomplex <span style="color: #339933; font-weight: bold;">::</span> <span style="color: green;">&#40;</span><span style="color: #cccc00; font-weight: bold;">Monad</span> m<span style="color: #339933; font-weight: bold;">,</span> <span style="color: #cccc00; font-weight: bold;">Num</span> a<span style="color: green;">&#41;</span> <span style="color: #339933; font-weight: bold;">=&gt;</span> m a <span style="color: #339933; font-weight: bold;">-&gt;</span> m a
mcomplex x <span style="color: #339933; font-weight: bold;">=</span> <span style="color: #06c; font-weight: bold;">do</span>
                v <span style="color: #339933; font-weight: bold;">&lt;-</span> x
                <span style="font-weight: bold;">return</span> <span style="color: #339933; font-weight: bold;">$</span> <span style="color: green;">&#40;</span>v<span style="color: #339933; font-weight: bold;">+</span><span style="color: red;">1</span><span style="color: green;">&#41;</span><span style="color: #339933; font-weight: bold;">*</span><span style="color: red;">2</span>
&nbsp;
<span style="color: #5d478b; font-style: italic;">-- En appliquant cette fonction à deux listes, on obtient le produit</span>
<span style="color: #5d478b; font-style: italic;">-- cartésien. Si on l'applique à deux Maybe, on obtient un Maybe.</span>
&nbsp;
mpair <span style="color: #339933; font-weight: bold;">::</span> <span style="color: #cccc00; font-weight: bold;">Monad</span> m <span style="color: #339933; font-weight: bold;">=&gt;</span> m a <span style="color: #339933; font-weight: bold;">-&gt;</span> m b <span style="color: #339933; font-weight: bold;">-&gt;</span> m <span style="color: green;">&#40;</span>a<span style="color: #339933; font-weight: bold;">,</span>b<span style="color: green;">&#41;</span>
mpair x y <span style="color: #339933; font-weight: bold;">=</span> <span style="color: #06c; font-weight: bold;">do</span>
                xx <span style="color: #339933; font-weight: bold;">&lt;-</span> x
                yy <span style="color: #339933; font-weight: bold;">&lt;-</span> y
                <span style="font-weight: bold;">return</span> <span style="color: #339933; font-weight: bold;">$</span> <span style="color: green;">&#40;</span>xx<span style="color: #339933; font-weight: bold;">,</span>yy<span style="color: green;">&#41;</span>
&nbsp;
<span style="color: #5d478b; font-style: italic;">-- Utilisation d'une fonction normale à l'intérieur d'un monad en la</span>
<span style="color: #5d478b; font-style: italic;">-- liftant. Ici, nous avons un exemple avec deux paramètres et avec</span>
<span style="color: #5d478b; font-style: italic;">-- un seul.</span>
&nbsp;
liftm2 <span style="color: #339933; font-weight: bold;">::</span> <span style="color: #cccc00; font-weight: bold;">Monad</span> m <span style="color: #339933; font-weight: bold;">=&gt;</span> <span style="color: green;">&#40;</span>a <span style="color: #339933; font-weight: bold;">-&gt;</span> b <span style="color: #339933; font-weight: bold;">-&gt;</span> c<span style="color: green;">&#41;</span> <span style="color: #339933; font-weight: bold;">-&gt;</span> m a <span style="color: #339933; font-weight: bold;">-&gt;</span> m b <span style="color: #339933; font-weight: bold;">-&gt;</span> m c
liftm2 f x y <span style="color: #339933; font-weight: bold;">=</span> <span style="color: #06c; font-weight: bold;">do</span>
      xx <span style="color: #339933; font-weight: bold;">&lt;-</span> x
      yy <span style="color: #339933; font-weight: bold;">&lt;-</span> y
      <span style="font-weight: bold;">return</span> <span style="color: #339933; font-weight: bold;">$</span> xx `f` yy
&nbsp;
liftm <span style="color: #339933; font-weight: bold;">::</span> <span style="color: #cccc00; font-weight: bold;">Monad</span> m <span style="color: #339933; font-weight: bold;">=&gt;</span> <span style="color: green;">&#40;</span>a <span style="color: #339933; font-weight: bold;">-&gt;</span> b<span style="color: green;">&#41;</span> <span style="color: #339933; font-weight: bold;">-&gt;</span> m a <span style="color: #339933; font-weight: bold;">-&gt;</span> m b
liftm f <span style="color: #339933; font-weight: bold;">=</span> <span style="color: green;">&#40;</span><span style="color: #339933; font-weight: bold;">&gt;&gt;=</span> <span style="font-weight: bold;">return</span><span style="color: #339933; font-weight: bold;">.</span>f<span style="color: green;">&#41;</span>
&nbsp;
<span style="color: #5d478b; font-style: italic;">-- Traduction d'un do en applications successives de &gt;&gt;= et &gt;&gt;.</span>
&nbsp;
toto <span style="color: #339933; font-weight: bold;">=</span> <span style="color: #06c; font-weight: bold;">do</span>
     x <span style="color: #339933; font-weight: bold;">&lt;-</span> <span style="color: green;">&#91;</span><span style="color: red;">1</span><span style="color: #339933; font-weight: bold;">,</span><span style="color: red;">2</span><span style="color: #339933; font-weight: bold;">,</span><span style="color: red;">3</span><span style="color: green;">&#93;</span>
     <span style="font-weight: bold;">return</span> <span style="color: red;">3</span>
     <span style="font-weight: bold;">return</span> <span style="color: green;">&#40;</span>x<span style="color: #339933; font-weight: bold;">*</span><span style="color: red;">2</span><span style="color: green;">&#41;</span>
&nbsp;
<span style="color: #5d478b; font-style: italic;">--[1,2,3] &gt;&gt;= (\x -&gt;</span>
<span style="color: #5d478b; font-style: italic;">--        return 3 &gt;&gt; (return (x*2)))</span>
&nbsp;
<span style="color: #5d478b; font-style: italic;">-- Utilisation du monad IO.</span>
&nbsp;
helloworld <span style="color: #339933; font-weight: bold;">::</span> <span style="color: #cccc00; font-weight: bold;">IO</span> <span style="color: green;">&#40;</span><span style="color: green;">&#41;</span>
helloworld <span style="color: #339933; font-weight: bold;">=</span> <span style="color: #06c; font-weight: bold;">do</span>
           <span style="font-weight: bold;">putStrLn</span> <span style="background-color: #3cb371;">&quot;Hello&quot;</span>
           <span style="font-weight: bold;">putStrLn</span> <span style="background-color: #3cb371;">&quot;World&quot;</span>
&nbsp;
<span style="color: #5d478b; font-style: italic;">-- Répétition deux fois d'une chaîne saisie par l'utilisateur.</span>
&nbsp;
<span style="font-weight: bold;">repeat</span> <span style="color: #339933; font-weight: bold;">::</span> <span style="color: #cccc00; font-weight: bold;">IO</span> <span style="color: green;">&#40;</span><span style="color: green;">&#41;</span>
<span style="font-weight: bold;">repeat</span> <span style="color: #339933; font-weight: bold;">=</span> <span style="color: #06c; font-weight: bold;">do</span>
       s <span style="color: #339933; font-weight: bold;">&lt;-</span> <span style="font-weight: bold;">getLine</span>
       <span style="font-weight: bold;">putStrLn</span> s
       <span style="font-weight: bold;">putStrLn</span> s
&nbsp;
<span style="color: #5d478b; font-style: italic;">-- Exemple de structure avec création de fonction automatique</span>
<span style="color: #5d478b; font-style: italic;">-- permettant d'extraire les données.</span>
&nbsp;
<span style="color: #06c; font-weight: bold;">data</span> Person <span style="color: #339933; font-weight: bold;">=</span> Person <span style="color: green;">&#123;</span> first <span style="color: #339933; font-weight: bold;">::</span> <span style="color: #cccc00; font-weight: bold;">String</span><span style="color: #339933; font-weight: bold;">,</span>
                       <span style="font-weight: bold;">last</span> <span style="color: #339933; font-weight: bold;">::</span> <span style="color: #cccc00; font-weight: bold;">String</span> <span style="color: green;">&#125;</span>
                       <span style="color: #06c; font-weight: bold;">deriving</span> <span style="color: green;">&#40;</span><span style="color: #cccc00; font-weight: bold;">Show</span><span style="color: green;">&#41;</span>
&nbsp;
<span style="color: #5d478b; font-style: italic;">-- State monad. On veut garder un état implicite tout en manipulant</span>
<span style="color: #5d478b; font-style: italic;">-- le contenu du monad avec les fonctions monadiques traditionnelles.</span>
&nbsp;
<span style="color: #06c; font-weight: bold;">data</span> SM s a <span style="color: #339933; font-weight: bold;">=</span> SM <span style="color: green;">&#123;</span>runSM <span style="color: #339933; font-weight: bold;">::</span> s <span style="color: #339933; font-weight: bold;">-&gt;</span> <span style="color: green;">&#40;</span>s<span style="color: #339933; font-weight: bold;">,</span>a<span style="color: green;">&#41;</span><span style="color: green;">&#125;</span>
&nbsp;
<span style="color: #5d478b; font-style: italic;">-- Bien entendu, le state monad est un monad.</span>
&nbsp;
<span style="color: #06c; font-weight: bold;">instance</span> <span style="color: #cccc00; font-weight: bold;">Monad</span> <span style="color: green;">&#40;</span>SM s<span style="color: green;">&#41;</span> <span style="color: #06c; font-weight: bold;">where</span>
         <span style="font-weight: bold;">return</span> a <span style="color: #339933; font-weight: bold;">=</span> SM <span style="color: #339933; font-weight: bold;">$</span> \s <span style="color: #339933; font-weight: bold;">-&gt;</span> <span style="color: green;">&#40;</span>s<span style="color: #339933; font-weight: bold;">,</span>a<span style="color: green;">&#41;</span>
         <span style="color: green;">&#40;</span>SM x<span style="color: green;">&#41;</span> <span style="color: #339933; font-weight: bold;">&gt;&gt;=</span> f <span style="color: #339933; font-weight: bold;">=</span> SM <span style="color: #339933; font-weight: bold;">$</span> \ s <span style="color: #339933; font-weight: bold;">-&gt;</span>
                           <span style="color: #06c; font-weight: bold;">let</span> <span style="color: green;">&#40;</span>s'<span style="color: #339933; font-weight: bold;">,</span> r<span style="color: green;">&#41;</span> <span style="color: #339933; font-weight: bold;">=</span> x s
                               <span style="color: green;">&#40;</span>s''<span style="color: #339933; font-weight: bold;">,</span> r'<span style="color: green;">&#41;</span> <span style="color: #339933; font-weight: bold;">=</span> runSM <span style="color: green;">&#40;</span>f r<span style="color: green;">&#41;</span> s'
                           <span style="color: #06c; font-weight: bold;">in</span> <span style="color: green;">&#40;</span>s''<span style="color: #339933; font-weight: bold;">,</span> r'<span style="color: green;">&#41;</span>
&nbsp;
<span style="color: #5d478b; font-style: italic;">-- Récupération du contenu de l'état en le liftant dans le monad.</span>
&nbsp;
get <span style="color: #339933; font-weight: bold;">::</span> SM s s
get <span style="color: #339933; font-weight: bold;">=</span> SM <span style="color: #339933; font-weight: bold;">$</span> \s <span style="color: #339933; font-weight: bold;">-&gt;</span> <span style="color: green;">&#40;</span>s<span style="color: #339933; font-weight: bold;">,</span>s<span style="color: green;">&#41;</span>
&nbsp;
<span style="color: #5d478b; font-style: italic;">-- Remplacement de l'état en ignorant l'état initial.</span>
&nbsp;
put <span style="color: #339933; font-weight: bold;">::</span> s <span style="color: #339933; font-weight: bold;">-&gt;</span> SM s <span style="color: green;">&#40;</span><span style="color: green;">&#41;</span>
put s <span style="color: #339933; font-weight: bold;">=</span> SM <span style="color: #339933; font-weight: bold;">$</span> \<span style="color: #339933; font-weight: bold;">_</span> <span style="color: #339933; font-weight: bold;">-&gt;</span> <span style="color: green;">&#40;</span>s<span style="color: #339933; font-weight: bold;">,</span> <span style="color: green;">&#40;</span><span style="color: green;">&#41;</span><span style="color: green;">&#41;</span>
&nbsp;
<span style="color: #5d478b; font-style: italic;">-- Modification de l'état. C'est équivalent à</span>
&nbsp;
<span style="color: #5d478b; font-style: italic;">--    change f = do</span>
<span style="color: #5d478b; font-style: italic;">--                 v &lt;- get</span>
<span style="color: #5d478b; font-style: italic;">--                 put $ f v</span>
&nbsp;
<span style="color: #5d478b; font-style: italic;">-- mais l'écriture avec &gt;&gt;= est plis simple et plus lisible.</span>
&nbsp;
change <span style="color: #339933; font-weight: bold;">::</span> <span style="color: green;">&#40;</span>s <span style="color: #339933; font-weight: bold;">-&gt;</span> s<span style="color: green;">&#41;</span> <span style="color: #339933; font-weight: bold;">-&gt;</span> SM s <span style="color: green;">&#40;</span><span style="color: green;">&#41;</span>
change f <span style="color: #339933; font-weight: bold;">=</span> get <span style="color: #339933; font-weight: bold;">&gt;&gt;=</span> <span style="color: green;">&#40;</span>put<span style="color: #339933; font-weight: bold;">.</span>f<span style="color: green;">&#41;</span>
&nbsp;
<span style="color: #5d478b; font-style: italic;">-- Exemple d'une fonction factorielle qui ajoute à un état</span>
<span style="color: #5d478b; font-style: italic;">-- numérique le nombre de multiplications effectuées.</span>
&nbsp;
fact' <span style="color: #339933; font-weight: bold;">::</span> <span style="color: green;">&#40;</span><span style="color: #cccc00; font-weight: bold;">Num</span> t<span style="color: #339933; font-weight: bold;">,</span> <span style="color: #cccc00; font-weight: bold;">Ord</span> t<span style="color: green;">&#41;</span> <span style="color: #339933; font-weight: bold;">=&gt;</span> t <span style="color: #339933; font-weight: bold;">-&gt;</span> SM <span style="color: #cccc00; font-weight: bold;">Int</span> t
fact' n <span style="color: #339933; font-weight: bold;">=</span> <span style="color: #06c; font-weight: bold;">if</span> n <span style="color: #339933; font-weight: bold;">&lt;</span> <span style="color: red;">3</span>
          <span style="color: #06c; font-weight: bold;">then</span> <span style="font-weight: bold;">return</span> n
           <span style="color: #06c; font-weight: bold;">else</span> <span style="color: #06c; font-weight: bold;">do</span>
               temp <span style="color: #339933; font-weight: bold;">&lt;-</span> fact' <span style="color: #339933; font-weight: bold;">$</span> n<span style="color: #339933; font-weight: bold;">-</span><span style="color: red;">1</span>
               change <span style="color: green;">&#40;</span><span style="color: #339933; font-weight: bold;">+</span><span style="color: red;">1</span><span style="color: green;">&#41;</span>
               <span style="font-weight: bold;">return</span> <span style="color: #339933; font-weight: bold;">$</span> n <span style="color: #339933; font-weight: bold;">*</span> temp
&nbsp;
<span style="color: #5d478b; font-style: italic;">-- Extraction de l'état.</span>
&nbsp;
state <span style="color: #339933; font-weight: bold;">::</span> SM s a <span style="color: #339933; font-weight: bold;">-&gt;</span> s <span style="color: #339933; font-weight: bold;">-&gt;</span> s
state m i <span style="color: #339933; font-weight: bold;">=</span> <span style="font-weight: bold;">fst</span> <span style="color: #339933; font-weight: bold;">$</span> runSM m i
&nbsp;
<span style="color: #5d478b; font-style: italic;">-- Extraction du contenu.</span>
&nbsp;
content <span style="color: #339933; font-weight: bold;">::</span> SM s a <span style="color: #339933; font-weight: bold;">-&gt;</span> s <span style="color: #339933; font-weight: bold;">-&gt;</span> a
content m i <span style="color: #339933; font-weight: bold;">=</span> <span style="font-weight: bold;">snd</span> <span style="color: #339933; font-weight: bold;">$</span> runSM m i
&nbsp;
<span style="color: #5d478b; font-style: italic;">-- Illustration de let, where et de la différence de scoping entre</span>
<span style="color: #5d478b; font-style: italic;">-- les deux.</span>
&nbsp;
ff x <span style="color: #339933; font-weight: bold;">=</span> <span style="color: #06c; font-weight: bold;">let</span> y <span style="color: #339933; font-weight: bold;">=</span> x<span style="color: #339933; font-weight: bold;">+</span><span style="color: red;">1</span>
       <span style="color: #06c; font-weight: bold;">in</span> y <span style="color: #339933; font-weight: bold;">*</span> <span style="color: red;">2</span>
&nbsp;
gg x <span style="color: #339933; font-weight: bold;">=</span> y <span style="color: #339933; font-weight: bold;">*</span> <span style="color: red;">2</span>
       <span style="color: #06c; font-weight: bold;">where</span> y <span style="color: #339933; font-weight: bold;">=</span> x<span style="color: #339933; font-weight: bold;">+</span><span style="color: red;">1</span>
&nbsp;
hh x <span style="color: #339933; font-weight: bold;">|</span> x <span style="color: #339933; font-weight: bold;">&gt;=</span> <span style="color: red;">3</span> <span style="color: #339933; font-weight: bold;">=</span> x <span style="color: #339933; font-weight: bold;">*</span> temp
     <span style="color: #339933; font-weight: bold;">|</span> <span style="font-weight: bold;">otherwise</span> <span style="color: #339933; font-weight: bold;">=</span> <span style="font-weight: bold;">seq</span> temp x
    <span style="color: #06c; font-weight: bold;">where</span> temp <span style="color: #339933; font-weight: bold;">=</span> hh <span style="color: green;">&#40;</span>x<span style="color: #339933; font-weight: bold;">-</span><span style="color: red;">1</span><span style="color: green;">&#41;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.rfc1149.net/plnc2010/2010/06/24/haskell-notes-de-cours-1-23-juin-2010/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Factor : TD 2</title>
		<link>http://www.rfc1149.net/plnc2010/2010/06/18/factor-td-2/</link>
		<comments>http://www.rfc1149.net/plnc2010/2010/06/18/factor-td-2/#comments</comments>
		<pubDate>Fri, 18 Jun 2010 11:30:16 +0000</pubDate>
		<dc:creator>Samuel Tardieu</dc:creator>
				<category><![CDATA[TD]]></category>
		<category><![CDATA[Factor]]></category>

		<guid isPermaLink="false">http://www.rfc1149.net/plnc2010/?p=107</guid>
		<description><![CDATA[<p>Aujourd&#8217;hui, nous allons nous intéresser au client IRC de Factor ainsi qu&#8217;à ses possibilités d&#8217;analyser des expressions selon une grammaire EBNF.</p>
Client IRC
<p>En s&#8217;inspirant de la documentation du client de chat IRC, créez un client qui :</p>

se connecte sur le serveur &#8220;irc.freenode.net&#8221; et rejoins le channel &#8220;#inf355&#8243; ;
récupère les messages envoyés sur le channel et puisse [...]]]></description>
			<content:encoded><![CDATA[<p>Aujourd&#8217;hui, nous allons nous intéresser au client <a href="http://fr.wikipedia.org/wiki/Irc">IRC</a> de Factor ainsi qu&#8217;à ses possibilités d&#8217;analyser des expressions selon une grammaire <a href="http://fr.wikipedia.org/wiki/EBNF">EBNF</a>.</p>
<h2>Client IRC</h2>
<p>En s&#8217;inspirant de la <a href="http://docs.factorcode.org/content/article-irc.client.html">documentation du client de chat IRC</a>, créez un client qui :</p>
<ul>
<li>se connecte sur le serveur &#8220;irc.freenode.net&#8221; et rejoins le channel &#8220;#inf355&#8243; ;</li>
<li>récupère les messages envoyés sur le channel et puisse réagir à ces messages ;</li>
<li>salue les gens qui rejoignent le channel en envoyant &#8220;Bienvenue XXX&#8221; où XXX est le pseudonyme (<em>nickname</em>) du nouvel arrivant ;</li>
<li>répondre &#8220;Pong XXX&#8221; à celui qui envoie &#8220;Ping&#8221; sur le channel.</li>
</ul>
<p>Vous éviterez d&#8217;utiliser des variables nommées (qu&#8217;elles soient locales ou dynamiquement scopées). La pile est largement suffisante pour cette utilisation.</p>
<p>Vérifiez que vous pouvez ajouter des fonctionalités au client connecté au serveur sans couper la connexion. Idéalement, un client ne devrait jamais se déconnecter une fois connecté. Vous pourrez notamment intercepter les exceptions liées au traitement des messages (s&#8217;il y en a) et afficher un message d&#8217;erreur sur le terminal et continuer le traitement plutôt que de laisser le client se déconnecter.</p>
<p>Pour dialoguer avec votre robot, vous devrez également vous connecter sur IRC. Vous pouvez utiliser <a href="http://fr.wikipedia.org/wiki/Liste_de_clients_IRC">un de ces clients</a> (j&#8217;utilise WeeChat pour ma part).</p>
<h2>Grammaire EBNF</h2>
<p>En vous inspirant de la <a href="http://docs.factorcode.org/content/article-peg.ebnf.html">documentation des grammaires EBNF disponibles en Factor</a>, créez une grammaire permettant à votre robot IRC de répondre à certaines requêtes provenant du channel IRC.<br />
Votre robot devra notamment être en mesure de répondre aux questions suivantes :</p>
<ul>
<li>&#8220;Quelle est la factorielle de NNN ?&#8221; où NNN est un nombre.</li>
<li>&#8220;Comment t&#8217;appelles-tu ?&#8221;</li>
<li>&#8220;Quel est mon pseudo ?&#8221; ou &#8220;Quel est mon nick ?&#8221;</li>
<li>&#8220;Quelle est la somme de MMM et NNN multipliée par OOO ?&#8221; où MMM, NNN et OOO sont des nombres. On reconnaître également &#8220;le produit de&#8221;, &#8220;ajouté à&#8221;, &#8220;à laquelle on soustrait&#8221;, &#8220;auquel on soustrait&#8221;, etc.</li>
<li>&#8220;Calcule 1+2*3-(7+10)&#8221; ou n&#8217;importe quelle expression mathématique parenthésée</li>
</ul>
<p>Toutes ces fonctionalités devront être implémentées dans un vocabulaire séparé et testées avec des tests unitaires.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rfc1149.net/plnc2010/2010/06/18/factor-td-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Factor : cours 2 (16 juin 2010)</title>
		<link>http://www.rfc1149.net/plnc2010/2010/06/18/factor-cours-2-16-juin-2010/</link>
		<comments>http://www.rfc1149.net/plnc2010/2010/06/18/factor-cours-2-16-juin-2010/#comments</comments>
		<pubDate>Fri, 18 Jun 2010 09:05:54 +0000</pubDate>
		<dc:creator>Samuel Tardieu</dc:creator>
				<category><![CDATA[Cours]]></category>
		<category><![CDATA[Factor]]></category>

		<guid isPermaLink="false">http://www.rfc1149.net/plnc2010/?p=103</guid>
		<description><![CDATA[ 
pre.code {
	border:1px dashed #ccc;
	background-color:#f5f5f5;
	padding:5px;
	font-size:150%;
	color:#000000;
}</p>
<p>.NULL {
color: #000000;
}
.COMMENT1 {
color: #cc0000;
}
.COMMENT2 {
color: #ff8400;
}
.COMMENT3 {
color: #6600cc;
}
.COMMENT4 {
color: #cc6600;
}
.DIGIT {
color: #ff0000;
}
.FUNCTION {
color: #9966ff;
}
.INVALID {
background: #ffffcc;
color: #ff0066;
}
.KEYWORD1 {
color: #006699;
font-weight: bold;
}
.KEYWORD2 {
color: #009966;
font-weight: bold;
}
.KEYWORD3 {
color: #0099ff;
font-weight: bold;
}
.KEYWORD4 {
color: #66ccff;
font-weight: bold;
}
.LABEL {
color: #02b902;
}
.LITERAL1 {
color: #ff00cc;
}
.LITERAL2 {
color: #cc00cc;
}
.LITERAL3 {
color: #9900cc;
}
.LITERAL4 {
color: #6600cc;
}
.MARKUP {
color: #0000ff;
}
.OPERATOR {
color: #000000;
font-weight: bold;
}</p>
<p>body, button {
	font:9pt "Lucida Grande", "Lucida Sans [...]]]></description>
			<content:encoded><![CDATA[<style type="text/css"> 
pre.code {
	border:1px dashed #ccc;
	background-color:#f5f5f5;
	padding:5px;
	font-size:150%;
	color:#000000;
}</p>
<p>.NULL {
color: #000000;
}
.COMMENT1 {
color: #cc0000;
}
.COMMENT2 {
color: #ff8400;
}
.COMMENT3 {
color: #6600cc;
}
.COMMENT4 {
color: #cc6600;
}
.DIGIT {
color: #ff0000;
}
.FUNCTION {
color: #9966ff;
}
.INVALID {
background: #ffffcc;
color: #ff0066;
}
.KEYWORD1 {
color: #006699;
font-weight: bold;
}
.KEYWORD2 {
color: #009966;
font-weight: bold;
}
.KEYWORD3 {
color: #0099ff;
font-weight: bold;
}
.KEYWORD4 {
color: #66ccff;
font-weight: bold;
}
.LABEL {
color: #02b902;
}
.LITERAL1 {
color: #ff00cc;
}
.LITERAL2 {
color: #cc00cc;
}
.LITERAL3 {
color: #9900cc;
}
.LITERAL4 {
color: #6600cc;
}
.MARKUP {
color: #0000ff;
}
.OPERATOR {
color: #000000;
font-weight: bold;
}</p>
<p>body, button {
	font:9pt "Lucida Grande", "Lucida Sans Unicode", verdana, geneva, sans-serif;
	color:#444;
}</p>
<p>.link-button {
	padding: 0px;
	background: none;
	border: none;
}</p>
<p>a:link, a:visited, .link {
	color: #222;
	border-bottom:1px dotted #666;
	text-decoration:none;
}</p>
<p>a:hover, .link:hover {
	border-bottom:1px solid #66a;
}</p>
<p>.error { color: #a00; }</p>
<p>.errors li { color: #a00; }</p>
<p>.field-label {
	text-align: right;
}</p>
<p>.inline {
	display: inline;
}</p>
<p>.navbar {
	background-color: #eeeee0;
	padding: 5px;
	border: 1px solid #ccc;
}</p>
<p>.big-field-label {
	vertical-align: top;
}</p>
<p>.description {
	padding: 5px;
	color: #000;
}</p>
<p>.description pre {
	border: 1px dashed #ccc;
	background-color: #f5f5f5;
}</p>
<p>.description p:first-child {
	margin-top: 0px;
}</p>
<p>.description p:last-child {
	margin-bottom: 0px;
}</p>
<p>.description table, .description td {
    border-color: #666;
    border-style: solid;
}</p>
<p>.description table {
    border-width: 0 0 1px 1px;
    border-spacing: 0;
    border-collapse: collapse;
}</p>
<p>.description td {
    margin: 0;
    padding: 4px;
    border-width: 1px 1px 0 0;
}</p>
</style>
<pre class="description"><span class="MARKUP">IN: inf355.cours2</span>
<span class="MARKUP">USING: </span><span class="LITERAL2">accessors</span><span class="LITERAL2"> </span><span class="LITERAL2">arrays</span><span class="LITERAL2"> </span><span class="LITERAL2">assocs</span><span class="LITERAL2"> </span><span class="LITERAL2">combinators.smart</span><span class="LITERAL2"> </span><span class="LITERAL2">continuations</span>
<span class="LITERAL2"> </span><span class="LITERAL2"> </span><span class="LITERAL2"> </span><span class="LITERAL2"> </span><span class="LITERAL2"> </span><span class="LITERAL2"> </span><span class="LITERAL2"> </span><span class="LITERAL2">destructors</span><span class="LITERAL2"> </span><span class="LITERAL2">fry</span><span class="LITERAL2"> </span><span class="LITERAL2">infix</span><span class="LITERAL2"> </span><span class="LITERAL2">io</span><span class="LITERAL2"> </span><span class="LITERAL2">kernel</span><span class="LITERAL2"> </span><span class="LITERAL2">locals</span><span class="LITERAL2"> </span><span class="LITERAL2">make</span><span class="LITERAL2"> </span><span class="LITERAL2">math</span><span class="LITERAL2"> </span><span class="LITERAL2">namespaces</span>
<span class="LITERAL2"> </span><span class="LITERAL2"> </span><span class="LITERAL2"> </span><span class="LITERAL2"> </span><span class="LITERAL2"> </span><span class="LITERAL2"> </span><span class="LITERAL2"> </span><span class="LITERAL2">sequences</span><span class="LITERAL2"> </span><span class="MARKUP">;</span>

<span class="COMMENT1">! </span><span class="COMMENT1">"call("</span><span class="COMMENT1"> </span><span class="COMMENT1">and</span><span class="COMMENT1"> </span><span class="COMMENT1">"fry"</span><span class="COMMENT1"> </span><span class="COMMENT1">illustration.</span>

TUPLE: demo quot <span class="MARKUP">;</span>

<span class="MARKUP">: call-demo</span> <span class="COMMENT3">( </span><span class="COMMENT4">demo</span><span class="COMMENT4"> </span><span class="COMMENT3">--</span><span class="COMMENT4"> </span><span class="COMMENT4">v</span><span class="COMMENT4"> </span><span class="COMMENT3">)</span>
    quot&gt;&gt; call<span class="COMMENT3">( </span><span class="COMMENT3">--</span><span class="COMMENT4"> </span><span class="COMMENT4">x</span><span class="COMMENT4"> </span><span class="COMMENT3">)</span> <span class="MARKUP">;</span>

<span class="MARKUP">: add-gen</span> <span class="COMMENT3">( </span><span class="COMMENT4">a</span><span class="COMMENT4"> </span><span class="COMMENT4">b</span><span class="COMMENT4"> </span><span class="COMMENT4">c</span><span class="COMMENT4"> </span><span class="COMMENT3">--</span><span class="COMMENT4"> </span><span class="COMMENT4">quot</span><span class="COMMENT4"> </span><span class="COMMENT3">)</span>
    <span class="OPERATOR">[</span> <span class="OPERATOR">[</span> + <span class="OPERATOR">]</span> 2curry <span class="OPERATOR">]</span>
    <span class="OPERATOR">[</span> <span class="OPERATOR">[</span> - <span class="OPERATOR">]</span> curry <span class="OPERATOR">]</span> bi* compose <span class="MARKUP">;</span>

<span class="MARKUP">: add-gen2</span> <span class="COMMENT3">( </span><span class="COMMENT4">a</span><span class="COMMENT4"> </span><span class="COMMENT4">b</span><span class="COMMENT4"> </span><span class="COMMENT4">c</span><span class="COMMENT4"> </span><span class="COMMENT4">d</span><span class="COMMENT4"> </span><span class="COMMENT3">--</span><span class="COMMENT4"> </span><span class="COMMENT4">quot</span><span class="COMMENT4"> </span><span class="COMMENT3">)</span>
    '<span class="OPERATOR">[</span> _ _ + _ @ <span class="OPERATOR">]</span> <span class="MARKUP">;</span>

<span class="COMMENT1">! </span><span class="COMMENT1">Local</span><span class="COMMENT1"> </span><span class="COMMENT1">variables</span><span class="COMMENT1"> </span><span class="COMMENT1">and</span><span class="COMMENT1"> </span><span class="COMMENT1">infix</span><span class="COMMENT1"> </span><span class="COMMENT1">syntax.</span><span class="COMMENT1"> </span><span class="COMMENT1">Most</span><span class="COMMENT1"> </span><span class="COMMENT1">of</span><span class="COMMENT1"> </span><span class="COMMENT1">the</span><span class="COMMENT1"> </span><span class="COMMENT1">time,</span><span class="COMMENT1"> </span><span class="COMMENT1">none</span><span class="COMMENT1"> </span><span class="COMMENT1">of</span><span class="COMMENT1"> </span><span class="COMMENT1">them</span><span class="COMMENT1"> </span><span class="COMMENT1">is</span>
<span class="COMMENT1">! </span><span class="COMMENT1">needed,</span><span class="COMMENT1"> </span><span class="COMMENT1">but</span><span class="COMMENT1"> </span><span class="COMMENT1">in</span><span class="COMMENT1"> </span><span class="COMMENT1">some</span><span class="COMMENT1"> </span><span class="COMMENT1">cases</span><span class="COMMENT1"> </span><span class="COMMENT1">in</span><span class="COMMENT1"> </span><span class="COMMENT1">may</span><span class="COMMENT1"> </span><span class="COMMENT1">make</span><span class="COMMENT1"> </span><span class="COMMENT1">the</span><span class="COMMENT1"> </span><span class="COMMENT1">code</span><span class="COMMENT1"> </span><span class="COMMENT1">clearer</span><span class="COMMENT1"> </span><span class="COMMENT1">(e.g.,</span><span class="COMMENT1"> </span><span class="COMMENT1">when</span>
<span class="COMMENT1">! </span><span class="COMMENT1">complex</span><span class="COMMENT1"> </span><span class="COMMENT1">mathematical</span><span class="COMMENT1"> </span><span class="COMMENT1">formulas</span><span class="COMMENT1"> </span><span class="COMMENT1">are</span><span class="COMMENT1"> </span><span class="COMMENT1">involved).</span>

SYMBOL: myvar

<span class="MARKUP">:: delta</span> <span class="COMMENT3">( </span><span class="COMMENT4">a</span><span class="COMMENT4"> </span><span class="COMMENT4">b</span><span class="COMMENT4"> </span><span class="COMMENT4">c</span><span class="COMMENT4"> </span><span class="COMMENT3">--</span><span class="COMMENT4"> </span><span class="COMMENT4">d</span><span class="COMMENT4"> </span><span class="COMMENT3">)</span>
    b b * a c * <span class="DIGIT">4</span> * - <span class="MARKUP">;</span>

<span class="MARKUP">:: delta2</span> <span class="COMMENT3">( </span><span class="COMMENT4">a</span><span class="COMMENT4"> </span><span class="COMMENT4">b</span><span class="COMMENT4"> </span><span class="COMMENT4">c</span><span class="COMMENT4"> </span><span class="COMMENT3">--</span><span class="COMMENT4"> </span><span class="COMMENT4">d</span><span class="COMMENT4"> </span><span class="COMMENT3">)</span>
    <span class="OPERATOR">[</span>infix sq(b)-4*a*c infix<span class="OPERATOR">]</span> <span class="MARKUP">;</span>

<span class="MARKUP">:: delta3</span> <span class="COMMENT3">( </span><span class="COMMENT4">a</span><span class="COMMENT4"> </span><span class="COMMENT4">b</span><span class="COMMENT4"> </span><span class="COMMENT4">c</span><span class="COMMENT4"> </span><span class="COMMENT3">--</span><span class="COMMENT4"> </span><span class="COMMENT4">d</span><span class="COMMENT4"> </span><span class="COMMENT3">)</span>
    a b c 3array :&gt; tab
    <span class="OPERATOR">[</span>infix sq(tab<span class="OPERATOR">[</span><span class="DIGIT">1</span><span class="OPERATOR">]</span>)-4*tab<span class="OPERATOR">[</span><span class="DIGIT">0</span><span class="OPERATOR">]</span>*tab<span class="OPERATOR">[</span><span class="DIGIT">2</span><span class="OPERATOR">]</span> infix<span class="OPERATOR">]</span> <span class="MARKUP">;</span>

<span class="MARKUP">:: example1</span> <span class="COMMENT3">( </span><span class="COMMENT4">a</span><span class="COMMENT4"> </span><span class="COMMENT4">b</span><span class="COMMENT4"> </span><span class="COMMENT3">--</span><span class="COMMENT4"> </span><span class="COMMENT4">c</span><span class="COMMENT4"> </span><span class="COMMENT4">d</span><span class="COMMENT4"> </span><span class="COMMENT3">)</span>
    a b :&gt; <span class="COMMENT3">( </span><span class="COMMENT4">c</span><span class="COMMENT4"> </span><span class="COMMENT4">d</span><span class="COMMENT4"> </span><span class="COMMENT3">)</span> c d <span class="MARKUP">;</span>

<span class="MARKUP">: example2</span> <span class="COMMENT3">( </span><span class="COMMENT4">a</span><span class="COMMENT4"> </span><span class="COMMENT4">b</span><span class="COMMENT4"> </span><span class="COMMENT3">--</span><span class="COMMENT4"> </span><span class="COMMENT4">c</span><span class="COMMENT4"> </span><span class="COMMENT3">)</span>
    <span class="OPERATOR">[</span>let :&gt; a :&gt; b a b + <span class="OPERATOR">]</span> <span class="MARKUP">;</span>

<span class="MARKUP">: example3</span> <span class="COMMENT3">( </span><span class="COMMENT4">a</span><span class="COMMENT4"> </span><span class="COMMENT4">b</span><span class="COMMENT4"> </span><span class="COMMENT3">--</span><span class="COMMENT4"> </span><span class="COMMENT4">c</span><span class="COMMENT4"> </span><span class="COMMENT3">)</span>
    <span class="OPERATOR">[</span>let :&gt; a a + <span class="OPERATOR">]</span> <span class="MARKUP">;</span>

<span class="MARKUP">: delta4</span> <span class="COMMENT3">( </span><span class="COMMENT4">a</span><span class="COMMENT4"> </span><span class="COMMENT4">b</span><span class="COMMENT4"> </span><span class="COMMENT4">c</span><span class="COMMENT4"> </span><span class="COMMENT3">--</span><span class="COMMENT4"> </span><span class="COMMENT4">d</span><span class="COMMENT4"> </span><span class="COMMENT3">)</span>
    swapd <span class="OPERATOR">[</span> sq <span class="OPERATOR">]</span> <span class="OPERATOR">[</span> <span class="DIGIT">4</span> * <span class="OPERATOR">]</span> <span class="OPERATOR">[</span> * - <span class="OPERATOR">]</span> tri* <span class="MARKUP">;</span>

<span class="COMMENT1">! </span><span class="COMMENT1">Destructors</span><span class="COMMENT1"> </span><span class="COMMENT1">and</span><span class="COMMENT1"> </span><span class="COMMENT1">object</span><span class="COMMENT1"> </span><span class="COMMENT1">disposal.</span><span class="COMMENT1"> </span><span class="COMMENT1">You</span><span class="COMMENT1"> </span><span class="COMMENT1">can</span><span class="COMMENT1"> </span><span class="COMMENT1">compare</span><span class="COMMENT1"> </span><span class="COMMENT1">what</span><span class="COMMENT1"> </span><span class="COMMENT1">happens</span><span class="COMMENT1"> </span><span class="COMMENT1">when</span>
<span class="COMMENT1">! </span><span class="COMMENT1">you</span><span class="COMMENT1"> </span><span class="COMMENT1">raise</span><span class="COMMENT1"> </span><span class="COMMENT1">an</span><span class="COMMENT1"> </span><span class="COMMENT1">exception</span><span class="COMMENT1"> </span><span class="COMMENT1">in</span><span class="COMMENT1"> </span><span class="COMMENT1">"test-dispose"</span><span class="COMMENT1"> </span><span class="COMMENT1">quotation.</span>

TUPLE: myclass &lt; disposable <span class="MARKUP">;</span>

M: myclass dispose*
    drop <span class="LITERAL1">"</span><span class="LITERAL1">Object</span><span class="LITERAL1"> </span><span class="LITERAL1">disposal</span><span class="LITERAL1">"</span> print <span class="MARKUP">;</span>

<span class="MARKUP">: test-dispose</span> <span class="COMMENT3">( </span><span class="COMMENT3">--</span><span class="COMMENT4"> </span><span class="COMMENT4">obj</span><span class="COMMENT4"> </span><span class="COMMENT3">)</span>
    myclass new-disposable
    <span class="OPERATOR">[</span> |dispose <span class="LITERAL1">"</span><span class="LITERAL1">Code</span><span class="LITERAL1"> </span><span class="LITERAL1">execution</span><span class="LITERAL1">"</span> print <span class="OPERATOR">]</span> with-destructors
    <span class="LITERAL1">"</span><span class="LITERAL1">End</span><span class="LITERAL1"> </span><span class="LITERAL1">of</span><span class="LITERAL1"> </span><span class="LITERAL1">code</span><span class="LITERAL1"> </span><span class="LITERAL1">execution</span><span class="LITERAL1">"</span> print
    <span class="MARKUP">;</span>

<span class="COMMENT1">! </span><span class="COMMENT1">Let's</span><span class="COMMENT1"> </span><span class="COMMENT1">implement</span><span class="COMMENT1"> </span><span class="COMMENT1">Haskell</span><span class="COMMENT1"> </span><span class="COMMENT1">like</span><span class="COMMENT1"> </span><span class="COMMENT1">monads</span><span class="COMMENT1"> </span><span class="COMMENT1">in</span><span class="COMMENT1"> </span><span class="COMMENT1">Factor.</span><span class="COMMENT1"> </span><span class="COMMENT1">Note</span><span class="COMMENT1"> </span><span class="COMMENT1">for</span><span class="COMMENT1"> </span><span class="COMMENT1">the</span><span class="COMMENT1"> </span><span class="COMMENT1">readers:</span>
<span class="COMMENT1">! </span><span class="COMMENT1">this</span><span class="COMMENT1"> </span><span class="COMMENT1">has</span><span class="COMMENT1"> </span><span class="COMMENT1">been</span><span class="COMMENT1"> </span><span class="COMMENT1">done</span><span class="COMMENT1"> </span><span class="COMMENT1">live</span><span class="COMMENT1"> </span><span class="COMMENT1">in</span><span class="COMMENT1"> </span><span class="COMMENT1">an</span><span class="COMMENT1"> </span><span class="COMMENT1">interactive</span><span class="COMMENT1"> </span><span class="COMMENT1">class</span><span class="COMMENT1"> </span><span class="COMMENT1">session.</span><span class="COMMENT1"> </span><span class="COMMENT1">This</span><span class="COMMENT1"> </span><span class="COMMENT1">is</span>
<span class="COMMENT1">! </span><span class="COMMENT1">probably</span><span class="COMMENT1"> </span><span class="COMMENT1">not</span><span class="COMMENT1"> </span><span class="COMMENT1">the</span><span class="COMMENT1"> </span><span class="COMMENT1">best</span><span class="COMMENT1"> </span><span class="COMMENT1">way</span><span class="COMMENT1"> </span><span class="COMMENT1">to</span><span class="COMMENT1"> </span><span class="COMMENT1">do</span><span class="COMMENT1"> </span><span class="COMMENT1">it!</span>

MIXIN: monad

<span class="COMMENT1">! </span><span class="COMMENT1">We</span><span class="COMMENT1"> </span><span class="COMMENT1">use</span><span class="COMMENT1"> </span><span class="COMMENT1">a</span><span class="COMMENT1"> </span><span class="COMMENT1">"current-monad"</span><span class="COMMENT1"> </span><span class="COMMENT1">variable</span><span class="COMMENT1"> </span><span class="COMMENT1">to</span><span class="COMMENT1"> </span><span class="COMMENT1">represent</span><span class="COMMENT1"> </span><span class="COMMENT1">the</span><span class="COMMENT1"> </span><span class="COMMENT1">context.</span><span class="COMMENT1"> </span><span class="COMMENT1">It</span><span class="COMMENT1"> </span><span class="COMMENT1">makes</span>
<span class="COMMENT1">! </span><span class="COMMENT1">writing</span><span class="COMMENT1"> </span><span class="COMMENT1">"&gt;&gt;="</span><span class="COMMENT1"> </span><span class="COMMENT1">easier</span><span class="COMMENT1"> </span><span class="COMMENT1">since</span><span class="COMMENT1"> </span><span class="COMMENT1">the</span><span class="COMMENT1"> </span><span class="COMMENT1">monad</span><span class="COMMENT1"> </span><span class="COMMENT1">won't</span><span class="COMMENT1"> </span><span class="COMMENT1">be</span><span class="COMMENT1"> </span><span class="COMMENT1">on</span><span class="COMMENT1"> </span><span class="COMMENT1">the</span><span class="COMMENT1"> </span><span class="COMMENT1">way</span><span class="COMMENT1"> </span><span class="COMMENT1">to</span><span class="COMMENT1"> </span><span class="COMMENT1">deeper</span>
<span class="COMMENT1">! </span><span class="COMMENT1">stack</span><span class="COMMENT1"> </span><span class="COMMENT1">values.</span>

SYMBOL: current-monad

<span class="MARKUP">: with-monad</span> <span class="COMMENT3">( </span><span class="COMMENT4">monad</span><span class="COMMENT4"> </span><span class="COMMENT4">quot</span><span class="COMMENT4"> </span><span class="COMMENT3">--</span><span class="COMMENT4"> </span><span class="COMMENT4">monad</span><span class="COMMENT4"> </span><span class="COMMENT3">)</span>
    <span class="OPERATOR">[</span> current-monad <span class="OPERATOR">]</span> dip <span class="OPERATOR">[</span> current-monad get <span class="OPERATOR">]</span> compose with-variable <span class="MARKUP">;</span> inline

<span class="COMMENT1">! </span><span class="COMMENT1">The</span><span class="COMMENT1"> </span><span class="COMMENT1">three</span><span class="COMMENT1"> </span><span class="COMMENT1">monadic</span><span class="COMMENT1"> </span><span class="COMMENT1">operations</span><span class="COMMENT1"> </span><span class="COMMENT1">we</span><span class="COMMENT1"> </span><span class="COMMENT1">will</span><span class="COMMENT1"> </span><span class="COMMENT1">use</span><span class="COMMENT1"> </span><span class="COMMENT1">are</span><span class="COMMENT1"> </span><span class="COMMENT1">"fail",</span><span class="COMMENT1"> </span><span class="COMMENT1">"return"</span><span class="COMMENT1"> </span><span class="COMMENT1">and</span>
<span class="COMMENT1">! </span><span class="COMMENT1">"&gt;&gt;="</span><span class="COMMENT1"> </span><span class="COMMENT1">(bind).</span><span class="COMMENT1"> </span><span class="COMMENT1">Those</span><span class="COMMENT1"> </span><span class="COMMENT1">will</span><span class="COMMENT1"> </span><span class="COMMENT1">call</span><span class="COMMENT1"> </span><span class="COMMENT1">generic</span><span class="COMMENT1"> </span><span class="COMMENT1">words</span><span class="COMMENT1"> </span><span class="COMMENT1">that</span><span class="COMMENT1"> </span><span class="COMMENT1">can</span><span class="COMMENT1"> </span><span class="COMMENT1">be</span><span class="COMMENT1"> </span><span class="COMMENT1">overriden</span>
<span class="COMMENT1">! </span><span class="COMMENT1">for</span><span class="COMMENT1"> </span><span class="COMMENT1">individual</span><span class="COMMENT1"> </span><span class="COMMENT1">monad</span><span class="COMMENT1"> </span><span class="COMMENT1">classes.</span><span class="COMMENT1"> </span><span class="COMMENT1">The</span><span class="COMMENT1"> </span><span class="COMMENT1">current</span><span class="COMMENT1"> </span><span class="COMMENT1">monad</span><span class="COMMENT1"> </span><span class="COMMENT1">isn't</span><span class="COMMENT1"> </span><span class="COMMENT1">used</span><span class="COMMENT1"> </span><span class="COMMENT1">for</span>
<span class="COMMENT1">! </span><span class="COMMENT1">"fail*"</span><span class="COMMENT1"> </span><span class="COMMENT1">and</span><span class="COMMENT1"> </span><span class="COMMENT1">"return*"</span><span class="COMMENT1"> </span><span class="COMMENT1">but</span><span class="COMMENT1"> </span><span class="COMMENT1">is</span><span class="COMMENT1"> </span><span class="COMMENT1">needed</span><span class="COMMENT1"> </span><span class="COMMENT1">to</span><span class="COMMENT1"> </span><span class="COMMENT1">get</span><span class="COMMENT1"> </span><span class="COMMENT1">proper</span><span class="COMMENT1"> </span><span class="COMMENT1">dispatching.</span>

GENERIC: fail* <span class="COMMENT3">( </span><span class="COMMENT4">monad</span><span class="COMMENT4"> </span><span class="COMMENT3">--</span><span class="COMMENT4"> </span><span class="COMMENT4">monad</span><span class="COMMENT4"> </span><span class="COMMENT3">)</span>
GENERIC: return* <span class="COMMENT3">( </span><span class="COMMENT4">data</span><span class="COMMENT4"> </span><span class="COMMENT4">monad</span><span class="COMMENT4"> </span><span class="COMMENT3">--</span><span class="COMMENT4"> </span><span class="COMMENT4">monad</span><span class="COMMENT4"> </span><span class="COMMENT3">)</span>
GENERIC# &gt;&gt;=* <span class="DIGIT">1</span> <span class="COMMENT3">( </span><span class="COMMENT4">monad</span><span class="COMMENT4"> </span><span class="COMMENT4">quot</span><span class="COMMENT4"> </span><span class="COMMENT3">--</span><span class="COMMENT4"> </span><span class="COMMENT4">monad</span><span class="COMMENT4"> </span><span class="COMMENT3">)</span>

<span class="COMMENT1">! </span><span class="COMMENT1">By</span><span class="COMMENT1"> </span><span class="COMMENT1">default,</span><span class="COMMENT1"> </span><span class="COMMENT1">we</span><span class="COMMENT1"> </span><span class="COMMENT1">may</span><span class="COMMENT1"> </span><span class="COMMENT1">want</span><span class="COMMENT1"> </span><span class="COMMENT1">to</span><span class="COMMENT1"> </span><span class="COMMENT1">have</span><span class="COMMENT1"> </span><span class="COMMENT1">a</span><span class="COMMENT1"> </span><span class="COMMENT1">defaut</span><span class="COMMENT1"> </span><span class="COMMENT1">"fail"</span><span class="COMMENT1"> </span><span class="COMMENT1">behaviour</span><span class="COMMENT1"> </span><span class="COMMENT1">if</span><span class="COMMENT1"> </span><span class="COMMENT1">"fail*"</span><span class="COMMENT1"> </span><span class="COMMENT1">is</span>
<span class="COMMENT1">! </span><span class="COMMENT1">not</span><span class="COMMENT1"> </span><span class="COMMENT1">overriden.</span><span class="COMMENT1"> </span><span class="COMMENT1">However,</span><span class="COMMENT1"> </span><span class="COMMENT1">here</span><span class="COMMENT1"> </span><span class="COMMENT1">we</span><span class="COMMENT1"> </span><span class="COMMENT1">do</span><span class="COMMENT1"> </span><span class="COMMENT1">not</span><span class="COMMENT1"> </span><span class="COMMENT1">want</span><span class="COMMENT1"> </span><span class="COMMENT1">it.</span>

ERROR: failure <span class="MARKUP">;</span>

<span class="COMMENT1">! </span><span class="COMMENT1">M:</span><span class="COMMENT1"> </span><span class="COMMENT1">monad</span><span class="COMMENT1"> </span><span class="COMMENT1">fail*</span><span class="COMMENT1"> </span><span class="COMMENT1">failure</span><span class="COMMENT1"> </span><span class="COMMENT1">;</span>

<span class="MARKUP">: fail</span> <span class="COMMENT3">( </span><span class="COMMENT3">--</span><span class="COMMENT4"> </span><span class="COMMENT3">)</span>
    current-monad <span class="OPERATOR">[</span> fail* <span class="OPERATOR">]</span> change <span class="MARKUP">;</span>

<span class="MARKUP">: return</span> <span class="COMMENT3">( </span><span class="COMMENT4">data</span><span class="COMMENT4"> </span><span class="COMMENT3">--</span><span class="COMMENT4"> </span><span class="COMMENT3">)</span>
    current-monad <span class="OPERATOR">[</span> return* <span class="OPERATOR">]</span> change <span class="MARKUP">;</span>

<span class="MARKUP">:: &gt;&gt;=</span> <span class="COMMENT3">( </span><span class="COMMENT4">quot</span><span class="COMMENT4"> </span><span class="COMMENT3">--</span><span class="COMMENT4"> </span><span class="COMMENT3">)</span>
    current-monad <span class="OPERATOR">[</span> quot &gt;&gt;=* <span class="OPERATOR">]</span> change <span class="MARKUP">;</span>

<span class="COMMENT1">! </span><span class="COMMENT1">Data</span><span class="COMMENT1"> </span><span class="COMMENT1">used</span><span class="COMMENT1"> </span><span class="COMMENT1">for</span><span class="COMMENT1"> </span><span class="COMMENT1">testing.</span>

<span class="MARKUP">: telsdata</span> <span class="COMMENT3">( </span><span class="COMMENT3">--</span><span class="COMMENT4"> </span><span class="COMMENT4">hash</span><span class="COMMENT4"> </span><span class="COMMENT3">)</span>
    H<span class="OPERATOR">{</span> <span class="OPERATOR">{</span> <span class="LITERAL1">"</span><span class="LITERAL1">Sam</span><span class="LITERAL1">"</span> <span class="LITERAL1">"</span><span class="LITERAL1">0661</span><span class="LITERAL1">"</span> <span class="OPERATOR">}</span>
       <span class="OPERATOR">{</span> <span class="LITERAL1">"</span><span class="LITERAL1">Julien</span><span class="LITERAL1">"</span> <span class="LITERAL1">"</span><span class="LITERAL1">0991</span><span class="LITERAL1">"</span> <span class="OPERATOR">}</span> <span class="OPERATOR">}</span> <span class="MARKUP">;</span>

<span class="MARKUP">: tels</span> <span class="COMMENT3">( </span><span class="COMMENT4">name</span><span class="COMMENT4"> </span><span class="COMMENT3">--</span><span class="COMMENT4"> </span><span class="COMMENT3">)</span>
    telsdata at <span class="OPERATOR">[</span> return <span class="OPERATOR">]</span> <span class="OPERATOR">[</span> fail <span class="OPERATOR">]</span> if* <span class="MARKUP">;</span>

<span class="COMMENT1">! </span><span class="COMMENT1">Implementation</span><span class="COMMENT1"> </span><span class="COMMENT1">of</span><span class="COMMENT1"> </span><span class="COMMENT1">the</span><span class="COMMENT1"> </span><span class="COMMENT1">"maybe"</span><span class="COMMENT1"> </span><span class="COMMENT1">tuple,</span><span class="COMMENT1"> </span><span class="COMMENT1">corresponding</span><span class="COMMENT1"> </span><span class="COMMENT1">to</span><span class="COMMENT1"> </span><span class="COMMENT1">Haskell's</span><span class="COMMENT1"> </span><span class="COMMENT1">maybe.</span>
<span class="COMMENT1">! </span><span class="COMMENT1">Example</span><span class="COMMENT1"> </span><span class="COMMENT1">use:</span>
<span class="COMMENT1">!</span>
<span class="COMMENT1">! </span><span class="COMMENT1"> </span><span class="COMMENT1"> </span><span class="COMMENT1">(</span><span class="COMMENT1"> </span><span class="COMMENT1">scratchpad</span><span class="COMMENT1"> </span><span class="COMMENT1">)</span><span class="COMMENT1"> </span><span class="COMMENT1">"Julien"</span><span class="COMMENT1"> </span><span class="COMMENT1">just</span><span class="COMMENT1"> </span><span class="COMMENT1">[</span><span class="COMMENT1"> </span><span class="COMMENT1">[</span><span class="COMMENT1"> </span><span class="COMMENT1">tels</span><span class="COMMENT1"> </span><span class="COMMENT1">]</span><span class="COMMENT1"> </span><span class="COMMENT1">&gt;&gt;=</span><span class="COMMENT1"> </span><span class="COMMENT1">[</span><span class="COMMENT1"> </span><span class="COMMENT1">"Phone</span><span class="COMMENT1"> </span><span class="COMMENT1">number</span><span class="COMMENT1"> </span><span class="COMMENT1">is</span><span class="COMMENT1"> </span><span class="COMMENT1">"</span><span class="COMMENT1"> </span><span class="COMMENT1">prepend</span><span class="COMMENT1"> </span><span class="COMMENT1">return</span><span class="COMMENT1"> </span><span class="COMMENT1">]</span><span class="COMMENT1"> </span><span class="COMMENT1">&gt;&gt;=</span><span class="COMMENT1"> </span><span class="COMMENT1">]</span><span class="COMMENT1"> </span><span class="COMMENT1">with-monad</span><span class="COMMENT1"> </span><span class="COMMENT1">.</span>
<span class="COMMENT1">! </span><span class="COMMENT1"> </span><span class="COMMENT1"> </span><span class="COMMENT1">T{</span><span class="COMMENT1"> </span><span class="COMMENT1">maybe</span><span class="COMMENT1"> </span><span class="COMMENT1">{</span><span class="COMMENT1"> </span><span class="COMMENT1">set</span><span class="COMMENT1"> </span><span class="COMMENT1">t</span><span class="COMMENT1"> </span><span class="COMMENT1">}</span><span class="COMMENT1"> </span><span class="COMMENT1">{</span><span class="COMMENT1"> </span><span class="COMMENT1">data</span><span class="COMMENT1"> </span><span class="COMMENT1">"Phone</span><span class="COMMENT1"> </span><span class="COMMENT1">number</span><span class="COMMENT1"> </span><span class="COMMENT1">is</span><span class="COMMENT1"> </span><span class="COMMENT1">0991"</span><span class="COMMENT1"> </span><span class="COMMENT1">}</span><span class="COMMENT1"> </span><span class="COMMENT1">}</span>
<span class="COMMENT1">!</span>
<span class="COMMENT1">! </span><span class="COMMENT1"> </span><span class="COMMENT1"> </span><span class="COMMENT1">(</span><span class="COMMENT1"> </span><span class="COMMENT1">scratchpad</span><span class="COMMENT1"> </span><span class="COMMENT1">)</span><span class="COMMENT1"> </span><span class="COMMENT1">nothing</span><span class="COMMENT1"> </span><span class="COMMENT1">[</span><span class="COMMENT1"> </span><span class="COMMENT1">[</span><span class="COMMENT1"> </span><span class="COMMENT1">tels</span><span class="COMMENT1"> </span><span class="COMMENT1">]</span><span class="COMMENT1"> </span><span class="COMMENT1">&gt;&gt;=</span><span class="COMMENT1"> </span><span class="COMMENT1">[</span><span class="COMMENT1"> </span><span class="COMMENT1">"Phone</span><span class="COMMENT1"> </span><span class="COMMENT1">number</span><span class="COMMENT1"> </span><span class="COMMENT1">is</span><span class="COMMENT1"> </span><span class="COMMENT1">"</span><span class="COMMENT1"> </span><span class="COMMENT1">prepend</span><span class="COMMENT1"> </span><span class="COMMENT1">return</span><span class="COMMENT1"> </span><span class="COMMENT1">]</span><span class="COMMENT1"> </span><span class="COMMENT1">&gt;&gt;=</span><span class="COMMENT1"> </span><span class="COMMENT1">]</span><span class="COMMENT1"> </span><span class="COMMENT1">with-monad</span><span class="COMMENT1"> </span><span class="COMMENT1">.</span>
<span class="COMMENT1">! </span><span class="COMMENT1"> </span><span class="COMMENT1"> </span><span class="COMMENT1">T{</span><span class="COMMENT1"> </span><span class="COMMENT1">maybe</span><span class="COMMENT1"> </span><span class="COMMENT1">}</span>
<span class="COMMENT1">!</span>
<span class="COMMENT1">! </span><span class="COMMENT1"> </span><span class="COMMENT1"> </span><span class="COMMENT1">(</span><span class="COMMENT1"> </span><span class="COMMENT1">scratchpad</span><span class="COMMENT1"> </span><span class="COMMENT1">)</span><span class="COMMENT1"> </span><span class="COMMENT1">"Claire"</span><span class="COMMENT1"> </span><span class="COMMENT1">just</span><span class="COMMENT1"> </span><span class="COMMENT1">[</span><span class="COMMENT1"> </span><span class="COMMENT1">[</span><span class="COMMENT1"> </span><span class="COMMENT1">tels</span><span class="COMMENT1"> </span><span class="COMMENT1">]</span><span class="COMMENT1"> </span><span class="COMMENT1">&gt;&gt;=</span><span class="COMMENT1"> </span><span class="COMMENT1">[</span><span class="COMMENT1"> </span><span class="COMMENT1">"Phone</span><span class="COMMENT1"> </span><span class="COMMENT1">number</span><span class="COMMENT1"> </span><span class="COMMENT1">is</span><span class="COMMENT1"> </span><span class="COMMENT1">"</span><span class="COMMENT1"> </span><span class="COMMENT1">prepend</span><span class="COMMENT1"> </span><span class="COMMENT1">return</span><span class="COMMENT1"> </span><span class="COMMENT1">]</span><span class="COMMENT1"> </span><span class="COMMENT1">&gt;&gt;=</span><span class="COMMENT1"> </span><span class="COMMENT1">]</span><span class="COMMENT1"> </span><span class="COMMENT1">with-monad</span><span class="COMMENT1"> </span><span class="COMMENT1">.</span>
<span class="COMMENT1">! </span><span class="COMMENT1"> </span><span class="COMMENT1"> </span><span class="COMMENT1">T{</span><span class="COMMENT1"> </span><span class="COMMENT1">maybe</span><span class="COMMENT1"> </span><span class="COMMENT1">}</span>

TUPLE: maybe
    <span class="OPERATOR">{</span> set boolean initial: <span class="LITERAL4">f</span> <span class="OPERATOR">}</span>
    data <span class="MARKUP">;</span>

<span class="MARKUP">: just</span> <span class="COMMENT3">( </span><span class="COMMENT4">data</span><span class="COMMENT4"> </span><span class="COMMENT3">--</span><span class="COMMENT4"> </span><span class="COMMENT4">maybe</span><span class="COMMENT4"> </span><span class="COMMENT3">)</span>
    <span class="OPERATOR">[</span> maybe new <span class="LITERAL3">t</span> &gt;&gt;set <span class="OPERATOR">]</span> dip &gt;&gt;data <span class="MARKUP">;</span>

<span class="MARKUP">: nothing</span> <span class="COMMENT3">( </span><span class="COMMENT3">--</span><span class="COMMENT4"> </span><span class="COMMENT4">maybe</span><span class="COMMENT4"> </span><span class="COMMENT3">)</span>
    maybe new <span class="MARKUP">;</span>

<span class="MARKUP">: from-maybe</span> <span class="COMMENT3">( </span><span class="COMMENT4">maybe</span><span class="COMMENT4"> </span><span class="COMMENT3">--</span><span class="COMMENT4"> </span><span class="COMMENT4">data</span><span class="COMMENT4"> </span><span class="COMMENT3">)</span>
    dup set&gt;&gt; <span class="LITERAL3">t</span> assert=
    data&gt;&gt; <span class="MARKUP">;</span>

INSTANCE: maybe monad

M: maybe fail*
    drop nothing <span class="MARKUP">;</span>

M: maybe return*
    drop just <span class="MARKUP">;</span>

M: maybe &gt;&gt;=*
    over set&gt;&gt;
    <span class="OPERATOR">[</span>
        <span class="OPERATOR">[</span> from-maybe <span class="OPERATOR">]</span> <span class="OPERATOR">[</span> call<span class="COMMENT3">( </span><span class="COMMENT4">data</span><span class="COMMENT4"> </span><span class="COMMENT3">--</span><span class="COMMENT4"> </span><span class="COMMENT3">)</span> <span class="OPERATOR">]</span> bi* current-monad get
    <span class="OPERATOR">]</span> <span class="OPERATOR">[</span>
        drop
    <span class="OPERATOR">]</span> if <span class="MARKUP">;</span>

<span class="COMMENT1">! </span><span class="COMMENT1">A</span><span class="COMMENT1"> </span><span class="COMMENT1">sequence</span><span class="COMMENT1"> </span><span class="COMMENT1">may</span><span class="COMMENT1"> </span><span class="COMMENT1">be</span><span class="COMMENT1"> </span><span class="COMMENT1">a</span><span class="COMMENT1"> </span><span class="COMMENT1">monad.</span><span class="COMMENT1"> </span><span class="COMMENT1">Example</span><span class="COMMENT1"> </span><span class="COMMENT1">use</span><span class="COMMENT1"> </span><span class="COMMENT1">with</span><span class="COMMENT1"> </span><span class="COMMENT1">the</span><span class="COMMENT1"> </span><span class="COMMENT1">very</span><span class="COMMENT1"> </span><span class="COMMENT1">same</span><span class="COMMENT1"> </span><span class="COMMENT1">code:</span>
<span class="COMMENT1">!</span>
<span class="COMMENT1">! </span><span class="COMMENT1"> </span><span class="COMMENT1"> </span><span class="COMMENT1">(</span><span class="COMMENT1"> </span><span class="COMMENT1">scratchpad</span><span class="COMMENT1"> </span><span class="COMMENT1">)</span><span class="COMMENT1"> </span><span class="COMMENT1">{</span><span class="COMMENT1"> </span><span class="COMMENT1">"Julien"</span><span class="COMMENT1"> </span><span class="COMMENT1">}</span><span class="COMMENT1"> </span><span class="COMMENT1">[</span><span class="COMMENT1"> </span><span class="COMMENT1">[</span><span class="COMMENT1"> </span><span class="COMMENT1">tels</span><span class="COMMENT1"> </span><span class="COMMENT1">]</span><span class="COMMENT1"> </span><span class="COMMENT1">&gt;&gt;=</span><span class="COMMENT1"> </span><span class="COMMENT1">[</span><span class="COMMENT1"> </span><span class="COMMENT1">"Phone</span><span class="COMMENT1"> </span><span class="COMMENT1">number</span><span class="COMMENT1"> </span><span class="COMMENT1">is</span><span class="COMMENT1"> </span><span class="COMMENT1">"</span><span class="COMMENT1"> </span><span class="COMMENT1">prepend</span><span class="COMMENT1"> </span><span class="COMMENT1">return</span><span class="COMMENT1"> </span><span class="COMMENT1">]</span><span class="COMMENT1"> </span><span class="COMMENT1">&gt;&gt;=</span><span class="COMMENT1"> </span><span class="COMMENT1">]</span><span class="COMMENT1"> </span><span class="COMMENT1">with-monad</span><span class="COMMENT1"> </span><span class="COMMENT1">.</span>
<span class="COMMENT1">! </span><span class="COMMENT1"> </span><span class="COMMENT1"> </span><span class="COMMENT1">{</span><span class="COMMENT1"> </span><span class="COMMENT1">"Phone</span><span class="COMMENT1"> </span><span class="COMMENT1">number</span><span class="COMMENT1"> </span><span class="COMMENT1">is</span><span class="COMMENT1"> </span><span class="COMMENT1">0991"</span><span class="COMMENT1"> </span><span class="COMMENT1">}</span>
<span class="COMMENT1">!</span>
<span class="COMMENT1">! </span><span class="COMMENT1"> </span><span class="COMMENT1"> </span><span class="COMMENT1">(</span><span class="COMMENT1"> </span><span class="COMMENT1">scratchpad</span><span class="COMMENT1"> </span><span class="COMMENT1">)</span><span class="COMMENT1"> </span><span class="COMMENT1">{</span><span class="COMMENT1"> </span><span class="COMMENT1">"Claire"</span><span class="COMMENT1"> </span><span class="COMMENT1">}</span><span class="COMMENT1"> </span><span class="COMMENT1">[</span><span class="COMMENT1"> </span><span class="COMMENT1">[</span><span class="COMMENT1"> </span><span class="COMMENT1">tels</span><span class="COMMENT1"> </span><span class="COMMENT1">]</span><span class="COMMENT1"> </span><span class="COMMENT1">&gt;&gt;=</span><span class="COMMENT1"> </span><span class="COMMENT1">[</span><span class="COMMENT1"> </span><span class="COMMENT1">"Phone</span><span class="COMMENT1"> </span><span class="COMMENT1">number</span><span class="COMMENT1"> </span><span class="COMMENT1">is</span><span class="COMMENT1"> </span><span class="COMMENT1">"</span><span class="COMMENT1"> </span><span class="COMMENT1">prepend</span><span class="COMMENT1"> </span><span class="COMMENT1">return</span><span class="COMMENT1"> </span><span class="COMMENT1">]</span><span class="COMMENT1"> </span><span class="COMMENT1">&gt;&gt;=</span><span class="COMMENT1"> </span><span class="COMMENT1">]</span><span class="COMMENT1"> </span><span class="COMMENT1">with-monad</span><span class="COMMENT1"> </span><span class="COMMENT1">.</span>
<span class="COMMENT1">! </span><span class="COMMENT1"> </span><span class="COMMENT1"> </span><span class="COMMENT1">{</span><span class="COMMENT1"> </span><span class="COMMENT1">}</span>
<span class="COMMENT1">!</span>
<span class="COMMENT1">! </span><span class="COMMENT1"> </span><span class="COMMENT1"> </span><span class="COMMENT1">(</span><span class="COMMENT1"> </span><span class="COMMENT1">scratchpad</span><span class="COMMENT1"> </span><span class="COMMENT1">)</span><span class="COMMENT1"> </span><span class="COMMENT1">{</span><span class="COMMENT1"> </span><span class="COMMENT1">"Julien"</span><span class="COMMENT1"> </span><span class="COMMENT1">"Sam"</span><span class="COMMENT1"> </span><span class="COMMENT1">}</span><span class="COMMENT1"> </span><span class="COMMENT1">[</span><span class="COMMENT1"> </span><span class="COMMENT1">[</span><span class="COMMENT1"> </span><span class="COMMENT1">tels</span><span class="COMMENT1"> </span><span class="COMMENT1">]</span><span class="COMMENT1"> </span><span class="COMMENT1">&gt;&gt;=</span><span class="COMMENT1"> </span><span class="COMMENT1">[</span><span class="COMMENT1"> </span><span class="COMMENT1">"Phone</span><span class="COMMENT1"> </span><span class="COMMENT1">number</span><span class="COMMENT1"> </span><span class="COMMENT1">is</span><span class="COMMENT1"> </span><span class="COMMENT1">"</span><span class="COMMENT1"> </span><span class="COMMENT1">prepend</span><span class="COMMENT1"> </span><span class="COMMENT1">return</span><span class="COMMENT1"> </span><span class="COMMENT1">]</span><span class="COMMENT1"> </span><span class="COMMENT1">&gt;&gt;=</span><span class="COMMENT1"> </span><span class="COMMENT1">]</span><span class="COMMENT1"> </span><span class="COMMENT1">with-monad</span><span class="COMMENT1"> </span><span class="COMMENT1">.</span>
<span class="COMMENT1">! </span><span class="COMMENT1"> </span><span class="COMMENT1"> </span><span class="COMMENT1">{</span><span class="COMMENT1"> </span><span class="COMMENT1">"Phone</span><span class="COMMENT1"> </span><span class="COMMENT1">number</span><span class="COMMENT1"> </span><span class="COMMENT1">is</span><span class="COMMENT1"> </span><span class="COMMENT1">0991"</span><span class="COMMENT1"> </span><span class="COMMENT1">"Phone</span><span class="COMMENT1"> </span><span class="COMMENT1">number</span><span class="COMMENT1"> </span><span class="COMMENT1">is</span><span class="COMMENT1"> </span><span class="COMMENT1">0661"</span><span class="COMMENT1"> </span><span class="COMMENT1">}</span>

INSTANCE: sequence monad

M: sequence fail*
      <span class="OPERATOR">{</span> <span class="OPERATOR">}</span> swap like <span class="MARKUP">;</span>

M: sequence return*
    <span class="OPERATOR">[</span> 1array <span class="OPERATOR">]</span> <span class="OPERATOR">[</span> like <span class="OPERATOR">]</span> bi* <span class="MARKUP">;</span>

M: sequence &gt;&gt;=*
    <span class="OPERATOR">[</span> call<span class="COMMENT3">( </span><span class="COMMENT4">x</span><span class="COMMENT4"> </span><span class="COMMENT3">--</span><span class="COMMENT4"> </span><span class="COMMENT3">)</span> current-monad get <span class="OPERATOR">]</span> curry map concat <span class="MARKUP">;</span>

<span class="COMMENT1">! </span><span class="COMMENT1">We</span><span class="COMMENT1"> </span><span class="COMMENT1">could</span><span class="COMMENT1"> </span><span class="COMMENT1">also</span><span class="COMMENT1"> </span><span class="COMMENT1">say</span><span class="COMMENT1"> </span><span class="COMMENT1">that</span><span class="COMMENT1"> </span><span class="COMMENT1">any</span><span class="COMMENT1"> </span><span class="COMMENT1">object</span><span class="COMMENT1"> </span><span class="COMMENT1">is</span><span class="COMMENT1"> </span><span class="COMMENT1">a</span><span class="COMMENT1"> </span><span class="COMMENT1">monad,</span><span class="COMMENT1"> </span><span class="COMMENT1">with</span><span class="COMMENT1"> </span><span class="COMMENT1">"f"</span><span class="COMMENT1"> </span><span class="COMMENT1">representing</span><span class="COMMENT1"> </span><span class="COMMENT1">a</span><span class="COMMENT1"> </span><span class="COMMENT1">failure.</span><span class="COMMENT1"> </span><span class="COMMENT1">For</span><span class="COMMENT1"> </span><span class="COMMENT1">that</span><span class="COMMENT1"> </span><span class="COMMENT1">to</span><span class="COMMENT1"> </span><span class="COMMENT1">work</span>
<span class="COMMENT1">! </span><span class="COMMENT1">properly</span><span class="COMMENT1"> </span><span class="COMMENT1">and</span><span class="COMMENT1"> </span><span class="COMMENT1">not</span><span class="COMMENT1"> </span><span class="COMMENT1">interact</span><span class="COMMENT1"> </span><span class="COMMENT1">with</span><span class="COMMENT1"> </span><span class="COMMENT1">sequences,</span><span class="COMMENT1"> </span><span class="COMMENT1">we</span><span class="COMMENT1"> </span><span class="COMMENT1">need</span><span class="COMMENT1"> </span><span class="COMMENT1">to</span><span class="COMMENT1"> </span><span class="COMMENT1">either</span><span class="COMMENT1"> </span><span class="COMMENT1">comment</span><span class="COMMENT1"> </span><span class="COMMENT1">out</span><span class="COMMENT1"> </span><span class="COMMENT1">the</span><span class="COMMENT1"> </span><span class="COMMENT1">"sequence</span><span class="COMMENT1"> </span><span class="COMMENT1">is</span><span class="COMMENT1"> </span><span class="COMMENT1">a</span><span class="COMMENT1"> </span><span class="COMMENT1">monad"</span>
<span class="COMMENT1">! </span><span class="COMMENT1">section</span><span class="COMMENT1"> </span><span class="COMMENT1">or</span><span class="COMMENT1"> </span><span class="COMMENT1">specialize</span><span class="COMMENT1"> </span><span class="COMMENT1">it</span><span class="COMMENT1"> </span><span class="COMMENT1">for</span><span class="COMMENT1"> </span><span class="COMMENT1">only</span><span class="COMMENT1"> </span><span class="COMMENT1">some</span><span class="COMMENT1"> </span><span class="COMMENT1">kind</span><span class="COMMENT1"> </span><span class="COMMENT1">of</span><span class="COMMENT1"> </span><span class="COMMENT1">sequences.</span>

<span class="COMMENT1">! </span><span class="COMMENT1">INSTANCE:</span><span class="COMMENT1"> </span><span class="COMMENT1">object</span><span class="COMMENT1"> </span><span class="COMMENT1">monad</span>
<span class="COMMENT1">!</span>
<span class="COMMENT1">! </span><span class="COMMENT1">M:</span><span class="COMMENT1"> </span><span class="COMMENT1">object</span><span class="COMMENT1"> </span><span class="COMMENT1">fail*</span><span class="COMMENT1"> </span><span class="COMMENT1">drop</span><span class="COMMENT1"> </span><span class="COMMENT1">f</span><span class="COMMENT1"> </span><span class="COMMENT1">;</span>
<span class="COMMENT1">!</span>
<span class="COMMENT1">! </span><span class="COMMENT1">M:</span><span class="COMMENT1"> </span><span class="COMMENT1">object</span><span class="COMMENT1"> </span><span class="COMMENT1">return*</span><span class="COMMENT1"> </span><span class="COMMENT1">drop</span><span class="COMMENT1"> </span><span class="COMMENT1">;</span>
<span class="COMMENT1">!</span>
<span class="COMMENT1">! </span><span class="COMMENT1">M:</span><span class="COMMENT1"> </span><span class="COMMENT1">object</span><span class="COMMENT1"> </span><span class="COMMENT1">&gt;&gt;=*</span>
<span class="COMMENT1">! </span><span class="COMMENT1"> </span><span class="COMMENT1"> </span><span class="COMMENT1"> </span><span class="COMMENT1"> </span><span class="COMMENT1">over</span><span class="COMMENT1"> </span><span class="COMMENT1">[</span><span class="COMMENT1"> </span><span class="COMMENT1">call(</span><span class="COMMENT1"> </span><span class="COMMENT1">x</span><span class="COMMENT1"> </span><span class="COMMENT1">--</span><span class="COMMENT1"> </span><span class="COMMENT1">)</span><span class="COMMENT1"> </span><span class="COMMENT1">current-monad</span><span class="COMMENT1"> </span><span class="COMMENT1">get</span><span class="COMMENT1"> </span><span class="COMMENT1">]</span><span class="COMMENT1"> </span><span class="COMMENT1">[</span><span class="COMMENT1"> </span><span class="COMMENT1">drop</span><span class="COMMENT1"> </span><span class="COMMENT1">]</span><span class="COMMENT1"> </span><span class="COMMENT1">if</span><span class="COMMENT1"> </span><span class="COMMENT1">;</span>

<span class="COMMENT1">! </span><span class="COMMENT1">We</span><span class="COMMENT1"> </span><span class="COMMENT1">can</span><span class="COMMENT1"> </span><span class="COMMENT1">implement</span><span class="COMMENT1"> </span><span class="COMMENT1">"do"</span><span class="COMMENT1"> </span><span class="COMMENT1">which</span><span class="COMMENT1"> </span><span class="COMMENT1">will</span><span class="COMMENT1"> </span><span class="COMMENT1">bind</span><span class="COMMENT1"> </span><span class="COMMENT1">every</span><span class="COMMENT1"> </span><span class="COMMENT1">quotation</span><span class="COMMENT1"> </span><span class="COMMENT1">in</span><span class="COMMENT1"> </span><span class="COMMENT1">a</span><span class="COMMENT1"> </span><span class="COMMENT1">sequence</span><span class="COMMENT1"> </span><span class="COMMENT1">and</span><span class="COMMENT1"> </span><span class="COMMENT1">return</span><span class="COMMENT1"> </span><span class="COMMENT1">the</span><span class="COMMENT1"> </span><span class="COMMENT1">result.</span><span class="COMMENT1"> </span><span class="COMMENT1">Example</span><span class="COMMENT1"> </span><span class="COMMENT1">use:</span>
<span class="COMMENT1">!</span>
<span class="COMMENT1">! </span><span class="COMMENT1"> </span><span class="COMMENT1">(</span><span class="COMMENT1"> </span><span class="COMMENT1">scratchpad</span><span class="COMMENT1"> </span><span class="COMMENT1">)</span><span class="COMMENT1"> </span><span class="COMMENT1">{</span><span class="COMMENT1"> </span><span class="COMMENT1">"Julien"</span><span class="COMMENT1"> </span><span class="COMMENT1">"Sam"</span><span class="COMMENT1"> </span><span class="COMMENT1">}</span><span class="COMMENT1"> </span><span class="COMMENT1">{</span><span class="COMMENT1"> </span><span class="COMMENT1">[</span><span class="COMMENT1"> </span><span class="COMMENT1">tels</span><span class="COMMENT1"> </span><span class="COMMENT1">]</span><span class="COMMENT1"> </span><span class="COMMENT1">[</span><span class="COMMENT1"> </span><span class="COMMENT1">"Phone</span><span class="COMMENT1"> </span><span class="COMMENT1">number</span><span class="COMMENT1"> </span><span class="COMMENT1">is</span><span class="COMMENT1"> </span><span class="COMMENT1">"</span><span class="COMMENT1"> </span><span class="COMMENT1">prepend</span><span class="COMMENT1"> </span><span class="COMMENT1">return</span><span class="COMMENT1"> </span><span class="COMMENT1">]</span><span class="COMMENT1"> </span><span class="COMMENT1">}</span><span class="COMMENT1"> </span><span class="COMMENT1">do</span><span class="COMMENT1"> </span><span class="COMMENT1">.</span>
<span class="COMMENT1">! </span><span class="COMMENT1"> </span><span class="COMMENT1">{</span><span class="COMMENT1"> </span><span class="COMMENT1">"Phone</span><span class="COMMENT1"> </span><span class="COMMENT1">number</span><span class="COMMENT1"> </span><span class="COMMENT1">is</span><span class="COMMENT1"> </span><span class="COMMENT1">0991"</span><span class="COMMENT1"> </span><span class="COMMENT1">"Phone</span><span class="COMMENT1"> </span><span class="COMMENT1">number</span><span class="COMMENT1"> </span><span class="COMMENT1">is</span><span class="COMMENT1"> </span><span class="COMMENT1">0661"</span><span class="COMMENT1"> </span><span class="COMMENT1">}</span>

<span class="MARKUP">: do</span> <span class="COMMENT3">( </span><span class="COMMENT4">monad</span><span class="COMMENT4"> </span><span class="COMMENT4">seq</span><span class="COMMENT4"> </span><span class="COMMENT3">--</span><span class="COMMENT4"> </span><span class="COMMENT4">monad</span><span class="COMMENT4"> </span><span class="COMMENT3">)</span>
    <span class="OPERATOR">[</span> <span class="OPERATOR">[</span> &gt;&gt;= <span class="OPERATOR">]</span> each <span class="OPERATOR">]</span> curry with-monad <span class="MARKUP">;</span>

<span class="COMMENT1">! </span><span class="COMMENT1">"do*"</span><span class="COMMENT1"> </span><span class="COMMENT1">will</span><span class="COMMENT1"> </span><span class="COMMENT1">also</span><span class="COMMENT1"> </span><span class="COMMENT1">execute</span><span class="COMMENT1"> </span><span class="COMMENT1">each</span><span class="COMMENT1"> </span><span class="COMMENT1">quotation,</span><span class="COMMENT1"> </span><span class="COMMENT1">and</span><span class="COMMENT1"> </span><span class="COMMENT1">"fail"</span><span class="COMMENT1"> </span><span class="COMMENT1">if</span><span class="COMMENT1"> </span><span class="COMMENT1">an</span><span class="COMMENT1"> </span><span class="COMMENT1">exception</span><span class="COMMENT1"> </span><span class="COMMENT1">is</span><span class="COMMENT1"> </span><span class="COMMENT1">raised</span><span class="COMMENT1"> </span><span class="COMMENT1">or</span><span class="COMMENT1"> </span><span class="COMMENT1">"return"</span><span class="COMMENT1"> </span><span class="COMMENT1">it</span><span class="COMMENT1"> </span><span class="COMMENT1">if</span><span class="COMMENT1"> </span><span class="COMMENT1">it</span>
<span class="COMMENT1">! </span><span class="COMMENT1">doesn't.</span><span class="COMMENT1"> </span><span class="COMMENT1">Example</span><span class="COMMENT1"> </span><span class="COMMENT1">use:</span>
<span class="COMMENT1">!</span>
<span class="COMMENT1">! </span><span class="COMMENT1"> </span><span class="COMMENT1">(</span><span class="COMMENT1"> </span><span class="COMMENT1">scratchpad</span><span class="COMMENT1"> </span><span class="COMMENT1">)</span><span class="COMMENT1"> </span><span class="COMMENT1">{</span><span class="COMMENT1"> </span><span class="COMMENT1">1</span><span class="COMMENT1"> </span><span class="COMMENT1">0</span><span class="COMMENT1"> </span><span class="COMMENT1">2</span><span class="COMMENT1"> </span><span class="COMMENT1">}</span><span class="COMMENT1"> </span><span class="COMMENT1">{</span><span class="COMMENT1"> </span><span class="COMMENT1">[</span><span class="COMMENT1"> </span><span class="COMMENT1">1</span><span class="COMMENT1"> </span><span class="COMMENT1">swap</span><span class="COMMENT1"> </span><span class="COMMENT1">/</span><span class="COMMENT1"> </span><span class="COMMENT1">]</span><span class="COMMENT1"> </span><span class="COMMENT1">[</span><span class="COMMENT1"> </span><span class="COMMENT1">2</span><span class="COMMENT1"> </span><span class="COMMENT1">+</span><span class="COMMENT1"> </span><span class="COMMENT1">]</span><span class="COMMENT1"> </span><span class="COMMENT1">}</span><span class="COMMENT1"> </span><span class="COMMENT1">do*</span><span class="COMMENT1"> </span><span class="COMMENT1">.</span>
<span class="COMMENT1">! </span><span class="COMMENT1"> </span><span class="COMMENT1">{</span><span class="COMMENT1"> </span><span class="COMMENT1">3</span><span class="COMMENT1"> </span><span class="COMMENT1">2+1/2</span><span class="COMMENT1"> </span><span class="COMMENT1">}</span>
<span class="COMMENT1">!</span>
<span class="COMMENT1">! </span><span class="COMMENT1"> </span><span class="COMMENT1">(</span><span class="COMMENT1"> </span><span class="COMMENT1">scratchpad</span><span class="COMMENT1"> </span><span class="COMMENT1">)</span><span class="COMMENT1"> </span><span class="COMMENT1">1</span><span class="COMMENT1"> </span><span class="COMMENT1">just</span><span class="COMMENT1"> </span><span class="COMMENT1">{</span><span class="COMMENT1"> </span><span class="COMMENT1">[</span><span class="COMMENT1"> </span><span class="COMMENT1">1</span><span class="COMMENT1"> </span><span class="COMMENT1">swap</span><span class="COMMENT1"> </span><span class="COMMENT1">/</span><span class="COMMENT1"> </span><span class="COMMENT1">]</span><span class="COMMENT1"> </span><span class="COMMENT1">[</span><span class="COMMENT1"> </span><span class="COMMENT1">2</span><span class="COMMENT1"> </span><span class="COMMENT1">+</span><span class="COMMENT1"> </span><span class="COMMENT1">]</span><span class="COMMENT1"> </span><span class="COMMENT1">}</span><span class="COMMENT1"> </span><span class="COMMENT1">do*</span><span class="COMMENT1"> </span><span class="COMMENT1">.</span>
<span class="COMMENT1">! </span><span class="COMMENT1"> </span><span class="COMMENT1">T{</span><span class="COMMENT1"> </span><span class="COMMENT1">maybe</span><span class="COMMENT1"> </span><span class="COMMENT1">{</span><span class="COMMENT1"> </span><span class="COMMENT1">set</span><span class="COMMENT1"> </span><span class="COMMENT1">t</span><span class="COMMENT1"> </span><span class="COMMENT1">}</span><span class="COMMENT1"> </span><span class="COMMENT1">{</span><span class="COMMENT1"> </span><span class="COMMENT1">data</span><span class="COMMENT1"> </span><span class="COMMENT1">3</span><span class="COMMENT1"> </span><span class="COMMENT1">}</span><span class="COMMENT1"> </span><span class="COMMENT1">}</span>
<span class="COMMENT1">!</span>
<span class="COMMENT1">! </span><span class="COMMENT1"> </span><span class="COMMENT1">(</span><span class="COMMENT1"> </span><span class="COMMENT1">scratchpad</span><span class="COMMENT1"> </span><span class="COMMENT1">)</span><span class="COMMENT1"> </span><span class="COMMENT1">0</span><span class="COMMENT1"> </span><span class="COMMENT1">just</span><span class="COMMENT1"> </span><span class="COMMENT1">{</span><span class="COMMENT1"> </span><span class="COMMENT1">[</span><span class="COMMENT1"> </span><span class="COMMENT1">1</span><span class="COMMENT1"> </span><span class="COMMENT1">swap</span><span class="COMMENT1"> </span><span class="COMMENT1">/</span><span class="COMMENT1"> </span><span class="COMMENT1">]</span><span class="COMMENT1"> </span><span class="COMMENT1">[</span><span class="COMMENT1"> </span><span class="COMMENT1">2</span><span class="COMMENT1"> </span><span class="COMMENT1">+</span><span class="COMMENT1"> </span><span class="COMMENT1">]</span><span class="COMMENT1"> </span><span class="COMMENT1">}</span><span class="COMMENT1"> </span><span class="COMMENT1">do*</span><span class="COMMENT1"> </span><span class="COMMENT1">.</span>
<span class="COMMENT1">! </span><span class="COMMENT1"> </span><span class="COMMENT1">T{</span><span class="COMMENT1"> </span><span class="COMMENT1">maybe</span><span class="COMMENT1"> </span><span class="COMMENT1">}</span>

<span class="MARKUP">: do*</span> <span class="COMMENT3">( </span><span class="COMMENT4">monad</span><span class="COMMENT4"> </span><span class="COMMENT4">seq</span><span class="COMMENT4"> </span><span class="COMMENT3">--</span><span class="COMMENT4"> </span><span class="COMMENT4">monad</span><span class="COMMENT4"> </span><span class="COMMENT3">)</span>
    <span class="OPERATOR">[</span> '<span class="OPERATOR">[</span> <span class="OPERATOR">[</span> @ return <span class="OPERATOR">]</span> <span class="OPERATOR">[</span> 2drop fail <span class="OPERATOR">]</span> recover <span class="OPERATOR">]</span> <span class="OPERATOR">]</span> map do <span class="MARKUP">;</span>
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.rfc1149.net/plnc2010/2010/06/18/factor-cours-2-16-juin-2010/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Factor : TD 1</title>
		<link>http://www.rfc1149.net/plnc2010/2010/06/11/factor-td-1/</link>
		<comments>http://www.rfc1149.net/plnc2010/2010/06/11/factor-td-1/#comments</comments>
		<pubDate>Fri, 11 Jun 2010 11:30:03 +0000</pubDate>
		<dc:creator>Samuel Tardieu</dc:creator>
				<category><![CDATA[TD]]></category>
		<category><![CDATA[Factor]]></category>

		<guid isPermaLink="false">http://www.rfc1149.net/plnc2010/?p=95</guid>
		<description><![CDATA[Préambule
<p>Il est conseillé de faire l&#8217;échauffement avant d&#8217;attaquer les autres parties du TD. Vous avez ensuite le choix entre les tours de Hanoï (très simple) ou les engrammes (peu compliqué). Bien entendu, vous pouvez faire les deux si vous le souhaitez.</p>
Échauffement
<p>Définir la fonction « fact » calculant la factorielle d’un nombre.  Cette fonction devra retourner 1 [...]]]></description>
			<content:encoded><![CDATA[<h2>Préambule</h2>
<p>Il est conseillé de faire l&#8217;échauffement avant d&#8217;attaquer les autres parties du TD. Vous avez ensuite le choix entre les tours de Hanoï (très simple) ou les engrammes (peu compliqué). Bien entendu, vous pouvez faire les deux si vous le souhaitez.</p>
<h2>Échauffement</h2>
<p>Définir la fonction « fact » calculant la factorielle d’un nombre.  Cette fonction devra retourner 1 pour un paramètre inférieur ou égal à  0.</p>
<p>Rappels du cours : on pourra utiliser les mots « dup », « &lt;= »,  « if ». Les blocs de code (similaires à des « lambda » sans arguments)  sont délimités par des crochets « [ ... ] ». Les crochets doivent être  considérés comme des mots isolés, il faut donc mettre des espaces de  manière idoine.</p>
<h2>Rappels sur le système de module</h2>
<p>Dans Factor, on peut définir les mots qui suivront dans un  vocabulaire différent en écrivant :</p>
<pre>  IN: vocab</pre>
<p>Pour utiliser un vocabulaire particulier (et en voir les mots), on  peut faire</p>
<pre>  USE: vocab</pre>
<p>ou</p>
<pre>  USING: vocab1 vocab2 ... vocabN ;</pre>
<p>Lorsqu’un mot n’est pas visible mais est connu, l’environnement  proposera généralement d’importer automatiquement les différents modules  où un tel mot est défini.</p>
<p>Il est possible d&#8217;encadrer certains mots de &#8220;&lt;PRIVATE&#8221; et &#8220;PRIVATE&gt;&#8221;. Dans ce cas, ils seront créés dans un vocabulaire dont le nom sera dérivé du nom du vocabulaire courant auquel sera ajouté &#8220;.private&#8221;. L&#8217;accès depuis le vocabulaire courant est automatique, mais ne seront pas automatiquement visible depuis d&#8217;autres vocabulaires (à moins que le vocabulaire privé soit explicitement utilisé, ce qui est un signe évident de mauvaise pratique).</p>
<h2>Tours de Hanoï</h2>
<p>On souhaite faire un programme permettant de résoudre le problème des  tours de Hanoï. N tours sont empilées sur le plot 1, et on souhaite les  faire arriver sur le plot 3 qui est initialement vide, le plot 2  l’étant aussi. À aucun moment une tour ne peut être placée sur une tour  plus petite qu’elle.</p>
<p>Pour savoir où créer son premier vocabulaire, voir l’article « <em>Creating  a vocabulary for your first program</em> » dans la <a href="http://docs.factorcode.org/">documentation de Factor</a>. Le  vocabulaire devra se trouver dans la ressource « work » et s’appeler  « hanoi ».</p>
<h3>Affichage d’un mouvement</h3>
<p>Faire un mot « move ( a b — str ) » renvoyant la chaîne de caractères  « a vers b ». Par exemple, « 1 2 move » renverra « 1 vers 2 ».</p>
<p>On pourra utiliser « &gt;base ( n radix — str) » pour transformer un  entier en chaîne de caractères. On minimisera les répétitions de code en  utilisant « bi@ ». On cherchera dans la documentation comment joindre  ensemble deux chaînes deux caractères avec un séparateur, les chaînes  étant elles-même des tableaux de caractères.</p>
<p>Au même endroit que le vocabulaire « hanoi », créer un fichier  « hanoi-tests.factor » contenant un ou plusieurs tests unitaires pour la  fonction « move ». On pourra s’inspirer de l’article<br />
« <em>Testing your first program</em> » de la documentation de Factor.</p>
<p>Pour tous les mots définis par la suite, on écrira des tests  unitaires.</p>
<h3>Algorithme</h3>
<p>La signature de « hanoi » est :</p>
<pre>  hanoi ( d a n -- )</pre>
<p>où « d » est le plot de départ (entre 1 et 3), « a » le plot  d’arrivée (entre 1 et 3) et « n » le nombre de tours empilées.</p>
<p>Chercher un algorithme récursif permettant de résoudre le problème  des tours de Hanoï.</p>
<p>On pourra définir les mots suivants si on a besoin :</p>
<pre>  other ( a b -- o )       ! Étant donné deux plots a et b, renvoie le 3è
  partial ( a b -- a b' )  ! Étant donné deux plots a et b, renvoie les deux plots a et o
                           ! où o est le résultat de other appliqué sur a et b</pre>
<p>Définir le mot principal « hanoi » avec la signature donnée  ci-dessus. De plus, le mot « print » affiche une chaîne de caractères  suivie d’un retour à la ligne. Le mot « move » défini précédemment sera  également utile.</p>
<p>Vérifier que le programme fonctionne en appelant</p>
<pre>  1 3 3 hanoi</pre>
<p>Cela doit afficher</p>
<pre>1 vers 3
1 vers 2
3 vers 2
1 vers 3
2 vers 1
2 vers 3
1 vers 3</pre>
<p>Créer des tests pour le programme « hanoi ». On pourra utiliser  « with-string-writer » pour rediriger temporairement la sortie par  défaut vers une chaîne de caractères.</p>
<h3>Refactorisation du code</h3>
<p>Éventuellement, refactoriser le vocabulaire en vérifiant à chaque  étape que les tests unitaires fonctionnent toujours. Si de nouveaux mots  sont créés à cette occasion, il ne faut pas oublier de rajouter de  nouveaux tests unitaires.</p>
<p>N’oubliez pas qu’il est possible de tester les mots privés. Ne  laissez visible que ce qui est nécessaire.</p>
<h2>Engrammes</h2>
<p>Les engrammes sont un <a href="http://instinctive.eu/articles/systeme-numeration-exotique">système de numérotation exotique basé sur les facteurs premiers</a> sortis de l&#8217;esprit torturé de <a href="http://instinctive.eu/moi/">Natacha Kerensikova</a>. Le but de cette partie du TD est de concevoir un système de codage de nombres classiques sous la forme d&#8217;un engramme, puis un système de décodage d&#8217;engrammes sous la forme de nombres classiques.</p>
<h3>Génération d&#8217;engrammes</h3>
<p>Écrire un mot &#8220;&gt;engramme ( n &#8212; str )&#8221; qui génère un engramme sous la forme d&#8217;une chaîne de caractères. On pourra, pour créer des mots mutuellement récursifs, utiliser la syntaxe &#8220;DEFER: word&#8221; qui déclare que le mot &#8220;word&#8221; sera défini plus tard dans le vocabulaire.</p>
<p>On pourra utiliser le vocabulaire &#8220;math.primes.factors&#8221;, et notamment son mot &#8220;group-factors&#8221;, pour décomposer un nombre entier en facteurs premiers et leurs puissances associées. Le mot &#8220;primes-upto&#8221; pourra également être utile. Cependant, la version actuelle a un bug : &#8220;2 primes-upto&#8221; renvoie le vecteur &#8220;V{ 2 3 }&#8221; et contient une valeur en trop. En attendant que cela soit corrigé, on pourra écrire un wrapper &#8220;(primes-upto) ( n &#8212; seq )&#8221; qui traite différemment le cas particulier où on lui passe la valeur 2 sur la pile.</p>
<p>Rajouter des tests unitaires avec les exemples donnés par Natacha dans la page décrivant les engrammes.</p>
<h3>Décodage d&#8217;engrammes</h3>
<p>On veut écrire un mot &#8220;engramme&gt; ( str &#8212; n )&#8221; qui transforme un engramme codé sous forme de chaîne en nombre classique. Pour cela, on pourra par exemple décoder le chaîne à l&#8217;aide d&#8217;un mot &#8220;parse ( str &#8212; engramme )&#8221; qui retourne un nombre (0 ou 1) ou un tableau contenant lui-même d&#8217;autres nombres ou tableaux. Ensuite, en surchargeant &#8220;&gt;integer&#8221; sur les tableaux, on pourra transformer cette structure en nombre.</p>
<p>Si un engramme est mal formé, on souhaite générer l&#8217;exception &#8220;malformed&#8221;. Pour cela, on peut la déclarer à l&#8217;aide de &#8220;ERROR: malformed ;&#8221;. Cela définit le mot &#8220;malformed&#8221; comme levant l&#8217;erreur associée (et ne contenant aucun champ).</p>
<h3>Mots utiles</h3>
<p>On pourra éventuellement avoir besoin des mots suivants pour réaliser ce codage et décodage d&#8217;engrammes :</p>
<ul>
<li><a href="http://docs.factorcode.org/content/word-__star__,math.html">*</a></li>
<li><a href="http://docs.factorcode.org/content/word-1vector,vectors.html">1vector</a></li>
<li><a href="http://docs.factorcode.org/content/word-2drop,kernel.html">2drop</a></li>
<li><a href="http://docs.factorcode.org/content/word-=,kernel.html">=</a></li>
<li><a href="http://docs.factorcode.org/content/word-__gt__hashtable,hashtables.html">&gt;hashtable</a></li>
<li><a href="http://docs.factorcode.org/content/word-__gt__integer,math.html">&gt;integer</a></li>
<li><a href="http://docs.factorcode.org/content/word-^,math.functions.html">^</a></li>
<li><a href="http://docs.factorcode.org/content/word-append,sequences.html">append</a></li>
<li><a href="http://docs.factorcode.org/content/word-at,assocs.html">at</a></li>
<li><a href="http://docs.factorcode.org/content/word-bi,kernel.html">bi</a></li>
<li><a href="http://docs.factorcode.org/content/word-bi__star__,kernel.html">bi*</a></li>
<li><a href="http://docs.factorcode.org/content/word-case,combinators.html">case</a></li>
<li><a href="http://docs.factorcode.org/content/word-curry,kernel.html">curry</a></li>
<li><a href="http://docs.factorcode.org/content/word-dip,kernel.html">dip</a></li>
<li><a href="http://docs.factorcode.org/content/word-drop,kernel.html">drop</a></li>
<li><a href="http://docs.factorcode.org/content/word-dup,kernel.html">dup</a></li>
<li><a href="http://docs.factorcode.org/content/word-empty__que__,sequences.html">empty?</a></li>
<li><a href="http://docs.factorcode.org/content/word-first,sequences.html">first</a></li>
<li><a href="http://docs.factorcode.org/content/word-group-factors,math.primes.factors.html">group-factors</a></li>
<li><a href="http://docs.factorcode.org/content/word-if,kernel.html">if</a></li>
<li><a href="http://docs.factorcode.org/content/word-keep,kernel.html">keep</a></li>
<li><a href="http://docs.factorcode.org/content/word-last,sequences.html">last</a></li>
<li><a href="http://docs.factorcode.org/content/word-map-reduce,sequences.html">map-reduce</a></li>
<li><a href="http://docs.factorcode.org/content/word-next-prime,math.primes.html">next-prime</a></li>
<li><a href="http://docs.factorcode.org/content/word-or,kernel.html">or</a></li>
<li><a href="http://docs.factorcode.org/content/word-over,kernel.html">over</a></li>
<li><a href="http://docs.factorcode.org/content/word-prefix,sequences.html">prefix</a></li>
<li><a href="http://docs.factorcode.org/content/word-primes-upto,math.primes.html">primes-upto</a></li>
<li><a href="http://docs.factorcode.org/content/word-rest,sequences.html">rest</a></li>
<li><a href="http://docs.factorcode.org/content/word-surround,sequences.html">surround</a></li>
<li><a href="http://docs.factorcode.org/content/word-swap,kernel.html">swap</a></li>
<li><a href="http://docs.factorcode.org/content/word-unclip,sequences.html">unclip</a></li>
<li><a href="http://docs.factorcode.org/content/word-unless,kernel.html">unless</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.rfc1149.net/plnc2010/2010/06/11/factor-td-1/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Factor : note de cours 1 (9 juin 2010)</title>
		<link>http://www.rfc1149.net/plnc2010/2010/06/10/factor-note-de-cours-1-9-juin-2010/</link>
		<comments>http://www.rfc1149.net/plnc2010/2010/06/10/factor-note-de-cours-1-9-juin-2010/#comments</comments>
		<pubDate>Thu, 10 Jun 2010 21:05:08 +0000</pubDate>
		<dc:creator>Samuel Tardieu</dc:creator>
				<category><![CDATA[Cours]]></category>
		<category><![CDATA[Factor]]></category>

		<guid isPermaLink="false">http://www.rfc1149.net/plnc2010/?p=86</guid>
		<description><![CDATA[ 
pre.code {
	border:1px dashed #ccc;
	background-color:#f5f5f5;
	padding:5px;
	font-size:150%;
	color:#000000;
}</p>
<p>.NULL {
color: #000000;
}
.COMMENT1 {
color: #cc0000;
}
.COMMENT2 {
color: #ff8400;
}
.COMMENT3 {
color: #6600cc;
}
.COMMENT4 {
color: #cc6600;
}
.DIGIT {
color: #ff0000;
}
.FUNCTION {
color: #9966ff;
}
.INVALID {
background: #ffffcc;
color: #ff0066;
}
.KEYWORD1 {
color: #006699;
font-weight: bold;
}
.KEYWORD2 {
color: #009966;
font-weight: bold;
}
.KEYWORD3 {
color: #0099ff;
font-weight: bold;
}
.KEYWORD4 {
color: #66ccff;
font-weight: bold;
}
.LABEL {
color: #02b902;
}
.LITERAL1 {
color: #ff00cc;
}
.LITERAL2 {
color: #cc00cc;
}
.LITERAL3 {
color: #9900cc;
}
.LITERAL4 {
color: #6600cc;
}
.MARKUP {
color: #0000ff;
}
.OPERATOR {
color: #000000;
font-weight: bold;
}</p>
<p>body, button {
	font:9pt "Lucida Grande", "Lucida Sans [...]]]></description>
			<content:encoded><![CDATA[<style type="text/css"> 
pre.code {
	border:1px dashed #ccc;
	background-color:#f5f5f5;
	padding:5px;
	font-size:150%;
	color:#000000;
}</p>
<p>.NULL {
color: #000000;
}
.COMMENT1 {
color: #cc0000;
}
.COMMENT2 {
color: #ff8400;
}
.COMMENT3 {
color: #6600cc;
}
.COMMENT4 {
color: #cc6600;
}
.DIGIT {
color: #ff0000;
}
.FUNCTION {
color: #9966ff;
}
.INVALID {
background: #ffffcc;
color: #ff0066;
}
.KEYWORD1 {
color: #006699;
font-weight: bold;
}
.KEYWORD2 {
color: #009966;
font-weight: bold;
}
.KEYWORD3 {
color: #0099ff;
font-weight: bold;
}
.KEYWORD4 {
color: #66ccff;
font-weight: bold;
}
.LABEL {
color: #02b902;
}
.LITERAL1 {
color: #ff00cc;
}
.LITERAL2 {
color: #cc00cc;
}
.LITERAL3 {
color: #9900cc;
}
.LITERAL4 {
color: #6600cc;
}
.MARKUP {
color: #0000ff;
}
.OPERATOR {
color: #000000;
font-weight: bold;
}</p>
<p>body, button {
	font:9pt "Lucida Grande", "Lucida Sans Unicode", verdana, geneva, sans-serif;
	color:#444;
}</p>
<p>.link-button {
	padding: 0px;
	background: none;
	border: none;
}</p>
<p>a:link, a:visited, .link {
	color: #222;
	border-bottom:1px dotted #666;
	text-decoration:none;
}</p>
<p>a:hover, .link:hover {
	border-bottom:1px solid #66a;
}</p>
<p>.error { color: #a00; }</p>
<p>.errors li { color: #a00; }</p>
<p>.field-label {
	text-align: right;
}</p>
<p>.inline {
	display: inline;
}</p>
<p>.navbar {
	background-color: #eeeee0;
	padding: 5px;
	border: 1px solid #ccc;
}</p>
<p>.big-field-label {
	vertical-align: top;
}</p>
<p>.description {
	padding: 5px;
	color: #000;
}</p>
<p>.description pre {
	border: 1px dashed #ccc;
	background-color: #f5f5f5;
}</p>
<p>.description p:first-child {
	margin-top: 0px;
}</p>
<p>.description p:last-child {
	margin-bottom: 0px;
}</p>
<p>.description table, .description td {
    border-color: #666;
    border-style: solid;
}</p>
<p>.description table {
    border-width: 0 0 1px 1px;
    border-spacing: 0;
    border-collapse: collapse;
}</p>
<p>.description td {
    margin: 0;
    padding: 4px;
    border-width: 1px 1px 0 0;
}</p>
</style>
<p>Voici un lien vers la documentation de certains mots utilisés :</p>
<ul>
<li><a href="http://docs.factorcode.org/content/word-__star__,math.html">*</a></li>
<li><a href="http://docs.factorcode.org/content/word-+,math.html">+</a></li>
<li><a href="http://docs.factorcode.org/content/word--,math.html">-</a></li>
<li><a href="http://docs.factorcode.org/content/word-__slash__,math.html">/</a></li>
<li><a href="http://docs.factorcode.org/content/word-__gt__,math.html">&gt;</a></li>
<li><a href="http://docs.factorcode.org/content/word-__gt__=,math.html">&gt;=</a></li>
<li><a href="http://docs.factorcode.org/content/word-__que__,kernel.html">?</a></li>
<li><a href="http://docs.factorcode.org/content/word-append,sequences.html">append</a></li>
<li><a href="http://docs.factorcode.org/content/word-bi,kernel.html">bi</a></li>
<li><a href="http://docs.factorcode.org/content/word-bi__star__,kernel.html">bi*</a></li>
<li><a href="http://docs.factorcode.org/content/word-boa,kernel.html">boa</a></li>
<li><a href="http://docs.factorcode.org/content/word-clone,kernel.html">clone</a></li>
<li><a href="http://docs.factorcode.org/content/word-complex,math.html">complex</a></li>
<li><a href="http://docs.factorcode.org/content/word-curry,kernel.html">curry</a></li>
<li><a href="http://docs.factorcode.org/content/word-dip,kernel.html">dip</a></li>
<li><a href="http://docs.factorcode.org/content/word-drop,kernel.html">drop</a></li>
<li><a href="http://docs.factorcode.org/content/word-dup,kernel.html">dup</a></li>
<li><a href="http://docs.factorcode.org/content/word-eq__que__,kernel.html">eq?</a></li>
<li><a href="http://docs.factorcode.org/content/word-if,kernel.html">if</a></li>
<li><a href="http://docs.factorcode.org/content/word-length,sequences.html">length</a></li>
<li><a href="http://docs.factorcode.org/content/word-number__que__,math.html">number?</a></li>
<li><a href="http://docs.factorcode.org/content/word-odd__que__,math.html">odd?</a></li>
<li><a href="http://docs.factorcode.org/content/word-print,io.html">print</a></li>
<li><a href="http://docs.factorcode.org/content/word-ratio,math.html">ratio</a></li>
<li><a href="http://docs.factorcode.org/content/word-reduce,sequences.html">reduce</a></li>
<li><a href="http://docs.factorcode.org/content/word-suffix,sequences.html">suffix</a></li>
<li><a href="http://docs.factorcode.org/content/word-sum,sequences.html">sum</a></li>
<li><a href="http://docs.factorcode.org/content/word-swap,kernel.html">swap</a></li>
<li><a href="http://docs.factorcode.org/content/word-t,syntax.html">t</a></li>
<li><a href="http://docs.factorcode.org/content/word-tuple__que__,kernel.html">tuple?</a></li>
<li><a href="http://docs.factorcode.org/content/word-unclip,sequences.html">unclip</a></li>
<li><a href="http://docs.factorcode.org/content/word-when,kernel.html">when</a></li>
</ul>
<pre class="description"><span class="COMMENT1">! </span><span class="COMMENT1">Ce</span><span class="COMMENT1"> </span><span class="COMMENT1">vocabulaire</span><span class="COMMENT1"> </span><span class="COMMENT1">(a.k.a.</span><span class="COMMENT1"> </span><span class="COMMENT1">module)</span><span class="COMMENT1"> </span><span class="COMMENT1">doit</span><span class="COMMENT1"> </span><span class="COMMENT1">être</span><span class="COMMENT1"> </span><span class="COMMENT1">placé</span><span class="COMMENT1"> </span><span class="COMMENT1">dans</span><span class="COMMENT1"> </span><span class="COMMENT1">le</span><span class="COMMENT1"> </span><span class="COMMENT1">fichier</span>
<span class="COMMENT1">! </span><span class="COMMENT1">work/inf355/cours1/cours1.factor</span><span class="COMMENT1"> </span><span class="COMMENT1">pour</span><span class="COMMENT1"> </span><span class="COMMENT1">pouvoir</span><span class="COMMENT1"> </span><span class="COMMENT1">être</span><span class="COMMENT1"> </span><span class="COMMENT1">trouvé</span><span class="COMMENT1"> </span><span class="COMMENT1">par</span><span class="COMMENT1"> </span><span class="COMMENT1">Factor</span>
<span class="COMMENT1">! </span><span class="COMMENT1">lorsqu'on</span><span class="COMMENT1"> </span><span class="COMMENT1">fait.</span>
<span class="COMMENT1">!</span>
<span class="COMMENT1">! </span><span class="COMMENT1"> </span><span class="COMMENT1">USE:</span><span class="COMMENT1"> </span><span class="COMMENT1">inf355.cours1</span>
<span class="COMMENT1">!</span>

<span class="COMMENT1">! </span><span class="COMMENT1">Nom</span><span class="COMMENT1"> </span><span class="COMMENT1">du</span><span class="COMMENT1"> </span><span class="COMMENT1">vocabulaire.</span>

<span class="MARKUP">IN: inf355.cours1</span>

<span class="COMMENT1">! </span><span class="COMMENT1">Vocabulaires</span><span class="COMMENT1"> </span><span class="COMMENT1">utilisés.</span>

<span class="MARKUP">USING: </span><span class="LITERAL2">accessors</span><span class="LITERAL2"> </span><span class="LITERAL2">io</span><span class="LITERAL2"> </span><span class="LITERAL2">kernel</span><span class="LITERAL2"> </span><span class="LITERAL2">math</span><span class="LITERAL2"> </span><span class="LITERAL2">sequences</span><span class="LITERAL2"> </span><span class="MARKUP">;</span>

<span class="COMMENT1">! </span><span class="COMMENT1">Opérations</span><span class="COMMENT1"> </span><span class="COMMENT1">de</span><span class="COMMENT1"> </span><span class="COMMENT1">base.</span>

<span class="MARKUP">: square</span> <span class="COMMENT3">( </span><span class="COMMENT4">x</span><span class="COMMENT4"> </span><span class="COMMENT3">--</span><span class="COMMENT4"> </span><span class="COMMENT4">y</span><span class="COMMENT4"> </span><span class="COMMENT3">)</span> dup * <span class="MARKUP">;</span>

<span class="MARKUP">: cube</span> <span class="COMMENT3">( </span><span class="COMMENT4">x</span><span class="COMMENT4"> </span><span class="COMMENT3">--</span><span class="COMMENT4"> </span><span class="COMMENT4">y</span><span class="COMMENT4"> </span><span class="COMMENT3">)</span> dup square * <span class="MARKUP">;</span>

<span class="COMMENT1">! </span><span class="COMMENT1">Création</span><span class="COMMENT1"> </span><span class="COMMENT1">d'un</span><span class="COMMENT1"> </span><span class="COMMENT1">nouveau</span><span class="COMMENT1"> </span><span class="COMMENT1">vecteur</span><span class="COMMENT1"> </span><span class="COMMENT1">à</span><span class="COMMENT1"> </span><span class="COMMENT1">chaque</span><span class="COMMENT1"> </span><span class="COMMENT1">appel</span><span class="COMMENT1"> </span><span class="COMMENT1">à</span><span class="COMMENT1"> </span><span class="COMMENT1">"myvec".</span>

<span class="MARKUP">: myvec</span> <span class="COMMENT3">( </span><span class="COMMENT3">--</span><span class="COMMENT4"> </span><span class="COMMENT4">vec</span><span class="COMMENT4"> </span><span class="COMMENT3">)</span> V<span class="OPERATOR">{</span> <span class="OPERATOR">}</span> clone <span class="MARKUP">;</span>

<span class="COMMENT1">! </span><span class="COMMENT1">Utilisation</span><span class="COMMENT1"> </span><span class="COMMENT1">du</span><span class="COMMENT1"> </span><span class="COMMENT1">combinateur</span><span class="COMMENT1"> </span><span class="COMMENT1">"bi"</span><span class="COMMENT1"> </span><span class="COMMENT1">pour</span><span class="COMMENT1"> </span><span class="COMMENT1">utiliser</span><span class="COMMENT1"> </span><span class="COMMENT1">deux</span><span class="COMMENT1"> </span><span class="COMMENT1">fois</span>
<span class="COMMENT1">! </span><span class="COMMENT1">les</span><span class="COMMENT1"> </span><span class="COMMENT1">données</span><span class="COMMENT1"> </span><span class="COMMENT1">qui</span><span class="COMMENT1"> </span><span class="COMMENT1">se</span><span class="COMMENT1"> </span><span class="COMMENT1">trouvent</span><span class="COMMENT1"> </span><span class="COMMENT1">sur</span><span class="COMMENT1"> </span><span class="COMMENT1">la</span><span class="COMMENT1"> </span><span class="COMMENT1">pile.</span>

<span class="MARKUP">: mean</span> <span class="COMMENT3">( </span><span class="COMMENT4">seq</span><span class="COMMENT4"> </span><span class="COMMENT3">--</span><span class="COMMENT4"> </span><span class="COMMENT4">n</span><span class="COMMENT4"> </span><span class="COMMENT3">)</span>
    <span class="OPERATOR">[</span> sum <span class="OPERATOR">]</span> <span class="OPERATOR">[</span> length <span class="OPERATOR">]</span> bi / <span class="MARKUP">;</span>

<span class="COMMENT1">! </span><span class="COMMENT1">Une</span><span class="COMMENT1"> </span><span class="COMMENT1">autre</span><span class="COMMENT1"> </span><span class="COMMENT1">méthode</span><span class="COMMENT1"> </span><span class="COMMENT1">avec</span><span class="COMMENT1"> </span><span class="COMMENT1">"dup"</span><span class="COMMENT1"> </span><span class="COMMENT1">au</span><span class="COMMENT1"> </span><span class="COMMENT1">lieu</span><span class="COMMENT1"> </span><span class="COMMENT1">de</span><span class="COMMENT1"> </span><span class="COMMENT1">"bi".</span>

<span class="MARKUP">: mean'</span> <span class="COMMENT3">( </span><span class="COMMENT4">seq</span><span class="COMMENT4"> </span><span class="COMMENT3">--</span><span class="COMMENT4"> </span><span class="COMMENT4">n</span><span class="COMMENT4"> </span><span class="COMMENT3">)</span>
    dup sum swap length / <span class="MARKUP">;</span>

<span class="COMMENT1">! </span><span class="COMMENT1">Implémentation</span><span class="COMMENT1"> </span><span class="COMMENT1">classique</span><span class="COMMENT1"> </span><span class="COMMENT1">d'un</span><span class="COMMENT1"> </span><span class="COMMENT1">calcul</span><span class="COMMENT1"> </span><span class="COMMENT1">de</span><span class="COMMENT1"> </span><span class="COMMENT1">factorielle</span><span class="COMMENT1"> </span><span class="COMMENT1">récursif.</span>

<span class="MARKUP">: fact</span> <span class="COMMENT3">( </span><span class="COMMENT4">n</span><span class="COMMENT4"> </span><span class="COMMENT3">--</span><span class="COMMENT4"> </span><span class="COMMENT4">n</span><span class="COMMENT4">'</span><span class="COMMENT4"> </span><span class="COMMENT3">)</span>
    dup <span class="DIGIT">2</span> &gt; <span class="OPERATOR">[</span>
        <span class="OPERATOR">[</span> <span class="DIGIT">1</span> - fact <span class="OPERATOR">]</span> <span class="OPERATOR">[</span> * <span class="OPERATOR">]</span> bi
    <span class="OPERATOR">]</span> when <span class="MARKUP">;</span>

<span class="COMMENT1">! </span><span class="COMMENT1">Affichage</span><span class="COMMENT1"> </span><span class="COMMENT1">de</span><span class="COMMENT1"> </span><span class="COMMENT1">la</span><span class="COMMENT1"> </span><span class="COMMENT1">parité</span><span class="COMMENT1"> </span><span class="COMMENT1">d'un</span><span class="COMMENT1"> </span><span class="COMMENT1">nombre.</span>

<span class="MARKUP">: print-parity</span> <span class="COMMENT3">( </span><span class="COMMENT4">n</span><span class="COMMENT4"> </span><span class="COMMENT3">--</span><span class="COMMENT4"> </span><span class="COMMENT3">)</span>
    <span class="OPERATOR">[</span> <span class="LITERAL1">"</span><span class="LITERAL1">it</span><span class="LITERAL1"> </span><span class="LITERAL1">was</span><span class="LITERAL1"> </span><span class="LITERAL1">"</span> <span class="OPERATOR">]</span> dip odd?
    <span class="LITERAL1">"</span><span class="LITERAL1">odd</span><span class="LITERAL1">"</span> <span class="LITERAL1">"</span><span class="LITERAL1">even</span><span class="LITERAL1">"</span> ? append print <span class="MARKUP">;</span>

<span class="COMMENT1">! </span><span class="COMMENT1">Utilisation</span><span class="COMMENT1"> </span><span class="COMMENT1">de</span><span class="COMMENT1"> </span><span class="COMMENT1">"bi*"</span><span class="COMMENT1"> </span><span class="COMMENT1">pour</span><span class="COMMENT1"> </span><span class="COMMENT1">inverser</span><span class="COMMENT1"> </span><span class="COMMENT1">une</span><span class="COMMENT1"> </span><span class="COMMENT1">liste.</span><span class="COMMENT1"> </span><span class="COMMENT1">"unclip"</span><span class="COMMENT1"> </span><span class="COMMENT1">est</span>
<span class="COMMENT1">! </span><span class="COMMENT1">bien</span><span class="COMMENT1"> </span><span class="COMMENT1">pratique</span><span class="COMMENT1"> </span><span class="COMMENT1">ici.</span>

<span class="MARKUP">: rev</span> <span class="COMMENT3">( </span><span class="COMMENT4">seq</span><span class="COMMENT4"> </span><span class="COMMENT3">--</span><span class="COMMENT4"> </span><span class="COMMENT4">seq</span><span class="COMMENT4">'</span><span class="COMMENT4"> </span><span class="COMMENT3">)</span>
    dup length <span class="DIGIT">2</span> &gt;= <span class="OPERATOR">[</span>
        unclip
        <span class="OPERATOR">[</span> rev <span class="OPERATOR">]</span> <span class="OPERATOR">[</span> suffix <span class="OPERATOR">]</span> bi*
    <span class="OPERATOR">]</span> when <span class="MARKUP">;</span>

<span class="COMMENT1">! </span><span class="COMMENT1">Réimplémentation</span><span class="COMMENT1"> </span><span class="COMMENT1">de</span><span class="COMMENT1"> </span><span class="COMMENT1">"sum"</span><span class="COMMENT1"> </span><span class="COMMENT1">avec</span><span class="COMMENT1"> </span><span class="COMMENT1">"reduce".</span>

<span class="MARKUP">: mysum</span> <span class="COMMENT3">( </span><span class="COMMENT4">seq</span><span class="COMMENT4"> </span><span class="COMMENT3">--</span><span class="COMMENT4"> </span><span class="COMMENT4">n</span><span class="COMMENT4"> </span><span class="COMMENT3">)</span>
    <span class="DIGIT">0</span> <span class="OPERATOR">[</span> + <span class="OPERATOR">]</span> reduce <span class="MARKUP">;</span>

<span class="COMMENT1">! </span><span class="COMMENT1">Création</span><span class="COMMENT1"> </span><span class="COMMENT1">d'un</span><span class="COMMENT1"> </span><span class="COMMENT1">type</span><span class="COMMENT1"> </span><span class="COMMENT1">"person".</span>

TUPLE: person <span class="OPERATOR">{</span> first initial: <span class="LITERAL1">"</span><span class="LITERAL1">John</span><span class="LITERAL1">"</span> <span class="OPERATOR">}</span> <span class="OPERATOR">{</span> last initial: <span class="LITERAL1">"</span><span class="LITERAL1">Doe</span><span class="LITERAL1">"</span> <span class="OPERATOR">}</span> <span class="MARKUP">;</span>

<span class="COMMENT1">! </span><span class="COMMENT1">Définition</span><span class="COMMENT1"> </span><span class="COMMENT1">d'un</span><span class="COMMENT1"> </span><span class="COMMENT1">constructeur</span><span class="COMMENT1"> </span><span class="COMMENT1">pour</span><span class="COMMENT1"> </span><span class="COMMENT1">ce</span><span class="COMMENT1"> </span><span class="COMMENT1">type.</span><span class="COMMENT1"> </span><span class="COMMENT1">C'est</span><span class="COMMENT1"> </span><span class="COMMENT1">équivalent</span><span class="COMMENT1"> </span><span class="COMMENT1">à</span>
<span class="COMMENT1">! </span><span class="COMMENT1"> </span><span class="COMMENT1"> </span><span class="COMMENT1">:</span><span class="COMMENT1"> </span><span class="COMMENT1">&lt;person&gt;</span><span class="COMMENT1"> </span><span class="COMMENT1">(</span><span class="COMMENT1"> </span><span class="COMMENT1">first</span><span class="COMMENT1"> </span><span class="COMMENT1">last</span><span class="COMMENT1"> </span><span class="COMMENT1">--</span><span class="COMMENT1"> </span><span class="COMMENT1">person</span><span class="COMMENT1"> </span><span class="COMMENT1">)</span><span class="COMMENT1"> </span><span class="COMMENT1">person</span><span class="COMMENT1"> </span><span class="COMMENT1">boa</span><span class="COMMENT1"> </span><span class="COMMENT1">;</span>
<span class="COMMENT1">! </span><span class="COMMENT1">ou</span><span class="COMMENT1"> </span><span class="COMMENT1">à</span>
<span class="COMMENT1">! </span><span class="COMMENT1"> </span><span class="COMMENT1"> </span><span class="COMMENT1">:</span><span class="COMMENT1"> </span><span class="COMMENT1">&lt;person&gt;</span><span class="COMMENT1"> </span><span class="COMMENT1">(</span><span class="COMMENT1"> </span><span class="COMMENT1">first</span><span class="COMMENT1"> </span><span class="COMMENT1">last</span><span class="COMMENT1"> </span><span class="COMMENT1">--</span><span class="COMMENT1"> </span><span class="COMMENT1">person</span><span class="COMMENT1"> </span><span class="COMMENT1">)</span><span class="COMMENT1"> </span><span class="COMMENT1">[</span><span class="COMMENT1"> </span><span class="COMMENT1">person</span><span class="COMMENT1"> </span><span class="COMMENT1">new</span><span class="COMMENT1"> </span><span class="COMMENT1">]</span><span class="COMMENT1"> </span><span class="COMMENT1">2dip</span><span class="COMMENT1"> </span><span class="COMMENT1">&gt;&gt;first</span><span class="COMMENT1"> </span><span class="COMMENT1">&gt;&gt;last</span><span class="COMMENT1"> </span><span class="COMMENT1">;</span>

C: &lt;person&gt; person

<span class="COMMENT1">! </span><span class="COMMENT1">La</span><span class="COMMENT1"> </span><span class="COMMENT1">classe</span><span class="COMMENT1"> </span><span class="COMMENT1">"student"</span><span class="COMMENT1"> </span><span class="COMMENT1">est</span><span class="COMMENT1"> </span><span class="COMMENT1">dérivée</span><span class="COMMENT1"> </span><span class="COMMENT1">de</span><span class="COMMENT1"> </span><span class="COMMENT1">"person"</span><span class="COMMENT1"> </span><span class="COMMENT1">et</span><span class="COMMENT1"> </span><span class="COMMENT1">ajoute</span><span class="COMMENT1"> </span><span class="COMMENT1">un</span><span class="COMMENT1"> </span><span class="COMMENT1">champ</span>
<span class="COMMENT1">! </span><span class="COMMENT1">"grade"</span><span class="COMMENT1"> </span><span class="COMMENT1">avec</span><span class="COMMENT1"> </span><span class="COMMENT1">une</span><span class="COMMENT1"> </span><span class="COMMENT1">valeur</span><span class="COMMENT1"> </span><span class="COMMENT1">initiale</span><span class="COMMENT1"> </span><span class="COMMENT1">de</span><span class="COMMENT1"> </span><span class="COMMENT1">0.</span>

TUPLE: student &lt; person <span class="OPERATOR">{</span> grade initial: <span class="DIGIT">0</span> <span class="OPERATOR">}</span> <span class="MARKUP">;</span>

<span class="COMMENT1">! </span><span class="COMMENT1">Définition</span><span class="COMMENT1"> </span><span class="COMMENT1">d'un</span><span class="COMMENT1"> </span><span class="COMMENT1">type</span><span class="COMMENT1"> </span><span class="COMMENT1">"course"</span><span class="COMMENT1"> </span><span class="COMMENT1">et</span><span class="COMMENT1"> </span><span class="COMMENT1">de</span><span class="COMMENT1"> </span><span class="COMMENT1">son</span><span class="COMMENT1"> </span><span class="COMMENT1">constructeur.</span>

TUPLE: course name teacher <span class="OPERATOR">{</span> students initial: <span class="OPERATOR">{</span> <span class="OPERATOR">}</span> <span class="OPERATOR">}</span> <span class="MARKUP">;</span>

<span class="MARKUP">: &lt;course&gt;</span> <span class="COMMENT3">( </span><span class="COMMENT4">name</span><span class="COMMENT4"> </span><span class="COMMENT4">teacher</span><span class="COMMENT4"> </span><span class="COMMENT3">--</span><span class="COMMENT4"> </span><span class="COMMENT4">course</span><span class="COMMENT4"> </span><span class="COMMENT3">)</span>
    <span class="OPERATOR">{</span> <span class="OPERATOR">}</span> course boa <span class="MARKUP">;</span>

<span class="COMMENT1">! </span><span class="COMMENT1">Ajout</span><span class="COMMENT1"> </span><span class="COMMENT1">d'un</span><span class="COMMENT1"> </span><span class="COMMENT1">étudiant</span><span class="COMMENT1"> </span><span class="COMMENT1">à</span><span class="COMMENT1"> </span><span class="COMMENT1">un</span><span class="COMMENT1"> </span><span class="COMMENT1">cours.</span>

<span class="MARKUP">: add-student</span> <span class="COMMENT3">( </span><span class="COMMENT4">course</span><span class="COMMENT4"> </span><span class="COMMENT4">student</span><span class="COMMENT4"> </span><span class="COMMENT3">--</span><span class="COMMENT4"> </span><span class="COMMENT4">course</span><span class="COMMENT4"> </span><span class="COMMENT3">)</span>
    <span class="OPERATOR">[</span> suffix <span class="OPERATOR">]</span> curry change-students <span class="MARKUP">;</span>

<span class="MARKUP">: add-named-student</span> <span class="COMMENT3">( </span><span class="COMMENT4">course</span><span class="COMMENT4"> </span><span class="COMMENT4">first</span><span class="COMMENT4"> </span><span class="COMMENT4">last</span><span class="COMMENT4"> </span><span class="COMMENT3">--</span><span class="COMMENT4"> </span><span class="COMMENT4">course</span><span class="COMMENT4"> </span><span class="COMMENT3">)</span>
    <span class="DIGIT">0</span> student boa add-student <span class="MARKUP">;</span>

<span class="COMMENT1">! </span><span class="COMMENT1">Déclaration</span><span class="COMMENT1"> </span><span class="COMMENT1">d'une</span><span class="COMMENT1"> </span><span class="COMMENT1">fonction</span><span class="COMMENT1"> </span><span class="COMMENT1">générique</span><span class="COMMENT1"> </span><span class="COMMENT1">"name"</span><span class="COMMENT1"> </span><span class="COMMENT1">permettant</span><span class="COMMENT1"> </span><span class="COMMENT1">de</span><span class="COMMENT1"> </span><span class="COMMENT1">récupérer</span>
<span class="COMMENT1">! </span><span class="COMMENT1">nom</span><span class="COMMENT1"> </span><span class="COMMENT1">d'une</span><span class="COMMENT1"> </span><span class="COMMENT1">personne,</span><span class="COMMENT1"> </span><span class="COMMENT1">puis</span><span class="COMMENT1"> </span><span class="COMMENT1">définition</span><span class="COMMENT1"> </span><span class="COMMENT1">pour</span><span class="COMMENT1"> </span><span class="COMMENT1">une</span><span class="COMMENT1"> </span><span class="COMMENT1">"person"</span><span class="COMMENT1"> </span><span class="COMMENT1">et</span><span class="COMMENT1"> </span><span class="COMMENT1">pour</span><span class="COMMENT1"> </span><span class="COMMENT1">un</span>
<span class="COMMENT1">! </span><span class="COMMENT1">"student".</span>

GENERIC: name <span class="COMMENT3">( </span><span class="COMMENT4">person</span><span class="COMMENT4"> </span><span class="COMMENT3">--</span><span class="COMMENT4"> </span><span class="COMMENT4">str</span><span class="COMMENT4"> </span><span class="COMMENT3">)</span>

M: person name
    <span class="OPERATOR">[</span> first&gt;&gt; <span class="OPERATOR">]</span> <span class="OPERATOR">[</span> last&gt;&gt; <span class="OPERATOR">]</span> bi
    <span class="LITERAL1">"</span><span class="LITERAL1"> </span><span class="LITERAL1">"</span> glue <span class="MARKUP">;</span>

M: student name
    call-next-method <span class="LITERAL1">"</span><span class="LITERAL1">The</span><span class="LITERAL1"> </span><span class="LITERAL1">small</span><span class="LITERAL1"> </span><span class="LITERAL1">"</span> prepend <span class="MARKUP">;</span>

<span class="COMMENT1">! </span><span class="COMMENT1">Un</span><span class="COMMENT1"> </span><span class="COMMENT1">"good-student"</span><span class="COMMENT1"> </span><span class="COMMENT1">est</span><span class="COMMENT1"> </span><span class="COMMENT1">un</span><span class="COMMENT1"> </span><span class="COMMENT1">"student"</span><span class="COMMENT1"> </span><span class="COMMENT1">avec</span><span class="COMMENT1"> </span><span class="COMMENT1">une</span><span class="COMMENT1"> </span><span class="COMMENT1">note</span><span class="COMMENT1"> </span><span class="COMMENT1">supérieure</span><span class="COMMENT1"> </span><span class="COMMENT1">ou</span><span class="COMMENT1"> </span><span class="COMMENT1">égale</span>
<span class="COMMENT1">! </span><span class="COMMENT1">à</span><span class="COMMENT1"> </span><span class="COMMENT1">10.</span>

PREDICATE: good-student &lt; student
    grade&gt;&gt; <span class="DIGIT">10</span> &gt;= <span class="MARKUP">;</span>

<span class="COMMENT1">! </span><span class="COMMENT1">On</span><span class="COMMENT1"> </span><span class="COMMENT1">spécialise</span><span class="COMMENT1"> </span><span class="COMMENT1">"name"</span><span class="COMMENT1"> </span><span class="COMMENT1">pour</span><span class="COMMENT1"> </span><span class="COMMENT1">un</span><span class="COMMENT1"> </span><span class="COMMENT1">"good-student".</span>

M: good-student name
    call-next-method <span class="LITERAL1">"</span><span class="LITERAL1"> </span><span class="LITERAL1">(and</span><span class="LITERAL1"> </span><span class="LITERAL1">great!)</span><span class="LITERAL1">"</span> append <span class="MARKUP">;</span>

<span class="COMMENT1">! </span><span class="COMMENT1">Un</span><span class="COMMENT1"> </span><span class="COMMENT1">enseignant</span><span class="COMMENT1"> </span><span class="COMMENT1">a</span><span class="COMMENT1"> </span><span class="COMMENT1">un</span><span class="COMMENT1"> </span><span class="COMMENT1">bureau.</span>

TUPLE: teacher &lt; person office <span class="MARKUP">;</span>

<span class="COMMENT1">! </span><span class="COMMENT1">Un</span><span class="COMMENT1"> </span><span class="COMMENT1">membre</span><span class="COMMENT1"> </span><span class="COMMENT1">de</span><span class="COMMENT1"> </span><span class="COMMENT1">l'université</span><span class="COMMENT1"> </span><span class="COMMENT1">est</span><span class="COMMENT1"> </span><span class="COMMENT1">soit</span><span class="COMMENT1"> </span><span class="COMMENT1">un</span><span class="COMMENT1"> </span><span class="COMMENT1">étudiant</span><span class="COMMENT1"> </span><span class="COMMENT1">soit</span><span class="COMMENT1"> </span><span class="COMMENT1">un</span><span class="COMMENT1"> </span><span class="COMMENT1">enseignant.</span>

UNION: university-member student teacher <span class="MARKUP">;</span>

<span class="COMMENT1">! </span><span class="COMMENT1">Définition</span><span class="COMMENT1"> </span><span class="COMMENT1">d'une</span><span class="COMMENT1"> </span><span class="COMMENT1">fonction</span><span class="COMMENT1"> </span><span class="COMMENT1">donnant</span><span class="COMMENT1"> </span><span class="COMMENT1">le</span><span class="COMMENT1"> </span><span class="COMMENT1">nom</span><span class="COMMENT1"> </span><span class="COMMENT1">à</span><span class="COMMENT1"> </span><span class="COMMENT1">l'envers</span><span class="COMMENT1"> </span><span class="COMMENT1">(nom</span><span class="COMMENT1"> </span><span class="COMMENT1">de</span><span class="COMMENT1"> </span><span class="COMMENT1">famille</span>
<span class="COMMENT1">! </span><span class="COMMENT1">en</span><span class="COMMENT1"> </span><span class="COMMENT1">premier</span><span class="COMMENT1"> </span><span class="COMMENT1">et</span><span class="COMMENT1"> </span><span class="COMMENT1">prénom</span><span class="COMMENT1"> </span><span class="COMMENT1">ensuite)</span><span class="COMMENT1"> </span><span class="COMMENT1">et</span><span class="COMMENT1"> </span><span class="COMMENT1">implémentation</span><span class="COMMENT1"> </span><span class="COMMENT1">pour</span><span class="COMMENT1"> </span><span class="COMMENT1">un</span><span class="COMMENT1"> </span><span class="COMMENT1">membre</span><span class="COMMENT1"> </span><span class="COMMENT1">de</span>
<span class="COMMENT1">! </span><span class="COMMENT1">l'université.</span>

GENERIC: reverse-name <span class="COMMENT3">( </span><span class="COMMENT4">u</span><span class="COMMENT4"> </span><span class="COMMENT3">--</span><span class="COMMENT4"> </span><span class="COMMENT4">str</span><span class="COMMENT4"> </span><span class="COMMENT3">)</span>

M: university-member reverse-name
    <span class="OPERATOR">[</span> last&gt;&gt; <span class="OPERATOR">]</span> <span class="OPERATOR">[</span> first&gt;&gt; <span class="OPERATOR">]</span> bi <span class="LITERAL1">"</span><span class="LITERAL1"> </span><span class="LITERAL1">"</span> glue <span class="MARKUP">;</span>

<span class="COMMENT1">! </span><span class="COMMENT1">Définition</span><span class="COMMENT1"> </span><span class="COMMENT1">d'un</span><span class="COMMENT1"> </span><span class="COMMENT1">type</span><span class="COMMENT1"> </span><span class="COMMENT1">mixin</span><span class="COMMENT1"> </span><span class="COMMENT1">"graded"</span><span class="COMMENT1"> </span><span class="COMMENT1">représentant</span><span class="COMMENT1"> </span><span class="COMMENT1">ceux</span><span class="COMMENT1"> </span><span class="COMMENT1">qui</span><span class="COMMENT1"> </span><span class="COMMENT1">peuvent</span><span class="COMMENT1"> </span><span class="COMMENT1">avoir</span>
<span class="COMMENT1">! </span><span class="COMMENT1">une</span><span class="COMMENT1"> </span><span class="COMMENT1">note.</span>

MIXIN: graded

<span class="COMMENT1">! </span><span class="COMMENT1">"grade"</span><span class="COMMENT1"> </span><span class="COMMENT1">et</span><span class="COMMENT1"> </span><span class="COMMENT1">"final-grade"</span><span class="COMMENT1"> </span><span class="COMMENT1">sont</span><span class="COMMENT1"> </span><span class="COMMENT1">génériques.</span>

GENERIC: grade <span class="COMMENT3">( </span><span class="COMMENT4">p</span><span class="COMMENT4"> </span><span class="COMMENT3">--</span><span class="COMMENT4"> </span><span class="COMMENT4">n</span><span class="COMMENT4"> </span><span class="COMMENT3">)</span>
GENERIC: final-grade <span class="COMMENT3">( </span><span class="COMMENT4">p</span><span class="COMMENT4"> </span><span class="COMMENT3">--</span><span class="COMMENT4"> </span><span class="COMMENT4">n</span><span class="COMMENT4"> </span><span class="COMMENT3">)</span>

<span class="COMMENT1">! </span><span class="COMMENT1">Par</span><span class="COMMENT1"> </span><span class="COMMENT1">défaut,</span><span class="COMMENT1"> </span><span class="COMMENT1">la</span><span class="COMMENT1"> </span><span class="COMMENT1">note</span><span class="COMMENT1"> </span><span class="COMMENT1">est</span><span class="COMMENT1"> </span><span class="COMMENT1">20.</span>

M: graded grade drop <span class="DIGIT">20</span> <span class="MARKUP">;</span>

<span class="COMMENT1">! </span><span class="COMMENT1">Par</span><span class="COMMENT1"> </span><span class="COMMENT1">défaut,</span><span class="COMMENT1"> </span><span class="COMMENT1">la</span><span class="COMMENT1"> </span><span class="COMMENT1">note</span><span class="COMMENT1"> </span><span class="COMMENT1">finale</span><span class="COMMENT1"> </span><span class="COMMENT1">est</span><span class="COMMENT1"> </span><span class="COMMENT1">égale</span><span class="COMMENT1"> </span><span class="COMMENT1">à</span><span class="COMMENT1"> </span><span class="COMMENT1">la</span><span class="COMMENT1"> </span><span class="COMMENT1">note.</span>

M: graded final-grade grade <span class="MARKUP">;</span>

<span class="COMMENT1">! </span><span class="COMMENT1">Pour</span><span class="COMMENT1"> </span><span class="COMMENT1">un</span><span class="COMMENT1"> </span><span class="COMMENT1">étudiant,</span><span class="COMMENT1"> </span><span class="COMMENT1">la</span><span class="COMMENT1"> </span><span class="COMMENT1">note</span><span class="COMMENT1"> </span><span class="COMMENT1">est</span><span class="COMMENT1"> </span><span class="COMMENT1">la</span><span class="COMMENT1"> </span><span class="COMMENT1">note</span><span class="COMMENT1"> </span><span class="COMMENT1">obtenue.</span>

M: student grade grade&gt;&gt; <span class="MARKUP">;</span>

<span class="COMMENT1">! </span><span class="COMMENT1">Pour</span><span class="COMMENT1"> </span><span class="COMMENT1">un</span><span class="COMMENT1"> </span><span class="COMMENT1">bon</span><span class="COMMENT1"> </span><span class="COMMENT1">étudiant,</span><span class="COMMENT1"> </span><span class="COMMENT1">la</span><span class="COMMENT1"> </span><span class="COMMENT1">note</span><span class="COMMENT1"> </span><span class="COMMENT1">finale</span><span class="COMMENT1"> </span><span class="COMMENT1">est</span><span class="COMMENT1"> </span><span class="COMMENT1">la</span><span class="COMMENT1"> </span><span class="COMMENT1">note</span><span class="COMMENT1"> </span><span class="COMMENT1">augmentée</span><span class="COMMENT1"> </span><span class="COMMENT1">de</span><span class="COMMENT1"> </span><span class="COMMENT1">la</span><span class="COMMENT1"> </span><span class="COMMENT1">demi-différence</span>
<span class="COMMENT1">! </span><span class="COMMENT1">avec</span><span class="COMMENT1"> </span><span class="COMMENT1">20.</span>

M: good-student final-grade call-next-method <span class="DIGIT">20</span> + <span class="DIGIT">2</span> / <span class="MARKUP">;</span>

<span class="COMMENT1">! </span><span class="COMMENT1">Les</span><span class="COMMENT1"> </span><span class="COMMENT1">étudiants</span><span class="COMMENT1"> </span><span class="COMMENT1">et</span><span class="COMMENT1"> </span><span class="COMMENT1">les</span><span class="COMMENT1"> </span><span class="COMMENT1">enseignants</span><span class="COMMENT1"> </span><span class="COMMENT1">peuvent</span><span class="COMMENT1"> </span><span class="COMMENT1">avoir</span><span class="COMMENT1"> </span><span class="COMMENT1">une</span><span class="COMMENT1"> </span><span class="COMMENT1">note.</span>

INSTANCE: teacher graded
INSTANCE: student graded

<span class="COMMENT1">! </span><span class="COMMENT1">On</span><span class="COMMENT1"> </span><span class="COMMENT1">peut</span><span class="COMMENT1"> </span><span class="COMMENT1">aussi</span><span class="COMMENT1"> </span><span class="COMMENT1">étendre</span><span class="COMMENT1"> </span><span class="COMMENT1">les</span><span class="COMMENT1"> </span><span class="COMMENT1">notes</span><span class="COMMENT1"> </span><span class="COMMENT1">aux</span><span class="COMMENT1"> </span><span class="COMMENT1">nombres</span><span class="COMMENT1"> </span><span class="COMMENT1">:</span><span class="COMMENT1"> </span><span class="COMMENT1">la</span><span class="COMMENT1"> </span><span class="COMMENT1">note</span><span class="COMMENT1"> </span><span class="COMMENT1">est</span><span class="COMMENT1"> </span><span class="COMMENT1">le</span><span class="COMMENT1"> </span><span class="COMMENT1">nombre</span><span class="COMMENT1"> </span><span class="COMMENT1">lui-même.</span>

M: number grade <span class="MARKUP">;</span>

INSTANCE: number graded
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.rfc1149.net/plnc2010/2010/06/10/factor-note-de-cours-1-9-juin-2010/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Scala : notes de cours 2 (4 juin 2010)</title>
		<link>http://www.rfc1149.net/plnc2010/2010/06/04/scala-notes-de-cours-2-4-juin-2010/</link>
		<comments>http://www.rfc1149.net/plnc2010/2010/06/04/scala-notes-de-cours-2-4-juin-2010/#comments</comments>
		<pubDate>Fri, 04 Jun 2010 13:10:06 +0000</pubDate>
		<dc:creator>Samuel Tardieu</dc:creator>
				<category><![CDATA[Cours]]></category>
		<category><![CDATA[Scala]]></category>

		<guid isPermaLink="false">http://www.rfc1149.net/plnc2010/?p=81</guid>
		<description><![CDATA[
package net.rfc1149.cours2
&#160;
import scala.actors.&#123;Actor,Futures,Scheduler,TIMEOUT&#125;
import Futures._
&#160;
// Demonstration of object unbuilding using unapply.
// This will be used for pattern matching.
&#160;
object TripleOf &#123;
&#160;
  def apply&#40;n: Int&#41;: Int = 3 * n
&#160;
  def unapply&#40;n: Int&#41;: Option&#91;Int&#93; =
    if &#40;n % 3 == 0&#41; Some&#40;n/3&#41; else None
&#160;
&#125;
&#160;
// Simple matching returning a boolean, no possibility of variable [...]]]></description>
			<content:encoded><![CDATA[
<div class="wp_syntax"><div class="code"><pre class="scala" style="font-family:monospace;"><span style="color: #0000ff; font-weight: bold;">package</span> net.<span style="color: #000000;">rfc1149</span>.<span style="color: #000000;">cours2</span>
&nbsp;
<span style="color: #0000ff; font-weight: bold;">import</span> scala.<span style="color: #000000;">actors</span>.<span style="color: #F78811;">&#123;</span>Actor,Futures,Scheduler,TIMEOUT<span style="color: #F78811;">&#125;</span>
<span style="color: #0000ff; font-weight: bold;">import</span> Futures.<span style="color: #000080;">_</span>
&nbsp;
<span style="color: #008000; font-style: italic;">// Demonstration of object unbuilding using unapply.</span>
<span style="color: #008000; font-style: italic;">// This will be used for pattern matching.</span>
&nbsp;
<span style="color: #0000ff; font-weight: bold;">object</span> TripleOf <span style="color: #F78811;">&#123;</span>
&nbsp;
  <span style="color: #0000ff; font-weight: bold;">def</span> apply<span style="color: #F78811;">&#40;</span>n<span style="color: #000080;">:</span> Int<span style="color: #F78811;">&#41;</span><span style="color: #000080;">:</span> Int <span style="color: #000080;">=</span> <span style="color: #F78811;">3</span> <span style="color: #000080;">*</span> n
&nbsp;
  <span style="color: #0000ff; font-weight: bold;">def</span> unapply<span style="color: #F78811;">&#40;</span>n<span style="color: #000080;">:</span> Int<span style="color: #F78811;">&#41;</span><span style="color: #000080;">:</span> Option<span style="color: #F78811;">&#91;</span>Int<span style="color: #F78811;">&#93;</span> <span style="color: #000080;">=</span>
    <span style="color: #0000ff; font-weight: bold;">if</span> <span style="color: #F78811;">&#40;</span>n <span style="color: #000080;">%</span> <span style="color: #F78811;">3</span> <span style="color: #000080;">==</span> <span style="color: #F78811;">0</span><span style="color: #F78811;">&#41;</span> Some<span style="color: #F78811;">&#40;</span>n/<span style="color: #F78811;">3</span><span style="color: #F78811;">&#41;</span> <span style="color: #0000ff; font-weight: bold;">else</span> None
&nbsp;
<span style="color: #F78811;">&#125;</span>
&nbsp;
<span style="color: #008000; font-style: italic;">// Simple matching returning a boolean, no possibility of variable unification</span>
&nbsp;
<span style="color: #0000ff; font-weight: bold;">object</span> IsDouble <span style="color: #F78811;">&#123;</span>
&nbsp;
   <span style="color: #0000ff; font-weight: bold;">def</span> unapply<span style="color: #F78811;">&#40;</span>n<span style="color: #000080;">:</span> Int<span style="color: #F78811;">&#41;</span><span style="color: #000080;">:</span> Boolean <span style="color: #000080;">=</span> n <span style="color: #000080;">%</span> <span style="color: #F78811;">2</span> <span style="color: #000080;">==</span> <span style="color: #F78811;">0</span>
&nbsp;
<span style="color: #F78811;">&#125;</span>
&nbsp;
<span style="color: #008000; font-style: italic;">// Definition of a container case class</span>
&nbsp;
<span style="color: #0000ff; font-weight: bold;">case</span> <span style="color: #0000ff; font-weight: bold;">class</span> Triple<span style="color: #F78811;">&#40;</span>n<span style="color: #000080;">:</span> Int<span style="color: #F78811;">&#41;</span>
&nbsp;
<span style="color: #008000; font-style: italic;">// Singleton</span>
&nbsp;
<span style="color: #0000ff; font-weight: bold;">case</span> <span style="color: #0000ff; font-weight: bold;">object</span> Error
&nbsp;
<span style="color: #008000; font-style: italic;">// Simple actor case</span>
&nbsp;
<span style="color: #0000ff; font-weight: bold;">class</span> Poor <span style="color: #0000ff; font-weight: bold;">extends</span> Actor <span style="color: #F78811;">&#123;</span>
&nbsp;
  <span style="color: #0000ff; font-weight: bold;">def</span> act <span style="color: #000080;">=</span> println<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;I am an actor&quot;</span><span style="color: #F78811;">&#41;</span>
<span style="color: #F78811;">&#125;</span>
&nbsp;
<span style="color: #0000ff; font-weight: bold;">case</span> <span style="color: #0000ff; font-weight: bold;">object</span> Die
&nbsp;
<span style="color: #008000; font-style: italic;">// Rich actor with differenciation based on received message.</span>
<span style="color: #008000; font-style: italic;">// react and reactWithin do not return, hence the loop.</span>
<span style="color: #008000; font-style: italic;">// In reactWithin, the timeout is signalled by sending</span>
<span style="color: #008000; font-style: italic;">// TIMEOUT.</span>
&nbsp;
<span style="color: #0000ff; font-weight: bold;">class</span> Rich <span style="color: #0000ff; font-weight: bold;">extends</span> Actor <span style="color: #F78811;">&#123;</span>
&nbsp;
  <span style="color: #0000ff; font-weight: bold;">def</span> act <span style="color: #000080;">=</span> <span style="color: #F78811;">&#123;</span>
&nbsp;
    loop <span style="color: #F78811;">&#123;</span>
      react <span style="color: #F78811;">&#123;</span>
&nbsp;
	<span style="color: #0000ff; font-weight: bold;">case</span> Die <span style="color: #000080;">=&gt;</span> println<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;I am gonna die&quot;</span><span style="color: #F78811;">&#41;</span><span style="color: #000080;">;</span> exit<span style="color: #000080;">;</span> println<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;I am not here&quot;</span><span style="color: #F78811;">&#41;</span>
	<span style="color: #0000ff; font-weight: bold;">case</span> s<span style="color: #000080;">:</span> String <span style="color: #000080;">=&gt;</span> println<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;I received a scenario for &quot;</span> + s<span style="color: #F78811;">&#41;</span>
	<span style="color: #0000ff; font-weight: bold;">case</span> i<span style="color: #000080;">:</span> Int <span style="color: #000080;">=&gt;</span> <span style="color: #F78811;">&#123;</span>
	  <span style="color: #0000ff; font-weight: bold;">val</span> n <span style="color: #000080;">=</span> i <span style="color: #000080;">*</span> <span style="color: #F78811;">2</span>
	  println<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;I received some cash ($&quot;</span> + i + <span style="color: #6666FF;">&quot;) but I want $&quot;</span> + n<span style="color: #F78811;">&#41;</span>
	  reply<span style="color: #F78811;">&#40;</span>n<span style="color: #F78811;">&#41;</span>
	<span style="color: #F78811;">&#125;</span>
      <span style="color: #F78811;">&#125;</span>
    <span style="color: #F78811;">&#125;</span>
  <span style="color: #F78811;">&#125;</span>
&nbsp;
<span style="color: #F78811;">&#125;</span>
&nbsp;
<span style="color: #008000; font-style: italic;">// Simple mutex with P and V operations. A Die operation</span>
<span style="color: #008000; font-style: italic;">// stops the mutex.</span>
&nbsp;
<span style="color: #0000ff; font-weight: bold;">case</span> <span style="color: #0000ff; font-weight: bold;">object</span> P
<span style="color: #0000ff; font-weight: bold;">case</span> <span style="color: #0000ff; font-weight: bold;">object</span> V
<span style="color: #0000ff; font-weight: bold;">case</span> <span style="color: #0000ff; font-weight: bold;">object</span> Ok
&nbsp;
<span style="color: #0000ff; font-weight: bold;">class</span> Mutex <span style="color: #0000ff; font-weight: bold;">extends</span> Actor <span style="color: #F78811;">&#123;</span>
&nbsp;
  <span style="color: #0000ff; font-weight: bold;">def</span> act <span style="color: #000080;">=</span> <span style="color: #F78811;">&#123;</span>
&nbsp;
    loop <span style="color: #F78811;">&#123;</span>
      react <span style="color: #F78811;">&#123;</span>
	  <span style="color: #0000ff; font-weight: bold;">case</span> P <span style="color: #000080;">=&gt;</span> <span style="color: #F78811;">&#123;</span>
	    reply<span style="color: #F78811;">&#40;</span>Ok<span style="color: #F78811;">&#41;</span>
	    react <span style="color: #F78811;">&#123;</span>
	        <span style="color: #0000ff; font-weight: bold;">case</span> Die <span style="color: #000080;">=&gt;</span> exit
		<span style="color: #0000ff; font-weight: bold;">case</span> V <span style="color: #000080;">=&gt;</span>
		  println<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;Waiting people &quot;</span> + mailboxSize<span style="color: #F78811;">&#41;</span>
	    <span style="color: #F78811;">&#125;</span>
	  <span style="color: #F78811;">&#125;</span>
	  <span style="color: #0000ff; font-weight: bold;">case</span> Die <span style="color: #000080;">=&gt;</span> exit
      <span style="color: #F78811;">&#125;</span>
    <span style="color: #F78811;">&#125;</span>
&nbsp;
  <span style="color: #F78811;">&#125;</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Synchronous call</span>
  <span style="color: #0000ff; font-weight: bold;">def</span> p <span style="color: #000080;">=</span> <span style="color: #0000ff; font-weight: bold;">this</span> <span style="color: #000080;">!?</span> P
&nbsp;
  <span style="color: #008000; font-style: italic;">// Asynchronous calls</span>
  <span style="color: #0000ff; font-weight: bold;">def</span> v <span style="color: #000080;">=</span> <span style="color: #0000ff; font-weight: bold;">this</span> <span style="color: #000080;">!</span> V
  <span style="color: #0000ff; font-weight: bold;">def</span> die <span style="color: #000080;">=</span> <span style="color: #0000ff; font-weight: bold;">this</span> <span style="color: #000080;">!</span> Die
&nbsp;
<span style="color: #F78811;">&#125;</span>
&nbsp;
<span style="color: #008000; font-style: italic;">// Message prioritization example</span>
&nbsp;
<span style="color: #0000ff; font-weight: bold;">case</span> <span style="color: #0000ff; font-weight: bold;">object</span> Alarm
<span style="color: #0000ff; font-weight: bold;">case</span> <span style="color: #0000ff; font-weight: bold;">object</span> Info
&nbsp;
<span style="color: #0000ff; font-weight: bold;">class</span> Toto <span style="color: #0000ff; font-weight: bold;">extends</span> Actor <span style="color: #F78811;">&#123;</span>
&nbsp;
  <span style="color: #0000ff; font-weight: bold;">def</span> act <span style="color: #000080;">=</span> <span style="color: #F78811;">&#123;</span>
    loop <span style="color: #F78811;">&#123;</span>
      reactWithin<span style="color: #F78811;">&#40;</span><span style="color: #F78811;">0</span><span style="color: #F78811;">&#41;</span> <span style="color: #F78811;">&#123;</span>
	  <span style="color: #0000ff; font-weight: bold;">case</span> Alarm <span style="color: #000080;">=&gt;</span> println<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;Alarm&quot;</span><span style="color: #F78811;">&#41;</span>
	  <span style="color: #0000ff; font-weight: bold;">case</span> TIMEOUT <span style="color: #000080;">=&gt;</span>
	    react <span style="color: #F78811;">&#123;</span>
		<span style="color: #0000ff; font-weight: bold;">case</span> Alarm <span style="color: #000080;">=&gt;</span> println<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;Alarm&quot;</span><span style="color: #F78811;">&#41;</span>
		<span style="color: #0000ff; font-weight: bold;">case</span> Info <span style="color: #000080;">=&gt;</span> println<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;Info&quot;</span><span style="color: #F78811;">&#41;</span>
	    <span style="color: #F78811;">&#125;</span>
      <span style="color: #F78811;">&#125;</span>
    <span style="color: #F78811;">&#125;</span>
  <span style="color: #F78811;">&#125;</span>
&nbsp;
<span style="color: #F78811;">&#125;</span>
&nbsp;
<span style="color: #0000ff; font-weight: bold;">object</span> Utils <span style="color: #F78811;">&#123;</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// &quot;actor&quot; is a shortcut to create a new actor from</span>
  <span style="color: #008000; font-style: italic;">// a block of code. Let's reimplement it ourselves.</span>
  <span style="color: #0000ff; font-weight: bold;">def</span> myActor<span style="color: #F78811;">&#40;</span>f<span style="color: #000080;">:</span> <span style="color: #000080;">=&gt;</span> Any<span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=</span> <span style="color: #F78811;">&#123;</span>
    <span style="color: #0000ff; font-weight: bold;">val</span> a <span style="color: #000080;">=</span> <span style="color: #0000ff; font-weight: bold;">new</span> Actor <span style="color: #F78811;">&#123;</span>
      <span style="color: #0000ff; font-weight: bold;">def</span> act <span style="color: #000080;">=</span> f
    <span style="color: #F78811;">&#125;</span>
    a.<span style="color: #000000;">start</span>
    a
  <span style="color: #F78811;">&#125;</span>
&nbsp;
<span style="color: #F78811;">&#125;</span>
&nbsp;
<span style="color: #0000ff; font-weight: bold;">object</span> cours2 <span style="color: #0000ff; font-weight: bold;">extends</span> Application <span style="color: #F78811;">&#123;</span>
&nbsp;
  println<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;&quot;</span><span style="color: #F78811;">&#41;</span>
&nbsp;
  <span style="color: #0000ff; font-weight: bold;">val</span> x <span style="color: #000080;">=</span> future <span style="color: #F78811;">&#123;</span> println<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;Starting computation&quot;</span><span style="color: #F78811;">&#41;</span><span style="color: #000080;">;</span> Thread.<span style="color: #000000;">sleep</span><span style="color: #F78811;">&#40;</span><span style="color: #F78811;">3000</span><span style="color: #F78811;">&#41;</span><span style="color: #000080;">;</span> <span style="color: #F78811;">40</span> + <span style="color: #F78811;">2</span> <span style="color: #F78811;">&#125;</span>
  println<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;Future created: &quot;</span> + x<span style="color: #F78811;">&#41;</span>
&nbsp;
  println<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;Creating a poor actor&quot;</span><span style="color: #F78811;">&#41;</span>
  <span style="color: #0000ff; font-weight: bold;">val</span> a <span style="color: #000080;">=</span> <span style="color: #0000ff; font-weight: bold;">new</span> Poor
  a.<span style="color: #000000;">start</span>
  println<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;Started the poor actor &quot;</span> + a<span style="color: #F78811;">&#41;</span>
&nbsp;
  println<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;Creating a rich actor&quot;</span><span style="color: #F78811;">&#41;</span>
  <span style="color: #0000ff; font-weight: bold;">val</span> r <span style="color: #000080;">=</span> <span style="color: #0000ff; font-weight: bold;">new</span> Rich
  r.<span style="color: #000000;">start</span>
  println<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;Started the rich actor &quot;</span> + r<span style="color: #F78811;">&#41;</span>
&nbsp;
  r <span style="color: #000080;">!</span> <span style="color: #6666FF;">&quot;Stargate Universe&quot;</span>
  <span style="color: #0000ff; font-weight: bold;">val</span> expectedSalary <span style="color: #000080;">=</span> <span style="color: #F78811;">&#40;</span>r <span style="color: #000080;">!!</span> <span style="color: #F78811;">1000000</span><span style="color: #F78811;">&#41;</span>
  r <span style="color: #000080;">!</span> Die
&nbsp;
  println<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;expectedSalary: &quot;</span> + expectedSalary<span style="color: #F78811;">&#41;</span>
  println<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;expectedSalary: &quot;</span> + expectedSalary<span style="color: #F78811;">&#40;</span><span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span>
&nbsp;
  println<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;Future value: &quot;</span> + x<span style="color: #F78811;">&#40;</span><span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span>
  println<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;Future value: &quot;</span> + x<span style="color: #F78811;">&#40;</span><span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span>
&nbsp;
  println<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;&quot;</span><span style="color: #F78811;">&#41;</span>
&nbsp;
<span style="color: #F78811;">&#125;</span>
&nbsp;
<span style="color: #008000; font-style: italic;">// Old main program, commented out to avoid having</span>
<span style="color: #008000; font-style: italic;">// multiple ones.</span>
&nbsp;
<span style="color: #0000ff; font-weight: bold;">object</span> cours21 <span style="color: #F78811;">&#123;</span> <span style="color: #008000; font-style: italic;">// extends Application</span>
&nbsp;
  println<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;&quot;</span><span style="color: #F78811;">&#41;</span>
&nbsp;
  println<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;Hello, world!&quot;</span><span style="color: #F78811;">&#41;</span>
&nbsp;
  <span style="color: #008000; font-style: italic;">// Matching examples. The typecast prevents Scala</span>
  <span style="color: #008000; font-style: italic;">// from statically resolving the type and complaining</span>
  <span style="color: #008000; font-style: italic;">// about impossible matches.</span>
&nbsp;
  <span style="color: #F78811;">&#40;</span>Error<span style="color: #000080;">:</span> Any<span style="color: #F78811;">&#41;</span> <span style="color: #0000ff; font-weight: bold;">match</span> <span style="color: #F78811;">&#123;</span>
      <span style="color: #0000ff; font-weight: bold;">case</span> IsDouble<span style="color: #F78811;">&#40;</span><span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=&gt;</span> println<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;This is a double of some integer&quot;</span><span style="color: #F78811;">&#41;</span>   <span style="color: #008000; font-style: italic;">// () are mandatory here</span>
      <span style="color: #0000ff; font-weight: bold;">case</span> Triple<span style="color: #F78811;">&#40;</span>n<span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=&gt;</span> println<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;Simple triple &quot;</span> + n<span style="color: #F78811;">&#41;</span>
      <span style="color: #0000ff; font-weight: bold;">case</span> Error <span style="color: #000080;">=&gt;</span> println<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;I got an error&quot;</span><span style="color: #F78811;">&#41;</span>
      <span style="color: #0000ff; font-weight: bold;">case</span> TripleOf<span style="color: #F78811;">&#40;</span>n<span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=&gt;</span> println<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;I got the triple of &quot;</span> + n<span style="color: #F78811;">&#41;</span>
      <span style="color: #0000ff; font-weight: bold;">case</span> s<span style="color: #000080;">:</span> String <span style="color: #000080;">=&gt;</span> println<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;I got a string: &quot;</span> + s<span style="color: #F78811;">&#41;</span>
      <span style="color: #0000ff; font-weight: bold;">case</span> i<span style="color: #000080;">:</span> Int <span style="color: #000080;">=&gt;</span> println<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;I got an int: &quot;</span> + i<span style="color: #F78811;">&#41;</span>
      <span style="color: #0000ff; font-weight: bold;">case</span> <span style="color: #F78811;">&#40;</span>a, b<span style="color: #F78811;">&#41;</span> <span style="color: #000080;">=&gt;</span> println<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;I got a &quot;</span> + a<span style="color: #F78811;">&#41;</span>
  <span style="color: #F78811;">&#125;</span>
&nbsp;
  println<span style="color: #F78811;">&#40;</span><span style="color: #6666FF;">&quot;&quot;</span><span style="color: #F78811;">&#41;</span>
<span style="color: #F78811;">&#125;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.rfc1149.net/plnc2010/2010/06/04/scala-notes-de-cours-2-4-juin-2010/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>TD Scala 2</title>
		<link>http://www.rfc1149.net/plnc2010/2010/06/04/td-scala-2/</link>
		<comments>http://www.rfc1149.net/plnc2010/2010/06/04/td-scala-2/#comments</comments>
		<pubDate>Fri, 04 Jun 2010 11:30:14 +0000</pubDate>
		<dc:creator>Samuel Tardieu</dc:creator>
				<category><![CDATA[TD]]></category>
		<category><![CDATA[Scala]]></category>

		<guid isPermaLink="false">http://www.rfc1149.net/plnc2010/?p=77</guid>
		<description><![CDATA[<p>Dans la continuation du cours d&#8217;aujourd&#8217;hui, nous allons maintenant jouer avec les acteurs Scala et le pattern matching (à travers les &#8220;case class&#8221; ou &#8220;unapply&#8221;) pour coder le comportement des clients d&#8217;une auberge. Les différents personnages seront codés en utilisant des acteurs séparés. On pourra, à la fin, y rajouter un soupçon de XML.</p>
Les personnages

Le [...]]]></description>
			<content:encoded><![CDATA[<p>Dans la continuation du cours d&#8217;aujourd&#8217;hui, nous allons maintenant jouer avec les acteurs Scala et le pattern matching (à travers les &#8220;case class&#8221; ou &#8220;unapply&#8221;) pour coder le comportement des clients d&#8217;une auberge. Les différents personnages seront codés en utilisant des acteurs séparés. On pourra, à la fin, y rajouter un soupçon de XML.</p>
<h3>Les personnages</h3>
<ul>
<li>Le chef cuisinier : il dispose d&#8217;un certain nombre de recettes qu&#8217;il communiquera à chaque serveur qui lui demandera. À la demande d&#8217;un serveur, il peut aussi cuisiner une de ces recettes, et cela prend un certain temps. Une fois le plat terminé, il le confie à un serveur afin qu&#8217;il l&#8217;apporte au client qui l&#8217;a commandé. Il n&#8217;y a qu&#8217;un seul chef dans l&#8217;auberge.</li>
<li>Le serveur : après avoir acquis la liste des plats auprès du chef, il la transmet aux clients qui lui demandent. Lorsqu&#8217;un client commande un plat, il le commande auprès du chef. Lorsqu&#8217;un chef lui demande de livrer un plat, il l&#8217;apporte au client. Il peut y avoir plusieurs serveurs.</li>
<li>Le client : après avoir demandé à un serveur la liste des plats, il en choisit un (avec un petit temps de réflexion) qu&#8217;il commande à un serveur (qui peut être différent de celui qui lui a apporté le menu) après un petit temps de réflexion. Lorsqu&#8217;il reçoit son plat, il le mange (ce qui prend un certain temps) et il quitte l&#8217;auberge. Les clients arrivent à un rythme indéterminé dans l&#8217;auberge.</li>
</ul>
<h3>Ce qu&#8217;il faut faire</h3>
<ul>
<li>Coder les différents acteurs du système.</li>
<li>Afficher des traces de chaque action effectuée par les acteurs (envoi ou réception de message).</li>
<li>Simuler l&#8217;arrivée des clients dans l&#8217;auberge.</li>
<li>Pour trouver un serveur disponible, vous pouvez écrire un chef des serveurs, unique, qui renvoie tour à tour l&#8217;identité de chaque serveur à solliciter. Cela revient à avoir quelqu&#8217;un qui surveille la salle et la cuisine et qui prévient un serveur qu&#8217;on a besoin de lui.</li>
<li>Lire, depuis un fichier XML, la liste des recettes disponibles et le nombre de serveurs à utiliser. Ci-dessous se trouve une illustration de ce que pourrait contenir ce fichier.</li>
</ul>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;auberge<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;serveurs<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>2<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/serveurs<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;recettes<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;recette<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Dinde aux marrons<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/recette<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;recette<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Bœuf bourguignon<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/recette<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;recette<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Morilles aux truffes<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/recette<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;recette<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Pâtes au jambon<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/recette<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;recette<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Sauté de veau sauce Télécom<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/recette<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/recettes<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/auberge<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.rfc1149.net/plnc2010/2010/06/04/td-scala-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Idées de projets</title>
		<link>http://www.rfc1149.net/plnc2010/2010/05/30/idees-de-projets/</link>
		<comments>http://www.rfc1149.net/plnc2010/2010/05/30/idees-de-projets/#comments</comments>
		<pubDate>Sun, 30 May 2010 21:35:16 +0000</pubDate>
		<dc:creator>Samuel Tardieu</dc:creator>
				<category><![CDATA[Administratif]]></category>

		<guid isPermaLink="false">http://www.rfc1149.net/plnc2010/?p=69</guid>
		<description><![CDATA[<p>Voici quelques idées de projets pour cette année. N&#8217;hésitez pas à en proposer d&#8217;autres ou à adopter un projet (en postant un commentaire). Tous les langages non-mainstream et non-jouet sont envisageables.</p>
Application pour Android en Scala
<p>À l&#8217;instar de HarassMe, on développera une application pour Android en Scala. L&#8217;application devra, avec l&#8217;aide de sbt, utiliser les bibliothèques [...]]]></description>
			<content:encoded><![CDATA[<p>Voici quelques idées de projets pour cette année. N&#8217;hésitez pas à en proposer d&#8217;autres ou à adopter un projet (en postant un commentaire). Tous les langages non-mainstream et non-jouet sont envisageables.</p>
<h3>Application pour Android en Scala</h3>
<p>À l&#8217;instar de <a href="http://git.rfc1149.net/harassme.git">HarassMe</a>, on développera une application pour Android en Scala. L&#8217;application devra, avec l&#8217;aide de sbt, utiliser les <a href="http://developer.android.com/guide/developing/device.html">bibliothèques Android</a>, et disposer de tests fonctionnels natifs et de tests tournant sur l&#8217;appareil. L&#8217;utilisation d&#8217;API publiques est recommandée, par exemple un interfaçage avec <a href="http://www.thetvdb.com/">thetvdb.com</a> pour une application qui donne la liste des épisodes de séries (mais toute autre application est la bienvenue).</p>
<p>Si l&#8217;application proposée est particulièrement ambitieuse ou implique une communication entre utilisateurs distants (jeu multi-joueurs par exemple), elle pourra être réalisée en binôme.</p>
<p>Il est important de bien séparer les différentes fonctionnalités afin de permettre la réutilisation d&#8217;un maximum de composants dans de futures applications.</p>
<h3>Réplication des fonctionnalités de distribution et de supervision d&#8217;Erlang en Scala</h3>
<p>Scala s&#8217;est inspiré d&#8217;<a href="http://www.erlang.org/">Erlang</a> pour le modèle de communication entre threads utilisant les acteurs. Mais Erlang va beaucoup plus loin, en offrant notamment :</p>
<ul>
<li>la communication entre processus se trouvant sur des noeuds distants et l&#8217;envoi de messages de manière indifférenciée entre processus locaux et processus distants</li>
<li>l&#8217;utilisation d&#8217;un serveur de noms pour pouvoir nommer les processus</li>
<li>un framework de supervision permettant de détecter et relancer automatiquement les processus défaillants selon le modèle de développement « laisser les processus défaillants crasher, ils seront relancés si le besoin s&#8217;en fait sentir » plutôt que le « rattraper et traiter l&#8217;exception à tout prix »</li>
<li>un framework de logging permettant d&#8217;enregistrer la trace des défaillances de l&#8217;application</li>
<li>un framework (OTP) permettant de coder facilement des processus serveurs et des machines à états : seules les fonctions de callback sont à fournir par l&#8217;utilisateur, la partie répétitive et compliquée à implémenter correctement étant fournie par la bibliothèque OTP</li>
</ul>
<p>Ce projet, s&#8217;il est réalisé de manière complète (avec documentation et tests) peut être réalisé par un binôme. Je tiens le livre « <a href="http://oreilly.com/catalog/9780596518189">Erlang Programming</a> » (de Cesarini &amp; Thompson) à la disposition des personnes intéressées.</p>
<h3>Jeu de rôle en réseau multi-langages</h3>
<p>Le but de ce projet est de développer un jeu de rôle multi-joueurs accessible par le réseau en mode texte (en s&#8217;y connectant avec &#8220;telnet&#8221; par exemple). Le jeu doit comprendre des commandes (&#8220;north&#8221;, &#8220;look at sign&#8221;, etc.) et générer des descriptions, des réponses et des actions.  Il doit être possible d&#8217;y coder le comportement des PNJ (personnages non-joueurs) et des objets dans différents langages de programmation, et les différents programmes doivent pouvoir tourner sur des machines séparées. Les différents langages devront communiquer en utilisant par exemple les <a href="http://code.google.com/p/protobuf/">Protocol Buffers de Google</a>. Le joueur devra pouvoir stocker des objets dans son inventaire, ces objets étant représentées sous la forme de callbacks permettant de rappeler le module approprié.</p>
<p>On devra utiliser au minimum trois langages non-classiques différents. Le jeu peut être réalisé seul ou en binôme.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rfc1149.net/plnc2010/2010/05/30/idees-de-projets/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>TD Scala 1</title>
		<link>http://www.rfc1149.net/plnc2010/2010/05/26/td-scala-1/</link>
		<comments>http://www.rfc1149.net/plnc2010/2010/05/26/td-scala-1/#comments</comments>
		<pubDate>Wed, 26 May 2010 05:30:45 +0000</pubDate>
		<dc:creator>Samuel Tardieu</dc:creator>
				<category><![CDATA[TD]]></category>
		<category><![CDATA[Scala]]></category>

		<guid isPermaLink="false">http://www.rfc1149.net/plnc2010/?p=56</guid>
		<description><![CDATA[<p>Dans ce TD, nous allons mettre en œuvre les concepts illustrés par Alexandre lors du cours de la semaine dernière. On pourra consulter la documentation en ligne de Scala, ainsi que le livre Programming Scala disponible également en ligne.
Pour faire le TD, vous aurez besoin d&#8217;installer sbt (simple build tool). Une fois ceci fait, récupérez [...]]]></description>
			<content:encoded><![CDATA[<p>Dans ce TD, nous allons mettre en œuvre les concepts illustrés par Alexandre lors du cours de la semaine dernière. On pourra consulter <a href="http://www.scala-lang.org/docu/files/api/index.html">la documentation en ligne de Scala</a>, ainsi que le livre <a href="http://programming-scala.labs.oreilly.com/">Programming Scala disponible également en ligne</a>.<br />
Pour faire le TD, vous aurez besoin d&#8217;installer sbt (simple build tool). Une fois ceci fait, récupérez <a href="http://www.rfc1149.net/tmp/td1.tar.gz">le fichier contenant le squelette de l&#8217;application</a>, déplacez vous dans le répertoire &#8220;td1&#8243; après extraction et lancez &#8220;sbt&#8221;. Il faudra lancer la commande &#8220;update&#8221; pour récupérer les bibliothèques de test.</p>
<p>Le code devra être placé dans un ou plusieurs fichiers localisés dans &#8220;src/main/scala/&#8221;. Vous pouvez voir les tests dans &#8220;src/tests/scala/Tests.scala&#8221;. Ces tests sont écrits dans un DSL fourni par le paquetage &#8220;scalatest&#8221;. Un certain nombre de tests sont écrits, il vous faudra les décommenter au fur et à mesure.<br />
Tout le code devra se situer dans le paquetage &#8220;net.rfc1149.td1&#8243; (voir la directive au début du fichier &#8220;src/main/scala/td1.scala&#8221;).</p>
<h3>isOdd/isEven</h3>
<p>Implémenter des fonctions &#8220;isOdd&#8221; et &#8220;isEven&#8221; prenant en paramètre un &#8220;Int&#8221; et retournant un &#8220;Boolean&#8221; (dont vous devinerez aisément ce qu&#8217;elles font) et testez les avec la commande &#8220;test&#8221; de &#8220;sbt&#8221;. Ces fonctions devront être placées dans l&#8217;objet &#8220;TD1&#8243; (rappelons qu&#8217;il n&#8217;existe pas de méthodes statiques en Scala).</p>
<h3>Classe paramétrée ExtSeq</h3>
<p>Faire une classe &#8220;ExtSeq&#8221; paramétrée par un type &#8220;T&#8221; prenant comme argument de constructeur un &#8220;Seq[T]&#8221; (une séquence abstraite d&#8217;objets de type T). Cette classe devra implémenter les méthodes &#8220;any&#8221; et &#8220;all&#8221; prenant chacune une fonction transformant un objet de type &#8220;T&#8221; en &#8220;Boolean&#8221;. Un tel type se décrit comme &#8220;T =&gt; Boolean&#8221; en Scala. Les méthodes doivent respectivement vérifier si au moins un élément respecte la condition passée en argument, et si tous les éléments respectent cette condition.</p>
<p>Un objet de même nom que la classe devra fournir une fonction &#8220;toExtSeq&#8221; déclarée comme implicite permettant de transformer un &#8220;Seq[T]&#8221; en &#8220;ExtSeq[T]&#8220;.</p>
<p>Décommenter les tests et tester. Si la fonction implicite &#8220;toExtSeq&#8221; est bien visible directement, on pourra appliquer les fonctions &#8220;all&#8221; et &#8220;any&#8221; à tous les types de séquences, par exemple les listes (fonctionalité &#8220;Pimp my library&#8221;).</p>
<h3>myWhile/doWhile</h3>
<p>Implémenter dans l&#8217;objet &#8220;TD1&#8243; une fonction &#8220;myWhile&#8221; prenant en paramètre un booléen « par nom » (c&#8217;est-à-dire non évalué) dont la signature en Scala se note &#8220;=&gt; Boolean&#8221; ainsi qu&#8217;une fonction sans paramètre et retournant n&#8217;importe quoi (le résultat sera ignoré) à appeler tant que la condition est vraie. Tester.</p>
<p>Implémenter une classe &#8220;ExtCond&#8221; (et son objet associé pour une conversion implicite d&#8217;un &#8220;=&gt; Boolean&#8221; en ce type) qui fournit une méthode &#8220;doWhile&#8221; qui fera la même chose que précédemment (mais ne prendra bien sûr que l&#8217;action en paramètre). Tester.</p>
<h3>Complex</h3>
<p>Implémenter un type &#8220;Complex&#8221; prenant en paramètre deux doubles (les parties réelles et imaginaires). On utilisera une &#8220;case class&#8221; pour bénéficier de certains automatismes comme la définition correcte de l&#8217;égalité ou la déconstruction pour l&#8217;utilisation dans le cadre du pattern matching. L&#8217;affichage, par la surcharge de la méthode &#8220;toString&#8221;, devra être naturel, par exemple &#8220;1.2&#8243; ou &#8220;-3.4+5.6i&#8221; ou encore &#8220;-3.0i&#8221;. Tester l&#8217;affichage.</p>
<p>Implémenter la fonction &#8220;reciprocal&#8221; renvoyant le conjugué, ainsi que l&#8217;addition entre complexes. Tester.</p>
<p>Autoriser à l&#8217;aide d&#8217;une fonction implicite les opérations avec les &#8220;Double&#8221;. Tester.</p>
<p>Rajouter les autres opérations (-, /, *, abs, etc.) ainsi que des primitives de tests unitaires.</p>
<h3>Les N reines</h3>
<p>Implémentez dans l&#8217;objet TD1 (ou changez le nom dans le driver de test) une fonction avec la signature suivante :</p>

<div class="wp_syntax"><div class="code"><pre class="scala" style="font-family:monospace;">&nbsp;
   <span style="color: #0000ff; font-weight: bold;">def</span> solveQueens<span style="color: #F78811;">&#40;</span>numberOfQueens<span style="color: #000080;">:</span> Int, f<span style="color: #000080;">:</span> List<span style="color: #F78811;">&#91;</span><span style="color: #F78811;">&#40;</span>Int, Int<span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#93;</span> <span style="color: #000080;">=&gt;</span> Unit<span style="color: #F78811;">&#41;</span><span style="color: #000080;">:</span> Unit</pre></div></div>

<p>qui appelle la fonction &#8220;f&#8221; avec chaque liste de paires représentant une solution au problème des &#8220;numberOfQueens&#8221; reines. On pourra utiliser si nécessaire les constructions suivantes :</p>
<ol>
<li>&#8220;A to B&#8221; (où &#8220;A&#8221; et &#8220;B&#8221; sont des entiers) : liste des entiers entre A et B (compris)</li>
<li>&#8220;toList&#8221;, s&#8217;appliquant à une séquence et la transformant en liste</li>
<li>&#8220;head&#8221;/&#8221;tail&#8221;/&#8221;last&#8221; qui s&#8217;appliquent à une liste et donnent respectivement le premier élément, tous les éléments sauf le premier et le dernier élément</li>
<li>&#8220;foreach&#8221; pour parcourir une liste et exécuter des actions</li>
<li>&#8220;return&#8221; pour sortir prématurément d&#8217;une fonction</li>
<li>&#8220;for&#8221; (voir <a href="http://programming-scala.labs.oreilly.com/ch03.html#ForComprehensions">cette documentation sur les compréhensions</a>)</li>
<li>Les fonctions &#8220;::&#8221; et &#8220;:::&#8221; des listes. On remarquera qu&#8217;en Scala les opérateurs terminant par un &#8220;:&#8221; sont recherchés dans l&#8217;opérande de droite plutôt que dans celui de gauche.</li>
</ol>
<p>Il est permis à ce stade de regretter l&#8217;opérateur angélique que nous avions implémenté en Scheme. Notons que Scala 2.8.0 appportera les continuations sous la forme d&#8217;un plugin, mais que celles-ci sont délimitées et que l&#8217;implémentation de &#8220;amb&#8221; serait donc non triviale.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rfc1149.net/plnc2010/2010/05/26/td-scala-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

