LINUX.ORG.RU

ocaml Syntax error


0

0

Доброго времени суток. помогите начинающему функциональному програмисту есть код на ocaml

.....
if not !Sys.interactive then
  let args = parse_cmdline in

  deend_use_multi args.deend_multi;
  deend_use args.deend;

  (* get trace from one source *)
  print_string "Getting trace\n";
  flush stdout;

 
  let prog =
    Printf.printf "statefile %s\n" args.state_file;
    List.iter 
      (fun (x,y) -> Printf.printf "%Lx %Lx\n" x y)
      args.state_ranges;
........
я в него добавил:
let lines = ref [] in
let chan = open_in filename in
try
  while true; do
    lines := input_line chan :: !lines
  done; []
with End_of_file ->
  close_in chan;
  List.rev !lines
получилась:
if not !Sys.interactive then
  let args = parse_cmdline in

  deend_use_multi args.deend_multi;
  deend_use args.deend;

  (* get trace from one source *)
  print_string "Getting trace\n";
  flush stdout;

  (* get list ijmp not go*)
    let filename = "test.ijmp.graphist.result" in

    let lines = ref [] in
    let chan = open_in filename in
    try
      while true; do
	lines := input_line chan :: !lines
      done; []
    with End_of_file ->
      close_in chan;
      List.rev !lines

  let prog =
    Printf.printf "statefile %s\n" args.state_file;
    List.iter 
      (fun (x,y) -> Printf.printf "%Lx %Lx\n" x y)
      args.state_ranges;
кидает ошибку
ocamlfind ocamldep -I ../ocaml ../trace_mine_2 appreplay.ml > ._d/appreplay.d
File "appreplay.ml", line 606, characters 2-4:
Syntax error
make[3]: *** Deleting file `._d/appreplay.d'
ocamlfind ocamlopt -package gdome2,str,ocamlgraph,extlib,unix -c -I ../ocaml -I ../trace_mine_2 -I ../stp/ocaml -I ../stp appreplay.ml
File "appreplay.ml", line 606, characters 2-4:
Syntax error
Я так понел утеряна связь моего куска в общей функцией. Вопрос: как это правильно реализовать. Цель: нужно в теле функции открыват файл и считать все строки в list

заранее огромное спасибо!

Для просто исправления синтаксической ошибки достаточно обернуть try-with в скобки:

  ...
  let chan = open_in filename in
  ( try 
      while true do 
        lines := input_line chan :: !lines 
        done; [] 
      with End_of_file -> 
        close_in chan; 
        List.rev !lines ) ;

  let prog = ...

По смыслу: код ужасен, беспощаден и кое-где бессмысленен; стоит прочитать хоть что-то по ФП, а не брать инструмент в руки и сразу писать.

Если уж пишете императивно, то что за выверты с возвращением значения? Ваш код не будет работать, как вы того ожидаете. С минимальными изменениями:

  ( try
      while true do
        lines := input_line chan :: !lines
      done;
    with End_of_file ->
      close_in chan ;
      lines := List.rev !lines ) ;
satanic-mechanic
()
Ответ на: комментарий от virvdova

Уже рекомендованная DAOC весьма неплоха. Еще есть Functional Approach to Programming, где описание ведется с помощью Caml.

Но вообще я рекомендую, очень настоятельно рекомендую, до серьезного общения с любыми ФЯ прочитать одну первую главу SICP и проделать упражнения. Это значительно облегчит дальнейшее освоение. Сама книга разумеется заслуживает полного прочтения.

Using Understanding And Unrave The Ocaml Language точно не для начинающих

satanic-mechanic
()
Ответ на: комментарий от satanic-mechanic

>Но вообще я рекомендую, очень настоятельно рекомендую, до серьезного общения с любыми ФЯ прочитать одну первую главу SICP и проделать упражнения.
и Харрисон — «Введение в ФП»

arhibot
()
Ответ на: комментарий от satanic-mechanic

Но все-равно почитайте DAOC. Мне нравится озвученный наиболее четко именно там (среди прочтенного мною) подход к «практичному» ФП при использовании нечистых ФЯ: в большинстве случаев любое изменение состояния, обуславливающее нечистоту, должно быть скрыто за функциональной абстракцией. То есть внутри, пожалуйста, модификация значений и прочее, но не модификация окружения.

satanic-mechanic
()
Ответ на: комментарий от arhibot

> Харрисон — «Введение в ФП»

Да, книжка хорошая и нужная, но она больше о _теории_ ФП. В то время как в SICP куда больше внимания уделено _философии_, _проектированию_ и практическим приемам использования. ИМХО.

satanic-mechanic
()
Ответ на: комментарий от satanic-mechanic

Да, но мне кажется, что пример перехода от теории к реальному языку весьма показателен и крайне сильно помогает восприятию ФП в целом и в частности ML.

arhibot
()
Ответ на: комментарий от satanic-mechanic

плз

а можно с Вами пообщаться например через icq. Если у меня будут какие то вопросы по ocaml. много времени я занимать не будут:) заранее огромное спасибо!

virvdova
() автор топика
Ответ на: комментарий от arhibot

> крайне сильно помогает восприятию ФП в целом и в частности ML.

Разумеется помогает, спорить тут не о чем :)

satanic-mechanic
()
Ответ на: плз от virvdova

труЪ-юниксоиды не пользуют ICQ :) Тебе в jabber-конференцию ocaml@conference.jabber.ru.

satanic-mechanic
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.