Home
Objective Caml
ocaml@conference.jabber.ru
Четверг, 2 июля 2009< ^ >
f[x] установил(а) тему: Камло -- http://caml.inria.fr | chatlog -- http://chatlogs.jabber.ru/ocaml@conference.jabber.ru/ (старые -- http://ocaml.seajelly.org/ ) | верблюды грязи не боятся!
Конфигурация комнаты

GMT+4
[00:51:07] ygrek вышел(а) из комнаты
[05:16:00] john вошёл(а) в комнату
[08:17:36] gds вышел(а) из комнаты
[08:57:38] gds вошёл(а) в комнату
[10:15:15] Typhon вошёл(а) в комнату
[10:21:46] f[x] вошёл(а) в комнату
[10:31:55] ygrek вошёл(а) в комнату
[11:16:06] sceptic вышел(а) из комнаты: Replaced by new connection
[11:16:11] sceptic вошёл(а) в комнату
[11:59:28] sceptic вышел(а) из комнаты
[12:29:10] gds вышел(а) из комнаты: Replaced by new connection
[12:29:11] gds вошёл(а) в комнату
[14:17:46] sceptic вошёл(а) в комнату
[14:42:14] john вышел(а) из комнаты
[15:40:21] gds вышел(а) из комнаты: Replaced by new connection
[15:40:22] gds вошёл(а) в комнату
[15:47:00] gds вышел(а) из комнаты
[15:47:48] gds вошёл(а) в комнату
[17:31:06] gds вышел(а) из комнаты
[18:38:41] gds вошёл(а) в комнату
[19:15:05] Mon вышел(а) из комнаты
[19:15:06] Typhon вышел(а) из комнаты
[19:17:25] gds вышел(а) из комнаты: Replaced by new connection
[19:17:26] gds вошёл(а) в комнату
[19:18:13] Mon вошёл(а) в комнату
[19:33:46] <f[x]> (* << *)
[19:33:53] <f[x]> ocamlc -pp camlp4o
[19:34:09] <f[x]> Quotation not terminated
[19:34:37] <f[x]> camlp4 парсит содержимое комментов?
[19:47:08] <gds> как понимаю, ему надо всего лишь сохранять комментарии, но зачем в них вдаваться?..
[19:50:39] <f[x]> зачем-то ищет в них quotation'ы
[19:57:42] Mon вышел(а) из комнаты
[19:57:49] gds вышел(а) из комнаты
[19:57:51] gds вошёл(а) в комнату
[19:58:11] Mon вошёл(а) в комнату
[20:34:22] sceptic вышел(а) из комнаты: Replaced by new connection
[20:34:26] sceptic вошёл(а) в комнату
[22:58:29] DimitryKakadu вошёл(а) в комнату
[22:59:09] <DimitryKakadu> привет всем!
[22:59:24] <gds> шолом.
[22:59:32] <DimitryKakadu> я что-то торможу: как добавить в string list ещё один string?
[22:59:53] <gds> смотря куда.
[22:59:59] <DimitryKakadu> а то тут начал разбираться с функциональщиной...
[23:00:03] <DimitryKakadu> положим в хвост
[23:00:37] <gds> плохо положим, так как это пересоздание списка.
let new_list = old_list @ ["new string"]
[23:01:02] <gds> в начало --
let new_list = "new string" :: old_list
[23:01:18] <gds> первое -- O(length(old_list)), второе -- O(1).
[23:04:16] <gds> оператор "@" так же известен как List.append.
[23:04:50] <DimitryKakadu> а как-нибудь без let можно? а то я хожу в цикле по всем файлам из каталога и *.с добавляю в список.
[23:05:15] <gds> какого рода цикл?
[23:05:26] <DimitryKakadu> эм
[23:05:29] <gds> лучше в виде кода, видимо.
[23:05:53] <DimitryKakadu> сюда удобно постить?
[23:06:15] <gds> лично мне удобно читать отсюда. вроде никто особо не возмущался до сих пор.
[23:06:34] <ermine> давай сюда, посмеемся
[23:07:22] gds даёт ermine плётку для пущего антуражу
[23:07:30] <DimitryKakadu> let (targets:string list) = [] in
let dir_hndl = Unix.opendir path in (
while (true) do
let (filename:string) = Unix.readdir dir_hndl in
if ((filename.[String.length filename -1] = 'c')&
(filename.[String.length filename -2] = '.')) then begin
print_string (filename ^ " found\n");
targets = targets@filename
end;
done;
)
[23:07:36] ermine уже догадывается, что gds будет рассказывать про аккумуляторы в рекурсивных функциях
[23:07:49] <ermine> vim сосет
[23:08:28] <DimitryKakadu> а что, аккумуляторы есть действительно что мне надо? я про них где-то читал...
[23:08:47] <gds> DimitryKakadu: функциональщина серьёзно интересна, или отмучиться от чего-то и забыть?
[23:09:07] <DimitryKakadu> серьезно
[23:09:22] <DimitryKakadu> я в проект у себя у Университете залез
[23:09:34] <DimitryKakadu> там Ocaml & EclispseRCP
[23:10:01] <DimitryKakadu> Эклипса достала, пересаживаюсь на ocaml
[23:11:35] lelf вошёл(а) в комнату
[23:13:29] <gds> тогда первым шагом делаем (код не проверял, и вообще в original не пишу):
let with_unix_dir path func =
let dir_hndl = Unix.opendir path in
try ( let r = func dir_hndl in ( Unix.closedir dir_hndl ; r ) ) with e -> ( Unix.closedir dir_hndl ; raise e )
понятно, зачем?
[23:14:25] <gds> (в общем случае стоило бы взять более общую функцию типа finally или вообще синт.расширение finally, или синт.расширение pa_safeuse, в котором всё это почти есть)
[23:15:03] <ermine> gds: а скобки в try в revised нужны?
[23:16:19] ermine ненавидит, когда скобок не меньше чем в лиспе
[23:16:35] <DimitryKakadu> Кажется я понял что этот код делает...
[23:16:37] <gds> ermine: в выражении под try -- нет. может разве в хитрых случаях.
а вот в with, как и в любом матче, квадратные нужны.
[23:16:45] <gds> и что же?
[23:17:57] <ermine> ну скобки вокруг try скорее нужны чем в with
[23:18:12] <DimitryKakadu> ну мы передаем в with_unix_dir path и функцию, которую мы вызовем с аргументом path, если эта директория открываема
[23:18:42] <gds> ermine: может про скобки будет интересно http://mibori.livejournal.com/80616.html
[23:19:14] <gds> DimitryKakadu: почти. вызовем с уже открытым dir_hndl, и функция всегда его закроет.
[23:19:47] <DimitryKakadu> а, ну да, точно!
[23:20:11] <gds> далее, можем подразумевать, что файлов меньше сотни тысяч?
[23:20:19] <DimitryKakadu> запросто
[23:21:29] <ermine> gds: у меня сегодня голова болит, лучше пока закопаю в букмарку ссылку
[23:24:11] <gds> несмотря на ограничение по файлам, сделаем ещё одно улучшение безопасности.
let readdir_opt h = try (Some (Unix.readdir h)) with End_of_file -> None
после чтения документации на Unix.readdir станет ясно, что исключение End_of_file на самом деле, семантически, не исключение, а нормальная ситуация в работе программы. Вот и обернём его.
Понятно, что код делает и значение какого типа возвращает?
[23:27:30] <DimitryKakadu> Я в первый раз вижу Some и None...
[23:28:00] <gds> а индуктивные типы или начальные алгебры тоже в первый раз?
[23:29:58] <ermine> и то, что не надо на каждый чих выписывать типы после двоеточия...
[23:29:59] <DimitryKakadu> именно такие слова в первый раз, но кажется я понял о чем разговор
let Expr = string | Expr plus Expr;;
[23:30:36] <ermine> зря туториал какой-нить на ocaml-tutorial.org не почитал
[23:30:52] <DimitryKakadu> там в какой-то книжке показывали как арифметическое выражение подсчитать. Без польской.
[23:31:09] <DimitryKakadu> я это на ocaml-tutorial ивидел
[23:31:46] <gds> ermine: а вот с двоеточиями в original и revised одинаково..
[23:31:47] <DimitryKakadu> всё, нашел
[23:32:16] <ermine> gds: скобки нужны?
[23:32:20] <DimitryKakadu> type foo = Nothing | Int of int | Pair of int * int | String of string;; (*Это имеется ввиду под индуктивными типами?*)
[23:32:30] <gds> DimitryKakadu: именно это
[23:32:34] <gds> ermine: покажи пример.
[23:32:55] <ermine> gds: let a:string = "abc"
[23:34:01] <gds> ermine: в обоих катит без скобок.
[23:34:11] <ermine> или let add a b : (int -> int -> int) = a+b
[23:34:58] ermine засомневалась, нужны ли скобки вообще во втором случае... лень проверять
[23:35:02] <gds> выражение "add a b" будет иметь тип int, а не int -> int -> int.
[23:35:14] <gds> так как ( + ) : int -> int -> int.
[23:36:29] <ermine> точно
[23:44:04] <gds> итак, у нас есть функция, которая при вызове с dir handle даёт [..что?..].
а теперь неплохо бы оформить свёртку результатов в порядке их вызова.
let fold_of_opt_iter opt_iter func acc iter_arg =
  let rec inner acc =
    match opt_iter iter_arg with
      None -> acc
    | Some a -> inner (func acc a)
  in
    inner acc
