metaclass: (дзедline)
[personal profile] metaclass
В очередной раз, в связи с макросами подниму свой любимый вопрос:
Можно ли поиметь в языках типа скалы строгую типизацию, не объявляя типы записей заранее?

Идея в следующем: у меня в Clojure большая часть DSL основана на том, что я могу в любое место описания строк-колонок-ячеек отчета (условно говоря, Excel-like таблица фиксированной формы, заполняемая автоматом из проводок) в любой момент добавить атрибут типа :skip-in-vat true и обработать его. При этом мне нужно это изменить ровно в двух местах - описание документа ("данные") и расчетный алгоритм ("код"). Типов тут нет, а вместо них - структуры данных, скомбинированные из словарей, массивов и атомарных данных.

Но с динамически типизированными языками, а особенно с Clojure с ее destructring и прагматичным подходам к совместимости типов имеется постоянно проблема вида "сунул лишние скобки, на место числа попал массив и через 100500 вызовов когда дело дошло до суммирования, оператор + сдох от попытки просуммировать ссылку на массив со стек-трейсом на три страницы". Причем если мне такие ошибки чинить достаточно легко, то менее опытным коллегам это вырывает мозг.

В F# и прочих типизированных языках же мне придется сначала ползти в описание записи (если там записи вообще есть), добавлять поле или хуже того - еще один вариант для алгебраического типа, править вызовы конструкторов (если оверлоадинга нет) и прочая и прочая.

Кроме того, часто хочется такого: "тип записи создается в SQL запросе и далее используется в функции, обрабатывающей результат запроса". В clojure это опять же - словарь, с кейвордами в качестве ключей.

Языки же кроме F#, Scala и Clojure можно не рассматривать вообще - на них аналогичные задачи или сводятся к "наняли 100 ртишников по одному на объект предметной области и написали вручную" или к "написали самодельный лисп с хаскелем на дельфи/C#" или к "используем безумные ORM с еще более дикими, чем SQL языками и внешними декларативными описаниями".
Т.е. я не говорю, что они не пригодны - но затраты ресусов на решение задачи на таких языках заметно больше.

Date: 2013-02-20 03:10 pm (UTC)
From: [identity profile] gds.livejournal.com
> Языки же кроме F#, Scala и Clojure можно не рассматривать вообще

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

> Кроме того, часто хочется такого: "тип записи создается в SQL запросе и далее используется в функции, обрабатывающей результат запроса".

в окамле это -- синтаксическое расширение, генерирующее тип по схеме и запросу. Для некоторых вещей есть http://pgocaml.forge.ocamlcore.org/ и http://www.strauss-acoustics.ch/macaque-pgocaml.html .

Date: 2013-02-20 03:23 pm (UTC)
From: [identity profile] theiced.livejournal.com
окамл негуманен

Date: 2013-02-20 03:29 pm (UTC)
From: [identity profile] gds.livejournal.com
почему Вы так считаешь?

Date: 2013-02-20 03:56 pm (UTC)
From: [identity profile] theiced.livejournal.com
потому что он негуманен и ужасен :)

Date: 2013-02-20 03:57 pm (UTC)
From: [identity profile] gds.livejournal.com
ответ уровня жж.
ок.

Date: 2013-02-20 04:52 pm (UTC)
From: [identity profile] jdevelop.livejournal.com
киэха/моэха?

Date: 2013-02-20 04:56 pm (UTC)
From: [identity profile] gds.livejournal.com
моэха нет, киэху асилил потом, но изначально кащенка и эхехехи, заражённые набегами.

Date: 2013-02-20 05:02 pm (UTC)

Date: 2013-02-20 05:33 pm (UTC)
From: [identity profile] avnik.livejournal.com
Только питон, только хардкор

Profile

metaclass: (Default)
metaclass

April 2017

S M T W T F S
      1
2345678
9101112 131415
16171819202122
23242526272829
30      

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Sep. 2nd, 2025 04:36 pm
Powered by Dreamwidth Studios