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

[PREV][SUIV]

Le shell ravi

Un "shell" est un programme qui interpréte des commandes frappées par un utilisateur à sa console. En Lisp, et en Scheme, cela est réalisé par une fonction "top-level"; avec ravi, cette fonction s'appèle ravi-1top-level, décrite ci-après.

Traitement d'erreurs

En cas d'erreur, il y a impression d'un message, et on revient à la fonction top-level. On dispose de 2 sources pour plus d'information sur l'erreur, à posteriori: la variable *errobj* et la fonction error-frame.

*errobj* Pour une grande partie des erreurs détectées par des fonctions écrites en C, cette variable contient "l'objet fautif". Un truc à savoir: quand l'impression de *errobj* donne une ligne vide, cela veut dire qu'elle possède la valeur unspecified. C'est la valeur qu'on donne pour les erreurs qui ne positionnent pas cette variable; mais: la valeur unspecified peut aussi être l'objet fautif ...

(error-frame)

L'appel de (error-frame)imprime les 2 "cadres d'appel de fonction" qui se trouvaient au sommet de la pile au moment de la dernière erreur. Un cadre est écrit comme un appel de fonction: (fonction arg1 ...) Cela permet souvent de savoir où dans les programmes, et dans quelles conditions, l'erreur s'est produite.

error-frame utilise la fonction top-write décrite ci-après.

Remarque: paradoxalement, les cadres sont plus facile à comprendre pour les fonctions Scheme compilées que pour les fonctions interprétées; cela vient du fait que les fonctions internes à l'interpréteur apparaissent dans les cadres. Cela est le prix à payer quand on écrit l'interpréteur en Scheme! Il faudra un jour améliorer cette situation, c'est tout à fait possible.

Un autre truc: la variable *errf* contient les cadres d'erreur imprimés par error-frame, elle vaut #f quand il n 'y a pas d'erreur. Essayez: (car *errf*) (cdr *errf*)

ravi-1top-level

En bon franglais, on appèle "top-level" la boucle d'un interpréteur qui assure le dialogue avec l'utilisateur; en Lisp (et donc en Scheme, c'est la boucle "read-eval-print".

(ravi-1top-level) est la fonction dans ravi qui réalise cette séquence read-eval-print. La version standard utilise les fonctions top-read et top-write expliquées ci-après. Si besoin, on peut redéfinir ravi-1top-level - il n'y a aucune protection, la nouvelle fonction remplace immédiatement la précédente dans l'interpréteur. (Le module trace, par exemple, procède ainsi).

min-time est la variable modifiable qui donne le seuil à partir duquel le temps d'exécution est imprimé. La valeur actuelle est (presque) nulle.

(top-write x) imprime l'expression x avec un nombre d'éléments limité selon la variable *write-limit* ; valeur par défaut: 128. Par "élément" on entend ici une parenthèse ouvrante, un élément de liste ou de tableau. A la place de données non-imprimeés, on sort ...

top-write imprime juste un newline pour la valeur #unspecified. Est-ce une bonne chose?

La version actuelle de top-write est assez simple; j'en ai une autre qui essaie d'imprimer sélectivement des éléments près de la racine d'une expression, mais ce n'est pas très convaincant. a voir.

*write-limit* est une variable globale modifiable.

(lim-write x lim) est la fonction d'impression limitée, avec limite lim.

(top-read) la fonction de lecture "avec un ack".

Les cadres d'erreurs

En cas d'erreur, la variable *errf* contient les 2 cadres actifs qui se trouvaient au sommet de la pile lors de l'erreur.

*print-error-frame* est une variable globale (modifiable) qui précise si on imprime ces cadres d'erreurs de facon standard. Défaut: #f. Il est conseillé de redéfinir cette variable dans le .RaviInit.scm .

(error-frame) est la fonction qui imprime ces cadres d'erreur.

Definition en autoload

a connaitre