return page history
α-wwwiki
::
history/lambdaway/20131020-212929.txt
editor : alpha [82.253.73.50] 2013/10/20 21:29:29 {center {i en cours d'écriture !}} _h1 λy {div {@ style="display:none;"}{define cod () °° var args = [].slice.call(arguments).join( ' ' ); var style= "font:normal 0.8em arial;" +"background:#888;" +"color:#fff;" +"text-align:center;" +"padding:0 5px;" +"border:1px solid;" +"box-shadow:0px 0px 2px black;" +"-webkit-border-radius:10px;" +"-moz-border-radius:10px;" +"border-radius:10px;"; return '{span {@ style="' + style + '"}' + args + '}'; °°}} _p Tentative de description simple et non ambiguë de ce qui fait l'essentiel d'un évaluateur de S-expressions. Ce qui n'est pas si simple ! _h3 S-expression _p L'évaluation d'une S-expression {cod °°{first rest}°°} consiste en l'application de l'opérateur {cod first} aux arguments contenus dans {cod rest}. Le terme {cod first} est un nom de fonction ou une S-expression produisant un nom de fonction, {cod rest} est une chaîne de mots (suite de caractères sans espace), de nombres (au sens où ils sont compris par l'environnement) et de S- expressions. L'évaluation se fait en commençant par les S-expressions terminales (ne contenant pas de S-expression) jusqu'à la S-expression englobante. Le résultat est une chaîne de mots. _h3 évaluation immédiate _p Dans l'expression {cod °°{+ 1 2}°°} le symbole {cod +} appartient au dictionnaire de fonctions prédéfinies, {cod 1 et 2} sont deux symboles reconnus comme étant des nombres et évalués à eux-mêmes. L'appel de la fonction avec les deux arguments {cod 1 et 2} produira donc la valeur {cod 3} ! _h3 évaluation différée _p L'expression {cod °°{+ a b}°°} contient deux symboles {cod a et b}, qui ne sont ni des nombres ni des S-expressions. Leur valeur n'est pas connue au moment de l'écriture de la S-expression et son évaluation doit être reportée. On la mémorise dans le dictionnaire sous la forme d'une fonction (un enclos, une fermeture, une lambda, une liaison) associant à tous les termes {cod a et b} contenus dans le corps les valeurs qui seront fournies à l'appel de la fonction, par exemple les valeurs {cod 1 et 2}. _p L'expression {cod °° {lambda {:a :b} {+ :a :b} °°} crée cette fonction en lui attribuant un nom aléatoire, du type {cod lambda_12345}, inconnu en principe de l'utilisateur, une fonction anonyme. L'expression {cod °°{lambda_12345 1 2}°°} produirait ainsi la valeur {cod 3}. Dans la mesure où le nom est inconnu, on couple en réalité la définition et l'appel : {cod °° {{lambda {:a :b} {+ :a :b} 1 2} -> 3°°}. Et la fonction anonyme retourne ensuite dans les limbes du "garbage collector". _h3 extension du dictionnaire _p On aimerait conserver plus longtemps cette fonction, ne serait-ce que pour pouvoir l'utiliser plusieurs fois sans avoir à écrire sa définition. De façon plus pratique on découplera souvent la définition et l'appel de la fonction en lui donnant un nom. L'expression {cod °°{def add {lambda {:a :b} {+ :a :b}}°°} associera le nom {cod add} à la définition de la fonction. Et ceci de façon permanente : l'expression {cod °° {add 1 2}°°} produira {cod 3}, {cod °°{add 3 4}°°} produira {cod 7}, et ainsi de suite. _p De façon générale, {cod °°{def nom expression}°°} associe un nom à une expression, augmentant ainsi le dictionnaire des fonctions pré-définies. Si l'expression est évaluable, en ne faisant appel à aucune valeur indéfinie, elle est évaluée et mémorisée sous forme de constante. Sinon, elle est mémorisée sous la forme d'une fonction possédant des arguments à l'aide de l'opérateur {cod lambda}. _h3 coder _p Ecrire un programme, c'est créer un ensemble de fonctions agissant sur un ensemble de données. Dans le cas présent, on notera la similitude des notations entre les opérateurs et les données, on parle aussi d'homo-iconicité. C'est le point commun des dialectes du LISP défini au départ en 1960 sur un nombre très réduit de formes primitives : {cod 7}. Lambdatalk bénéficie de la fondation confortable des navigateurs WEB et leurs langages intégrés, le HTML, le CSS, et le LISP habillé en C malencontreusement appelé JavaScript. Lambdatalk dispose ainsi sans mal de 50 opérateurs HTML, de 30 fonctions mathématiques de JavaScript, et ajoute à cette base solide 20 nouveaux opérateurs et 3 formes spéciales (lambda, def, if). Associé au moteur PHP d'alphawiki, le code de lambdatalk, visible {b [[ICI|data/lambdatalk/lambdatalk.js]] } et réduit à très peu de lignes (une centaine pour l'évaluateur, environ quatre cent pour le dictionnaire) se révèle suffisant pour composer et coder de façon confortable des pages multimedia interactives pouvant devenir complexes. _p alain marty 20/10/2013 _p à suivre ...