Version française
Home     About     Download     Resources     Contact us    
Browse thread
[Caml-list] format type
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: -- (:)
From: Alessandro Baretta <alex@b...>
Subject: Re: [Caml-list] format type


Cezary Kaliszyk wrote:
> On Mon, Nov 04, 2002 at 08:54:13AM +0100, Alessandro Baretta wrote:
> 

>>>>The only known workaround for me for now is to pass "%t" and
>>>>make my function not (unit -> unit) but ('a -> unit).
>>>
>>As far as I can see from the docs, "%t" is only meaningful 
>>with the Printf module. I see no mention of it in Scanf. 
>>What exactly are you trying to do anyway?
> 
> I am trying to create a protocol for passing messages via network.
> Each message may be acompanied by a certain amount of parameters
> (of type char, int, float or string) (the parameters are dependant on the
> message).
> 
> output/input_value aren't apropriate. (For network speed reasons, and no
> type extensibility)

I'd avoid "reinventing the wheel" and stick with well known 
protocols. Did you try anything XML based? It's versatile 
and well supported. And it will spare you a lot of low level 
parsing routines. But of course, it is suboptimal, bitrate-wise.

> I am writing a function which adds a message to the protocol, which takes the
> type of arguments accompanying the message and the receiving function.
> It should return function used to send this message type. Eg:
> 
> let two_char_sender = add_to_protocol "%c%c" two_char_receiver;;
> 
> Where two_char_receiver : (char -> char -> unit)
> And   tho_char_sender : (char -> char -> unit).
> 
> And I'd like the types to be controlled.
> 
> And I've written it. But it doesn't work if I want to create a message
> that does not take any parameters. And I suppose the builtin type format
> doesn't have the functionality necessary to write it. 

I have a feeling you are asking more of the format type than 
it was meant to handle. The format type is meant to be used 
with the Scanf and Printf modules. You can parse a message 
according to a format with Scanf, and by the same means you 
can format a message with Printf. If you are using format 
values in different contexts, you are probably abusing them.

>>Assuming you are talking about the Scanf module, I'd say you 
>>can't. Of course, if your function takes a unit input, it 
>>can very well be a perfectly polymorphic function (? la 
>>ignore) with type ('a -> unit). In which case you can force 
>>a call to such function while scanning the input buffer by 
>>passing it a range conversion with an empty range: 
>>"%[^\000-\255]". Your function would be called with an empty 
>>string as an actual parameter.
> 
> I'm not talkin about Printf nor Scanf, but about my module that uses the
> format type.
<snip>
> The format argument is parsed by me, not by scanf or printf (as I wrote
> in the example code) and I don't know where in ocaml code is type
> checking of the arguments accompanying the format type.
> 
> Cezary Kaliszyk

I lost track of what you are trying to do. Sorry for this. 
But I have a feeling you are making things much more complex 
than necessary.

Did you consider using yacc to parse your data stream 
according to your protocol specification? Format strings are 
sad heritage from C, and good for quick hacks where you do 
not want to take the time to write up a lexer and a parser, 
but you must realize they have some limitations.

I'm sorry for not being any more helpful.

Alex

-------------------
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