LINUX.ORG.RU

4
Всего сообщений: 27

Призываются мастера препроцессора С

У нас есть код типа

#define FUNC_BEGIN(name) \
    static some_struct_t s_##name; \
    static void init_##name() { \
        s_##name.init_func=init_##name; \
        int index=0;
#define FUNC_END() }
#define ADD_INT32(name) \
    s_##name.list[index].type=type_int32; \
    s_##name.list[index].ptr=&name;
#define ADD_STR(name) \
    s_##name.list[index].type=type_str; \
    s_##name.list[index].ptr=name;
// тут дальше много разных типов

static int32_t var1;
static char var2[100];

FUNC_BEGIN(f1)
    ADD_INT32(var1);
    ADD_STR(var2);
FUNC_END
// И таких функций в программе штук 300.
Тут много отрезано.. Что нужно? Нужно сделать функцию которая будет занулять все переменные указанные такими макросами. Сейчас в структуре есть массив, в который заносятся указатели и типы переменных. Чем не нравится - массив фиксированного размера, в каждом воркере создается свой экземпляр. Есть идея переместить его в статические пременные, в которых есть указатель на предидущую переменную. Чтобы получился код типа такого:
typedef struct {
  void* ptr;
  int16_t type;
  const var_rec_t* prev;
} var_rec_t;
static var_rec_t init_var1={&var1, type_int32, NULL};
static var_rec_t init_var2={var2, type_str, &init_var1};
Вот как бы такое сделать макросами? Проблему у меня вызывает указатель на предидущую перменную.

 ,

vromanov ()

Как на макросах изобразить инстанциирование

Есть макрос, который должен создавать функцию.

(defmacro build (info) `(lambda ...))

Текст функции зависит от содержимого структуры info.

Где-то в коде он многократно вызывается с разными параметрами. Можно ли как-то сделать, чтобы он при первом запуске где-то создавал функцию, а при последующих только ссылался на неё? То есть нужен механизм, аналогичный инстанциированию шаблонов C++.

Есть какие-нибудь идеи, как сделать? Реализация лиспа (CL, Scheme, ...) не важна.

 , ,

monk ()

Calc - наочные примеры для школяров

Итак, в глухом, забитом украинском селе перевели 4 компа на бубен. Дано: девятиклассники, которые ни х^ не хотят делать и LibreOffice Calc. Найти: Познавательные, научные, содержательные примеры для полезного времяпрепровождения местных гаврошей :) Желательно с настраиваемыми макросами поведения. З.Ы. Самому искать нет времени - побеспокой ЛОР ;)

 , , ,

Twissel ()

Отодвиньте вашу тарелку с борщом в сторону, специалисты по макросам!

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

n = 3, k = 1, {x = y + z, y = x - z, z = x - y}
Тривиально. Поблажка - порядок неважен, т.е. есть возможность пользоваться именованными параметрами, например
smth = init(x = 100, y = 10)
эквивалентно
smth = init(y = 10, x = 100)
То есть нужно писать (генерировать) не A(n, k), а C(n, k) функций.

Квест заключается в написании макроса, который генерирует все возможные варианты init(...), потому что нам, например, лень. В тред приглашаются лисперы, racket-пацаны, скальщики, с++-темплейт-шаманы, nemerle-писатели (есть такие вообще здесь?) и остальные, кого еще меньше. У D там вроде зачаточно что-то было? Напишу все эти языки в теги.

Я думаю, это можно было бы сгенерить и каким-то питонячим/руби-скриптом в отдельный файлик и его включать, но это не слишком спортивно.

Пример признаю абсолютно теоретическим.

 , , , ,

cdshines ()

Полнота парадигм в Ruby

Доброго времени суток ананимусы и аналитики ЛОР'а! В связи с последним г*ом, которое заявил Гвидо решил окончательно сползать с Python 3.x на что-то более вменяемое. Полностью переходить на tcl пока не хочу (много слишком веществ надо потреблять), хочется немного батареек побольше. Ранее использовал Ruby в разрезе ООП. Заинтересовало вот что:

1. Как обстоят дела на Ruby с ФП? Насколько он поддерживает данную парадигму? Хотя бы на уровне Scheme или Clojure оно или на том же уровне, что и Python?

2. Как обстоят дела с меттапрограммированием? Можно ли писать такие же классные вещи как на tcl или lisp-family (макросы, программирование синтаксиса, etc.)? Насколько хорошо с этим в рубине?

 , , , ,

iMushroom ()

mcedit, macros

Как привязать макрос к комбинации клавиш? Например ctrl-X+ctrl-A.

 ,

at ()