.. comment: -*- mode:rst; coding:utf-8 -*-

================================================================================
Tuyau de flux
================================================================================

.. meta::
   :description: Un paquetage Common Lisp fournissant un tuyau tamponé avec un flux d'entrée et un flux de sortie.
   :keywords: common lisp,lisp,stream,pipe,gray streams,bordeaux-threads
   :author: Pascal Bourguignon


❡


Tuyau de flux
================================================================================

Voici un nouveau paquetage, ``"COM.INFORMATIMAGO.CLEXT.PIPE"`` qui
implémente un tube unidirectionel («pipe») basé sur
``"BORDEAUX-THREADS"`` et ``"TRIVIAL-GRAY-STREAM"``.

Les données écrites sur le flux de sortie ``PIPE-OUTPUT-STREAM`` sont
mise en queue (si une taille de queue maximale est spécifiée, alors le
fil qui écrit peut être bloqué lorsque le tampon est plein).

Les données dans la queue peuvent être lues du flux d'entrée
``PIPE-INPUT-STREAM``.  Si la queue est vide, alors le fil lecteur
pourra être bloqué jusqu'à ce que des données soient disponibles
(à moins que ``LISTEN``, ``READ-CHAR-NO-HANG``, etc ne soient utilisés).

Quand le flux de sortie est fermé, on peut encore lire les données
dans la queue avec le flux d'entrée jusqu'à ce que la fin de fichier
soit atteinte.

Plusieurs fils peuvent lire ou écrire sur le même tuyau.


Pour démontrer l'utilisation de ces tuyaux, le paquetage
``"COM.INFORMATIMAGO.CLEXT.FILTER"`` exporte une fonction ``GREP`` qui
lit ``*STANDARD-INPUT*`` et écrit sur ``*STANDARD-OUTPUT*``, et une
macro ``FILTER`` qui construit une chaîne de tuyau contenant n'importe
quel nombre de formes, chacune tournant dans son fil propre (sauf la
dernière qui est évaluée dans le fil appelant)

Il fournit aussi une fonction ``IN`` qui lit un fichier texte et le
copie sur ``*STANDARD-OUTPUT*``, et une fonction ``OUT`` qui lit
``*STANDARD-INPUT*`` let le copie dans un fichier. (Elles
correspondent aux redirections `unix` : ``<`` ``>`` et ``>>``).

``COM.INFORMATIAMGO.COMMON-LISP.INTERACTIVE.BROWSER:MORE`` et ``CAT``
ont été mises à jours pour être capable de lire ``*STANDARD-INPUT*``
quand aucun fichier n'est donné, et fonctionnant ainsi comme filtres.

