powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / OCaml, хочу ликбез по сторонним библиотекам, классам и работе с файлами.
12 сообщений из 12, страница 1 из 1
OCaml, хочу ликбез по сторонним библиотекам, классам и работе с файлами.
    #37966605
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надо: класс в котором хранится и несколько раз обрабатывается текст прочитанный из файла. Застрял на чтении из файла :(

Нагуглил библиотеку http://code.google.com/p/ocaml-extlib/ которая должна по идее делать работу с текстовыми файлами очень простой. Скачал, распаковал, make, make install.
Появилась кучка файлов в C:\OCaml\lib\site-lib\extlib\, в том числе и IO.cmi и IO.mli

сделал микро-тест:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
class file_holder =
	object
		val mutable source_text = ""
		method get_source = source_text
		method load file_name =
			source_text <- IO.read_all file_name;       (* 6 *)
end;;

let main =
	let f = new file_holder;                                    (* 10 *)
	f#load Sys.argv.(1)
	print_string f#get_source;
	exit(0);;                                                   (* 13 *)

main;;



Получил
Код: plaintext
1.
2.
C:\dev>ocamlc test.ml
File "test.ml", line 13, characters 8-10:
Error: Syntax error

Закоментировал создание объекта в 10-ой строке. Получил ошибку:
Код: plaintext
1.
2.
C:\dev>ocamlc test.ml
File "test.ml", line 6, characters 18-29:
Error: Unbound module IO

Что я делаю не правильно?
...
Рейтинг: 0 / 0
OCaml, хочу ликбез по сторонним библиотекам, классам и работе с файлами.
    #37966745
Фотография k0rvin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl,

Модуль вроде нужно вначале подключить:
Код: plaintext
1.
open IO;;
...
Рейтинг: 0 / 0
OCaml, хочу ликбез по сторонним библиотекам, классам и работе с файлами.
    #37966761
Фотография k0rvin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl,

И у тебя let неправильный. Надо так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
let main () =
	let f = new file_holder in                                  (* 10 *)
	f#load Sys.argv.(1);
	print_string f#get_source;
	exit(0);;                                                   (* 13 *)

main;;

http://ideone.com/l0ujV

В вике есть примеры подключения модулей и let-синтаксиса.
...
Рейтинг: 0 / 0
OCaml, хочу ликбез по сторонним библиотекам, классам и работе с файлами.
    #37967818
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все равно не понимаю.
Если я добавляю in в объявление main, то ошибка на exit(0) больше не выдается. Но все равно не понятно, почему при закоментаренной десятой строке в которой создается объект с именем f не выдается ошибка на 11-ой и 12-ой строках где этот объект используется?
И как на все это влияет in? Оно же должно ограничить область видимости объекта, так? Или какую роль оно здесь играет?


С библиотекой по прежнему проблемы. На open IO;; компилятор ругается что плохой синтаксис.
Без open IO, но с более длинной командой компиляции:
Код: plaintext
1.
2.
3.
C:\dev>ocamlc -I C:\OCaml\lib\site-lib\extlib\ IO.cmo test.ml
File "test.ml", line 11, characters 8-20:
Error: This expression has type string but an expression was expected of type
         IO.input
При чем здесь 11-ая строка?
...
Рейтинг: 0 / 0
OCaml, хочу ликбез по сторонним библиотекам, классам и работе с файлами.
    #37967831
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дошел до этого:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
class file_holder =
	object
		val mutable source_text = ""
		method get_source = source_text
		method load file_name =
			let chan_in = Pervasives.open_in file_name in
				source_text <- IO.read_all (IO.input_channel(chan_in));
				Pervasives.close_in chan_in;
end;;

let main =
	let f = new file_holder in
	f#load Sys.argv.(1);
	print_string f#get_source;
	exit(0);;

main;;



Это работает, только я не понимаю почему...
...
Рейтинг: 0 / 0
OCaml, хочу ликбез по сторонним библиотекам, классам и работе с файлами.
    #37967834
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ах да, команда компиляции последнего исходника:
ocamlc -I +site-lib\extlib extlib.cma test.ml
...
Рейтинг: 0 / 0
OCaml, хочу ликбез по сторонним библиотекам, классам и работе с файлами.
    #37968036
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще один newbie-вопрос. Как делать условное ветвление? Если я правильно понимаю, if/then/else это функция а если мне не нужно ничего возвращать?
Ну вот например как на OCaml сделать аналог такого кода:
Код: plaintext
1.
2.
3.
4.
5.
6.
if ( a=b ) {
   foo();
   bar();
} elseif ( isFunction() ) {
  zap();
}
...
Рейтинг: 0 / 0
OCaml, хочу ликбез по сторонним библиотекам, классам и работе с файлами.
    #37968175
Фотография k0rvin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl,

ветвление: http://ideone.com/Z7Ur2

Но вообще оно всегда что-то возвращает. В Ocaml'е, как и в (почти) любом другом ФЯП любое выражение имеет какой-то тип и какое-то значение. Как следствие тип всех веток должен быть одинаковым и в примере выше тип выражения -- unit, значение -- ().
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
# let x = if 1 == 2 then
  begin
    print_int 1;
    print_int 2
  end
else if 2 == 2 then
  begin
    print_int 3;
    print_newline ()
  end;;
3
val x : unit = ()
# x;;
- : unit = ()

соответственно, если сделать типы разными, то получим ошибку компиляции:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
# let x = if 1 == 2 then
  begin
    print_int 1;
    print_int 2
  end
else if 2 == 2 then
  3 ;;
Characters 92-93:
    3 ;;
    ^
Error: This expression has type int but an expression was expected of type
         unit
...
Рейтинг: 0 / 0
OCaml, хочу ликбез по сторонним библиотекам, классам и работе с файлами.
    #37968176
Фотография k0rvin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlЕсли я правильно понимаю, if/then/else это функция

Нет, не функция =)
...
Рейтинг: 0 / 0
OCaml, хочу ликбез по сторонним библиотекам, классам и работе с файлами.
    #37968408
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну хорошо. Вот конкретная задача: получить в командной строке имена нескольких текстовых файлов и обработать их. Значит нам первым делом надо разобрать командную строку:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
	Array.iter (fun parameter ->
		if Filename.check_suffix(parameter, ".txt") then
		begin
			print_string "Loading ";
			print_string parameter;
			holder#load parameter;  (* объект класса file_holder из предыдущих постов *)
			print_endline " ok";
		end 
		else if parameter.[0]='-' then
		begin
			print_endline ("option " ^parameter);
		end
	) Sys.argv;


