| 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 | Le shell raviUn "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.
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*)
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".
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.
|