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

GMT+4
[00:11:42] ygrek вышел(а) из комнаты
[00:23:22] <gds> вот чорт. а мой молоток, которым я, чорт возми, постоянно забиваю гвозди, уже сто лет не изменяется никак. вот говно, а?..
[00:56:27] <sevenov> gds, аналогия совсем неверная.
[00:58:47] <gds> не знаю, кому как, но у инженеров есть правило: "работает -- не трожь".
[01:01:15] <sevenov> Если бы в IT было все именно так, тогда до сих пор все писали бы на асм или фортране.
[01:01:53] <gds> там работает плохо (по отношению деньги/время).
[01:04:01] <sevenov> gds, ну если так рассуждать, то на том же пистоне что-то написать быстрее, чем на камле.
[01:06:13] <gds> "что-то" -- да. Более того, лично я до сих пор использую баш, перл, греп+сед+сотоноварищи, sql, pl/sql. Конечно, окамл не покрывает все требуемые мне области деятельности.
[01:06:28] <gds> кстати, на цэ тоже порой пишу. /me делает ножкой
[01:10:16] <gds> кстати, скорее бы окамл сдох. так как он от хаскеля концептуально отличается малым (а именно, ленивостью), то хаксиль сдох бы тоже. И писали бы надёжный софт на нормальных человеческих Coq и Agda, которые на голову выше всех используемых ныне языков программирования.
А может и CPL дошёл бы до используемой стадии, тоже было бы офигенно забавно.
[03:30:29] sceptic вышел(а) из комнаты
[03:31:03] sceptic вошёл(а) в комнату
[06:44:50] john вышел(а) из комнаты: Replaced by new connection
[06:44:51] john вошёл(а) в комнату
[08:06:54] sceptic вышел(а) из комнаты
[08:07:04] sceptic вошёл(а) в комнату
[08:09:46] john вышел(а) из комнаты
[09:17:44] sevenov вышел(а) из комнаты
[09:39:15] abiogenesis вошёл(а) в комнату
[09:39:21] <abiogenesis> а почему он умирает?
[10:30:34] <gds> abiogenesis: потому что "caml weekly news" и сайт туарега не обновляются. окамл обречён :[
[10:32:46] <ermine> gds: насчет молотка - вот если бы изменялись законы физики... или попробовал бы ты им постучать гденить в космосе
[10:34:06] <ermine> gds: а камло, если не будет развиваца, будет неинтересен на компах, которые появаца через лет 10
[10:34:49] <abiogenesis> может, авторы его забросили и перешли в ms работать над F#?
[10:35:37] <ermine> та не забросили
[10:36:44] <gds> ermine: с молотком аналогия левоватая, да.
про будущие компы -- разве что многоядерность надо разрулить. решения уже есть, надо думать, выбирать.
[10:37:10] <gds> насчёт F# -- не перешли, судя по публично-доступной информации.
[10:39:00] <ermine> gds: а вот компилятор clean непашыт на 64 разрядных компах
[10:39:12] <ermine> или mozart
[10:39:27] <ermine> мало ли их, полудохлятин
[10:40:51] <gds> от размера коммунити и от компилятора зависит. окамловский -- вон, в рассылке чел между делом за недельку добавил новую архитектуру, которую сам не знал.
[10:42:01] <ermine> какая архитектура?
[10:43:39] <gds> http://caml.inria.fr/pub/ml-archives/caml-list/2009/08/c9f8470a79dfff3f53714721bb257781.en.html
[10:44:44] <ermine> какой-то проц
[10:44:53] <ermine> понапридумают же молотков
[10:48:44] <gds> с одной стороны, интеловские молотки объективно плохи, да и есть некий профит от изобретения собственного.
[10:50:13] <ermine> чтобы почувствовать свою значимость
[10:53:14] <gds> не это главное. "программно-аппаратные комплексы" (проц, железная обвязка, софт) -- готовая штука для разработки разных девайсов. и они это вполне успешно продают.
[10:57:41] ygrek вошёл(а) в комнату
[11:25:46] <ygrek> gds: несмотря на умирание камля, ты dbf выложишь?
[11:29:16] <gds> у меня там прога, поэтому, чтобы сделать либу, нужно продумать её интерфейс. Только тупак лезет в голову: сделать
open_dbf: filename:string -> (reader_handle * (string * col_type) list)
read_record : reader_handle -> string list
есть идеи получше?
[11:35:10] <ygrek> вполне, можно получение колонок отделтить от открытия
[11:35:29] <ygrek> я могу и сам в либу оформить
[11:40:57] <gds> при регистрации проекта на forge.ocamlcore.org -- выбор крутой:
You can choose among different SCM for your project, but just one.
CVS
SVN
даже не знаю, что выбрать.
[11:42:10] <ygrek> но git есть
[11:42:32] <ygrek> http://forge.ocamlcore.org/forum/forum.php?forum_id=207
[11:45:52] <gds> мда, посмотрел я ещё на твой баг про svn+https и на реакцию. не, репо будет в другом месте.
а первичнее -- поднять репо, а потом уже регистрить проект на forge.
[11:46:31] <gds> вот например на google code, где дают, по слухам, только svn и меркуриал.
[11:48:22] <gds> или вот http://freehg.org/ есть. даже не знаю, всё такое вкусное.
[11:54:14] <gds> заодно перерисую у себя процедуру сборки проги -- ocamlbuild'у как надо говорить о том, что один модуль это лексер (ocamllex), а другой это парсер (ocamlyacc)?
[11:55:02] <ygrek> никак - он сам соображает
[11:55:31] <ygrek> ещё есть repo.or.cz :)
[11:58:27] <gds> хитро -- у меня все *.ml *.mli в revised, и он подумал, что lexer.ml ( <- lexer.mll) тоже.
как кошерно решить проблему?
[11:59:34] <ermine> юзать все ревижное
[11:59:45] abiogenesis вышел(а) из комнаты
[12:00:38] <ygrek> <lexer.ml>: -camlp4r ?
[12:00:51] <ermine> ага
[12:01:26] <gds> ermine: хехе, покажи как-нибудь
[12:01:52] <ermine> gds: вон уже показали
[12:02:04] <ermine> **/*.ml даже
[12:05:36] <gds> всё получилось. интересно, как ocamlbuild определяет, что приоритетнее, camlp4r или -camlp4r?
[12:06:09] <ygrek> кстати интересный вопрос. наверное по тому что специфичнее
[12:06:22] <ygrek> т.е. file.ml более важно чем *.ml
[12:07:50] <gds> интуиция тоже подсказывает так.
надо бы при случае поставить его раком. как-то вида
<*/file.ml> : +
<dir/*.ml> : -
[12:25:38] <ygrek> что-то на stackoverflow 3 последних вопроса по камлю про многопоточность - от разных людей..
[12:33:45] <gds> а что спрашивают?
[12:34:57] <ygrek> "доколе же". ответы отправляют в mpi
[12:37:03] john вошёл(а) в комнату
[12:48:32] <gds> прога у меня называется тупо -- dbfwork, модуль с полезными функциями называется mlxbase. но "проект" -- хз как назвать. чтобы было отсылка и на окамл, и на dbf (или xbase). какие идеи?
[12:49:40] <ermine> mldbf
[12:49:57] <ermine> ни одной гласной
[12:49:59] <gds> и заодно отсылка на молдавский brainfuck :)
[12:50:33] <ermine> а у молдавии вроде же .md
[12:50:36] <gds> а вообще -- идея хорошая.
в некоторых языках (таки да) вообще гласные не пишутся, и ничего, живут.
[12:51:20] <gds> да, .md, но mld более ассоциируется.
в общем, пока рабочий вариант mldbf.
[12:52:01] <gds> репо буду делать на гите. врага надо знать в лицо. да и весьма полезно уметь его использовать.
[12:52:02] <ermine> вообще стандартно и тупо - ocaml-dbf
[12:52:30] <ermine> как ocaml-sqlite, ocaml-ssl, ocaml-чтотамеще
[12:52:51] <gds> тоже хороший вариант, ага.
[12:53:02] <ermine> у меня кстати проекты начинающиеся на ml - биндинги к С либлам
[12:54:07] <gds> где-то в мануале было такое именование, вот потому у тебя так.
[12:54:57] <ermine> а еще можно labldbf
[13:10:11] <gds> по "ocaml-dbf" ничего не ищется, беру в дело.
http://repo.or.cz/w/ocaml-dbf.git
пошол освежать гит в памяти.
[13:13:35] <ermine> гит?
[13:13:39] <ermine> а пчу гит?
[13:13:44] <ermine> а как же меркуриал?
[13:13:51] <gds> (11:49:17) gds: репо буду делать на гите. врага надо знать в лицо. да и весьма полезно уметь его использовать.
[13:14:48] <ermine> какой ты практичный
[13:14:52] <gds> меркуриал крутой, но его я уже умею готовить. гит по возможностям похожю
[13:20:26] <gds> ещё есть проблемка с кодировками. падвендой часто бывает так, что в dbf данные в cp866, а в проге нужны в cp1251. Пока у меня там висящие сопли в виде табличной перекодировки туда-сюда.
Думаю, по уму надо бы вывести функцию string -> string и дать её в руки пользователю, который сам уже решит, хватит ли ему fun x -> x, или же нужно подключать camomile.
[13:27:12] <gds> а хотя, проще надо быть. отдаю и принимаю строки с байтами, а там хоть в ebcdic.
[14:01:44] <gds> сделал всё как тут: http://brion.inria.fr/gallium/index.php/Mllib
"You will get your .cma file in your "_build" directory and a link to it from your main directory."
линков чото нет.
что-то делаю не так?
либа называется так же, как и единственный модуль, входящий в неё.
[14:19:54] <ygrek> кстати что значит labl?
[14:20:31] <gds> labelled. вообще, labels и optional arguments вроде бы придумывались в процессе написания labltk
[14:20:43] <ygrek> а, ясно
[14:21:06] <ygrek> в mllib надо имена модулей - с заглавной буквы по одному в строке - всё так?
[14:21:24] <gds> да.
[14:21:36] <gds> пожалуй, самое время заливать на публичный репо?
[14:21:45] <ygrek> угу
[14:21:57] <gds> утибя там какой юзернейм?
[14:22:03] <ygrek> ygrek
[14:23:36] ygrek тем временем прикрутил определение single-row SELECT'ов по grouping функциям без GROUP BY. Вообще уже столько накопилось всяких ad-hoc туплов что без .annot и не разобрать :)
[14:31:29] <gds> ааааа!111111
No refs in common and none specified; doing nothing.
Perhaps you should specify a branch such as 'master'.
[14:33:14] <ygrek> :))
[14:33:27] <ygrek> первый пуш
git push origin master
[14:35:03] <gds> первый пуш, он трудный самый
гляди: http://repo.or.cz/w/ocaml-dbf.git
[14:37:33] <ygrek> утянул. если вдруг чё - коммитить в master?
[14:37:55] <gds> таки да.
[14:38:11] <gds> а коммитить там есть чего, ибо писал чисто для себя.
[14:39:15] <ygrek> либы оно собирает, но линков на них не делает.
[14:39:22] <ygrek> кстати по-моему никогда и не делало
[14:40:06] <gds> но по идее должно ведь.
[14:40:29] <ygrek> может и бага
[14:41:46] <gds> я рассуждаю так: в случае сбора бинарников оно создаёт линки -- значит и тут должно.
[14:43:42] <ygrek> ну бинарники человек руками хочет запускать, а либы то никому и не нужны в top каталоге.
[14:43:54] <ygrek> впрочем на доку например линки создаёт тоже
[14:49:44] <ygrek> а какая лицензия?
[14:50:01] <gds> чото накосячил, видимо. делаю второй пуш:
$ git push origin
fatal: 'origin': unable to chdir or not a git archive
fatal: The remote end hung up unexpectedly
[14:50:16] <gds> лицензию думаю просто gpl поставить. покатит?
[14:50:25] <gds> тьфу, не то.
[14:50:41] <gds> просто git push. но результат тот же.
[14:53:04] <ygrek> ты автор ты решаешь :) мне годится, но dbf это такая штука что нужна в основном всяким неудачникам копающимся в проприетарных отложениях юрского периода. имхо лучше было бы lgpl или bsd для развития
[14:53:54] <ygrek> хм, а если опять git push origin master?
[14:56:45] <ygrek> у меня git push работает, так что если что - склонируй начисто репу
[14:56:47] <gds> потому и спрашивал про лицензию, ибо торможу в последнее время. Про кал всё верно. А lgpl vs bsd -- где будет разница? Разве что продавать мой код под lgpl не смогут, и линковать статически.
[14:57:26] ygrek тоже не спец по тонкостям лицензий
[14:58:27] <ygrek> под lgpl продавать смогут, но продавать модифицированное только поделившись патчами - вроде так
[14:58:47] <ygrek> http://git.or.cz/gitwiki/GitFaq#A.22unabletochdirornotagitarchive.22whilepushing
[15:04:59] DiGiTAL_CuRSe вошёл(а) в комнату
[15:06:34] <gds> угу, видимо гит запомнил левый урл.
склонированное сработало ок. линки добавил руками на баше.
[15:08:47] <gds> добавил лицензию.
[15:10:52] <ygrek> кстати можно в ~/.gitconfig прописать для логов
[user]
email=...
name=...
[15:11:20] DiGiTAL_CuRSe вышел(а) из комнаты
[15:12:04] <ygrek> ERROR: Leftover Ocaml compilation files:
File mlxbase.cma in . has suffix .cma
File mlxbase.cmxa in . has suffix .cmxa
[15:12:11] <ygrek> вот поэтому и нет линков :)
[15:13:37] <gds> ненене, линков не было до того, как я добавил код на баше. ща исправлю.
[15:14:56] <gds> думаю их удолять перед ocamlbuild, конечно.
[15:15:44] <ygrek> зачем они вообще нужны?
[15:16:45] <ygrek> ну т.е. в идеале будет make install с ocamlfind, а для adhoc использования всё равно что contrib/mlxbase что contrib/mlxbase/_build
[15:19:05] <gds> чтобы не было ocamlbuild-специфичного "_build/", единственное. Конечно, можно и как ты описал, но мне не сложно накодить логику для их создания-удаления.
[15:19:47] <gds> (осталось понадеяться на то, что ocamlfind обрабатывает симлинки как нормальные файлы)
[15:20:56] <ygrek> имхо только лишняя сложность (и головная боль виндовс-лузерам)
[15:27:13] <gds> логично: даже если ocamlbuild и пофиксят, в _build будут лежать .cm{a,xa}
[15:28:44] <gds> а вот теперь я не могу разобраться с гитом. хочу всё получить с удалённого репо и попытаться замержить воедино с локальным. в меркуриале это просто делается..
[15:28:56] <gds> получить-то получил, как замержить вот.
[15:38:10] <ygrek> git fetch получить
[15:38:18] <ygrek> git merge origin - смержить
[15:38:27] <ygrek> или просто git pull - получить и смержить
[15:38:46] <ygrek> если ты таки хочешь симлинки то проще им precious таг поставить
[15:43:41] <gds> насчёт гита вроде разобрался, но вот странно -- в нём на редкость просто сделать какую-то фигню. В меркуриале это сделать гораздо сложнее, судя по опыту использования.
[15:44:29] <ygrek> кишки наружу, да
[15:46:04] <gds> насчёт симлинков -- не уверен, как оно будет работать с precious. с одной стороны, симлинки не надо будет пересоздавать, а с другой, падвендой, где симлинк = копирование, это не сработает.
Поэтому пишу честное удаление симлинков, это не сложно.
А баг в ocamlbuild поправят как-нибудь.
[15:49:31] <gds> в общем, "изя всё". То, что планировал сделать по поводу ocaml-dbf (кроме добавления на forge.ocamlcore.org) -- сделал.
[15:51:18] john вышел(а) из комнаты
[15:59:27] <ygrek> 1c99c41: use identity_string for r_cpcvt by default
[16:01:47] <ygrek> мои файлы оно не прочитало. будем копать.
[16:02:04] <ygrek> кстати ты формат сам расковыривал или по спеке?
[16:02:36] <ygrek> я обычно держу вместе с кодом линки на все исопльзованные rfc, примеры кода, etc
[16:10:19] <gds> и по спеке, и расковыривал.
[16:11:05] <gds> о да, фикс правильный, это дело я забыл.
[16:11:31] <gds> если чо, давай файл, поковыряю.
[16:16:02] <ygrek> не смею злоупотреблять вашей любезностю сударь, сам поковыряю :)
[16:23:21] <gds> руководствовался этой докой: http://www.clicketyclick.dk/databases/xbase/format/
[16:24:19] <gds> но вроде там не полное соответствие тем dbf, которые я парсил. впрочем, уже не помню.
[16:25:50] <ygrek> ясно
[16:26:06] <gds> кстати, интересно, в чём там дело.
[16:26:12] <gds> когда раскопаешь :)
[16:53:51] Mon вышел(а) из комнаты
[17:03:26] <ygrek> в deleted_sign у меня произвольные байты, ни разу не пробел или звёздочка
[18:03:05] DimitryKakadu вошёл(а) в комнату
[18:34:03] <gds> ygrek: а в остальном записи лежат ровненько?
[18:41:42] <gds> ага, дифф посмотрел, что-то подобное как раз прикидывал в случае, если проблема только в этом, и если бы ты уже не реализовал.
[18:43:15] <ygrek> ещё EOF'а нет, а наоборт бывает встречается в начале record'а из за чего не все данные читаются
[18:43:19] <ygrek> сейчас обхоже это
[18:43:24] <ygrek> * обхожу
[18:43:59] <gds> eof'а нет -- это \x1A, за которым физический конец файла?
[18:44:24] <gds> и интересно, чем же это генерили данные dbf...
[18:44:37] <ygrek> да
[18:44:46] <ygrek> не знаю :)
[18:45:22] <ygrek> но openoffice и dbfxtrct их нормально обрабатывают
[18:45:23] <gds> знать бы -- можно было бы погуглить на предмет "имяутилиты dbf формат".
[18:46:21] <ygrek> скорее всего delphi, попробую узнать
[18:46:30] <ermine> а может позырить в исходники конвертера?
[18:46:35] <ermine> и скопипастить
[18:47:17] <gds> кстати, я мог проигнорировать (забыть или не заметить) какое-то поле в заголовке, типа "на сколько двинуто начало записей".
если вдруг фикс будет неоднозначный (то есть, если будет эвристика или вообще сломается поведение), было бы интересно изучить dbf, проанализировать поля и побегать hex editor'ом.
[18:47:22] <ermine> копипаста - наше всё!
[18:48:26] <gds> ermine: "нет такой проблемы в software engineering, которую нельзя было бы решить копипастой". От разбора двоичных форматов до архитектурных решений :)
[18:48:34] <ermine> ручная работа - зло и приводит только к огрехам
[18:49:17] <ermine> надо юзать asn.1 и генерить код
[18:49:19] <gds> это ты про рукоблудие?
[18:49:31] <ermine> ага
[18:50:47] <ermine> в противном случае свое детище надо прогонять через миллион тестов
[18:50:57] <ermine> интересно как Кнут писал свой tex
[18:52:09] <gds> у меня порой были другие примеры: на некоторых плохих, негодных языках программирования нормальными средствами устроить абстракцию поведения (поведение похожее, но различается в деталях) -- значит рожать лисп изнутри себя либо полагаться на кодогенерацию, где исходник представляет разветвлённые спагетти.
а так, скопипастил пару раз -- и сэкономил себе труд, где-то на пару порядков.
[18:53:11] <gds> да даже в окамле копипаста это прикольно: посмотрите, например, на Map -> Set. Или на Hashtbl -> Hashset (это из отдельных источников, у филлиатра, или как его).
[18:54:37] <ermine> вот бы если бы тщательнее копипастили мап в сет
[18:54:56] <ermine> не маялась бы я с find/keys функциями
[18:55:46] <gds> вот если бы ты тщательно скопипастила себе локальную копию extlib, упростилось бы ещё чуть более 9000 вещей.
[18:58:23] <ermine> а там есть treap?
[18:59:27] <ermine> а treap - это ведь map, только с другой балансировкой
[19:02:03] <gds> сходу не вижу, имхо нет.
[19:03:02] <ermine> а zip там потоковый?
[19:06:59] <ygrek> headerlen учитывается - тут всё ок
[19:07:07] <ygrek> фикс пушнул, вроде адекватный
[19:51:13] <gds> ага, алгоритм ок, но вот лично я почему-то избегаю tell() и их аналогов, как в:
if pos_in d.r_ch = in_channel_length d.r_ch
судя по логике, если прочитано 0 байт, то всё ок и End_of_file, а иначе ошибка формата, так?
[20:18:10] sevenov вошёл(а) в комнату
[20:27:29] DimitryKakadu вышел(а) из комнаты
[20:59:54] 604 вошёл(а) в комнату
[21:09:46] <604> вопрос по основам
# let sum x y = x+y;;
# let inc x = sum x 1;;
чем это лучше, чем аналогичное
function sum(x,y){return x+y;}
function inc (x) {return sum(x,1);}
просто уже не в первый раз в учебниках встречаю, что на этом заостряется внимание, как на особенной фиче
[21:10:32] <gds> заостряют не то, или неправильно процитировал.
let inc = sum 1;;
[21:11:50] <604> да, действительно, неправильно процитировал.
[21:12:06] <604> так чем это отличается?
[21:13:32] <gds> тем, что выражение вида sum 1 -- нормальное выражение, как любое другое. Его не надо объявлять как функцию. А если это уже функция, к ней можно что-нибудь применить.
[21:14:12] <604> что, например?
[21:15:46] <604> > Его не надо объявлять как функцию.
просто для удобства сделали, что ли?
[21:17:19] dream.designer вошёл(а) в комнату
[21:17:45] <gds> например, к ней можно применить целое число.
насчёт удобства -- там хитрая история. бОльшей частью -- вопросы удобства. Так-то ФП и на цэ можно оформлять.
[21:21:00] dream.designer вышел(а) из комнаты
[21:21:17] <604> ладно, может дальше в учебнике пояснят, как это применяется (хотя дальше уже идёт другая глава)
[21:25:18] <gds> навряд ли. оно -- просто способ избавиться на этапе компиляции от указания всех аргументов. вместо этого делается closure, держащая нужные данные.
на практике -- удобно. а так -- особо не объяснить. ну, куча аргументов не передаются, всё это гибко на этапе компиляции, но пока до практики руки не дойдут, ниасилишь особо.
в качестве мелочи --
let string_list = List.map (Printf.sprintf "%5.3f") float_list
да и то, фигня.
Рекомендую просто уяснить, что currying существует и в будущем не пугаться, что количество аргументов не сходится.
[21:25:23] gds away
[21:28:31] <ygrek> конечно это удобно. на примере с одной функцией это не очень понятно, а вот если надо и sum 1 и sum 2 и sum 3 итп - и их все можно не описывать - а сразу использовать
[21:29:00] <ygrek> в этом весь цимес - анонимные функции
[21:30:56] <604> дык у той же функции есть вполне определенное имя - inc
[21:32:13] <ygrek> смысл в том что можно и не называть
[21:32:36] <ygrek> для того чтобы использовать sum 1 не обязательно его называть
[21:33:00] <604> эээ... т.е. (Printf.sprintf "%5.3f") это и есть пример анонимной функции?
[21:33:13] <ygrek> да
[21:33:40] <604> которая существует только тут и вызывает Printf.sprintf с определенным параметром?
[21:34:17] <ygrek> gds: кстати насчёт End_of_file там по-видимому неправильно - really_input не перематывает указатель файла если не смог всё прочитать, так что лажа, надо исправить
[21:34:18] <ygrek> да
[21:34:39] <604> и часто такое используется?
[21:34:43] <ygrek> постоянно
[21:35:15] <ygrek> ну хорошо, не постоянно. но часто, да
[21:37:09] <604> все равно плюсы как-то неочевидны. Можно же было организовать цикл, который пробегает по всему float_list и вызывает функцию печати
[21:39:50] <ygrek> конечно можно
[21:39:58] <ygrek> а ещё можно на ассемблере писать
[21:40:16] <ygrek> суть - абстракция
[21:40:24] <ygrek> повышение уровня абстракции
[21:41:07] <ygrek> с помощью first class функций можно удобно абстрагировать понятие цикла
[21:42:14] <604> а можно пример, для реализации которого в императивном пришлось бы изрядно помучиться, но который легко можно реализовать с помошью этой штуки?
[21:48:23] <ygrek> let offset k x = x + k
let zoom k x = k * x
let (&) f g = function x -> f (g x)
let () =
let points = [1;2;3;4;5;6] in
let show f = List.iter (Printf.printf "%u " & f) points; print_endline "" in
show (zoom 4 & offset 2);
show (offset 2 & zoom 4);
()
[21:57:15] <604> что обозначает последнее ()?
[21:58:50] <ygrek> значение типа unit
[21:59:07] <ygrek> для красоты
[22:12:46] <604> и в чём сложность для императивного языка? ща в пхп воспроизвел то же самое
[22:13:23] <ygrek> в пхп?
[22:13:25] <ygrek> ну ну
[22:13:27] <ygrek> покажи код
[22:13:38] <604> function zoom($k,$x){return $k*$x;};
function offset($k,$x){return $k+$x;};
$points = array(1,2,3,4,5,6);
foreach ($points as $point){
echo zoom(4,offset($point,2))." ";
}
echo "\r\n";
foreach ($points as $point){
echo offset(2,zoom($point,4))." ";
}
[22:14:41] <ygrek> мда
[22:15:25] <ygrek> абстрагируй вот эту часть
foreach ($points as $point){
echo
}
[22:15:39] <ygrek> так чтобы это не надо было писать каждый раз
[22:17:14] <ygrek> вариант второй
let work f g =
let points = [1;2;3;4;5;6] in
let show f = List.iter (Printf.printf "%u " & f) points; print_endline "" in
show (f & g);
show (g & f);
()
[22:17:33] <ygrek> хочу функцию work на пыхыпы
[22:17:37] <ygrek> без eval
[22:21:33] <604> чорт
[22:21:59] <604> только дописал вариант с eval
[22:25:17] <604> хотя eval - это, конечно, чит
[22:27:46] <604> в паскале или си его трудновато будет реализовать
[22:28:50] <ygrek> не просто чит - это ахтунг при использовании
[22:37:57] <604> держи
function zoom($k,$x){return $k*$x;};
function offset($k,$x){return $k+$x;};
function work($points,$func1,$param1, $func2, $param2){
foreach ($points as $point){
echo call_user_func($func1,$param1,call_user_func($func2,$param2,$point))." ";
}
}
$points = array(1,2,3,4,5,6);
work($points,"zoom",4,"offset",2);
echo "\r\n";
work($points,"offset",2,"zoom",4);
[22:39:25] <ygrek> у work должно быть два параметра а не 4 :)
[22:39:52] <ygrek> эти функции f и g могут прийти издалека - про них ничего не известно
[22:40:12] <604> что значит "издалека"?
[22:40:45] <ygrek> в момент вызова work я не знаю что такое f - её мне передали как параметр
[22:41:14] <ygrek> а во-вторых call_user_func это тот же eval
[22:41:39] <ygrek> если я позже переопределю function offset то будет мне больно
[22:42:32] <604> > let (&) f g = function x -> f (g x)
а вот это не eval?
[22:43:42] <ygrek> в камле вообще нет eval
[22:44:02] <604> я про саму суть
[22:44:23] <ygrek> нет, это не eval
[22:44:58] <604> а в чем принципиальное различие?
[22:44:59] <ygrek> это функция высшего порядка - которая принимает функции как аргументы и возвращает функцию
[22:45:10] <ygrek> eval принимает строку
[22:45:29] <ygrek> принципиальная разница -- между функцией и строкой
[22:47:41] <604> ок, но в си можно передавать указатель на функцию
[22:53:23] <ygrek> можно
[22:53:27] <ygrek> я ведь и не спорю
[22:53:44] <ygrek> то что я хочу - на пхп в принципе нельзя написать, на си можно
[22:53:48] <ygrek> можно и на ассемблере
[22:54:03] <ygrek> вопрос в кол-ве усилий
[22:54:22] <ygrek> и следовательно в вероятности использования этого на практике
[22:54:46] <ygrek> на с++ это можно писать даже почти с человеческим лицом
[22:55:05] <604> ладно, я суть уловил, пошёл читать учебник дальше. НО это было весело, спасибо :)
[23:07:39] <gds> howdy ho!
604: eval -- это не окамл. вот и всё различие.
[23:16:27] <604> кстати, а чем отличает List.map от List.iter? из вышеприведенных пример я понял, что работают они одинаково
[23:17:14] <604> блин, когда быстро печатаю, окончания слов пропадают :(
[23:17:57] <ygrek> на такие вопросы хорошо отвечает документация
[23:18:14] <ygrek> или интерактивная сессия ocaml
[23:18:37] <604> ок
[23:21:41] ygrek вышел(а) из комнаты
[23:37:22] <gds> 604: кстати, List.fold_left тоже работает одинаково. А вот List.fold_right работает по-разному.
[23:39:06] <604> знать бы еще, что это за функции...
[23:41:17] <gds> ты вроде из похапэ пришёл? если надо, почитай про индуктивные или алгебраические типы данных. просветление получишь, точняк.
самое интересное, что они полезны на практике.
[23:42:42] <604> точнее, было так: паскаль -> асм -> пхп
[23:43:36] <604> почитаю, спасибо
[23:45:59] <gds> о, наличие первых двух стадий -- уважуха. Там понимают, что такое указатель. Не зря понимают.
[23:48:11] <604> есть такое :)
[23:50:32] <604> а что, в окамле указатели используются?
[23:59:22] <gds> там хитрая штука. значения могут быть указателями, но система типизации это дело аккуратно скрывает, на радость людям.
кроме того, есть тип 'a ref -- для любого значения с типом 'a есть возможность создать значение, ссылающееся на него.
есть вопросы сравнения значений -- некоторые сравнения делаются через указатели, некоторое иначе.
и есть вопросы взаимодействия с низким уровнем; взят C как стандартная штука.
Powered by ejabberd Powered by Erlang Valid XHTML 1.0 Transitional Valid CSS!