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

igor

  • Sr. Member
  • ****
  • Сообщений: 438
    • Просмотр профиля
Re:[pure С] Макросы как инструмент построения eDSL
« Ответ #15 : Апрель 05, 2011, 11:24:10 am »
В конкретном данном примере автоматизация не нужна, IMHO.
Почему?
Потому что то, автоматизированное решение получается сложнее ручного, а усложнение обычно не ведёт к повышению надёжности.

Но давайте дождёмся решения Петра Алмазова. Может быть оно повлияет на мою точку зрения.

igor

  • Sr. Member
  • ****
  • Сообщений: 438
    • Просмотр профиля
Re:[pure С] Макросы как инструмент построения eDSL
« Ответ #16 : Апрель 05, 2011, 11:51:23 am »
Позволю себе выдвинуть такой тезис:
Тривиальные задачки не подлежат автоматизации.

Хотя, Geniepro возможно намеренно привёл такой простой пример только для демонстрации метода, так сказать. А в жизни предполагается использовать этот метод в более сложных случаях.

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re:[pure С] Макросы как инструмент построения eDSL
« Ответ #17 : Апрель 05, 2011, 12:44:59 pm »
Позволю себе выдвинуть такой тезис:
Тривиальные задачки не подлежат автоматизации.

Тривиальные ЯП не позволяют автоматизировать тривиальные задачки :) Вон, освобождение ресурса - тоже тривиальная задача. А на обероне - не автоматизируется...

P.S. Еще один тезис: ошибка ручного кодирования тривиальных задач может приводить к нетривиальным багам :)

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re:[pure С] Макросы как инструмент построения eDSL
« Ответ #18 : Апрель 05, 2011, 12:49:35 pm »
Вот, предположим, нужно, что бы в некоей процедуры куски кода выполнялись поочерёдно при каждом вызове этой процедуры, причём эти куски кода нежелательно выделять в отдельные процедуры, поскольку сами по себе они большого смысла не имеют.

Если речь идет о "кусках кода", то я однозначно начну с функциональных переменных... Применительно к данной задаче: список функторов и итератор.
« Последнее редактирование: Апрель 05, 2011, 12:52:16 pm от vlad »

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re:[pure С] Макросы как инструмент построения eDSL
« Ответ #19 : Апрель 05, 2011, 12:52:13 pm »
Хотя, Geniepro возможно намеренно привёл такой простой пример только для демонстрации метода, так сказать. А в жизни предполагается использовать этот метод в более сложных случаях.
Естественно, я не стал приводить несколько страниц никому неинтересного тут кода, а выделил саму суть, что бы не отвлекала от идеи.
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re:[pure С] Макросы как инструмент построения eDSL
« Ответ #20 : Апрель 05, 2011, 12:57:12 pm »
Если речь идет о "кусках кода", то я однозначно начну с функциональных переменных... Применительно к данной задаче: список функторов и итератор.
Тогда возникнет неудобство -- надо будет протаскивать некий контекст, который обрабатывается в этой функции...
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re:[pure С] Макросы как инструмент построения eDSL
« Ответ #21 : Апрель 05, 2011, 01:51:13 pm »
Вот, предположим, нужно, что бы в некоей процедуры куски кода выполнялись поочерёдно при каждом вызове этой процедуры, причём эти куски кода нежелательно выделять в отдельные процедуры, поскольку сами по себе они большого смысла не имеют.

Если речь идет о "кусках кода", то я однозначно начну с функциональных переменных... Применительно к данной задаче: список функторов и итератор.

Если задачу решать в общем виде, то тут мы имеем банальный Конечный Автомат. И эта задача отлично на Сях решается (даже без плюсов), читабельно и не хуже чем на всяких там ФП и без таких сложных макросов. Но есть нюанс: в этом общем случае нам нужно знать имена состояний и событий (ибо они разные и нам нужно знать ху из ху) и они там будут. Но для данной задачи это избытычно, поэтому это решение (через полновесный КА) будет слишком громоздко.

Собственно говоря, вначале и Geniepro и я пытались решать задачу в рамках именно FSM. Уже потом лишние сущности были вначале отрезаны бритвой Оккама, а затем расстреляны из автомата Калашникова.

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

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re:[pure С] Макросы как инструмент построения eDSL
« Ответ #22 : Апрель 05, 2011, 02:17:28 pm »
Если речь идет о "кусках кода", то я однозначно начну с функциональных переменных... Применительно к данной задаче: список функторов и итератор.
Тогда возникнет неудобство -- надо будет протаскивать некий контекст, который обрабатывается в этой функции...

