metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2012-09-03 09:31 pm
Entry tags:

Привет из 80х годов прошлого века

Вспомнил один срач на тему однопроходных компиляторов, где Steve Yegge критиковал Clojure за то, что в ней объявления видны не во всем модуле, а только ниже объявления. (Ну, за исключением declare которые что-то вроде forward-объявлений).
Сижу приделываю новую фичу к кодогенератору на F# - и таки внезапно оказывается, что это не только в Clojure, но так же и F#, и, что самое печальное, - в долбаном SQL, который я генерирую.
Сижу вот, сортирую объекты из которых генерируется SQL по зависимостям.

А как с этим дела обстоят в Scala?
Я тут подумываю, что надо бы провести сравнение F# и Scala на моих задачах, все равно уже полная работа JVM и жаб, так может, выводилка типов в Scala для меня окажется более приемлемой, чем дикий ад в F# (теперь я понимаю, почему его [livejournal.com profile] thesz критикует). Ну и макросы в скале [livejournal.com profile] xeno_by прикрутил вроде уже.
Хотя единственное, что мне приходит в голову на тему приличного использования макросов - это при их выполнении долбится в БД или модель этой БД и генерировать код.
(deleted comment)

[identity profile] metaclass.livejournal.com 2012-09-03 06:39 pm (UTC)(link)
Вот, а я только когда в это самое уперся при кодогенерации SQL - дошло таки, что имел в виду Yegge.

И главное ж, ничего не сделаешь - SQL в общем случае не идемпотентен и не является декларативным описанием, в отличие от какого-нибудь кода на C#.

[identity profile] prote-je-moi.livejournal.com 2012-09-03 07:20 pm (UTC)(link)
пуся, да адахни ты уже. иди лучше посмотри, какие я ботиночки купила клёви.

[identity profile] golikov konstantine (from livejournal.com) 2012-09-03 07:21 pm (UTC)(link)
> это при их выполнении долбится в БД или модель этой БД и генерировать код.
знакомься, http://slick.typesafe.com/

[identity profile] max630.livejournal.com 2012-09-03 07:48 pm (UTC)(link)
в ocaml то же самое

[identity profile] max630.livejournal.com 2012-09-03 07:49 pm (UTC)(link)
и даже в хаскеле (!!!), если TH в топлевеле использовать

[identity profile] xeno-by.livejournal.com 2012-09-03 08:38 pm (UTC)(link)
Там по-другому никак. У них макросы раскрываются в тайпере, а биндинги резолвятся на фазу раньше, в ренеймере. Если бы не этот хак, вообще бы ссылки на топ левел в том же файле не работали. Народ не раз пытался победить, но в третьей папере они просто забили и объявили это фичей.

[identity profile] migmit.livejournal.com 2012-09-04 01:40 pm (UTC)(link)
То бишь, по-русски говоря, монада Q не является инстансом MonadFix.

[identity profile] xeno-by.livejournal.com 2012-09-03 08:36 pm (UTC)(link)
В скале форвард декларации работают в топ левеле и на уровне мемберов класса, но обычно не канают внутри тел методов. Я не знаю спеки на этот счет, но из-за этого пришлось один метод переписать в локальный объект (пример слинкую как приеду домой).

Если надо генерировать классы или методы из макросов, да еще так, чтобы их было видно снаружи, надо ждать января 2013 года. Пока что это не поддерживается по техническим причинам, но в январе у нас дедлайн по тайп макросам, поэтому технические причины к тому времени будут пофикшены. Тогда же скорее всего в транк приземлятся и макро аннотации.

[identity profile] xeno-by.livejournal.com 2012-09-03 08:41 pm (UTC)(link)
Макро аннотации будут в некотором роде как декораторы в питоне, только статически типизированные. Мне кажется весьма полезным. Еще можно делать имплисит макросы для генерации инстансов тайп классов. Аннотации будут только через несколько месяцев, а имплисит макросы должны работать прямо сейчас. Там есть свои проблемы, которые не было времени починит, но тайп классов они не должны коснуться.

[identity profile] theiced.livejournal.com 2012-09-03 08:55 pm (UTC)(link)
а вот вы лучше объясните нахуя скала если есть кложура. ну мне так, интересно.

[identity profile] metaclass.livejournal.com 2012-09-03 09:07 pm (UTC)(link)
Ломается при рефакторинге. Без типизации в проектах со сложными структурами данных будет жопа.

