Автор Тема: [pure С] Макросы как инструмент построения eDSL  (Прочитано 68791 раз)

DIzer

  • Гость
Re:[pure С] Макросы как инструмент построения eDSL
« Ответ #75 : Апрель 12, 2011, 10:48:37 am »

Оно не просто коряво. Оно концептуально неверно и ведет к граблям. Используйте фабрики.

Да фабрики хороши - одна проблема - не гарантируют создания экземпляра  ИСКЛЮЧИТЕЛЬНО по ЗАДАННЫМ правилам или я ошибаюсь?.
Почему же? Они именно для этого и есть, то есть для создания объектов по жестким заданным правилам.
Как ? я говорю про обеспечение непротиворечивого СОЗДАНИЯ экземпляра (переменной) составного типа - такой фокус могут обеспечить только конструкторы (а фабричные функции вы можете использовать для этой цели ,а можете и не  использовать).Т.е ничто вам не помешает инициализировать переменную так , как это сделал Игорь (имея при этом в загашнике прекрасную фабричную функцию).

igor

  • Sr. Member
  • ****
  • Сообщений: 438
    • Просмотр профиля
Re:[pure С] Макросы как инструмент построения eDSL
« Ответ #76 : Апрель 12, 2011, 10:59:18 am »
Не нравится сама идея создания и использования eDSL, или же реализация её посредством макросов?
Не нравится реализация eDSL посредством макросов.
Отношение к самой идеи eDSL у меня пока не однозначно.
« Последнее редактирование: Апрель 12, 2011, 11:02:35 am от igor »

Comdiv

  • Newbie
  • *
  • Сообщений: 25
    • Просмотр профиля
Re:[pure С] Макросы как инструмент построения eDSL
« Ответ #77 : Апрель 12, 2011, 11:13:38 am »
Как ? я говорю про обеспечение непротиворечивого СОЗДАНИЯ экземпляра (переменной) составного типа - такой фокус могут обеспечить только конструкторы (а фабричные функции вы можете использовать для этой цели ,а можете и не  использовать).Т.е ничто вам не помешает инициализировать переменную так , как это сделал Игорь (имея при этом в загашнике прекрасную фабричную функцию).
Непротиворечивость можно обеспечить известным архитектурным приёмом:
наружу выставляется абстрактный тип, тип наследник - скрыт, фабрика типа возвращает
экземпляр наследника под видом абстрактного.

DIzer

  • Гость
Re:[pure С] Макросы как инструмент построения eDSL
« Ответ #78 : Апрель 12, 2011, 11:22:42 am »
Как ? я говорю про обеспечение непротиворечивого СОЗДАНИЯ экземпляра (переменной) составного типа - такой фокус могут обеспечить только конструкторы (а фабричные функции вы можете использовать для этой цели ,а можете и не  использовать).Т.е ничто вам не помешает инициализировать переменную так , как это сделал Игорь (имея при этом в загашнике прекрасную фабричную функцию).
Непротиворечивость можно обеспечить известным архитектурным приёмом:
наружу выставляется абстрактный тип, тип наследник - скрыт, фабрика типа возвращает
экземпляр наследника под видом абстрактного.
Плодить иерархию по пустякам... и потом, если нет в ЯП такого понятия как ADT (как ,например, в стандартном обероне)?

Comdiv

  • Newbie
  • *
  • Сообщений: 25
    • Просмотр профиля
Re:[pure С] Макросы как инструмент построения eDSL
« Ответ #79 : Апрель 12, 2011, 11:59:24 am »
По пустякам и конструкторов не надо.

DIzer

  • Гость
Re:[pure С] Макросы как инструмент построения eDSL
« Ответ #80 : Апрель 12, 2011, 12:05:57 pm »
По пустякам и конструкторов не надо.
Вы это к тому, что Оберон - язычек на пустячек?  ;)

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re:[pure С] Макросы как инструмент построения eDSL
« Ответ #81 : Апрель 12, 2011, 12:39:32 pm »
Непротиворечивость можно обеспечить известным архитектурным приёмом:
наружу выставляется абстрактный тип, тип наследник - скрыт, фабрика типа возвращает
экземпляр наследника под видом абстрактного.

2igor: Именно это я и имел ввиду применительно к оберонам.

