(defun make-it-5 (num)
(setq num 5))
(setq a 0)
(make-it-5 a)
;; now a is still 0, not 5.
В приведенном выше коде, кажется, ни (setq a 5), ни (setq 0 5) не происходит. Если бы (setq a 5) произошло, то a изменилось бы на 5, но a по-прежнему равно 0. Если (setq 0 5) произошло, произошла бы ошибка Lisp. Что происходит? Это мой вопрос.
Для некоторых из вас, кто пришел сюда, погуглив и задаваясь вопросом, как заставить make-it-5 работать, как следует из его названия, один из способов -
(defmacro make-it-7 (num) ; defmacro instead of defun
`(setq ,num 7))
(setq a 0)
(make-it-7 a)
;; now a is 7.
Еще есть:
(defun make-it-plus (num-var)
(set num-var (+ 1 (symbol-value num-var))) ; `set' instead of `setq'
)
(setq a 0)
(make-it-plus 'a) ; 'a instead of a
;; now a is 1.