Ранние шаги с макросами и поиском разъяснений.
(defmacro nil! (x)
(list 'setf x nil))
Пол Грэм пишет на стр. 169 ANSI CL
nil!
, ntimes
и while
вседолжны быть написаны как макросы, потому что все должны контролировать способ, которым их аргументы оцениваются.
Я посмотрел на nil!
и подумал, подожди минутку, я хочу попробовать написать это какфункция.Оказалось, что он прав, как и ожидалось, но хотел выяснить, почему.Если я сделаю
(defun nil!f (x)
(setf x nil))
(setf a 9)
(nil!f a)
; a is still 9, not nil
Заставив себя на это, я замечу, что это странное использование функции, потому что я бы не стал setf
параметром.Если бы я собирался setf
в функции, это скорее было бы глобальным, а не параметром.
Если я правильно понял, параметр x
создает новую лексическую область, которая затемняет a
, который я установил на верхнем уровне.Это означает, что мы можем передать значение функции, но не переменной.
В то время как с макросами мы можем иметь дело с переменными.
Конечно, мы можем сделать это
(defun nil!f-a ()
(setf a nil))
, но теперь мы потеряли возможность передавать переменную этой конкретной функции, так что это тупая версия оригинала.
Следовательно, вот что макрос позволяет вам сделать здесь:?
Второй вопрос: является ли это верным утверждением
"В CL вы не можете передать переменную в функцию"
Здесь я даю ...