[identity profile] nivanych.livejournal.com 2012-09-04 03:06 pm (UTC)(link)
А в зависимо-типовых можно относительно недорого иметь _гарантию_ корректности рефакторинга.

[identity profile] xeno-by.livejournal.com 2012-09-03 09:24 pm (UTC)(link)
вероятно потому что полезная система типов (аргументы за и против типизации я приводить здесь не буду) + лично мне нравится как сделана модульность. я немного писал в каментах к недавнему посту Димы: http://my-clojure.blogspot.ch/2012/09/clojure-1-2012.html и у себя в ЖЖ.

впрочем я с clojure глубоко не разбирался, поэтому мое мнение наверняка неполное. если вы ребе смотрели в сторону скалы, будет интересен ваш взгляд. вот мне в лиспах нравится репл в живую программу. это классно. еще со мной можно на ты, если так будет удобнее.

[identity profile] golikov konstantine (from livejournal.com) 2012-09-03 10:06 pm (UTC)(link)
если правильно понимаю, но того же самого можно достичь используя костыли -- jrebel
но если не прав, поправьте
Edited 2012-09-03 22:07 (UTC)

[identity profile] xeno-by.livejournal.com 2012-09-03 10:12 pm (UTC)(link)
я если честно jrebel не юзал никогда, поэтому не могу ничего сказать. кстати что он делает с уже существующими в памяти объектами измененных классов? (с надеждой) прозрачно подменяет класс на новый?

[identity profile] golikov konstantine (from livejournal.com) 2012-09-03 10:44 pm (UTC)(link)
уже инстанциированные объекты ведут себя как старый класс, новые объекты ведут себя как новый подгруженный класс

[identity profile] anton-arhipov.livejournal.com 2012-09-19 07:48 pm (UTC)(link)
неверно. уже существующие экземпляры получают то же самое поведение, т.е новые методы и константы будут доступны всем.
новые поля в существующих объектах не будут проинизиализированы только, тк jrebel не перезапускает конструктор

[identity profile] golikov konstantine (from livejournal.com) 2012-09-19 09:13 pm (UTC)(link)
спасибо за исправление

хотел спросить когда можно будет перегружать суперклассы, а вы оказывается уже это поправили в новом jrebel'е
прямо вау-вау

[identity profile] anton-arhipov.livejournal.com 2012-09-20 04:56 am (UTC)(link)
супер классы сейчас не перегружаются

видимо у вас небольшое приложение, и сервер сам перезагрузил его так что вы не заметили.

[identity profile] theiced.livejournal.com 2012-09-04 06:28 am (UTC)(link)
я считаю статическую типизацию объективным злом.

[identity profile] xeno-by.livejournal.com 2012-09-04 07:00 am (UTC)(link)
а что насчет остального, если есть желание прокомментировать?

[identity profile] migmit.livejournal.com 2012-09-04 01:41 pm (UTC)(link)
> я считаю ... объективным ...

Взаимоисключающие параграфы.

[identity profile] blackyblack.livejournal.com 2012-09-05 05:30 am (UTC)(link)
+1. Но в то же время я считаю кложурь объективным говном.

[identity profile] xeno-by.livejournal.com 2012-09-03 08:44 pm (UTC)(link)
А да не знаю как с этим в шарпе, но у нас тайп инференс требует вручную написанные сигнатуры для методов.

[identity profile] gds.livejournal.com 2012-09-03 09:42 pm (UTC)(link)
"ниже объявления" -- полезно для rebinding'а и для композиционируемости исходников.

[identity profile] golikov konstantine (from livejournal.com) 2012-09-03 09:52 pm (UTC)(link)
и оно же с пояснениями

http://stackoverflow.com/questions/12184997/scala-and-forward-references

[identity profile] xeno-by.livejournal.com 2012-09-03 09:57 pm (UTC)(link)
ага, есть такое. но это только для валов

[identity profile] nivanych.livejournal.com 2012-09-05 10:03 am (UTC)(link)
Не в тему, но должно понравиться.
Привет из 50-х годов прошлого века —
http://nag.ru/articles/article/22460/telekomiks-pyatidesyatyie.html

[identity profile] metaclass.livejournal.com 2012-09-05 12:56 pm (UTC)(link)
Я ебошу на трех работах, чтобы накопить бабла на упомянутый там RF-frontend.
Вернее, чтобы его покупка не была большим ударом по семейному бюджету :)

[identity profile] berezovsky.livejournal.com 2012-09-05 01:04 pm (UTC)(link)
На каких таких трёх работах?