;;
[23:45:47] <DimitryKakadu> (*Ну у меня сбилдился такой вариант, но сейчас попробую вникнуть в ваш*)
[23:45:56] <DimitryKakadu> let readdir_opt h =
try (
Some (Unix.readdir h)
)
with
| End_of_file -> None;;
let rec myfunc h =
let newfile = readdir_opt h in
if (newfile = None) then []
else newfile::(myfunc h)
;;
[23:46:50] <gds> вариант не совсем, так как делает список из значений... с каким типом?
[23:47:28] <DimitryKakadu> по-видимому Some
[23:52:07] <gds> если хочется по-простому, то можно этот вариант переписать, разрушив/проанализировав значение, сконструированное readdir_opt. Some "имяфайла" -- это не тип, а конкретное значение.
или же можно вникнуть в мою помогающую функцию, которая годна не только для readdir_opt.
с ней можно будет построить функцию
let fold_dir = fold_of_opt_iter readdir_opt;;
, которая осуществляет честную левостороннюю свёртку. В этом есть свой прикол.
[23:54:15] <DimitryKakadu> (*Это наверное простой вариант*)
exception Stop
let rec myfunc h =
let newfile = readdir_opt h in
match newfile with
| Some a -> a::(myfunc h)
| None -> []
| _ -> raise Stop;;
[23:55:29] <gds> 1. не нужны исключения в нормальном ходе работы.
2. третий случай не наступит.
[23:55:39] <gds> 1а. иногда нужны.
[23:57:09] <DimitryKakadu> кажется я догадался в фишку вашей проги
[23:57:41] <DimitryKakadu> про исключения понял, приму на заметку
Powered by ejabberd Powered by Erlang Valid XHTML 1.0 Transitional Valid CSS!