LINUX.ORG.RU

let rec print_hw () = print_hello () and print_hello () = print_newline "Hello, world!" ;;

Попробуй -- снёс я пока этый OCaml...

А почему бы, собственно, не переставить местами? В конкретном примере можно (возможно) и как выше, но, вообще-то. OCaml (собственно, и никто, имхо) на такое не рассчитан...

С уважением -- Смоляное Чучелко

anonymous
()

Сорьки, но не пойдет.
У меня немножко сложнее (это был так, дурацкий пример).
Первая функция вызывает вторую, вторая - третью, а третья - первую.
Да и вообще, когда делаю список типа

let item_parse_list = [
"item1", func_item1; (* Второй член -- функция *)
"item2", func_item2;
];;

как-то приятнее, чтобы он валялся в начале файла.
Ну и в конце-то концов, какого черта :) ?

anonymous
()
Ответ на: комментарий от anonymous

Ну так и определять всё через and. Какие проблемы?

anonymous
()

И то верно. Так и сделаю. Спасибо.

anonymous
()

Не сделаешь, имхо.

Во-первых, and мало -- обрати ещё внимание на rec (let rec).

Во-вторых, помнится, оный OcaML не позволял описывать в let rec переменные -- только функи (3.06 на сей предмет, кажись, не проверял).

Можно поизвращаться с refами.

Можно, наконец, смириться с фактом: OcaML, как и почти любой другой язык, не позволяет обратиться к идентификатору до его описания и не имеет, в отличие от Цэ, предварительных определений, не помню уж точно, как они называются и кои всё равно не решают проблемы.

И так оно, имхо, и лучше...

С уважением -- Смоляное Чучелко

anonymous
()

Способ-то, кстати, есть. Только он какой-то хитрый и работает с
ограничениями. (То ли баг, то ли фича, то ли багли фича).

$ cat test.ml:
let print_hw () =
Test.print_hello ()
;;

let print_hello () =
print_endline "Hello, world!"
;;

let _ = print_hw ();;
$ cat test.mli
val print_hw: unit -> unit
val print_hello: unit -> unit
$ ls
Makefile  test.ml  test.mli
$ ocamlopt -w A -c test.mli
$ ocamlopt -w A -c test.ml
$ ocamlopt -o test test.cmx
$ echo "Look! No errors, no warnings!"
Look! No errors, no warnings!
$ ./test
Hello, world!


Условия такие:
1) необходим файл test.mli с хотя бы той функцией, которая
вызывается в стиле Module.function;
2) работает только с native-code компилером;
3) точка входа должна быть *ниже* этого вызова.

anonymous
()

Bugfix:

-3) точка входа должна быть *ниже* этого вызова.

+3) точка входа должна быть ниже обеих функций.

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