Entry tags:
Эпический ад
Написал таки кусок кодогенератора на F#. Сначала в лоб, просто конверсией моих типов в последовательность строк SQL запроса для создания таблиц, а потом мне резко разонравилось отсутствие разделения модели и представления и я прикрутил AST для SQL, заодно заменив выходной результат на string seq, то бишь IEnumerable<string>.
Завтра буду прикручивать AST для дельфей, если мне не откозлопитонируют мозг какой-нибудь срочно-капец-нужно-вчера хреновиной.
Теперь понимаю, чего
zabivator устроил хаскель-срач - когда над головой не висит чистота и ленивость, но есть discriminated unions, вывод типов и это дело корректно интегрировано в привычную среду, можно особо не задумываясь писать всякий мрак.
Но при этом однозначно начинать надо с хаскеля, а для F# - еще и дотнет знать, потому что иначе этот безумный бред понять затруднительно. Хаскель лаконичен, там те же самые идеи не заслоняются синтаксисом.
Завтра буду прикручивать AST для дельфей, если мне не откозлопитонируют мозг какой-нибудь срочно-капец-нужно-вчера хреновиной.
Теперь понимаю, чего
![[livejournal.com profile]](https://www.dreamwidth.org/img/external/lj-userinfo.gif)
Но при этом однозначно начинать надо с хаскеля, а для F# - еще и дотнет знать, потому что иначе этот безумный бред понять затруднительно. Хаскель лаконичен, там те же самые идеи не заслоняются синтаксисом.
no subject
no subject
no subject
`Something
не суть важно, важен лишь сам тип (а именно, какое множество значений принимает данное выражение). Например, выражение имеет тип , этот тип инферрится и проверяется при компиляции.Для красоты можно ввести и написать , и типовыводилка будет знать, что выражение имеет тип
mytype
(например, для документирования кода или для будущего расширения вариантов и статической проверки полноты match cases). Кстати, наличие последнего -- весьма хорошая фишка окамла, которой нет и не может быть в хаскеле, она помогает писать надёжный код.no subject
Если выводилка типов сообщает что где-то воооооот тут какая-то страшная фигня с типами данных, то пара вручную расставленных аннотаций сильно проясняет ситуацию.
+ если мало-мальски сложный модуль, то аннотации типов функций и аргументов просто незаменимы для документирования.
Пока единственное, что меня раздражает - это отсутствие перегруженных функций, я как бэ понимаю почему они лишние, но вот не хватает. Похоже, я просто ещё не научился проектировать в терминах Ocaml.
Также офигенной фичей является опциональная мутабельность, опциональная ленивость.
По сравнению с С++ я имею HOF, могу не писать истерично (как того требует С++) типы где попало, а указывать лишь там где надо.
По сравнению с Haskell я могу делать ленивыми лишь те куски кода, которые в этом действительно нуждаются и упрощают жизнь.
В целом Ocaml - это такой локальный very pragmatic оптимум, для полного счастья не хватает лишь нормальный поддержкой венды (ocamlfind - грустно), чуть менее бардака в библиотеках (с батарейками BatList vs List - ад) - но это возможно также нужно просто научиться её готовить, да и GODI я ещё не смотрел (но для GODI - тоже самое, поддержка mingw нужна, поддержка студии (компилятора) - а то cygwin это всё не то...).
Ещё для полного счастья нужны процессы в стиле Erlang, я вот lwt смотрел - да не осилил, + собрать lwt под windows РЕЛЬНАЯ ПРОБЛЕМА.
В остальном же - идеал =)
no subject
Отсутствие перегрузки по типам -- есть такое дело. Кстати, я шёл с C (до этого -- с осемблира), затем чуть поковырял C++, потом понял, что ocaml это то, что нужно, но вот тоже не хватало перегрузки. Кусал локти сначала. Потом как-то научился обходиться без неё. И только потом понял, что кое-где эмулируется вариантными типами, кое-где объектами, кое-где всякими deriving'ами.
Мутабельность и ленивость -- ок :)
Кстати, ленивость использовать так же, как в хаскеле, не стоит: например, кое-кто идиоматично пишет обработку потоков данных как функции над ленивыми списками, затем забывает голову списка в памяти и ловит ололо пыщ пыщ риальни.
Про венду -- чего там грустно с ocamlfind? У меня он работает чотко. Даже кучу других библиотек скомпилял, даже типа-дистр виндовый сделал.
GODI я тоже не смотрел, именно из-за того, что оно не умело под mingw работать в своё время.
Насчёт lwt же -- очень странно. Мой билд-скрипт для него (для довольно старого 1.1.0) состоит из "$MAKE && $MAKE install", правда вот зависимость от ocaml-ssl есть.
Процессы -- советую глянуть JoCaml, это даже интереснее ырланка (ибо типизация).
no subject
Ой, а можно мануал, как мне получить на выходе omake + ocamlfind + ocaml + batteries? Под mingw, пожалуйста, и без cygwin!
И вообще просто шикарно - если ещё и с lwt
Под вендовый cmd? Если под bash - то какой - cygwin или таки MSYS?
ВОТ ЭТО НИХУЯ СЕБЕ ПРОСТИТЕ ЗА ВЫРАЖЕНИЯ ТИПИЗИРОВАННЫЙ ERLANG ПЫЩПЫЩПЫЩ!
О дааааааа, надо заценивать, если оно годное - то срочно OTP портировать под такое щастье!!!
no subject
(Anonymous) 2010-03-09 09:44 am (UTC)(link)Зачем нужен неподдерживаемый omake когда есть ocamlbuild? ocamlfind just works. ocaml бинарный с сайта - без проблем. насчёт батареек не знаю. Вообщем "у меня всё работает". Покажи конкретную проблему.
no subject
+ он мне больше ocamlbuild нравится.
Дальше, что значит "неподдерживаемый"? Разрабатывается аж с 2004 года, солидная история релизов и багфиксов, есть пакеты под все платформы, что с ним не так?
Ну вот я не смог собрать вместе ocaml, ocamlfind, omake под mingw так, чтобы они заработали.
Пришлось собирать всё тоже самое под cygwin, всё из сорцов.
+ вылезли грабли с camomile.
Когда попробую ещё раз попозже, и отпишусь про конкретные проблемы
no subject
А зачем пересобирать ocaml и omake когда они в бинарниках есть? Конкретно в тулчейне проблем не должно быть, но в общем согласен - большинство камловых библиотек обычно не собираются с полпинка в каждом из портов (cygwin/mingw/msvc). Это легко понять так как кому охота всё это тестировать, а во-вторых повальная любовь к хитровывернутым bash-скриптам. Вот камлобилд тем и хорош что даёт некий общий базис и "из коробки".
no subject
Как минимум, нужно чтобы ocamlfind смотрел "куда надо".
Подробно проблемы не помню, когда вернусь к этой теме - отпишусь подробней.
no subject
Кроме того, ocamlbuild включён в дистрибутив окамла, что означает его кошерность (его будут допиливать, так или иначе).
no subject
Но засада в том, что я вон попробовал своё оверблд на нетбуке завести, и что-то не завелось сходу (отвалилось в линковке с tcl/tk, но, чувствую, проблема глобальнее), и руки не доходили разобраться (как и сейчас не особо доходят, впрочем).
А у одного знакомого вроде как завелось замечательно, да и на локально-доступных мне компах проблем не замечал. Так что стоит попробовать, вот внешние зависимости (если не страшно, то тривиальная инструкция по сборке там рядом).
Сборку окамла падвенду осуществляю msys'овским башем.
Насчёт эрланга -- агаа :) Но там не всё так идеально, и нужно просто посмотреть, устраивает ли. А так -- оно вполне живое.
no subject
no subject
Если бы не лицензия, всё было бы сильно проще. Сейчас это хозяйство представляет собой максимально простой способ распространять окамл и библиотеки без нарушений.
А так-то -- да, согласен, внешние зависимости ставить руками это гемор. Ещё наткнулся на то, что хостеры почему-то поломали старые урлы внешних зависимостей (тарболов всяких), и урлы надо периодически обновлять.
no subject
no subject
no subject
no subject
no subject
no subject
Читайте пост вместе с комментариями, что-ли.
no subject
no subject
no subject
объекты (row types и их типизация; самое клёвое ооп, которое
Re: объекты (row types и их типизация; самое клёвое ооп, котор
Вот тут -- Private row types: abstracting the unnamed -- описываются применения row types (и полиморфных вариантных типов заодно).
Если вкратце и своими словами, типизация объектов в окамле структурная (член структуры = метод = "row" в официальной терминологии). Обращение к члену структуры (
obj#meth
) заставляет тайпчекер статически гарантировать наличие у объекта obj метода meth.Нет номинальной типизации/подтипизации объектов (по имени класса), но она легко эмулируется, если нужна.
Поля объектов могут быть как изменяемыми, так и неизменными, по желанию. Поля видны только в пределах объекта, методы видны и в пределах объекта, и за пределами. Класс может иметь типы-параметры (как обычные параметрические типы). Методы класса могут быть полиморфными (через это имеем полиморфизм второго ранга в объектах). Существует возможность создать объект или описать объектный тип, не создавая класс. Поддерживаются виртуальные методы (и статически проверяется, что любой создаваемый объект должен иметь полностью определённые методы). Поддерживается множественное наследование (хотя даже обычное наследование не часто нужно).
Одно из классных свойств ООП в окамле состоит в том, что нет нужды использовать большинство ООП-паттернов. А вот для чего можно использовать ООП, так это для эмуляции duck typing и typeclasses.