История изменений
Исправление MOPKOBKA, (текущая версия) :
Это, пожалуй, основной пункт моего утверждения.
Метапрограммирование в стиле лиспа смещает эту грань сильно, поэтому loop на лиспе есть, а аналога на C — нету.
Я считаю что loop нету по другим причинам:
1) Сложность, в CL это стандартная конструкция, обязательная к реализации, есть ли альтернативные реализации помимо тех что есть в компиляторе?
2) Отсутствие понятие итерируемости у объектов
А свои конструкции циклов на С делают постоянно, пример из ядра:
list_for_each_entry_safe_reverse(pos, tmp, head, miscj)
kobject_del(&pos->kobj);
А это как считать. Если данные макросы используются во всём остальном коде, то тут можно к коду макросов прибавить и код всех использующих их функций
Если альтернативная реализация без макроса не может обеспечить схожие возможности за примерно тоже самое количество строк, то можно считать.
Здесь defmacro и defun представлены в примерно равной пропорции.
Осталось понять их сложность, и можно ли их заменить на #define, вот например взял первый попавшийся макрос
(defmacro atomic-incf (place &optional (delta 1))
"Atomically increment PLACE by DELTA. Return _previous_ value of PLACE."
`(sb-ext:atomic-incf ,place ,delta))
#define atomic_incf(place, delta) sb_ext_atomic_incf(place, delta)
Исходная версия MOPKOBKA, :
Это, пожалуй, основной пункт моего утверждения.
Метапрограммирование в стиле лиспа смещает эту грань сильно, поэтому loop на лиспе есть, а аналога на C — нету.
Я считаю что loop нету по другим причинам:
1) Сложность, в CL это стандартная конструкция, обязательная к реализации, есть ли альтернативные реализации помимо тех что есть в компиляторе?
2) Отсутствие понятие итерируемости у объектов
А свои конструкции циклов на С делают постоянно, пример из ядра:
list_for_each_entry_safe_reverse(pos, tmp, head, miscj)
kobject_del(&pos->kobj);
А это как считать. Если данные макросы используются во всём остальном коде, то тут можно к коду макросов прибавить и код всех использующих их функций
Если альтернативная реализация без макроса не может обеспечить схожие возможности за примерно тоже самое количество строк, то можно считать.
Здесь defmacro и defun представлены в примерно равной пропорции.
Осталось понять их сложность, и можно ли их заменить на #define, вот например взял первый попавшийся макрос
(defmacro atomic-incf (place &optional (delta 1))
"Atomically increment PLACE by DELTA. Return _previous_ value of PLACE."
`(sb-ext:atomic-incf ,place ,delta))
#define atomic_incf(place, delta) ab_ext_atomic_incf(place, delta)