Comdiv

  • Newbie
  • *
  • Сообщений: 25
    • Просмотр профиля
Re:[pure С] Макросы как инструмент построения eDSL
« Ответ #82 : Апрель 12, 2011, 03:52:18 pm »
По пустякам и конструкторов не надо.
Вы это к тому, что Оберон - язычек на пустячек?  ;)
В качестве шутки сойдёт, но из контекста разговора понятно, что нет.

DIzer

  • Гость
Re:[pure С] Макросы как инструмент построения eDSL
« Ответ #83 : Апрель 12, 2011, 06:57:45 pm »
По пустякам и конструкторов не надо.
Вы это к тому, что Оберон - язычек на пустячек?  ;)
В качестве шутки сойдёт, но из контекста разговора понятно, что нет.
Точно. Интересно, что эта тема (о необходимости  в ЯП конструкций аналогичных конструкторам) поднималась несколько раз у коровцев  (как оберонофилами так и оберонофобами).. в качестве аргументации в основном были "жизненные" примеры.. Понятно что на каждый такой пример находился контрпример (или , на худой конец, "нафиг энто нужно"). Я считаю - что даже в простом СОВРЕМЕННОМ  ЯВУ такая вещь (назовем ее инициализатором) - крайне полезна ибо позволяет описывать моделируемую систему  точно и надежно (это является для меня ДОСТАТОЧНЫМ основанием).

igor

  • Sr. Member
  • ****
  • Сообщений: 438
    • Просмотр профиля
Re:[pure С] Макросы как инструмент построения eDSL
« Ответ #84 : Апрель 13, 2011, 04:13:28 am »
Я считаю - что даже в простом СОВРЕМЕННОМ  ЯВУ такая вещь (назовем ее инициализатором) - крайне полезна ибо позволяет описывать моделируемую систему  точно и надежно (это является для меня ДОСТАТОЧНЫМ основанием).

Необходимость в конструкторах (или инициализаторах) я для себя обосновываю несколько иначе.
Основную цель конструкторов я вижу в том, чтобы перевести только что созданный объект (до первого использования) во внутренне непротиворечивое состояние. Дело в том, что конструктор - это особый метод, который вызывается тогда, когда объекта ещё как бы нет (в том смысле, что этот объект ещё не доступен для использования). К тому же этот метод вызывается автоматически, так что у программиста нет возможности "забыть" его вызвать.

Всё это звучит несколько академически, но я действительно так думаю.  :)

DIzer

  • Гость
Re:[pure С] Макросы как инструмент построения eDSL
« Ответ #85 : Апрель 13, 2011, 08:16:41 am »
Я считаю - что даже в простом СОВРЕМЕННОМ  ЯВУ такая вещь (назовем ее инициализатором) - крайне полезна ибо позволяет описывать моделируемую систему  точно и надежно (это является для меня ДОСТАТОЧНЫМ основанием).

Необходимость в конструкторах (или инициализаторах) я для себя обосновываю несколько иначе.
Основную цель конструкторов я вижу в том, чтобы перевести только что созданный объект (до первого использования) во внутренне непротиворечивое состояние. Дело в том, что конструктор - это особый метод, который вызывается тогда, когда объекта ещё как бы нет (в том смысле, что этот объект ещё не доступен для использования). К тому же этот метод вызывается автоматически, так что у программиста нет возможности "забыть" его вызвать.

Всё это звучит несколько академически, но я действительно так думаю.  :)
Поздравляю, время внести коррективы в свою точку зрения  :). Описанная вами проблема лечится просто - при создании переменной в нее заносится некоторое значение из области определения (например, численные типы инициализируются нулем, указатели -NIL) . Я говорю , про то, что необходимость в конструкторах имеет другую природу (и вообще говоря вывести ее  логически из постулатов информатики невозможно- можно только ввести их в ЯП аксиоматически...а введение новых сущностей нужно жестко обосновывать, иначе винегрет)

DIzer

  • Гость
Re:[pure С] Макросы как инструмент построения eDSL
« Ответ #86 : Апрель 13, 2011, 08:18:04 am »
Я считаю - что даже в простом СОВРЕМЕННОМ  ЯВУ такая вещь (назовем ее инициализатором) - крайне полезна ибо позволяет описывать моделируемую систему  точно и надежно (это является для меня ДОСТАТОЧНЫМ основанием).

