: Peter Seibel : Practical Common Lisp

Posté par Nicolas Sceaux. Modéré le 25 avril 2005.
0
Practical Common Lisp, disponible depuis début avril, offre une approche pragmatique inédite et approfondie du langage Common Lisp : au travers d'exemples pratiques et fonctionnels, tels que filtre antispam, serveur de MP3 ou bibliothèque de génération HTML, Peter Seibel couvre les concepts clés, les particularités et les idiomes du langage.

Destiné aux développeurs qui ont une expérience dans d'autres langages, ce livre permet de saisir la caractérisation de Common Lisp : "a programmable programming language" (que je laisserai non traduite).

J'ajoute en liens quelques références d'implémentations libres de Common Lisp.

> Lire la suite (23 commentaires, moyenne: 1,8).   [dépêche : 1300 caractères]

Vous avez demandé le commentaire #567123.

Exemple de test d'un code retour erreur en Lisp ?

Posté par free2.org (page perso, ) le 26/04/2005 à 01:24. (lien). Évalué à 2.

Question d'un programmeur C:
Quand j'utilise une fonction je fais attention à tester la présence d'un code d'erreur retourné par cette fonction (paramètres incorrects, évènement imprévu, post condition fausse...).

Cela donne quoi ce genre de test en Lisp ? Si quelqu'un a un exemple de code à me montrer... par avance, merci.

  • [^]Re: Exemple de test d'un code retour erreur en Lisp ?

    Posté par xavier () le 26/04/2005 à 08:08. (lien). Évalué à 3.

    Voir le chapitre 19 du premier url de la news.

    Une reponse simpliste pourrait etre: comme en C, avec un/des tests adaptés a la fonction, mais plus globalement chercher a transcrire directement des habitudes de C en CL n'est sans doute pas le meilleur moyen d'aborder ce langage, dynamic typing, higher order function, multiple return values, OOP (et non des moindre si l'on parle de pre/post conditions), offres a eux seuls une "foultitude" d'approches de ce probleme :)

    mais pour repondre le plus simplement possible a ta demande il est courant d'avoir une valeur de retour == nil (false) ou d'un type specifique en cas d'erreur, soit:

    (let ((valeur_retournée (la-fonction)))
    (if (predica-adapté valeur_retournée) 'tout_va_bien 'tout_va_mal))

    ou plus imperatif:

    (unless (predica-adapté (la-fonction)) 'tout_va_mal)

    • [^]Re: Exemple de test d'un code retour erreur en Lisp ?

      Posté par free2.org (page perso, ) le 26/04/2005 à 09:53. (lien). Évalué à 2.

      Merci, c'est clair,.

      En fait, naïvement, je croyais que des langages comme Lisp évitaient à tout prix d'utiliser des variables temporaires. Et je me demandais quelle contorsion cela donnait quand il faut d'abord tester une valeur de retour, puis l'utiliser si tout va bien.

      Ton premier exemple utilise une variable exactement comme on le fait en C.

      • [^]Re: Exemple de test d'un code retour erreur en Lisp ?

        Posté par Georges () le 26/04/2005 à 10:39. (lien). Évalué à 2.

        Oui, mais on pourrait s'en passer en utilisant des macros, qui sont vraiment vraiment différentes de celles utilisés en C. Exemple avec une macro reprise du livre « On Lisp »:

        CL-USER 12 > (defmacro aif (test-form then-form &optional else-form)
                      `(let ((it ,test-form))
                         (if it ,then-form ,else-form)))
        AIF
        
        CL-USER 13 > (defun ma-function ()
                       120)
        MA-FUNCTION
        
        CL-USER 14 > (aif (ma-function)
                         (print it)
                       (print 'returned-value-is-nil))
        
        120 
        120
        
        CL-USER 15 > (defun ma-function ()
                       nil)
        MA-FUNCTION
        
        CL-USER 16 > (aif (ma-function)
                         (print it)
                       (print 'returned-value-is-nil))
        
        RETURNED-VALUE-IS-NIL 
        RETURNED-VALUE-IS-NIL
        
        Pour comprendre ce qu'il se passe, regarder la transformation (qui a lieu avant l'évaluation) qui va affecter la variable IT en appelant « test-form » et exécuter soit « then-form », soit « else-form », en fonction de la valeur de IT.
        CL-USER 17 > (macroexpand-1 '(aif (ma-function)
                                            (print it)
                                          (print 'returned-value-is-nil)))
        (LET ((IT (MA-FUNCTION))) 
             (IF IT 
        	 (PRINT IT) 
        	 (PRINT (QUOTE RETURNED-VALUE-IS-NIL))))
        T
        
        C'est grâce aux macros que Lisp peut être qualifié de « programmable programming language »... Autre example pour planquer du code avec WITH-OPEN-FILE (qui fait partie du standard):
        (with-open-file (mon-flux "fichier" :direction :output)
           (write "Bonjour!" mon-flux)
           (write "Au revoir!" mon-flux))
        
        qui donnera:
        (LET ((#:INTERNAL-STREAM631 (OPEN "fichier" :DIRECTION :OUTPUT)) 
              (#:DELETE632 T))
          (UNWIND-PROTECT
              (MULTIPLE-VALUE-PROG1 (LET ((MON-FLUX #:INTERNAL-STREAM631))
                                      (WRITE "Bonjour!" MON-FLUX)
                                      (WRITE "Au revoir!" MON-FLUX))
                                    (SETQ #:DELETE632 NIL))
            (WHEN #:INTERNAL-STREAM631 
        	  (CLOSE #:INTERNAL-STREAM631 :ABORT #:DELETE632))))
        

        • [^]Re: Exemple de test d'un code retour erreur en Lisp ?

          Posté par neil () le 26/04/2005 à 12:01. (lien). Évalué à 1.


          Oui, mais on pourrait s'en passer en utilisant des macros, qui sont vraiment vraiment différentes de celles utilisés en C.


          Surtout qu'en C les macros sont ridicules puisque gérées par un préprocesseur simpliste.

    [^]Re: Exemple de test d'un code retour erreur en Lisp ?

    Posté par Georges () le 26/04/2005 à 09:35. (lien). Évalué à 3.

    CL-USER 34 > (defun test (f)
                   (case (apply f nil)
                     ((ok-1 ok-2 ok-3) "OK...")
                     ((nok-1 nok-2 nok-3) "NOK...")
                     (failed "Failed...")
                     (t "unknown")))
    TEST
    
    CL-USER 35 > (test (defun ma-function () 'ok-1))
    "OK..."
    
    CL-USER 36 > (test (defun ma-function () 'nok-1))
    "NOK..."
    
    CL-USER 37 > (test (defun ma-function () 'failed))
    "Failed..."
    
    CL-USER 38 > (test (defun ma-function () 'quoi))
    "unknown"
    
    CL-USER 39 > (test #'(lambda () 'nok-3))
    "NOK..."
    

    • [^]Re: Exemple de test d'un code retour erreur en Lisp ?

      Posté par free2.org (page perso, ) le 26/04/2005 à 10:01. (lien). Évalué à 2.

      Merci. Là je retrouve le "switch case" du C.
      Je commence à croire que les différences ne sont pas énormes entre les 2 languages.

      • [+] [^]Re: Exemple de test d'un code retour erreur en Lisp ?

        Posté par Delaregue () le 26/04/2005 à 11:25. (lien). Évalué à -1.

        Les differences sont enormes...C'est un peu comme comparer python,perl/ ou ruby avec C.

        [^]Re: Exemple de test d'un code retour erreur en Lisp ?

        Posté par xavier () le 26/04/2005 à 11:40. (lien). Évalué à 1.

        il y a surtout qu'en terme de multi paradigme CL est particulierement ouvert, en faisant reference a des usages de certains langages tu auras donc le plus souvent du code refletant les usages des langages en questions, j'avais au depart penser donner une reponse a base de cond Scheme (qui n'est lui meme qu'une macro hygienic a base de if) avant de me rappeler que le cond CL ne propose pas "l'operateur" => par defaut (il faudrait ecrire une macro hygienic pour, ce qui est toujours plus propre qu'introduire un symbole arbitraire :):

        (cond ( ((case0-function) 'pwet) ; classic CL usage
                ((case1-function) => function-recevant-la-valeur-non-nil)
                ((case2-function) => (lambda (x) `(pwet ,x)))
                ((case3-function) => (lambda (x) (a-function 42 x "pwet")))
                (else 'each_casex-fonction_return_nil))
        
        qui melange joyeusement case et erreur, le else devenant t en CL et l'usage du => demandant de passer par une macro. Evidemment pour des operateurs/statement aussi basic que if/switch c'est a peu de choses pret partout pareil.

    [^]Re: Exemple de test d'un code retour erreur en Lisp ?

    Posté par ducon anonymous () le 03/05/2005 à 17:08. (lien). Évalué à 2.

    On peut faire du C en Lisp, mais quel est l'intérêt ?

    Le concept de code d'erreur de retour est une abomination remplacée depuis des lustres par de la gestion d'exceptions, ou à vrai dire dans le cas de (http://fr.wikipedia.org/wiki/Common_Lisp(...) ) Common Lisp, le système de conditions ( http://fr.wikipedia.org/wiki/Syst%C3%A8me_de_gestion_d%27exceptions(...) ).

    Un erreur, ça se signale (avec error, signal, warn ...). Ca se traite avec HANDLER-BIND et ça se répare (et la suite redémarre, quand c'est possible) avec des RESTARTS.

    • [^]Re: Exemple de test d'un code retour erreur en Lisp ?

      Posté par Delaregue () le 04/05/2005 à 10:03. (lien). Évalué à 0.

      L'article sur le systeme de conditions est excellent!