Толочь воду в ступе

Apr 15, 2011 00:43

Пост навеян свежим ПФП. Статья про circumflex, вот этим вот:

// Выбрать все города Швейцарии, вернуть Seq[City]:
SELECT (ci.*) FROM (ci JOIN co) WHERE (co.code LIKE ”ch”)
ORDER_BY (ci.name ASC) listСтоило ли огород городить, если на выходе всё равно получается нечто, что ( Read more... )

article, typing, orm, common lisp, macros, sql, dsl, lisp, metaprogramming, pfp

Leave a comment

antage April 14 2011, 23:56:17 UTC
Мне кажется, вы лукавите. Вы привели настолько простой пример, что он просто не может сломаться при изменении схемы таблицы. SELECT (cities.*) FROM cities тоже будет трудно сломать добавлением всего лишь ещё одного поля.
Реквестирую наглядных примеров, в которых статически типизированные запросы ломаются, а динамически типизированные нет.

И где же конфликт со статической типизацией в отображении кода модели в схему БД? Через reflection вполне можно реализовать (и реализуют) автоматическую миграцию схемы.

Reply

nivanych April 15 2011, 04:23:14 UTC
> примеров, в которых
> статически типизированные запросы ломаются,
> а динамически типизированные нет

В такой формулировке, это невозможно даже теоретически - динамическая типизация, это частный случай даже самой примитивной статической.

Reply

swizard April 15 2011, 07:31:38 UTC
А статическая типизация -- это частный случай DSL :)

Reply

nivanych April 15 2011, 07:44:05 UTC
DSL - тоже частный случай. А толку?
Соорудить, всего лишь, параметрический полиморфизм с Hindley-Milner'ом, навроде ML'евой системы типов, это уже не элементарная задача, хотя и вполне доступная подготовленному человеку.
В то время, как динамические типы способен соорудить любой студент хоть на сишечке. Ну, с поправкой - качественно лямбды не любой соорудит - к сожалению, образование 95% студентов по "компьютерным" специальностям этого не позволяет.
Так что, "частнослучайенность" этих понятий качественно различная.

Reply

antage April 15 2011, 09:38:54 UTC
> параметрический полиморфизм с Hindley-Milner'ом, навроде ML'евой системы типов, это уже не элементарная задача

С каких пор реализация тривиального, прекрасно описанного в литературе алгоритма на 100 строчек, стала чем-то неэлементарным? Это разве что на лабораторную работу для второго курса тянет, не больше.

> В то время, как динамические типы способен соорудить любой студент хоть на сишечке.

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

Reply

nivanych April 15 2011, 10:57:13 UTC
> С каких пор реализация тривиального ( ... )

Reply

nivanych April 20 2011, 05:55:24 UTC
Спасибо.

Reply

antage April 16 2011, 06:08:50 UTC
> Hindley-Milner - это ж ещё далеко не всё в языке и системе типов ( ... )

Reply

nivanych April 20 2011, 05:50:51 UTC
> С динамикой так не выйдет ( ... )

Reply

nivanych April 15 2011, 17:22:53 UTC
>> В то время, как динамические типы способен соорудить любой студент хоть на сишечке.
> С одной поправкой - все это будет криво, глючно и тормознуто.

Ну а таки интересно, если без лямбд, то где там препятствия??
Даже и оптимизация получается почти примитивной.

Reply

swizard April 15 2011, 07:31:11 UTC
> SELECT (cities.*) FROM cities тоже будет трудно сломать добавлением всего лишь ещё одного поля.

Да ладно, "SELECT *" явно сломается в рантайме, если в класс добавить поле не в конец, а в середину :)

> И где же конфликт со статической типизацией в отображении кода модели в схему БД? Через reflection вполне можно реализовать (и реализуют) автоматическую миграцию схемы.

Миграцию схемы можно хоть отдельным перловым скприптом сделать, я же показал, как это можно делать на компиляции.

Да и потом, идея поста -- это не только обнаружение неконсистентности, а еще и автоматизация последующего рефакторинга.

Reply

antage April 15 2011, 15:05:55 UTC
>> SELECT (cities.*) FROM cities тоже будет трудно сломать добавлением всего лишь ещё одного поля ( ... )

Reply

swizard April 16 2011, 22:43:40 UTC
> Ну конечно не сломается, если мы будем, как умные люди, доставать значение полей по их имени, а не по порядковому номеру в записи.

Ну так сломается, если удалить поле.

> Статическая типизация мешает делать миграцию на этапе компиляции? Мне кажется, вы исходите из неверной предпосылки, что кодогенерация и метапрограммирование есть только в языках с динамической типизацией, а это не так.

Да нет же, у меня была другая предпосылка.

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

Reply


Leave a comment

Up