Ну это чисто синтаксическое неудобство. Оберонщикам, например, не привыкать ;) Зато все явно, тупо и тривиально:
struct context;
typedef void (*F)(context*);
F steps[] = {&step1, &step2, &step3};
int current_step = 0;

Не путать с приведенным обероновским примером - там тоже тривиально, но вручную :)

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re:[pure С] Макросы как инструмент построения eDSL
« Ответ #23 : Апрель 05, 2011, 02:23:05 pm »
Вообще, эта задача решалась бы проще и правильней, если бы в сях были вложенные функции (в gcc есть такой расширизм, кстати).

Толку от вложенных функций не сильно много, если они не умеют "захватывать" котнекст. Не зря Вирту они не нравятся... ;)

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re:[pure С] Макросы как инструмент построения eDSL
« Ответ #24 : Апрель 05, 2011, 02:30:21 pm »
Вообще, эта задача решалась бы проще и правильней, если бы в сях были вложенные функции (в gcc есть такой расширизм, кстати).

Толку от вложенных функций не сильно много, если они не умеют "захватывать" котнекст. Не зря Вирту они не нравятся... ;)
В данном случае они смогут захватить контекста достаточно для выполнения задачи.
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re:[pure С] Макросы как инструмент построения eDSL
« Ответ #25 : Апрель 05, 2011, 02:51:18 pm »
Толку от вложенных функций не сильно много, если они не умеют "захватывать" котнекст. Не зря Вирту они не нравятся... ;)
В данном случае они смогут захватить контекста достаточно для выполнения задачи.

Угу. Шаг в сторону - и все падает :) Нафиг-нафиг... Хватит уже "недорешений". Или полноценные замыкания или не надо притворяться, что они есть и плодить потенциальные грабли.

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re:[pure С] Макросы как инструмент построения eDSL
« Ответ #26 : Апрель 05, 2011, 02:56:15 pm »
Толку от вложенных функций не сильно много, если они не умеют "захватывать" котнекст. Не зря Вирту они не нравятся... ;)
В данном случае они смогут захватить контекста достаточно для выполнения задачи.

Угу. Шаг в сторону - и все падает :) Нафиг-нафиг... Хватит уже "недорешений". Или полноценные замыкания или не надо притворяться, что они есть и плодить потенциальные грабли.
Не понял. Нафига в данной задаче полноценные замыкания? И зачем тут тягать какой-то контекст?
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re:[pure С] Макросы как инструмент построения eDSL
« Ответ #27 : Апрель 05, 2011, 03:20:41 pm »
Не понял. Нафига в данной задаче полноценные замыкания? И зачем тут тягать какой-то контекст?

В какой задаче? Напечатать printf'ом номер шага? :) Если там все-таки что-то более интересное подразумевается, то контекст вылезет. А оттуда и до замыканий совсем немного...

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re:[pure С] Макросы как инструмент построения eDSL
« Ответ #28 : Апрель 05, 2011, 03:35:27 pm »
Не понял. Нафига в данной задаче полноценные замыкания? И зачем тут тягать какой-то контекст?

В какой задаче? Напечатать printf'ом номер шага? :) Если там все-таки что-то более интересное подразумевается, то контекст вылезет. А оттуда и до замыканий совсем немного...
Контекст у них у всех общий. Если совсем-совсем про данную уже реальную задачу Geniepro говорить, то этот контекст передается в виде неявного указателя this.

Указатели на эти блоки кода (вложенные процедуры) никуда из этой самой процедуры уезжать (в данной задаче) не должны ни при каких обстоятельствах.

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

igor

  • Sr. Member
  • ****
  • Сообщений: 438
    • Просмотр профиля
Re:[pure С] Макросы как инструмент построения eDSL
« Ответ #29 : Апрель 06, 2011, 08:03:00 am »
... а Вы предлагаете делать всё вручную...

Возвращаясь к своему варанту решения хочу заметить, что про него правильнее будет сказать "явное", а не "ручное".

Во-первых, манипуляции внутри процедуры, приводящие к смене куска кода при следующем вызове, прописаны явно (без шаманства). Замечу также, что блоку, в котором содержится вызов процедуры Test, нет нужды вникать в эту "кухню".

Во-вторых, вариант исполнения процедуры при следущем вызове прописан явно, при помощи глобальной переменной s. Это придаёт определённую гибкость данному решению. Появляется возможность перед вызовом процедуры явно указать какой должен быть вариант её исполнения, возможно изменив при этом предопределённый порядок. Да, я помню - такого требования в исходной задаче не было, но в жизни требования часто меняются. Гибкую программу гораздо легче адаптировать к изменившимся требованиям, а автоматизация обычно ведёт к снижению гибкости.