return page history
α-wwwiki
::
history/lambdaway/20131020-203816.txt
editor : alpha [82.253.73.50] 2013/10/20 20:38:16 _h1 λy _p Ceci est une 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 évaluation immédiate _p L'évaluation d'une S-expression {code °°{first rest}°°} consiste en l'application de l'opérateur {code first} aux arguments contenus dans {code rest}. First est un nom de fonction ou une S-expression produisant un nom de fonction, rest est une chaîne de mots, de nombres ou une S- expression. L'évaluation se fait en commençant par les S-expressions terminales (ne contenant pas de S-expression) jusqu'à la S-expression englobante. _p Dans l'expression {code °°{+ 1 2}°°} le symbole {code +} appartient au dictionnaire de fonctions prédéfinies, ce qui s'écrit en Javascript : {code °°dico['+'] = function (a,b) { return a+b };°°}, {code 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 {code 1 et 2} produira donc la valeur "3" ! _h3 évaluation différée _p L'expression {code °°{+ a b}°°} contient deux symboles {code a,b}, qui ne sont ni des nombres ni des S-expressions. Leur valeur n'est pas connue, l'évaluation de la S-expression 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 {code a et b} contenus dans le corps deux valeurs fournies à l'appel de la fonction, par exemple {code 1 et 2}. _p L'expression {code °° {lambda {:a :b} {+ :a :b} °°} crée cette fonction en lui attribuant un nom aléatoire, du type {code lambda_12345}, inconnu en principe de l'utilisateur, une fonction anonyme. L'expression {code °°{lambda_12345 1 2}°°} produirait ainsi la valeur 3. Et la fonction anonyme retourne ensuite dans les limbes du "garbage collector". _p De façon plus pratique, l'expression {code °°{def add {lambda {:a :b} {+ :a :b}}°°} associera le nom {code add} à cette fonction. Et ceci de façon permanente : l'expression {code °° {add 1 2} produira 3, {add 3 4} produira 7, etc °°}. _p De façon générale, {code °°{def nom expression}°°} associe une expression à un nom, augmentant ainsi le dictionnaire. Si l'expression est évaluable (elle ne fait appel à aucune valeur indéfinie) elle est évaluée sous forme de constante. Sinon, elle est mémorisée sous la forme d'une fonction à l'aide de l'opérateur "lambda" _p Ecrire un programme, c'est créer un ensemble de fonctions agissant sur un ensemble de données. On notera la similitude des notations entre les opérateurs et les données, on parle d'homo-iconicité. C'est le point commun des dialectes du LISP défini au départ en 1960 sur 7 formes primitives. Lambdatalk bénéficie de la fondation confortable des navigateurs WEB et les langages intégrés, le HTML, le CSS, et le LISP habillé en C malencontreusement appelé JavaScript. Lambdatalk dispose de 50 opérateurs construits sur le HTML, 30 opérateurs construits sur les fonctions mathématiques de JavaScript, ajoute 20 nouveaux opérateurs et 3 formes spéciales (lambda, def, if). Associé au moteur PHP d'alphawiki, le code de lambdatalk, visible [[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 à suivre ...