Во-вторых, можете привести пример гениального использования макросов? Типа, а вот здесь языки без макросов сосут.
В C# есть оператор using, который, в частности, позволяет автоматически закрывать файл после того, как с ним будет проведена какая-то работа:
// точно на память работу с файлами в .NET не помню,
// просто пример как это может выглядеть
using (File file = File.Open("filename.txt"))
{
// что-то делаем с файлом file
} // тут он автоматически закрывается
Когда в С# не было этого оператора (вроде когда-то его не было, может ошибаюсь), приходилось (да и теперь в том же С или Обероне приходится) закрывать файл вручную. Естественно, можно было по запарке забыть это дело сделать.
Макросы позволяют самостоятельно модифицировать язык, добавить этот самый "using":
; условный синтаксис:
(defmacro with-open-file (file filename body)
(let (,file (open-file filename)
,@body
(close-file ,file))))
; пример использования:
(with-open-file file "filename.txt"
( ; что-то делаем с файлом file
)) ; тут он автоматически закрывается
Ну, в некоторых языках некоторые возможности макросов можно реализовать и без макросов. Например, в Хаскелле:
with_open_file :: FilePath -> IOMode -> (Handle -> IO a) -> IO a
with_open_file filename mode action = do
fhnd <- openFile filename mode
result <- action fhnd
hClose fhnd
return result
-- Пример использования
do ...
with_open_file "filename.txt" ReadMode $ \\file -> do
... -- что-то делаем с файлом file
-- тут он автоматически закрывается
Но Хаскелл -- ленивый язык, в нём такие фокусы проходят.
В сях тоже можно соорудить макрос, но именно -- какой-никакой, а макрос.
А в оберонах?