I. Généralités▲ Inventé par John McCarthy en 1958 au Massachusetts Institute of

I. Généralités▲ Inventé par John McCarthy en 1958 au Massachusetts Institute of Technology, le LISP, acronyme de List Processing est le deuxième plus vieux langage de programmation. Langage de haut niveau, il est généralement classé parmi les langages fonctionnels. Il a été très en vogue dans les années 1970/80 dans les domaines de la recherche et de l'intelligence artificielle. AutoLISP® est un dialecte du LISP spécialement implémenté pour fonctionner avec AutoCAD®. Dans la suite de ce tutoriel, il ne sera question que d'AutoLISP®. I-A. Types d'expressions, types de données▲ Les expressions LISP se partagent entre deux types : liste et atome. Tout ce qui n'est pas une liste est un atome (excepté nil). I-A-1. Les atomes▲ Les atomes peuvent être des expressions dites autoévaluantes :  les nombres entiers, sans séparateur décimal : 1, -27, 23504… (compris entre -2147483648 et 2147483647)  les nombres réels, avec séparateur décimal, 1.0, 0.05, 3.375…  les chaînes, ensembles de caractères contenus entre des guillemets : "a", "Le résultat est : 128.5". ou des expressions évaluables :  les symboles, qui sont des suites de caractères (exceptés parenthèses, guillemets, apostrophes, points et points virgules) non exclusivement constituées de chiffres. Les symboles peuvent être affectés à des fonctions (prédéfinies ou définies par l'utilisateur), ou à des données, dans ce cas, on parle de variables, les données stockées dans les variables peuvent être des expressions LISP et aussi des pointeurs vers des objets spécifiques (jeux de sélection, noms d'entités, descripteurs de fichiers…). Certains symboles sont protégés, outre les fonctions LISP prédéfinies, il s'agit de T et pi. I-A-2. Les listes▲ La liste est l'expression fondamentale de tous les langages LISP. Une liste commence avec une parenthèse ouvrante et se termine avec une parenthèse fermante, entre ces parenthèses, chaque élément est séparé par une espace. Les éléments constituant les listes sont des expressions LISP de tout type y compris des listes. Ces imbrications multiples expliquent la multiplication des parenthèses caractéristique à ce langage. Un programme LISP est une liste d'expressions qui peuvent être elles-mêmes des listes. Ce qui fait dire que LISP est défini récursivement. I-A-3. nil▲ nil est une expression atypique en ce sens qu'elle exprime plusieurs concepts. Elle exprime la notion de vide : un symbole auquel aucune valeur n'est affectée est nil, une liste qui ne contient aucun élément est nil aussi. nil sert aussi pour exprimer le résultat Booléen faux (false) opposé à T vrai (true). Bien que son type soit nil, elle est considérée à la fois comme un atome et comme une liste. I-B. Syntaxe et évaluation (quote type)▲ Un programme LISP (langage dit « fonctionnel ») est essentiellement constitué d'appels de fonction. Une fonction, en informatique comme en mathématique est un ensemble d'instructions qui retourne un résultat dépendant des arguments (paramètres) qui lui sont passés, les mêmes arguments passés à une fonction retournent toujours le même résultat. Une expression LISP retourne toujours un résultat (fût-il nil), il n'existe pas en LISP d'instruction qui ne retourne rien. Le résultat de l'évaluation d'un appel de fonction est retourné à l'endroit même de cet appel. AutoLISP® fournit de nombreuses fonctions prédéfinies. La programmation LISP consiste à définir de nouvelles fonctions en utilisant les fonctions préexistantes, qu'elles soient natives ou définies par l'utilisateur. I-B-1. Évaluation des applications de fonction▲ AutoCAD® intègre un interpréteur qui permet d'évaluer les expressions LISP. L'interpréteur est accessible directement à la ligne de commande. Les expressions de type liste destinées à être évaluées sont appelées des appels de fonction (ou applications de fonction). La Notation dite « préfixe » du LISP en détermine la structure : le premier élément est une fonction (opérateur), les suivants les arguments requis par cette fonction. Suivant les fonctions les arguments peuvent être optionnels et leur nombre variable. Sélectionnez (fonction [argument …]) Par exemple 2 + 3 s'écrit en LISP : (+ 2 3) Sélectionnez Commande: (+ 2 3) 5 L'évaluation d'une expression LISP commence par le contrôle de l'appariement des parenthèses. Sélectionnez Commande: (+ 2 3)) ; erreur: parenthèse fermante supplémentaire en entrée S'il manque une (ou des) parenthèse(s) fermantes, il est demandé à l'utilisateur de corriger : Sélectionnez Commande: (+ 2 3 (_> Ceci fait, l'évaluation est faite et son résultat est retourné : Sélectionnez Commande: (+ 2 3 (_> ) 5 Ensuite l'interpréteur recherche la définition de la fonction (premier terme de la liste). Si cette définition n'est pas trouvée, un message d'erreur est retourné : Sélectionnez Commande: (toto) ; erreur: no function definition: TOTO Si la fonction est définie, la validité de chaque argument (termes suivants) est évaluée, au premier argument incorrect trouvé, un message d'erreur est retourné : Sélectionnez Commande: (+ "2" "3") ; erreur: type d'argument incorrect: numberp: "2" Les arguments pouvant être aussi des applications de fonction, celles-ci seront évaluées tour à tour et les résultats retournés à l'endroit même de chaque expression. Par exemple, dans l'expression (sqrt (+ (* 4 4) (* 3 3))),  (+ (* 4 4) (* 3 3)) est l'argument de la fonction sqrt ;  (* 4 4) et (* 3 3) les arguments de la fonction + ;  4 et 4 ou 3 et 3 ceux de la fonction *. L'évaluation procède de façon récursive en réduisant chaque appel de fonction à une expression autoévaluante à partir des expressions les plus imbriquées. Le suivi de l'expression ci-dessus peut être décrit comme suit : Sélectionnez Saisie : (* 4 4) Résultat : 16 Saisie : (* 3 3) Résultat : 9 Saisie : (+ 16 9) Résultat : 25 Saisie : (SQRT 25) Résultat : 5.0 Soit : (sqrt (+ (* 4 4) (* 3 3))) => (sqrt (+ 16 (* 3 3))) => (sqrt (+ 16 9)) => (sqrt 25) => 5.0 I-B-2. Données sous forme de listes (quote)▲ AutoLISP® intègre de nombreuses fonctions qui requièrent comme argument une (ou des) liste(s), voir chapitre 8. Ce type de liste est considéré comme une donnée unique, par exemple, un point se définit comme la liste de ses coordonnées (x y [z]). Ces listes n'étant pas des applications de fonction, il faut empêcher leur évaluation. On utilise pour cela la fonction quote. Sélectionnez (quote expression) (quote (1 2 3)) retourne : (1 2 3) (quote (+ 2 3)) retourne : (+ 2 3) Cette fonction, très largement utilisée, s'abrège avec une apostrophe : '(1 2 3) est équivalent à (quote (1 2 3)) I-B-3. Fonction type▲ La fonction type retourne le type de donnée de l'expression qui lui est passée comme argument. Les différents types de données AutoLISP® sont :  INT : nombre entier  REAL : nombre réel  STR : chaîne de caractères  SYM : symbole  LIST : liste  ENAME : nom d'entité  PICKSET : jeu de sélection  FILE : descripteur de fichier  SUBR : fonction AutoLISP® interne ou fonction chargée depuis des fichiers FAS ou VLX  USUBR : fonction définie par l'utilisateur chargée depuis un fichier LSP  VL-CATCH-ALL-APPLY-ERROR : erreur retournée par une expression vl- catch-all-apply (type 10) retourne : INT (type 25.4) retourne : REAL (type "test") retourne : STR (type '(1 2 3)) retourne : LIST (type quote) retourne : SUBR (type nil) retourne : nil II. Saisie directe▲ Les expressions LISP pouvant être entrées directement à la ligne de commande, toute expression qui débute par une parenthèse est interprétée comme une expression LISP. II-A. Opérateurs arithmétiques (+ - * / sqrt rem expt exp log)▲ Il est donc possible d'utiliser AutoLISP® comme une calculatrice, directement à la ligne de commande, avec les opérateurs numériques. Ces expressions peuvent être utilisées pour répondre à une invite dans une commande. Les fonctions +, -, *, /, rem et expt retournent un entier si tous leurs arguments sont entiers, un réel si au moins un des arguments est réel. + : addition (+ [nombre nombre] …)  (+ 3 4 2) retourne : 9  (+ 5 9.0) retourne : 14.0 - : soustraction (- [nombre nombre] …)  (- 9 4 2) retourne : 3  (- 5.2 6) retourne : -0.8 * : multiplication (* [nombre nombre] …)  (* 2.5 3) retourne : 7.5  (* 2 6 -4) retourne : -48 / : division (/ [nombre nombre] …)  (/ 20 3) retourne : 6  (/ 20.0 3) retourne : 6.66667 rem : reste de la division (rem [nombre nombre …])  (rem 20 3) retourne : 2  (rem 55 7 3) => (rem (rem 55 7) 3) => (rem 6 3) retourne : 0 expt : exposant (exp nombre puissance)  (expt 5.0 2) retourne : 25.0  (expt 2 5) retourne : 32 exp : exponentielle (exp nombre)  (exp 1) retourne : 2.71828  (exp 2.5) retourne : 12.1825 log : logarithme (log nombre)  (log 2.7182818) retourne : 1.0  (/ (log 32) (log 2)) retourne : 5.0 II-A-1. Opérateurs logiques binaires (Boole logand logior)▲ Boole (Boole operateur int1 [int2 ...]) C'est l'opérateur générique de comparaison « bit à bit ». uploads/s3/ lisp.pdf

  • 40
  • 0
  • 0
Afficher les détails des licences
Licence et utilisation
Gratuit pour un usage personnel Attribution requise
Partager