* [Caml-list] Printf and format @ 2003-07-03 16:38 Sylvain LE GALL 2003-07-05 10:26 ` Pierre Weis 0 siblings, 1 reply; 4+ messages in thread From: Sylvain LE GALL @ 2003-07-03 16:38 UTC (permalink / raw) To: caml-list Hello, I am sorry to ask a so silly question, but i need it for my personnal work, and i could not find it in the archive. Is there a way to transform string to ( 'a, out_channel, unit, unit) format. I need this function to use it with something like : Printf.printf (my_fun "X, Y") "coucou";; I look at the code and see a function scan_format, but it seems to be forbid to use it. Any idea ? Thanks Sylvain LE GALL ------------------- To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/ Beginner's list: http://groups.yahoo.com/group/ocaml_beginners ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [Caml-list] Printf and format 2003-07-03 16:38 [Caml-list] Printf and format Sylvain LE GALL @ 2003-07-05 10:26 ` Pierre Weis 2003-07-05 12:07 ` Sylvain LE GALL 0 siblings, 1 reply; 4+ messages in thread From: Pierre Weis @ 2003-07-05 10:26 UTC (permalink / raw) To: Sylvain LE GALL; +Cc: caml-list > Hello, > > I am sorry to ask a so silly question, but i need it for my personnal > work, and i could not find it in the archive. > > Is there a way to transform string to ( 'a, out_channel, unit, unit) > format. I need this function to use it with something like : > > Printf.printf (my_fun "X, Y") "coucou";; > > I look at the code and see a function scan_format, but it seems to be > forbid to use it. > > Any idea ? > > Thanks > Sylvain LE GALL As once announced on this list, the new release of Objective Caml will introduce a lot of novelty on the format type. Besides new convertion specifiers that you could find in the Printf and Scanf documentation (C, S, B, F, !, ...), there are now several different new functionalities provided by the new compiler which are relevant to your question: 0) converting arbitrary format string to a regular strings 1) converting CONSTANT strings to the corresponding constant format string 2) concatenating format strings (very often feature 0 and 1 are used in conjonction just to implement format strings concatenation). Those primitives are provided with respective names string_of_format, format_of_string, and binary infix operator ( ^^ ). I think they are useful and powerful: those new features should leverage the need for using Obj.magic and type constraints inside programs that directly manipulate format strings. However, this introduction of new format strings primitives has necessitated the addition of a new type variable to the format type that now get 4 variables instead of 3: this extra variable is mandatory to adequately type-check the kprintf function and to give an appropriate type to the new format concatenation operator (appropriate here just meaning correct, i.e. safe). This is normally completely transparent to programs that just use printf-like functions: the printf functions get a type using the new format type constructor, its format string get also the extra type variable in its typing, the type-checker hapilly handles the application and you will not even notice the modification. However, this new type variable indeed introduces a backward incompatibility, if you ever used the format type constructor into your programs, as part of the type constraints appearing either in the interface files or directly into your programs (to force an expression to get a format type). In this case, the modification of your program is easy and as follows: Just duplicate the last variable of the format type constructor argument. This systematic way to correct programs that mentioned the format type constructor is a minor inconvenience for the sake of the useful additions described above. If the users on this list feel it too complex and way too boring to modify their programs like that, we may try to implement various hacks to leverage the burden. I should mention that, even if I'm not enthusiastic at all to have been obliged to introduce such a backward incompatibility into the compiler, I would be ashame to add such (not so clean) hacks into it as well. In particular, because in this case, the modification of programs is almost trivial. Back to your problem: the features described here may your for some ``my_fun'' functions, but the general case is not properly covered by them. What we need is a general function that reads a format from within a string that is NOT a constant. This is a kind of dynamic convertion reminiscent of int_of_string or float_of_string, that checks that the string can be indeed considered as an integer of floatting point number. I propose (and have implemented for my own programming of a general translation function) a new function [read_format], such that [read_format pat s] returns the string [s] as a format string that has the same type (hence the same ``printf meaning'') as [pat], the first format string argument. For instance, read_format "The number %d is odd" "Le nombre %d est impair" returns "Le nombre %d est impair" as a format string with the same type as "The number %d is odd". This function is more general that the one above since now in [read_format pat s] the string [s] is not mandatorily an immediate string constant: it can be obtained from an arbitrary computation, as read from a file. The Typechecking of read_format would be: read_format : ('a, 'b, 'c, 'd) format -> string -> ('a, 'b, 'c, 'd) format If considered useful, this function could be added, for instance as part of a new internationalization module. Hope this helps, Pierre Weis INRIA, Projet Cristal, Pierre.Weis@inria.fr, http://pauillac.inria.fr/~weis/ ------------------- To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/ Beginner's list: http://groups.yahoo.com/group/ocaml_beginners ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [Caml-list] Printf and format 2003-07-05 10:26 ` Pierre Weis @ 2003-07-05 12:07 ` Sylvain LE GALL 2003-07-06 10:35 ` Xavier Leroy 0 siblings, 1 reply; 4+ messages in thread From: Sylvain LE GALL @ 2003-07-05 12:07 UTC (permalink / raw) To: Pierre Weis; +Cc: caml-list On Sat, Jul 05, 2003 at 12:26:49PM +0200, Pierre Weis wrote: > > Hello, > > > > I am sorry to ask a so silly question, but i need it for my personnal > > work, and i could not find it in the archive. > > > > Is there a way to transform string to ( 'a, out_channel, unit, unit) > > format. I need this function to use it with something like : > > > > Printf.printf (my_fun "X, Y") "coucou";; > > > > I look at the code and see a function scan_format, but it seems to be > > forbid to use it. > > > > Any idea ? > > > > Thanks > > Sylvain LE GALL > > As once announced on this list, the new release of Objective Caml will > introduce a lot of novelty on the format type. > > Besides new convertion specifiers that you could find in the Printf > and Scanf documentation (C, S, B, F, !, ...), there are now several > different new functionalities provided by the new compiler which are > relevant to your question: > > 0) converting arbitrary format string to a regular strings > > 1) converting CONSTANT strings to the corresponding constant format string > > 2) concatenating format strings (very often feature 0 and 1 are used > in conjonction just to implement format strings concatenation). > > Back to your problem: the features described here may your for some > ``my_fun'' functions, but the general case is not properly covered by > them. What we need is a general function that reads a format from > within a string that is NOT a constant. This is a kind of dynamic > convertion reminiscent of int_of_string or float_of_string, that > checks that the string can be indeed considered as an integer of > floatting point number. > > I propose (and have implemented for my own programming of a general > translation function) a new function [read_format], such that > > [read_format pat s] returns the string [s] as a format string that has > the same type (hence the same ``printf meaning'') as [pat], the first > format string argument. > > For instance, > > read_format "The number %d is odd" "Le nombre %d est impair" > > returns "Le nombre %d est impair" as a format string with the same > type as "The number %d is odd". > > This function is more general that the one above since now in > [read_format pat s] the string [s] is not mandatorily an immediate > string constant: it can be obtained from an arbitrary computation, as > read from a file. > > The Typechecking of read_format would be: > > read_format : > ('a, 'b, 'c, 'd) format -> string -> ('a, 'b, 'c, 'd) format > > If considered useful, this function could be added, for instance as > part of a new internationalization module. Hello, you read my mind. Indeed, the question concern an internationalization module ( let's call libgettext-ocaml ). It is basically a binding of gettext. But, for handling certain apsect of gettext it needs printf like capability. But the printf like capibility, as printf, use a non constant string ( returned by a function dngettext... or so ). That's the reason why i am looking after something which correpsond to this things. If people at INRIA could include some kind of read_format, it could be very useful. Thanks a lot Sylvain LE GALL ------------------- To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/ Beginner's list: http://groups.yahoo.com/group/ocaml_beginners ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [Caml-list] Printf and format 2003-07-05 12:07 ` Sylvain LE GALL @ 2003-07-06 10:35 ` Xavier Leroy 0 siblings, 0 replies; 4+ messages in thread From: Xavier Leroy @ 2003-07-06 10:35 UTC (permalink / raw) To: Sylvain LE GALL; +Cc: caml-list > Is there a way to transform string to ( 'a, out_channel, unit, unit) > format. I need this function to use it with something like : > > Printf.printf (my_fun "X, Y") "coucou";; No, not in a type-safe manner. The type of a format string depends on the "%" specifiers found in the string itself, and OCaml can't infer or check types at run-time. However, for the purpose of internationalization, the following operation suffices: given a (compile-time constant) format and a (dynamically computed) string, check that the string can be viewed as a format with the same format type as the constant format, and return the string as a format. In OCaml 3.06, this can be done as follows: let re_fmt = Str.regexp "%[#0-9.*+ -]*[lnL]?[sScCdioxXunfeEgGFbBatn[]" let string_of_format (s : ('a, 'b, 'c) format) = (Obj.magic s : string) let extract_formats s = List.fold_right (fun part accu -> match part with Str.Text _ -> accu | Str.Delim d -> d :: accu) (Str.full_split re_fmt s) [] let conv_format (src: ('a, 'b, 'c) format) (dst: string) = if extract_formats (string_of_format src) = extract_formats dst then (Obj.magic dst : ('a, 'b, 'c) format) else failwith "conv_format" Remark 1: yes, there's a lot of "Obj.magic" in this code, and yes, this is a deadly sin, but in this particular instance it is all type-safe nonetheless. Remark 2: the matching of the two formats can be relaxed, e.g. the code above will not allow the conversion of "%6d" into "%8x", although both formats have the same type. This is left as an exercise for the reader. But for internationalization purposes, I doubt you need that additional flexibility. Then, assuming you have a function "gettext : string -> string" to translate strings according to the user-selected language, you can extend it to formats as follows: let getformat f = conv_format f (gettext (string_of_format f)) and use it with printf functions like this: printf (getformat "My name is %s and I'm %d years old") "Bob" 12 > you read my mind. Indeed, the question concern an internationalization > module ( let's call libgettext-ocaml ). It is basically a binding of > gettext. I hope the above is enough to get you off the ground. - Xavier Leroy ------------------- To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/ Beginner's list: http://groups.yahoo.com/group/ocaml_beginners ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2003-07-06 10:35 UTC | newest] Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2003-07-03 16:38 [Caml-list] Printf and format Sylvain LE GALL 2003-07-05 10:26 ` Pierre Weis 2003-07-05 12:07 ` Sylvain LE GALL 2003-07-06 10:35 ` Xavier Leroy
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox