Про "дизайн" встроенных малых языков на C#.

Feb 11, 2011 00:07

(ниже я буду использовать квадратные скобки для параметров шаблонов)

В основном, "дизайн" сводится к построению добрососедских отношений с системой типов C#. Некоторые возможности системы типов достаточно приятны, и ими можно удобно пользоваться.

На работе я сделал прототип вот такого подъязыка для запросов к нашей БД:
string name = "b1 ( Read more... )

c#, dsel, программирование, работа

Leave a comment

Comments 44

djuffin February 10 2011, 22:32:43 UTC
>>На работе я сделал прототип вот такого подъязыка для запросов к нашей БД

Я думал я один такой ненормальный :) Тоже похожую штуку сделал.

var GetInternalGroups = SQL.SELECT.DISTINCT[InternalGroups.Id]()
.FROM()
.JOIN(InternalGroups.PrincipalId == AccessRecords.PrincipalId)
.JOIN(AccessRecords.ACLId == DataObjs.ACLId)
.WHERE(DataObjs.Id == "DataObjectId".AsIntParam());

var DeleteSystem = SQL.DELETE.FROM .WHERE(DataObjectAttachments.DataObjectId == DataObjectAttachments.DataObjectId.AsParam ( ... )

Reply

thesz February 10 2011, 22:39:53 UTC
У нас есть framework, который проще в использовании, но медленный. Вот я и решил. ;)

Как я понимаю, WHERE сделан через перегрузку операторов?

А в квадратных скобочках Select находится проекция, так?

Reply

djuffin February 10 2011, 22:57:01 UTC
Да, WHERE через перегрузку. Это позволяет:
1. Не пускать мусор в выражения (только колонки, параметры и константы)
2. Избавиться от a =>

Да, квадратные скобки this[] - это проекция. (Круглые после них - это опечатка)

Каждая таблица - класс. Каждая колонка - поле.

Reply

djuffin February 10 2011, 23:06:09 UTC
Делалось, что-бы:
1. Не пользоваться ORM, а иметь чистый SQL (Все скрипты генеряться один раз при старте). У нас просто не все операции хорошо ложаться на манипуляции с отдельными объектами.
2. Одновременно поддерживать: MS SQL Server, MS SQL Compact, Oracle, MySQL.
(Кстати, с поддержкой MS SQL Compact есть проблемы у многих ORM)
3. Добавить поддержку разных типов баз в систему, где все скрипты уже написаны, для MS SQL Compact.

Reply


w00dy February 10 2011, 23:39:55 UTC
> Преобразование кода сводится к перебору всех типов

Проще сделать визитор, который будет один на всех и обходить свой Expression (или не свой, если ты Expression Tree используешь)

http://blogs.msdn.com/b/mattwar/archive/2007/07/31/linq-building-an-iqueryable-provider-part-ii.aspx
смотреть на ExpressionVisitor

Reply

bik_top February 11 2011, 06:31:38 UTC
>> Преобразование кода сводится к перебору всех типов
> Проще сделать визитор, который будет один на всех и обходить свой Expression

В целом +1, но можно делать и без классического визитора, реализовать двойную диспетчеризацию на ручной тяге - через (хэш-)таблицу полиморфных функций.

Reply

thesz February 11 2011, 07:32:21 UTC
И это тоже не так прозрачно.

Reply

thesz February 11 2011, 07:31:44 UTC
Это не так прозрачно, натурально.

Reply


(The comment has been removed)

swizard February 11 2011, 01:09:42 UTC
Окстись, без типизации ведь сразу катастрофа и погибель :)

Reply

(The comment has been removed)

nealar February 11 2011, 02:54:50 UTC
И они так строго проверяются!

Reply


metaclass February 11 2011, 06:15:58 UTC
Теперь осталось это завернуть в LINQ/IQueryable и посмотреть что выйдет )

Reply

thesz February 11 2011, 07:35:34 UTC
Оный IQueryable я не понял после трёх дней внимательного рассмотрения, так что увольте.

Может, кто ещё сделает, я этим заниматься не буду. ;)

Reply

w00dy February 11 2011, 07:43:14 UTC
почитай тот цикл статей на которые я ссылку бросал. Там всё достаточно просто и прозрачно получается.

Reply

thesz February 11 2011, 07:52:38 UTC
Нет, это не просто и не прозрачно.

Я это читал, если что.

Reply


bik_top February 11 2011, 06:34:33 UTC
> ниже я буду использовать квадратные скобки для параметров шаблонов

Не очень понятно. Ты же всё равно копируешь код из редактора, заменяя проблемные символы? В чём преимущество «Ctrl+H „<“ „[“» над «Ctrl+H „<“ „<“»?

(Прошу прощения за многократные правки.)

Reply

thesz February 11 2011, 07:36:06 UTC
Я пишу его руками. Код на работе, я дома.

Reply


Leave a comment

Up