| Ravi Welcome Documentation Documentation About Ravi Documentation Introduction Premiers pas avec Ravi ravitool Scheme Tutorial Objets Scheme Le shell ravi Starting Ravi Le module trace Les ports d'E/S The C Parser load, require, modules Système d'interruptions Scheme compiler C++ mode Generating C++ Modules La déclaration struct Le type "C-object" More information Installation | Les ports d'E/SUn port représente un flot de données; on peut le voir comme l'adaptation à Scheme du type stream dans d'autres langages. Un port peut correspondre à
Chaque sous-type de ports possède des caractéristiques particuliers qui seront développées dans la documentation spécifique. Notons que Scheme propose des fonctions très commodes et puissantes qu'on n'a pas l'habitude de voir dans un langage de programmation:
qui redéfinissent, pour une exécution donnée, les ports standards.
Les fonctions essentielles opérant sur des ports ont toutes le port comme argument optionnel; si aucun port n'est précisé, l'opération s'effectue avec un des ports standards définis par les variables *scstdin*, *scstdout*, *scstderr*. Ces fonctions sont:
display-l est non-standard: (display-l e1 e2 ...) équivaut à (begin (display e1) (display e2) ...). Pour diriger l'impression de display-l vers un port de sortie explicite, on donne ce port comme premier argument. ATTENTION Cette convention est différente de celle de la fonction display!
Un port est soit de type entrée, soit de type sortie.
Les tubes fournissent des ports d'entrées/sorties particuliers. Ces ports sont créés par la fonction suivante qui effectue les appels système nécessaires:
Arguments: com type string: nom d'une commande Unix modes type string args type string: les arguments de la commande Résultat: liste de ports La fonction create-child-with-pipe crée un processus Unix P selon les paramètres com args; elle retourne une liste de ports qui sont connectés au stdin stdout stderr de P. Plus exactement: il y a 1, 2, ou 3 ports selon le paramètre mode, qui spécifie les ports avec les lettres ioe {pour in out err}. Si mode = "i", on crée juste un port pour le stdin, avec mode = "io" deux ports stdin, stdout, etc. Attention:
Exemple, avec un seul port d'entrée: La fonction sys affiche tout simplement toute la sortie standard d'une commande.
(define (sys x y)
(let ((p (car (create-child-with-pipe x "o" y)))) ; "ioe"
(do ((l (read-line p) (read-line p)))
((eof-object? l) #f)
(display l)
(newline))))
Utilisation:
RemarquesLa communication via tube se fait par tampon - il faut utiliser la fonction flush-port pour s'assurer que toutes les données ont été transférées. Les ports standards non-redirigés de P sont ceux du processus Ravi. Cela peut être pratique, mais aussi avoir des effets surprenants! Dans l'exemple de la fonction sys, cela signifie que, si la commande créée (comme le ls) effectue une lecture, elle lira dans le stdin de Ravi; et les messages d'erreur s'affichent sur l'écran. L'intérêt de créer des tubes avec des ports Ravi tient qu fait qu'un programme Scheme peut commander un autre processus (via stdin), et analyser ses sorties, normales ou d'erreur. =============================================================
Une chaine de caractères peut servir de port d'entrée ou de sortie. C'est équivalent à un passage par un fichier, mais beaucoup plus simple. Les fonctions de base dans Ravi - non-standards en Scheme, mais il existe l'équivalent dans d'autres versions de Scheme - sont: Pour une chaine en lecture:
Pour une chaine en sortie:
Noter qu'il n'y a pas de fermeture explicite des ports chaines. Le module ravi_string_port contient quelques fonctions de plus: ======================================== Exemples
Plus simplement, on peut utiliser call-with-output-string:
ou, encore plus simple, utiliser with-output-to-string : ============== |