Попытка откомпилировать выдает:
Код: plaintext
1.
2.
File "main.ml", line 14, characters 26-44:
Error: This expression has type 'a * string
       but an expression was expected of type string
14-ая строка помечена цветом...

В чем я не прав на этот раз?
...
Рейтинг: 0 / 0
OCaml, хочу ликбез по сторонним библиотекам, классам и работе с файлами.
    #37968489
Фотография k0rvin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl,

в том, что ты не ознакомился с системой типов. =) Функция Filename.check_suffix имеет тип string -> string -> bool, т.е. в некотором смысле функцией двух аргументов.
Ты же пытаешься передать ей один аргумент — кортеж (string, string), т.е. использовать ее как (string, string) -> bool.

http://ideone.com/eFxG6
http://caml.inria.fr/pub/docs/manual-ocaml/libref/Filename.html
http://ru.wikipedia.org/wiki/Каррирование#OCaml
...
Рейтинг: 0 / 0
OCaml, хочу ликбез по сторонним библиотекам, классам и работе с файлами.
    #37968520
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
k0rvinв том, что ты не ознакомился с системой типов. =)Ознакомился! Честное слово ознакомился.
Но вот в каррирование я пока еще явно не въехал :(
Спасибо.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / OCaml, хочу ликбез по сторонним библиотекам, классам и работе с файлами.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]