Version française
Home     About     Download     Resources     Contact us    
Browse thread
Toplevel function question
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: -- (:)
From: Cedric Auger <Cedric.Auger@l...>
Subject: Re: [Caml-list] Re: Toplevel function question
And one last thing in your title, avoid using "toplevel" term as it 
often refers to the program runned by typing "ocaml", that is the 
interactive system, so it is a bit confusing.

Cedric Auger a écrit :
> Joel Christner a écrit :
>> Simpler representation - tried compiling this and got the same syntax 
>> error - at a line number that was after the EOF.  Thanks in advance 
>> for any help!!
>>
>> let add_text variablelist text =
>>   variablelist.contents <- text::variablelist.contents
>>
>> let originalprogramcontents = ref [""]
>>
>> let _ =
>>   let lexbuf = Lexing.from_channel stdin in
>>   let rec storeoriginalprogram =
>>     let expr = lexbuf in
>>     match expr with
>>     | EOF   -> ()
>>     | _     -> (add_text originalprogramcontents expr); 
>> storeoriginalprogram
>>   in let parseprogram = List.iter
>>     (fun n -> print_string n; print_string "\n";) 
>> originalprogramcontents
>>
>> $ ocamlc -c toplevel.ml <http://toplevel.ml>
>> File "toplevel.ml <http://toplevel.ml>", line 17, characters 1-1:
>> Syntax error
>>
> Why do you use ( and ) delimiting "add_text originalprogramcontents 
> expr"?
> in (fun n -> print_string n; print_string "\n";), last ";" is useless
> as Benjamin said your "let" is missing its "in"
> eventually I assume you didn't intended to write "expr = lexbuf", but 
> rather "expr = parse lexbuf", where parse is a function you must 
> define, probably the "Parser.expr Scanner.token" of your first mail, 
> so I think that the following would be better:
>
> let add_text variablelist text =
>  variablelist := text::!variablelist
>
> let originalprogramcontents = ref [""]
>
> let _ =
>  let lexbuf = Lexing.from_channel stdin in
>  let rec storeoriginalprogram =
>    let expr = Parser.expr Scanner.token lexbuf in
>    match expr with
>    | EOF   -> ()
>    | _     -> add_text originalprogramcontents expr; storeoriginalprogram
>  in
>  List.iter
>     (fun n -> print_string n; print_string "\n")
>     originalprogramcontents
>
> And I don't think "let _ =" is mandatory
> Note that a list can be empty and you can write
> let originalprogramcontents = ref []
> if you want an empty list at beginning (I don't know if you need an 
> empty list or a list containing an empty string), caml will guess its 
> type since you used add_text on this list.
> If you don't use the list or want to restrict a type you also can 
> "cast" it:
> let (originalprogramcontents : (string list) ref) = ref []
>
>
>>   
>>
>> On Wed, May 13, 2009 at 4:43 PM, Joel Christner 
>> <joel.christner@gmail.com <mailto:joel.christner@gmail.com>> wrote:
>>
>>     Hello,
>>
>>     I hope you guys don't mind another beginner's question, I'm
>>     waiting on approval from the Yahoo! group moderator for the
>>     beginner's section.
>>
>>     I'm trying to implement a toplevel function that will accept input
>>     from stdin (someone running the program will do ./programname <
>>     someinputfile), store it to a ref string list, and then once
>>     stored, iteratively evaluate each item in the list individually.
>>
>>     What I've put together is:
>>
>>     let _ =
>>       let lexbuf = Lexing.from_channel stdin in
>>       let rec storeoriginalprogram =
>>         let expr = Parser.expr Scanner.token lexbuf in
>>         match expr with
>>         | EOF   -> ()
>>         | _     -> add_text originalprogramcontents expr;
>>     storeoriginalprogram
>>       in let parseprogram = List.iter
>>         (fun n -> eval expr) originalprogramcontents
>>
>>     where...
>>     - Parser and Scanner are already built and working great
>>     - When a line of text comes in, it calls 'add_text' which adds the
>>     expr into the 'originalprogramcontents' ref string list, and then
>>     recursively calls itself to get the next line
>>        - let originalprogramcontents = ref [""]
>>        - let add_text variablelist text = variablelist.contents <-
>>     text::variablelist.contents
>>     - Then when finished reading from stdin, iteratively executes
>>     'eval' against each line in the ref string list called
>>     'originalprogramcontents'
>>
>>     For some reason (probably a stupid mistake on my part) it's giving
>>     me a syntax error and pointing to a line of code that is AFTER the
>>     end of my program:
>>
>>     $ make
>>     ocamlc -c program.ml <http://program.ml>
>>     File "program.ml <http://program.ml>", line 203, characters 2-2:
>>     Syntax error
>>     make: *** [program.cmo] Error 2
>>
>>     But my program is only 202 lines long.
>>
>>     Any ideas on how I might go about making this work?
>>
>>     Thanks
>>     Joel
>>
>>
>> ------------------------------------------------------------------------
>>
>> _______________________________________________
>> Caml-list mailing list. Subscription management:
>> http://yquem.inria.fr/cgi-bin/mailman/listinfo/caml-list
>> Archives: http://caml.inria.fr
>> Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
>> Bug reports: http://caml.inria.fr/bin/caml-bugs
>>   
>
>


-- 
Cédric AUGER

Univ Paris-Sud, Laboratoire LRI, UMR 8623, F-91405, Orsay