Re: Implémentation de printf

From: Xavier Leroy (Xavier.Leroy@inria.fr)
Date: Wed Aug 19 1998 - 17:54:55 MET DST


Date: Wed, 19 Aug 1998 17:54:55 +0200
From: Xavier Leroy <Xavier.Leroy@inria.fr>
To: Alain Frisch <alfie2@ga.mygale.org>, caml-list@inria.fr
Subject: Re: =?iso-8859-1?Q?Implémentation_de_printf?=
In-Reply-To: <199808060831.KAA01652@wanadoo.fr>; from Alain Frisch on Thu, Aug 06, 1998 at 10:32:45AM +0000

> je cherche à créer une fonction du genre :
> let affiche format arg = mon_affichage (sprintf format arg);;
> mais qui accepte des formats avec plusieurs paramètres. Est-ce
> possible (j'utilise Caml Light 0.7).

Non, ce n'est pas possible. Étant donné la manière dont les fonctions
*printf consomment leurs arguments, on peut définir une fonction qui
fait quelque chose avant d'appeler printf:

    let affiche format = print_string "**mon prefixe**"; printf format

mais il n'est pas possible de reprendre la main après que printf a
consommé ses arguments.

> D'autre part, en consultant le code source de printf (version 0.6),
> il me vient quelques questions : que sont les fonctions magic,
> is_block, repr, obj_tag ?

Des primitives de très bas niveau permettant d'accéder directement aux
représentations des structures de données Caml et de contourner le
typage statique strict. Les utiliser nécessite une compréhension en
profondeur du runtime et du compilateur Caml. Je ne saurais trop vous
dissuader de vous en servir!

> Est-il possible de créer soi même une fonction du style printf
> (ie: nombre et type d'arguments variable suivant la valeur d'un
> paramètre) ?

En restant dans la partie "bien typée" du langage, c'est difficile.
Cependant, vous pouvez regarder le printf d'Olivier Danvy
("Functional Unparsing", http://www.brics.dk/RS/98/Ref/BRICS-RS-98-Ref/BRICS-RS-98-Ref.html#BRICS-RS-98-12).

- Xavier Leroy



This archive was generated by hypermail 2b29 : Sun Jan 02 2000 - 11:58:15 MET