Необходимость в конструкторах (или инициализаторах) я для себя обосновываю несколько иначе.
Основную цель конструкторов я вижу в том, чтобы перевести только что созданный объект (до первого использования) во внутренне непротиворечивое состояние. Дело в том, что конструктор - это особый метод, который вызывается тогда, когда объекта ещё как бы нет (в том смысле, что этот объект ещё не доступен для использования). К тому же этот метод вызывается автоматически, так что у программиста нет возможности "забыть" его вызвать. Кстати , не так давно вы пытались сделать что-то подобное по отношению к вычислениям с плавающей точкой...

Всё это звучит несколько академически, но я действительно так думаю.  :)
Поздравляю, время внести коррективы в свою точку зрения  :). Описанная вами проблема лечится просто - при создании переменной в нее заносится некоторое значение из области определения (например, численные типы инициализируются нулем, указатели -NIL) . Я говорю , про то, что необходимость в конструкторах имеет другую природу (и вообще говоря вывести ее  логически из постулатов информатики невозможно- можно только ввести их в ЯП аксиоматически...а введение новых сущностей нужно жестко обосновывать, иначе винегрет)

igor

  • Sr. Member
  • ****
  • Сообщений: 438
    • Просмотр профиля
Re:[pure С] Макросы как инструмент построения eDSL
« Ответ #87 : Апрель 13, 2011, 08:44:36 am »
Описанная вами проблема лечится просто - при создании переменной в нее заносится некоторое значение из области определения (например, численные типы инициализируются нулем, указатели -NIL) .
В том то и дело, что с точки зрения автора объекта нулевые значения могут быть некорректными. Например, в объекте Window поле width означает ширину окна, а по замыслу автора ширина любого окна (любого экземпляра объекта Window) ни при каких обстоятельствах не должна быть меньше 50 пикселей. Как гарантировать этот инвариант при создании объекта? При помощи конструктора (!), чтобы даже нечаянно не получилось создать объект, у которого будет width < 50.

Илья Ермаков

  • Full Member
  • ***
  • Сообщений: 177
    • Просмотр профиля
    • OberonCore
Re:[pure С] Макросы как инструмент построения eDSL
« Ответ #88 : Апрель 13, 2011, 12:07:35 pm »
Плодить иерархию по пустякам...

В КП есть LIMITED RECORD, как раз для такой цели (чтобы в обход фабрики нельзя было создать).
Используется редко (но метко), потому что базовый абстрактный тип имеет смысл вводить в большинстве случаев. И уж в случае прикладного моделирования точно (чтобы потом свободно играть с разными вариантами реализации какого-нибудь понятия).

Относиться к желательности введения ABSTRACT-типа можно так же, как к обязанности объявлять секцию interface в Object Pascal, дефинишн в Модуле или Аде, или хидер в Сях. Объём работы не увеличивается, т.к. как раз дефинишн Оберон генерирует автоматом, только звёздочки успевай ставить... Это как раз и к вопросу о том, почему в Оберонах теряет актуальность явное объявление спецификаций. Основные спецификации фиксируются в объявлениях ABSTRACT-типов.

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re:[pure С] Макросы как инструмент построения eDSL
« Ответ #89 : Апрель 13, 2011, 12:21:31 pm »
В КП есть LIMITED RECORD, как раз для такой цели (чтобы в обход фабрики нельзя было создать).
Но это только для переменных в куче. Не интересно.

Относиться к желательности введения ABSTRACT-типа можно так же, как к обязанности объявлять секцию interface в Object Pascal, дефинишн в Модуле или Аде, или хидер в Сях.
В сях хидер не обязателен абсолютно.

Объём работы не увеличивается, т.к. как раз дефинишн Оберон генерирует автоматом, только звёздочки успевай ставить... Это как раз и к вопросу о том, почему в Оберонах теряет актуальность явное объявление спецификаций. Основные спецификации фиксируются в объявлениях ABSTRACT-типов.
Где в Обероне ABSTRACT-типы? Их там как раз вроде бы нет.

Алсо беспорядочно раскиданые звездочки по тексту очень нелегко вылавливать. Я это дело прочувствовал когда на этих выходных писал на Oberon-7 :-)
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"