Показали нам однажды на лекции пример макроопределения.
#define MIN(x,y) ((x) < (y) ? (x) : (y))
Ежу, читавшему On Lisp, понятно, что пример бажный (может произойти
множественное вычисление аргументов). При этом, в мануале по cpp
написано, что в стандартном С такой баг пофиксить невозможно.
На лиспе корректное определение выглядит так
(defmacro my-min (x y)
(let ((x1 (gensym))
(y1 (gensym)))
`(let ((,x1 ,x)
(,y1 ,y))
(if (< ,x1 ,y1)
,x1
,y1))))
А еще и говорят, что на С даже ногу можно прострелить... :/ А каком
простреле ноги может идти речь, если даже с элементарными задачами
язык справится не может?
Форум —
Talks


