| 1 2 3 4 |
| [Nemerle] Семантический контроль над размерностями | |
| От: | Oyster![]() | ||
| Дата: | 05.04.06 07:03 | ||
| Оценка: | 160 (12) | ||
| Всем доброго времени суток. Некоторое время назад я натолкнулся в этом форуме на код, написанный на шаблонах C++, который позволяет контролировать размерности физических типов во время компиляции: Обеспечение семантического контроля над размерностями станда Автор: CrystaX . Некоторое другое время назад я начал увлекаться языком Nemerle и мне захотелось решить эту же задачу средствами Nemerle.Дата: 21.11.05
Код на Nemerle решает ровно те же задачи, что и код, описанный в Обеспечение семантического контроля над размерностями станда Автор: CrystaX . А вот и тестовый пример (тоже внаглую украденный оттуда):Дата: 21.11.05
Исходники в соседних сообщениях. Они разбиты на 2 группы:
Описание физических величин на простеньком DSL-е Макробиблиотека должна быть скомпилирована в отдельную сборку. Описание физических величин — в другой отдельной сборке. Я использовал для компиляции билд 0.9.2.6168 (т.е. первоапрельский). Немного оффтопа Основная цель, которую я преследовал при написании этого кода — изучение возможностей Nemerle (да и самого языка с библиотекой — за время написания кода я узнал много нового для себя). Мне хотелось понять, насколько сложно, например, переписать библиотеку с метакодом, написанную на C++, на Nemerle. А также хотелось показать другим участникам форума, что эта задача вполне разрешима штатными средствами Nemerle. Этот код не идеален, поскольку я не использую его в реальном приложении. Сейчас я вижу как минимум следующие модификации, которые можно произвести с кодом:
Переписывание кода на генерацую value-types — это может ускорить код по понятным причинам. Для этого можно использовать интерфейсы и немного покрутить с генериками Добавление большего количества метаинформации к генерируемым классам для формирования более информативных сообщений об ошибках Переписывание макрооператоров. Сейчас, например, при использовании макрооператоров из пространства имён Oyster.Units.Macros невозможно пользоваться т.н. каррингом в стиле Nemerle Автор: Vermicious Knid , т.е. выражениями вида _ + _Дата: 25.03.06 Добавление синтаксического сахара вроде физических литералов (например 100kg * 15sec или что-то вроде того) В то же время, в целом я доволен кодом. Мне кажется, что он понятнее, чем тот же код на C++. Да и описание физических величин имхо выглядит удобнее (см. исходники). Надеюсь, сообщение оказалось полезным. И сорри всем, кто дочитал до этой строчки, за объём текста |
| Исходники макробиблиотеки | |
| От: | Oyster![]() | ||
| Дата: | 05.04.06 07:06 |
ConcreteUnitTypeAttribute.n:
UnitTypeBase.n:
CompileTimeUtil.n:
UnitTypesMacro.n:
OperatorMacros.n:
|
| Описание физических величин | |
| От: | Oyster![]() | ||
| Дата: | 05.04.06 07:08 |
UnitDef.n:
|
| Все исходники в solution для VS 2005 | |
| От: | Oyster![]() | ||
| Дата: | 05.04.06 07:47 |
| На всякий случай вот solution для VS 2005, которым пользовался я: Oyster.Units.zip. Напомню, что проекты были изготовлены с использованием шаблонов проектов, доступных тут: Re: Микро-аддин для VS 2005 Автор: Oyster .Дата: 06.03.06 |
| Re: [Nemerle] Семантический контроль над размерностями | |
| От: | vdimas![]() | ||
| Дата: | 05.04.06 08:32 |
| Здравствуйте, Oyster, Вы писали: O>Переписывание кода на генерацую value-types — это может ускорить код по понятным причинам. Для этого можно использовать интерфейсы и немного покрутить с генериками Собсно, без value-типов временный незачет, ждем-с окончательной версии. O>Добавление синтаксического сахара вроде физических литералов (например 100kg * 15sec или что-то вроде того) Это было бы такое WOW ... << RSDN@Home 1.1.4 stable SR1 rev. 568>> |
| Re[2]: [Nemerle] Семантический контроль над размерностями | |
| От: | Oyster![]() | ||
| Дата: | 05.04.06 08:43 |
| Здравствуйте, vdimas, Вы писали: V>Собсно, без value-типов временный незачет, ждем-с окончательной версии. Почему? Боишься за перфоманс? Советую для начала попробовать — много маленьких объектов должны выделяться в управляемой куче быстро. Я сделаю это изменение, когда будет время. Как ты понимаешь, времени у нас у всех не так много по жизни... я и так слишком много времени потратил на этот код (в основном борясь с собственным незнанием языка). Да, и поверь мне на слово — эту задачу можно решить на value-types — просто это будет чуть сложнее, возможно. И всё-таки мне бы хотелось услышать твоё общее мнение о коде. Как тебе описание самих величин, например? Имхо как минимум понятнее, чем на C++, и менее подвержено человеческим ошибкам при вводе. O>>Добавление синтаксического сахара вроде физических литералов (например 100kg * 15sec или что-то вроде того) V>Это было бы такое WOW Так прыгни и напиши Это можно сделать — на Nemerle довольно серьёзные средства программирования, т.ч. для добавления своего синтаксиса. Единственное "но" — это выглядело бы как-то так (можно и с пробелами и без):
Или так (имхо ненамного удобнее):
Но так — без обрамляющего макроса и с величинами, заданными постфиксом, — по-моему точно не выйдет (у всего есть предел
|
| Re[3]: [Nemerle] Семантический контроль над размерностями | |
| От: | Vermicious Knid![]() | ||
| Дата: | 05.04.06 09:12 | ||
| Оценка: | 54 (3) | ||
| Здравствуйте, Oyster, Вы писали: O>Но так — без обрамляющего макроса и с величинами, заданными постфиксом, — по-моему точно не выйдет (у всего есть предел А по-моему выйдет.
|
| Re[4]: [Nemerle] Семантический контроль над размерностями | |
| От: | Oyster![]() | ||
| Дата: | 05.04.06 10:04 |
| Здравствуйте, Vermicious Knid, Вы писали: VK>А по-моему выйдет. А ведь ты прав! Очень даже изящное решение получается, спасибо! Кстати, в таком случае встаёт вопрос генерации макроса внутри макроса |
| Re[3]: [Nemerle] Семантический контроль над размерностями | |
| От: | vdimas![]() | ||
| Дата: | 05.04.06 10:10 |
| Здравствуйте, Oyster, Вы писали: O>И всё-таки мне бы хотелось услышать твоё общее мнение о коде. Как тебе описание самих величин, например? Имхо как минимум понятнее, чем на C++, и менее подвержено человеческим ошибкам при вводе. Описание самих величин — понятнее. А вот код, где вся механика происходит — не в пример запутаннее. В то время как в варианте на С++ все понятно. O>>>Добавление синтаксического сахара вроде физических литералов (например 100kg * 15sec или что-то вроде того) V>>Это было бы такое WOW [...] O>
O>Но так — без обрамляющего макроса и с величинами, заданными постфиксом, — по-моему точно не выйдет (у всего есть предел O>
Жаль... я именно это и имел ввиду. Спасибо за своевременный ответ. ... << RSDN@Home 1.1.4 stable SR1 rev. 568>> |
| Re[4]: [Nemerle] Семантический контроль над размерностями | |
| От: | Oyster![]() | ||
| Дата: | 05.04.06 10:27 |
| Здравствуйте, vdimas, Вы писали: V>Описание самих величин — понятнее. А вот код, где вся механика происходит — не в пример запутаннее. В то время как в варианте на С++ все понятно. Хмм... не сказал бы. Мне было тяжело понять код на C++, хотя опыт написания кода на C++ у меня есть. O>>Но так — без обрамляющего макроса и с величинами, заданными постфиксом, — по-моему точно не выйдет (у всего есть предел V>Жаль... я именно это и имел ввиду. Спасибо за своевременный ответ. Я ошибся Автор: Vermicious Knid .Дата: 05.04.06 |
| Re[4]: [Nemerle] Семантический контроль над размерностями | |
| От: | Oyster![]() | ||
| Дата: | 05.04.06 10:50 |
| Здравствуйте, vdimas, Вы писали: V>Описание самих величин — понятнее. А вот код, где вся механика происходит — не в пример запутаннее. В то время как в варианте на С++ все понятно. Кстати, должен заметить, что мой код избавлен от двух первых проблем, описанных тут: Направления дальнейшего развития Автор: CrystaX . Так что это уже не точно тот же код.Дата: 21.11.05 |
| Re[5]: [Nemerle] Семантический контроль над размерностями | |
| От: | Vermicious Knid![]() | ||
| Дата: | 05.04.06 11:04 | ||
| Оценка: | 7 (1) | ||
| Здравствуйте, Oyster, Вы писали: O>А ведь ты прав! Очень даже изящное решение получается, спасибо! Удалил старое сообщение? Видимо заметил пример в конце. Ну да ладно. O>Интересненько? А точно получится использовать унарный постфиксный (не префиксный) оператор? Точно. Это в общем-то фича языка — нет разницы между постфиксными и префиксными операторами.
O>Кстати, в таком случае встаёт вопрос генерации макроса внутри макроса Боюсь, что генерация это слишком сложный путь. Одно дело сгенерировать код, а другое дело его скомпилировать. Можно конечно компилировать "настройки" в отдельную сборку и оттуда использовать. Но есть идея и более простая. И макрос, и оператор можно зарегистрировать вручную через API компилятора(см. модуль MacroRegistry). Макрос это по сути экземпляр некого класса, реализовывающего интерфейс IMacro. Нужно просто написать собственную реализацию IMacro вручную(т.е. не использовать встроенную в компилятор генерацию этого класса), которая в зависимости от того как ее инициализируют будет вести себя как разные макросы(т.е. с разными именами и генерировать различный код). Вот дамп кода(на псевдо-немерле
|
| Re[6]: [Nemerle] Семантический контроль над размерностями | |
| От: | Oyster![]() | ||
| Дата: | 05.04.06 11:13 |
| Здравствуйте, Vermicious Knid, Вы писали: VK>Удалил старое сообщение? Видимо заметил пример в конце. Ну да ладно. +1. Я просто не сразу понял VK>Точно. Это в общем-то фича языка — нет разницы между постфиксными и префиксными операторами. Да, я понял это, но не сразу. Спасибо VK>Но есть идея и более простая. И макрос, и оператор можно зарегистрировать вручную через API компилятора(см. модуль MacroRegistry). Макрос это по сути экземпляр некого класса, реализовывающего интерфейс IMacro. Нужно просто написать собственную реализацию IMacro вручную(т.е. не использовать встроенную в компилятор генерацию этого класса), которая в зависимости от того как ее инициализируют будет вести себя как разные макросы(т.е. с разными именами и генерировать различный код). +1. Интересная идея. Так действительно проще. |
| Re[6]: [Nemerle] Семантический контроль над размерностями | |
| От: | Vermicious Knid![]() | ||
| Дата: | 05.04.06 11:14 | ||
| Оценка: | 1 (1) | ||
| Здравствуйте, Vermicious Knid, Вы писали: VK>Вот дамп кода(на псевдо-немерле Вот еще дамп из рефлектора, чтобы было понятнее:
|
| Re: [Nemerle] Семантический контроль над размерностями | |
| От: | Кодт модератор | ||
| Дата: | 05.04.06 12:38 |
| Немного отдаёт неряшливостью, что внесистемные единицы помещены в систему Ext. На то они и внесистемные... Например, одних только давлений сколько... — бар (100кПа = 1000гПа) — ат (1кгс/см2 = 981гПа = 1000ммвс) — атм (760ммрс = 1015гПа) — просто мм ртутного и водяного столба, не говоря уж о psi и т.п. Не заводить же под каждое из них свою систему? Posted via RSDN NNTP Server 2.0 Перекуём баги на фичи! |
| Re[4]: [Nemerle] Семантический контроль над размерностями | |
| От: | vdimas![]() | ||
| Дата: | 05.04.06 12:39 |
| Здравствуйте, Vermicious Knid, Вы писали: O>>Но так — без обрамляющего макроса и с величинами, заданными постфиксом, — по-моему точно не выйдет (у всего есть предел VK>А по-моему выйдет. VK>
Что это за шаманство? ... << RSDN@Home 1.1.4 stable SR1 rev. 568>> |
| Re[2]: [Nemerle] Семантический контроль над размерностями | |
| От: | Oyster![]() | ||
| Дата: | 05.04.06 12:42 |
| Здравствуйте, Кодт, Вы писали: К>Немного отдаёт неряшливостью, что внесистемные единицы помещены в систему Ext. К>На то они и внесистемные... К>Например, одних только давлений сколько... К>- бар (100кПа = 1000гПа) К>- ат (1кгс/см2 = 981гПа = 1000ммвс) К>- атм (760ммрс = 1015гПа) К>- просто мм ртутного и водяного столба, не говоря уж о psi и т.п. К>Не заводить же под каждое из них свою систему? Да, ты прав. Я тупо скопировал постановку задачи с C++, поэтому вот так вот. На самом деле, можно немного доработать напильником и делать специальные алиасы в каком-то одном пространстве имён. Хотя... с точки зрения CLR пространств имён вообще не существует — это просто часть имени класса. Так что не уверен, что это надо. Разве что немного поменять синтаксис самого макроса для удобства... |
| Re[5]: [Nemerle] Семантический контроль над размерностями | |
| От: | Oyster![]() | ||
| Дата: | 05.04.06 12:43 | ||
| Оценка: | 8 (1) | ||
| Здравствуйте, vdimas, Вы писали: VK>>А по-моему выйдет.
V>Что это за шаманство? Задание приоритетов для своих операторов — надо же их как-то задавать |
| Re: [Nemerle] Семантический контроль над размерностями | |
| От: | CrystaX![]() | ||
| Дата: | 05.04.06 20:02 |
| Здравствуйте, Oyster, Вы писали: Здорово! Хоть у меня времени и нет практически, а все ж выделю — на выходных поизучаю код. У меня уже почти готова следующая версия. Основные отличия от предыдущей: 1. Отсутствует ограничение на количество базовых типов (ортов). Более того, орты задаются теперь не номером в векторе, а неявно (с помощью препроцессора, увы). 2. Появились типизированные константы для перевода единиц в/из системы измерения с частично совпадающими ортами (отдельное спасибо Егору за высказанные замечания по переводу электромагнитных величин из СИ в СГС). 3. Наконец, библиотека просто стала на порядок удобнее в использовании. Тем не менее, у нее есть некоторые недостатки. Фактически игра ведется на грани возможностей языка. Поэтому мне было очень интересно посмотреть на твой код. Предлагаю следующий вариант развития событий. У меня есть определенные мысли по развитию подобного инструмента, я их частично воплотил в новой версии. Было бы очень интересно и познавательно вести разработку параллельно — на C++ и на Nemerle. Исключительно из спортивного интереса. Весьма возможно, что кое-что из того, что мне далось с таким трудом на C++, будет легко сделать на Nemerle. В течении недели я надеюсь причесать новую версию и довести ее до состояния, достаточного для выкладывания в public domain. ... << RSDN@Home 1.1.4 stable rev. 510>> |
| Re: [Nemerle] Семантический контроль над размерностями | |
| От: | VladD2 rsdn | ||
| Дата: | 06.04.06 00:46 | ||
| Оценка: | ![]() | ||
| Здравствуйте, Oyster, Вы писали: Ну, ты герой! Я бы ни в жизнь на такое не решился. ... << RSDN@Home 1.2.0 alpha rev. 637>> |
| 1 2 3 4 |