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

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re:[pure С] Макросы как инструмент построения eDSL
« Ответ #45 : Апрель 07, 2011, 04:00:25 pm »
Код в студию, пожалуйста.

...

И никаких глобальных переменных :)

Да. Вместо одной глобальной переменной у Вас теперь не менее глобальная структура и целая горсть новых идентификаторов: stepper_t, next, steps_t, make_stepper, ... (насколько мне удалось разобраться в чужеродном для меня языке  :))

Не, вы не правы. Нет там никакой глобальной структуры, всего лишь объявление интерфейса, не более глобального чем любой экспортируемый тип в обероне. И сущностей там не больше чем в вашем решении. У вас функция и глобальная переменная (состояние). У меня функция создания состояния (не глобального) и функция, которая работает с этим состоянием. Можно было без лишних идентификаторов и структур, но менее наглядно:

хедер:
boost::function<void> make_stepper(std::vector< boost::function<void> > const&);
// возвращает функцию, которая на каждом вызове вызывает очередную функцию из списка переданных функций

использование:
boost::function<void> test1 = make_stepper(...);
boost::function<void> test2 = make_stepper(...);
test1(); // step1
test2(); // step1
test1(); // step2
test2(); // step2

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re:[pure С] Макросы как инструмент построения eDSL
« Ответ #46 : Апрель 07, 2011, 04:05:17 pm »
Почему-то никто не вспомнил ключевое слово сопрограмма

Да, есть такие штуки. Я их не щупал, а всегда хотел увидеть простой пример. Спасибо :) Чем то похоже на "генератор". Есть принципиальная разница?

Peter Almazov

  • Sr. Member
  • ****
  • Сообщений: 482
    • Просмотр профиля
Re:[pure С] Макросы как инструмент построения eDSL
« Ответ #47 : Апрель 07, 2011, 04:45:05 pm »
Чем то похоже на "генератор".
Поясните, о чем речь. Я не врубаюсь.

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re:[pure С] Макросы как инструмент построения eDSL
« Ответ #48 : Апрель 07, 2011, 05:23:00 pm »
Чем то похоже на "генератор".
Поясните, о чем речь. Я не врубаюсь.

def gen():
    yield 1
    yield 2
    yield 3

print list(gen())

Напечатает: [1, 2, 3]
Отличие в том, что генератор принимает аргумент один раз. Затем можно "лениво" итерироваться по результатам.

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re:[pure С] Макросы как инструмент построения eDSL
« Ответ #49 : Апрель 07, 2011, 05:30:49 pm »
Применительно к данной задачке - вот питоновский код с генератором:
import sys

def stepper(functions):
    i = 0
    while True:
        functions[i]()
        yield
        i = i + 1
        if i == len(functions):
            i = 0

s = stepper([lambda: sys.stdout.write("test1"), lambda: sys.stdout.write("test2")])
s.next()
s.next()
s.next()

И по-прежнему без глобальных переменных ;)

Peter Almazov

  • Sr. Member
  • ****
  • Сообщений: 482
    • Просмотр профиля
Re:[pure С] Макросы как инструмент построения eDSL
« Ответ #50 : Апрель 07, 2011, 06:02:10 pm »
Да, похоже, я пробовал yield в C#, но он там может использоваться только в итераторах. А то было бы самое оно.

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re:[pure С] Макросы как инструмент построения eDSL
« Ответ #51 : Апрель 09, 2011, 02:58:52 pm »
Да, похоже, я пробовал yield в C#, но он там может использоваться только в итераторах. А то было бы самое оно.

Кстати, почему поклонники Дейкстры никак не прореагировали на такой конструкт?
while True:
    yield

Это не break и не goto, но должно же вызвать какую-нибудь реакцию? :)

Peter Almazov

  • Sr. Member
  • ****
  • Сообщений: 482
    • Просмотр профиля
Re:[pure С] Макросы как инструмент построения eDSL
« Ответ #52 : Апрель 09, 2011, 03:23:41 pm »
Когда я писал в примере
пока истина цикл
  ...
  resume;
  ...

у меня было желание написать в комментарии: "цикл бесконечный".
Но потом подумал, что читатели могут расценить такой комментарий как совсем уже для тупых, и не стал писать.
А какой реакции вы ждете?

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re:[pure С] Макросы как инструмент построения eDSL
« Ответ #53 : Апрель 09, 2011, 04:08:00 pm »
Судя по всему, сопрограммы являются формой записи конечного автомата. Конечный автомат избыточен для данной задачи.
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re:[pure С] Макросы как инструмент построения eDSL
« Ответ #54 : Апрель 09, 2011, 04:47:06 pm »
у меня было желание написать в комментарии: "цикл бесконечный".
Но потом подумал, что читатели могут расценить такой комментарий как совсем уже для тупых, и не стал писать.
А какой реакции вы ждете?

Ну на самом деле цикл не вечный. В том смысле, что не зацикливает программу. При том, что программа вполне себе классическая/однопоточная. Т.е. имеет место некий "разрыв" в потоке от "блока" к "блоку", от "входа" к "выходу". Поэтому и хотелось услышать комментарии от ценителей "истинного" (догматического) структурного программирования. Сам я отношусь к такой конструкции не более чем как к абстракции, которая в определенных ситуациях хорошо описывает происходящее в программе. Моим "истинным" принципам эта абстракция не противоречит.

Илья Ермаков

  • Full Member
  • ***
  • Сообщений: 177
    • Просмотр профиля
    • OberonCore
Re:[pure С] Макросы как инструмент построения eDSL
« Ответ #55 : Апрель 09, 2011, 05:14:28 pm »
Кстати, почему поклонники Дейкстры никак не прореагировали на такой конструкт?

У меня есть реализация сопрограмм для КП/ББ, библиотечная. Хороший весчь.

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re:[pure С] Макросы как инструмент построения eDSL
« Ответ #56 : Апрель 09, 2011, 06:09:35 pm »
Кстати, почему поклонники Дейкстры никак не прореагировали на такой конструкт?

У меня есть реализация сопрограмм для КП/ББ, библиотечная. Хороший весчь.

Можно взглянуть?
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

Peter Almazov

  • Sr. Member
  • ****
  • Сообщений: 482
    • Просмотр профиля
Re:[pure С] Макросы как инструмент построения eDSL
« Ответ #57 : Апрель 09, 2011, 08:19:12 pm »
setjump/longjump?

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re:[pure С] Макросы как инструмент построения eDSL
« Ответ #58 : Апрель 10, 2011, 04:41:02 am »
Кстати, почему поклонники Дейкстры никак не прореагировали на такой конструкт?

У меня есть реализация сопрограмм для КП/ББ, библиотечная. Хороший весчь.


И это все? :) Ну и ладно...

Илья Ермаков

  • Full Member
  • ***
  • Сообщений: 177
    • Просмотр профиля
    • OberonCore
Re:[pure С] Макросы как инструмент построения eDSL
« Ответ #59 : Апрель 10, 2011, 08:39:20 am »
setjump/longjump?

Не совсем. Это, наверное, не совсем сопрограммы, а скорее фиберы.
В код отдельной такой сопрограммы вставляем вызов спец. процедуры Pass, диспетчер возобновляет очередную сопрограмму, пока и она не вызовет Pass. И т.п. Кооперативная многозадачность.
Реализация - на общем стеке, главном стеке программы. Кадры засыпающей сопрограммы снимаются со стека и запоминаются, на стек помещаются кадры получающей управление сопрограммы.
Никакой поддержки ОС не требуется, легковесный библиотечный параллелизм, поскольку стек один, можно иметь очень много параллельных задач.