::

    user1> (pprint (macroexpand-1 '(filter (in #P"~/tmp/misc/wang")
                                           (grep "LISP" :line-number t)
                                           (out "/tmp/wl.txt"))))

    (let ((#1=#:|pipe77885| (com.informatimago.clext.pipe:make-pipe
                             :buffer-size com.informatimago.clext.filter::*buffer-size*)))
      (bordeaux-threads:make-thread
       (lambda nil
         (unwind-protect
              (filter (in #P"/Users/pjb/tmp/misc/wang") (grep "LISP" :line-number t))
           (close *standard-output*)))
       :initial-bindings
       (list (cons '*standard-output* (com.informatimago.clext.pipe:pipe-output-stream #1#))
             (cons '*standard-input* *standard-input*)))
      (let ((*standard-input* (com.informatimago.clext.pipe:pipe-input-stream #1#)))
        (out "/tmp/wl.txt")))

    ; No value
    user1>


Exemple
--------------------------------------------------------------------------------

::

    cl-user> (mkupack :use '("COMMON-LISP"
                             "COM.INFORMATIMAGO.COMMON-LISP.INTERACTIVE.BROWSER"
                             "COM.INFORMATIMAGO.CLEXT.FILTER"))
    #<Package "USER1">
    user1> (filter (in #P"~/tmp/misc/wang"))
    Hao Wang, logicien americain.

    L'algorithme en  question  a  ete  publie  en  1960  dans l'IBM Journal,
    article intitule "Toward  Mechanical Mathematics", avec des variantes et
    une  extension au calcul  des  predicats.  Il  s'agit  ici  du  "premier
    programme" de Wang, systeme "P".

    L'article a ete ecrit en 1958, et les experiences effectuees sur IBM 704
    - machine a lampes, 32 k  mots  de 36 bits, celle-la meme qui vit naitre
    LISP a la meme epoque. Le programme  a  ete ecrit en assembleur (Fortran
    existait, mais il ne s'etait pas encore impose)  et  l'auteur estime que
    "there is very little in the program that is not straightforward".

    Il observe que les preuves engendrees sont "essentiellement des arbres",
    et  annonce  que  la  machine  a  demontre 220 theoremes du  calcul  des
    propositions  (tautologies)  en  3  minutes. Il en tire argument pour la
    superiorite  d'une  approche  algorithmique  par  rapport a une approche
    heuristique comme celle du "Logic Theorist" de Newell, Shaw et  Simon (a
    partir de 1956 sur la machine JOHNNIAC de la Rand Corporation): un debat
    qui dure encore...

    Cet  algorithme  a  ete popularise par J. McCarthy, comme exemple-fanion
    d'application  de LISP. Il figure dans le manuel de la premiere  version
    de  LISP  (LISP  1,  sur IBM 704 justement, le manuel est date  de  Mars
    1960), et il a ete repris dans le celebre "LISP 1.5 Programmer's Manual"
    publie en 1962 par MIT Press, un des maitres-livres de l'Informatique.



    nil
    user1> (filter (in #P"~/tmp/misc/wang") (grep "LISP"))
    LISP a la meme epoque. Le programme  a  ete ecrit en assembleur (Fortran
    d'application  de LISP. Il figure dans le manuel de la premiere  version
    de  LISP  (LISP  1,  sur IBM 704 justement, le manuel est date  de  Mars
    1960), et il a ete repris dans le celebre "LISP 1.5 Programmer's Manual"
    nil
    user1> (filter (in #P"~/tmp/misc/wang") (grep "program" :case-insensitive t))
    programme" de Wang, systeme "P".
    LISP a la meme epoque. Le programme  a  ete ecrit en assembleur (Fortran
    "there is very little in the program that is not straightforward".
    1960), et il a ete repris dans le celebre "LISP 1.5 Programmer's Manual"
    nil
    user1> (filter (in #P"~/tmp/misc/wang")
                   (grep " " :line-number t)
                   (let ((*terminal-height* 7)) (more)))
    1:Hao Wang, logicien americain.
    2:
    3:L'algorithme en  question  a  ete  publie  en  1960  dans l'IBM Journal,
    4:article intitule "Toward  Mechanical Mathematics", avec des variantes et
    5:une  extension au calcul  des  predicats.  Il  s'agit  ici  du  "premier
    6:programme" de Wang, systeme "P".
    7:
    8:L'article a ete ecrit en 1958, et les experiences effectuees sur IBM 704
    Type RETURN for next page:
    9:- machine a lampes, 32 k  mots  de 36 bits, celle-la meme qui vit naitre
    10:LISP a la meme epoque. Le programme  a  ete ecrit en assembleur (Fortran
    11:existait, mais il ne s'etait pas encore impose)  et  l'auteur estime que
    12:"there is very little in the program that is not straightforward".
    13:
    14:Il observe que les preuves engendrees sont "essentiellement des arbres",
    15:et  annonce  que  la  machine  a  demontre 220 theoremes du  calcul  des
    Type RETURN for next page:
    16:propositions  (tautologies)  en  3  minutes. Il en tire argument pour la
    17:superiorite  d'une  approche  algorithmique  par  rapport a une approche
    18:heuristique comme celle du "Logic Theorist" de Newell, Shaw et  Simon (a
    19:partir de 1956 sur la machine JOHNNIAC de la Rand Corporation): un debat
    20:qui dure encore...
    21:
    22:Cet  algorithme  a  ete popularise par J. McCarthy, comme exemple-fanion
    Type RETURN for next page:
    23:d'application  de LISP. Il figure dans le manuel de la premiere  version
    24:de  LISP  (LISP  1,  sur IBM 704 justement, le manuel est date  de  Mars
    25:1960), et il a ete repris dans le celebre "LISP 1.5 Programmer's Manual"
    26:publie en 1962 par MIT Press, un des maitres-livres de l'Informatique.
    27:
    28:
    29:
    Type RETURN for next page:

    ; No value
    user1> (filter (in #P"~/tmp/misc/wang") (grep "LISP" :line-number t) (out "/tmp/wl.txt"))
    nil
    user1> (cat "/tmp/wl.txt")
    10:LISP a la meme epoque. Le programme  a  ete ecrit en assembleur (Fortran
    23:d'application  de LISP. Il figure dans le manuel de la premiere  version
    24:de  LISP  (LISP  1,  sur IBM 704 justement, le manuel est date  de  Mars
    25:1960), et il a ete repris dans le celebre "LISP 1.5 Programmer's Manual"
    ; No value
    user1>


Sources
--------------------------------------------------------------------------------

Ces nouveaux paquetages sont disponibles sur gitlab ou github; et seront
distribué dans une prochaine mise à jour de `quicklisp`.

::

    git clone https://gitlab.com/com-informatimago/com-informatimago.git informatimago

`Informatimago Public Common Lisp Libraries <http://www.informatimago.com/develop/lisp/index.html>`_

.. comment: THE END
ViewGit