LINUX.ORG.RU

История изменений

Исправление 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)
???