Cette collection de procédures est distribuée sous termes de GPL. Elle est une tentative, écrite dans l'espoir de fournir des interfaces communes au système parmi des implantations vaiées pour la manipulation des noms de fichiers.
Scheme est tellement abstrait qu'il n'y a que de certaines interfaces
limitées implantées. Il y a des procédures d'entrées/sorties standard
telles que call-with-input-file ou open-input-file,
faciles et puissantes á exploiter, mais il est délibérément confié aux
implanteurs comment elles fonctionnent. Le manque de spécifications des
interfaces au système a conduit à des définitions divers de procédures
d'interface qui diffèrent suivant l'implantation. Les procédures
standard entrées/sorties ne permettnt de traiter qu'un seul fichier à la
fois.
J'ai essayé de fournir des manipulations des noms de fichier utilisant
l'appel aux commandes système ls pour les unix et systèmes
d'exploitation similaires, et dir pour Windows et OS/2. Les
interfaces de SCM font l'exception car l'appel au système Windows par
dir ne retroune pas les noms longs ni ceux avec espace tandis que
les appels de SCM le font.
Les résultats d'execution de commandes sont pris par Scheme par la voie de PIPE ou d'un fichier temporaire si la fonction PIPE n'est pas disponible.
Dai Inukai (inukai.d@jeans.osn.ne.jp)
Afin d'executer la commande ls ou dir à partir d'une
implantation Scheme, la procédure SYSTEM doit être disponible.
Par example, le mit-scheme pour OS/2 ne dispose pas de procédure
system et l'empaquetage présent ne peut pas fonctionner. Cela me
fâche car il n'y a aucune inconvénience pour l'inclure.
Pour les implantation non munies de la fontction PIPE, la voie est
réalisée à l'aide d'un fichier temporaire. Le fichier temporaire étant
effacé après l'execution de la command par la procédure
delete-file, elle doit être également disponible. Sinon, elle
doit être remplacée par l'appel à (system "rm TEMPORARY-FILE") ou
à (system "del (or delte) TEMPORARY-FILE").
La procédure getcwd (ou pwd en cas de mit-scheme) est utilisée afin d'obtenir le répertoire courant. Elle doit être disponible aussi.
Le reste de cet empaquetage se conforme à r5rs, j'espère.
Des procédures de la bibliothèque SLIB, en plus, particulièrement celles
de string-search, line-i/o, common-list-functions
et glob sont utilisées et l'implantation est requise de pouvoir
se servir d'elle. Ou les empaquetages "strsrch.scm", "lineio.scm" et
ainsi du reste doivent être chargés chucun à l'avance.
Les procédures dans ce "direntry.scm" sont testées avec scm5d4, STk-4.0.1, guile-1.4 et mit-scheme-7.5.4 sur FreeBSD Release 4.2, avec scm5d4, STk-4.0.1 et guile-1.4 sur Linux (kernel 2.2r1), scm5d4 sur OS/2, Windows 98 et Windows 2000.
L'argument booléen vector-output? est optionel. Retourne une procédure qui prend un argument, port d'entrée ouvert. La procédure retournee, un port d'entrée ouvert donné, retourne cett fois les lignes lues á partir du port comme liste si aucun argument ou #f est donné à vector-output?, ou comme vecteur si #t est donné à vector-output?.
Supposons que l'inport est lié à un fichier contenant les textes suivants:
aaa bbb ccc ddd
((port->string-list) inport) => ("aaa" "bbb" "ccc ddd")
((port->string-list #t) inport) => #("aaa" "bbb" "ccc ddd")
L'argument charset est optionel. La prédicative retourne #t si char est dans le charset sinon #f. Si l'argument charset est omis, l'ensemble de caractères est consigné à ceux pour lequels char-whitespace? retourne #t.
(char-in-set? #\space) => #t (char-in-set? #\newline) => #t (char-in-set? #\newline #\space) => #f (char-in-set? #\, #\space #\,) => #t
Les delimiters sont optionels et signifient le même que pour les
procédures char-in-set? et string-last-split. La
procédure décompose la chaîne de caractères spécifiée à entry en
les sous-chaînes séparées par les caractères spécifiés à l'argument
delimiters, les caractères eux-mêmes étant exclus, en retourne la
liste.
(decompose-string "This is a sample string.")
=> ("This" "is" "a" "sample" "string.")
(decompose-string "One, two, three and four are integers."
#\space #\,)
=> ("One" "two" "three" "and" "four" "are" "integers.")
(decompose-string "One, two, three and four are integers."
#\space #\, #\.)
=> ("One" "two" "three" "and" "four" "are" "integers")
La procédure retourne la chaîne de caractère concatenant les
sous-chaînes données à la liste string-list séparée par les
delimiters. L'argument booléen prepend? contrôle si les
délimiteurs spécifiés sont mis avant les sous-chaînes ou après. Les
delimiters sont optionels et spécifiés à #\space par défaut si
omis. La recompose-string n'est pas exactement l'inverse de la
decompose-string en ce que les delimiters sont specifiés en
ordre d'ajout aux sous-chaînes string-list. Si le nombre de
delimiters est plus de celui des éléments de string-list,
ils sont tronqués au nombre d'éléments de string-list. Par contre
le nombre de delimiters est augmenté en utilisant le dernier
élément dans la liste de delimiters s'il est moins de celui de
string-list.
(recompose-string #f '("This" "is" "a" "sample" "string."))
=> "This is a sample string."
(recompose-string #t '("This" "is" "a" "sample" "string."))
=> " This is a sample string."
(recompose-string #f '("This" "is" "a" "sample" "string.") #\,)
=> "This,is,a,sample,string."
(recompose-string #f '("direntry" "scm" "is" "to be" "required.")
#\. #\space)
=> "direntry.scm is to be required."
(recompose-string #f '("A" "test" "string" "") #\space #\- #\.)
=> "A test-string."
(recompose-string #f '("A" "test" "string" " ") #\space #\- #\.)
=> "A test-string. "
Les delimiters sont optionels. La procédure retourne la liste cons dont le car est les sous-chaînes de caractères se terminant à la dernière occurrence de delimiters exclus, et le cdr est la liste de sous-chaînes commançant au caractère juste après la dernière occurrence de delimiters. L'argument nth contôle la longueur de la liste cdr. Si les delimiters ne sont pas donnés, ils sont ceux pour lesquels char-whitespace? retourne #t.
(string-last-split "This is a sample string." 1)
=> (("This" "is" "a" "sample") "string.")
(string-last-split "A-little-brown-fox" 1 #\-)
=> ("A" "little" "brown") "fox")
(string-last-split "A-little-brown-fox" 2 #\-)
=> (("A" "little") "brown" "fox")
(string-last-split "1, 2, 3 and 4" 1 #\, #\space)
=> (("1" "2" "3" "and") "4")
(string-last-split "This is a sample string." 0 #\,)
=> (("This is a sample string."))
(string-last-split "This is a sample string." 3 #\,)
=> (() "This is a sample string.")
(string-last-split "This is a sample string." 5 #\,)
=> (() "This is a sample string.")
Crée une nouvelle liste de chaine de caractères à partir de la liste cons crée par la procédure string-last-split et la retourne.
(string-join-split (string-last-split "This is a sample string." 1))
=> ("This" "is" "a" "sample" "string.")
(string-join-split (string-last-split "A-little-brown-fox" 2 #\-))
=> ("A" "little" "brown" "fox")
Afin de recomposer la chaine originale, la procédure recompose-string est nécessaire.
(recompose-string #f
(string-join-split
(string-last-split "A-little-brown-fox" 2 #\-))
#\-)
=> "A-little-brown-fox"
L'arguement Command-string est n'importe quelle chaine de caractères constituant la commande valable du système qui est passée à la procédure system. L'argument proc est une procédure acceptant un argument, port d'entrée ouvert. La procédure call-with-input-pipe execute la commande system avec l'arguement coomand-string, ouvre une pipe, passe l'autre extrémité de pipe à la procédure proc comme le port ouvert d'entrée, et ferme la pipe après l'execution de proc. La procédure retourne la valeur retournée par proc.
Supposons que le répertoire courant est "direntry":
(load "direntry.scm")
(call-with-input-pipe "ls ."
(lambda (inport)
(do ((l (read-line inport)(read-line inport)))
((eof-object? l))
(write-line l))))
ChangeLog
About
direntry.scm
direntry.texi
=> ;; retourne la valeur évaluée de l'expression do.
Retourne #t si la chaine de caractères donnée à l'arguement name-string est un répertoire sinon #f. La procédure retourne #f aussi si la chaine de caractères donnée à name-string n'existe pas dans le système de fichier.
(is-directory? ".") => #t (is-directory? "./direntry") => #t (is-directory? "./direntry/direntry.scm") => #f (is-directory? "/usr/local") => #t
Retourne #t si le nom du répertoire spécifié à l'argument name-string ne contient rien sinon #f.
(directory-empty? "/usr/local") => #f
La procédure est appelée par directory-contains. L'arguement booléen directories? contrôle le balayage pour les répertoires si #t est spécifiés et pour les autres contenus si #f est spécifié. La procédure dirent:scan-directory retourne une procédure qui retourne les noms correspondant à la chaine de caractères spécifiée à son argument.
La procédure retrournée prend search-string, short-specs? et
absolute? comme arguments. Les arguments short-specs? et
absolute? sont optionels et consignés à #t par défaut si rien
n'est spécifié. La procédure profitant de l'appel à ls (unix) ou
à dir (ms-dos) par la chaine de commande à la procedure
system, les détails de fichiers ou de répertoires sont retournés
si short-specs? est #f. La voie absolue au fichier ou au
répertoire est retourné si #t est spécifié à absolute?.
Le répertoire courant de "/usr/local/lib/slib/direntry" est supposé:
((dirent:scan-directory #f) ".")
=> ("/usr/local/lib/slib/direntry/About"
"/usr/local/lib/slib/direntry/COPYING"
"/usr/local/lib/slib/direntry/ChangeLog"
"/usr/local/lib/slib/direntry/direntry.info"
"/usr/local/lib/slib/direntry/direntry.scm"
"/usr/local/lib/slib/direntry/direntry.texi")
((dirent:scan-directory #f) "." #t #t)
=> ("/usr/local/lib/slib/direntry/About"
"/usr/local/lib/slib/direntry/COPYING"
"/usr/local/lib/slib/direntry/ChangeLog"
"/usr/local/lib/slib/direntry/direntry.info"
"/usr/local/lib/slib/direntry/direntry.scm"
"/usr/local/lib/slib/direntry/direntry.texi")
((dirent:scan-directory #f) "." #t #f)
=> ("About" "COPYING" "ChangeLog" "direntry.info"
"direntry.scm" "direntry.texi")
((dirent:scan-directory #t) "." #t #f)
=> ("." "..")
((dirent:scan-directory #t) "." #t #t)
=> ("/usr/local/lib/slib/direntry/."
"/usr/local/lib/slib/direntry/..")
((dirent:scan-directory #t) "/usr/local/lib/slib" #f #f)
=> ("drwxr-xr-x 2 root wheel 512 3/21 05:00 direntry"
"drwxr-xr-x 2 root wheel 512 3/27 05:03 jfilter"
"drwxr-xr-x 2 root wheel 512 3/22 02:45 wb")
((dirent:scan-directory #f) "/usr/lib/libm.so.[0-9]" #t #f)
=> ("libm.so.2")
((dirent:scan-directory #f) "/usr/lib/libm.so.[0-9]" #t #t)
=> ("/usr/lib/libm.so.2")
((dirent:scan-directory #f) "/usr/lib/libm.so.[0-9]" #f #f)
=> ("-r--r--r-- 1 root wheel 118992 11/20 20:58 libm.so.2")
((dirent:scan-directory #f) "/usr/lib/libm.so.[0-9]" #f #t)
=> ("-r--r--r-- 1 root wheel 118992 11/20 20:58
/usr/lib/libm.so.2")
Retourne les égaux correspondant aux spécifications de search-strings. Les répertoires sont retournés si #t est spécifié à directories? sinon les fichiers. La valeur est retournée comme vecteur si #t est spécifié à vector-output? ou comme liste si #f est spécifié.
Les arguments short-specs?, absolute? et search-strings sont tous optionels et autant d'arguments en ordre libre peuvent être spécifiés. La première valeur booléenne rencontrée est assignée à short-specs?, la deuxième à absolute?, et plus de deux arguments booléens sont ignorés. Des multiple chaine de caractères search-string peuvent être spécifiées ou l'argment search-strings peut être une chaine contenant plusieurs chaines séparées par #\space, qui sont transformées en liste de chaine et balayées une après l'autre par la procédure dirent:scan-directory.
Si rien est spécifié pour les arguments optionels, par defaut #t est consigné à short-specs?, #t à absolute? et le répertoire courant est balayé.
(directory-contains #f #f "/usr/lib/libm.*" "/usr/lib/libc.*" #t #f)
=> ("libc.a" "libc.so" "libc.so.4" "libm.a" "libm.so"
"libm.so.2")
(directory-contains #f #f "/usr/lib/libm.* /usr/lib/libc.*" #t #f)
=> ("libc.a" "libc.so" "libc.so.4" "libm.a" "libm.so"
"libm.so.2")
(directory-contains #f #f "/usr/lib/libm.*" #t #t)
=> ("/usr/lib/libm.a" "/usr/lib/libm.so"
"/usr/lib/libm.so.2")
(directory-contains #f #f "/usr/lib/libm.*" #f #f)
=> ("-r--r--r-- 1 root wheel 118992 11/20 20:58 libm.so.2"
"-r--r--r-- 1 root wheel 274862 11/20 20:58 libm.a"
"lrwxrwxrwx 1 root wheel 9 2/ 9 09:43 libm.so
-> libm.so.2")
(directory-contains #f #f "/usr/lib/libm.*" #f #t)
=> ("-r--r--r-- 1 root wheel 118992 11/20 20:58
/usr/lib/libm.so.2"
"-r--r--r-- 1 root wheel 274862 11/20 20:58
/usr/lib/libm.a"
"lrwxrwxrwx 1 root wheel 9 2/ 9 09:43
/usr/lib/libm.so -> libm.so.2")
Les procédures files, files-v, dirs et dirs-v sont fournies comme raccourcis à la procédure directory-contains.
Les arguements short-specs?, absolute? et search-strings sont tous optionels et autant d'arguments en n'importe quel ordre peuvent être spécifiés. Voir directory-contains.
Retourne les noms de fichiers correspondants à search-strings en liste.
Les arguements short-specs?, absolute? et search-strings sont tous optionels et autant d'arguments en n'importe quel ordre peuvent être spécifiés. Voir directory-contains.
Retourne les noms de fichiers correspondants à search-strings en vecteur.
Les arguements short-specs?, absolute? et search-strings sont tous optionels et autant d'arguments en n'importe quel ordre peuvent être spécifiés. Voir directory-contains.
Retourne les noms de répertoires correspondant à search-strings en liste.
Les arguements short-specs?, absolute? et search-strings sont tous optionels et autant d'arguments en n'importe quel ordre peuvent être spécifiés. Voir directory-contains.
Retourne les noms de répertoires correspondant à search-strings en vecteur.
Retourne les composants valables répertoire dans le pathname.
(directoryname-in-path "/usr/local/lib")
=> "/usr/local/lib"
(directoryname-in-path "/usr/local/bin/scm")
=> "/usr/local/bin"
(directoryname-in-path "/usr/local/lib/non-existing-name")
=> "/usr/local/lib"
(directoryname-in-path "/usr/local/lib/slib/nclients.scm")
=> "/usr/local/lib/slib"
(directoryname-in-path ".")
=> "/usr/local/lib/slib/direntry"
;; current directory's path is returned.
Retourne le nom de fichier dans le pathname. Si le pathname est un répertoire ou si le fihier n'existe pas, une chaine nulle est retournée.
(filename-in-path "/usr/local/lib/slib/nclients.scm")
=> "nclients.scm"
(filename-in-path "/usr/local/lib/slib")
=> ""
(filename-in-path "/usr/local/lib/non-existing-name")
=> ""
Retourne le dernier composant de base dans la chaine même s'il est un répertoire ou si le fichier n'existe pas.
(basename-in-path "/usr/local/lib/slib/nclients.scm")
=> "nclients.scm"
(basename-in-path "/usr/local/lib/slib")
=> "slib"
(basename-in-path "/usr/local/lib/non-existing-name")
=> "non-existing-name"
L'argument updown est optionel. La procédure retourne la dernière chaine de caractères après le point (.) dans le dernier composant de
updown is optional. The procedure returns the last string after pathname (extension), la conversion de casse étant effectuée suivant la spécification à l'argument updown. La chaine nulle est retournée si le dernier composant n'a pas d'extension.
Les spécifications à updown sont rien: pas de conversion effectuée, #t: conversion en bas de casse et #f conversion en haut de casse.
(get-extension "scm.EXE") => "EXE" (get-extension "scm.EXE" #t) => "exe" (get-extension "scm.exe" #f) => "EXE"
Décompacter le "direntry.zip" dans le répertoire approprié, dans votre répertoire $HOME par example. Ceci crée un répertoire "$HOME/direntry" et y fait résider les archives.
Ajouter dans le fichier d'initialization de votre Scheme quelque ligne faisant le cons du nom du program au *catalog* SLIB.
unzip direntry.zip -d ~.
(require 'glob) ; Au cas où la variable *catalog* n'est pas disponible. (set! catalog (cons (cons 'directory-entries "your-home-directory/direntry") *catalog*))
Ou si vous trouvez cet empaquetage utile, récrire le programs mklibcat.scm sous le répertoire SLIB et recréer SLIBCAT en root.
*** mklibcat.scm.orig Fri Mar 30 19:48:40 2001 --- mklibcat.scm Wed Mar 21 05:21:58 2001 *************** *** 37,42 **** --- 37,45 ---- (cons 'portable-scheme-debugger (in-vicinity (sub-vicinity (library-vicinity) "psd") "psd-slib")) + (cons 'directory-entries + (in-vicinity (sub-vicinity (library-vicinity) "direntry") + "direntry")) (cons 'jfilter (in-vicinity (sub-vicinity (library-vicinity) "jfilter") "jfilter")))
Après la récriture ci-dessus effectuée, émettre les code suivants encore en root.
(require 'new-catalog) (require 'directory-entries)
Et un nouveau SLIBCAT est cré.
This document was generated on 7 April 2001 using the texi2html translator version 1.52.