Browse thread
Toplevel function question
[
Home
]
[ Index:
by date
|
by threads
]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
[ 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