[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.lisp

pipes and filters

Pascal J. Bourguignon

10/10/2015 7:24:00 PM


Here is a new package, `"COM.INFORMATIMAGO.CLEXT.PIPE"` that implements
a unidirectional pipe using `"BORDEAUX-THREADS"` and
`"TRIVIAL-GRAY-STREAM"`.

The data written to the `PIPE-OUTPUT-STREAM` is queued (if a maximum
queue-size is specified for the stream, then the writing thread may
block if the buffer is full).

The data queued can be read from the `PIPE-INPUT-STREAM`. If the queue
is empty, then the reading stream may block (unless it used `LISTEN`,
`READ-CHAR-NO-HANG`, etc).

When the stream is closed, one can still read from it until the end of
file is reached.

Multiple threads may read or write to the same pipe.

To demonstrate the use of pipes, the `"COM.INFORMATIMAGO.CLEXT.FILTER"`
package exports a GREP function that processes `*STANDARD-INPUT*` and
writes to `*STANDARD-OUTPUT*`, and a FILTER macro that builds a pipe
chain of any number of forms, each running in its own thread (but the
last one which runs in the calling thread).

It also provides a function IN that reads a text file and writes it to
`*STANDARD-OUTPUT*`, and a function OUT that reads `*STANDARD-INPUT*`
and writes it to a file. (They correspond to the unix redirections `<`
`>` and `>>`).

`COM.INFORMATIAMGO.COMMON-LISP.INTERACTIVE.BROWSER:MORE` and `CAT` have
been updated to read from `*STANDARD-INPUT*` when no file is given, thus
working as filters.

----------------------------------------------------------------------------------------
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>
----------------------------------------------------------------------------------------

Example: :

-----------------------------------------------------------------------------------------
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>
-----------------------------------------------------------------------------------------

These new packages are available on gitlab or github; and they'll be
distributed in a next quicklisp update.

git clone https://gitlab.com/com-informatimago/com-informa... informatimago
http://www.informat...develop/lisp/...


--
__Pascal Bourguignon__ http://www.informat...
â??The factory of the future will have only two employees, a man and a
dog. The man will be there to feed the dog. The dog will be there to
keep the man from touching the equipment.� -- Carl Bass CEO Autodesk
1 Answer

Matthew Carter

10/11/2015 2:00:00 AM

0

"Pascal J. Bourguignon" <pjb@informatimago.com> writes:

> Here is a new package, `"COM.INFORMATIMAGO.CLEXT.PIPE"` that implements
> a unidirectional pipe using `"BORDEAUX-THREADS"` and
> `"TRIVIAL-GRAY-STREAM"`.
>
> The data written to the `PIPE-OUTPUT-STREAM` is queued (if a maximum
> queue-size is specified for the stream, then the writing thread may
> block if the buffer is full).
>
> The data queued can be read from the `PIPE-INPUT-STREAM`. If the queue
> is empty, then the reading stream may block (unless it used `LISTEN`,
> `READ-CHAR-NO-HANG`, etc).
>
> When the stream is closed, one can still read from it until the end of
> file is reached.
>
> Multiple threads may read or write to the same pipe.
>
> To demonstrate the use of pipes, the `"COM.INFORMATIMAGO.CLEXT.FILTER"`
> package exports a GREP function that processes `*STANDARD-INPUT*` and
> writes to `*STANDARD-OUTPUT*`, and a FILTER macro that builds a pipe
> chain of any number of forms, each running in its own thread (but the
> last one which runs in the calling thread).
>
> It also provides a function IN that reads a text file and writes it to
> `*STANDARD-OUTPUT*`, and a function OUT that reads `*STANDARD-INPUT*`
> and writes it to a file. (They correspond to the unix redirections `<`
> `>` and `>>`).
>
> `COM.INFORMATIAMGO.COMMON-LISP.INTERACTIVE.BROWSER:MORE` and `CAT` have
> been updated to read from `*STANDARD-INPUT*` when no file is given, thus
> working as filters.
>
> ----------------------------------------------------------------------------------------
> 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>
> ----------------------------------------------------------------------------------------
>
> Example: :
>
> -----------------------------------------------------------------------------------------
> 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>
> -----------------------------------------------------------------------------------------
>
> These new packages are available on gitlab or github; and they'll be
> distributed in a next quicklisp update.
>
> git clone https://gitlab.com/com-informatimago/com-informa... informatimago
> http://www.informatimago.com/develop/lisp/...

Looks quite awesome!

--
Matthew Carter (m@ahungry.com)
http://a...