lambdaspeech
::
quick_intro
1
[
pages
][
login
][
load
]
_img http://epsilonwiki.free.fr/portail/data/babouins_lite.jpg _h1 quick intro _p Voici une rapide introduction à '{lambda speech}. _p Dans ce langage on écrit des expressions dans une notation préfixée utilisant des mots et des accolades. Lors de l'évaluation les accolades sont progressivement supprimées jusqu'à ce qu'il ne reste plus que des mots. _p Calculons par exemple l'hypothénuse {b c} d'un triangle rectangle dont les côtés sont {b 3} et {b 4}. Le théorème de Pythagore nous donne {b c = √(3{sup 2}+4{sup 2})}, ce qui se traduit dans la syntaxe '{lambda speech} par {b '{sqrt {+ {* 3 3} {* 4 4}}}}, {b sqrt} signifiant "square root". Et ce qui peut se lire ainsi « {i racine carrée de la somme du produit de 3 par 3 et du produit de 4 par 4} ». Les mots {b 3} et {b 4} sont des "nombres" que les opérateurs {b sqrt, +, *} savent traiter et cette expression va être progressivement remplacée par {b '{sqrt {+ 9 16}}}, puis par {b '{sqrt 25}} et enfin par {b 5}. _p A ce stade '{lambda speech} est une simple calculette où les opérations sont écrites suivant une curieuse notation parenthésée et préfixée, qui n'est pas bien plus étrange que la notation "historique" mélangeant allègrement un opérateur préfixé, {b √}, un opérateur infixé, {b +}, et un opérateur en exposant, {b x{sup 2}}. Nous nous y sommes habitués, mais à quel prix ! Certains ne s'en sont jamais remis, qui en concluent que « les maths c'est pas pour moi ! » _p Une calculette c'est bien mais on peut faire mieux. _p Il est en effet possible d'écrire une expression comprenant des mots dont la valeur n'est pas fixée, par exemple {b '{sqrt {+ {* a a} {* b b}}}}, généralisant le calcul de l'hypothénuse au cas d'un triangle rectangle quelconque, [{b a,b}]. _p On peut comprendre que l'évaluation d'une telle expression ne puisse pas aboutir, tout simplement parce que les mots {b a,b} ne sont pas des nombres et que les opérateurs {b sqrt, +, *} attendent bien sûr des nombres. L'évaluation d'une telle expression doit donc être retardée jusqu'à ce que les mots [{b a,b}] se voient attribuer des valeurs numériques, par exemple [{b 3,4}]. On pourrait exprimer ce processus sous cette forme : {pre remplace : a et b dans : '{sqrt {+ {* a a} {* b b}}} par : 3 et 4 } _p Fidèle à sa notation faite de mots et d'accolades, '{lambda speech} utilise une syntaxe plus concise, où - pour des raisons historiques - le mot "remplace" est remplacé par "lambda" et les mots "dans" et "par" sont oubliés et remplacés par un jeu d'accolades bien placées : {pre '{{lambda {a b} // remplace a et b {sqrt {+ {* a a} {* b b}}} // dans } 3 4} // par 3 et 4 } _p expression qui peut aussi s'écrire en une ligne, de façon parfaitement homogène : {pre '{{lambda {a b} {sqrt {+ {* a a} {* b b}}} } 3 4} } _p L'évaluation se fera en deux temps. Le mot "{b a}" sera remplacé par le nombre "{b 3}" : {pre '{{lambda {b} {sqrt {+ {* 3 3} {* b b}}} } 4} } _p puis "{b b}" sera remplacé par "{b 4}" {pre '{{lambda {} {sqrt {+ {* 3 3} {* 4 4}}} }} } _p et, l'expression {b '{sqrt {+ {* 3 3} {* 4 4}}}} étant parfaitement définie, elle sera évaluée à {b 5} comme nous l'avons dejà vu. On pourra bien sûr appliquer cette expression à d'autres valeurs que [{b 3,4}], par exemple à un triangle rectangle de côtés [{b 1,1}] : {pre '{{lambda {a b} {sqrt {+ {* a a} {* b b}}} } 1 1} -> {{lambda {a b} {sqrt {+ {* a a} {* b b}}} } 1 1} } _p détruisant ainsi le monde des pythagoriciens qui le croyaient parfait, exclusivement construit sur les nombres naturels et leurs rapports simples. Le rapport de la circonférence d'un cercle et de son diamètre était égale à {b 22/7 = {/ 22 7}} ou {b 355/113 = {/ 355 113}} pour les pinailleurs ! _p Revenant à '{lambda speech} il est clair que manipuler des expressions remplies d'accolades n'est pas une sinécure et '{lambda speech} va considérablement nous simplifier la vie en nous permettant de les {b nommer} grâce à une seconde forme spéciale, {b '{def nom expression}}. _p Par exemple, donnons un nom à l'expression {b '{lambda {a b} {sqrt {+ {* a a} {* b b}}} }} {pre '{def hypothénuse {lambda {a b} {sqrt {+ {* a a} {* b b}}} }} -> {def hypothénuse {lambda {a b} {sqrt {+ {* a a} {* b b}}} }} } _p ce qui peut se lire « {i je définis le mot {b hypothénuse} comme nom d'une fonction ayant deux arguments, [{b a,b}], et un corps, {b '{sqrt {+ {* a a} {* b b}}}}, dans lequel se trouvent les occurences des arguments destinées à être remplacées par deux futures valeurs.} » _p Nous pourrons maintenant écrire l'expression {b '{{lambda {a b} {sqrt {+ {* a a} {* b b}}} } 3 4}} sous une forme bien plus lisible {pre '{hypothénuse 3 4} -> {hypothénuse 3 4} '{hypothénuse 1 1} -> {hypothénuse 1 1} } _p C'est ainsi que l'on procèdera dans '{lambda speech} : {i on définira des fonctions avec {b lambda} et des noms avec {b def} }. Ces fonctions "nommées" seront ajoutées au dictionnaire des fonctions primitives, telles [{b sqrt, +, *}]. Elles seront utilisables de la même façon. Le dictionnaire pourra ainsi être étendu suivant les besoins, adapté aux problèmes à traiter. _p Une poignée de règles agissant sur des mots, tout ceci est suffisant pour constituer un langage de programmation homogène, cohérent et complet avec lequel on peut {i théoriquement} construire tous les algorithmes imaginables. _p Il sera par exemple possible de définir une fonction {b tree}, cf [[turtle]], {pre '{def tree {lambda {:e :s :k :a :b} {if {< :s :e} then T-30 M:s T120 M:s T120 M:s T150 // the flower else M:s T:a {tree :e {* :k :s} :k :a :b} T-{+ :a :b} {tree :e {* :k :s} :k :a :b} T:b M-:s }}} } _p et d'écrire {pre '{tree 5 200 {/ 2 3} 40 4} '{tree 5 180 {/ 2 3} 40 10} '{tree 5 180 {/ 2 3} 4 20} '{tree 5 150 {/ 2 3} 4 50} } _p pour obtenir ce résultat : _img http://lambdaway.free.fr/workshop/data/turtle_tree_2.jpg _p Alors, êtes-vous convaincus que {i Less is more} ? _p {i alain marty - mise à jour le 2018/07/26} {style ;; @import url(https://fonts.googleapis.com/css?family=Quicksand); #content { font-family: Quicksand; font-size:1.2em; background:#eee; } body {background:#888; } b { font:bold 1.0em courier; color:#800; } pre { background:#eee; padding:5px; } }
lambdaspeech v.20180812