Вы можете передать функцию в качестве аргумента другой функции, как показано в следующем примере:
(defun c:add ( / a )
(if (setq a (getint "\nEnter a number to add 2 to it: "))
(+ a 2)
)
)
(defun looper ( func )
(while
(progn
(initget "Y N")
(/= "N" (getkword "\nContinue? [Y/N] <Y>: "))
)
(func)
)
)
(defun c:adder ( )
(looper c:add)
)
Здесь символ c:add
вычисляется, чтобы получить указатель на определение функции, который затем привязывается к символу func
в области действия функции looper
. Таким образом, в рамках функции looper
символы func
и c:add
оценивают одну и ту же функцию.
В качестве альтернативы, вы можете передать символ c:add
в виде символа в кавычках, в этом случае значение символа func
является символом c:add
, который затем может быть оценен для получения функции:
(defun c:add ( / a )
(if (setq a (getint "\nEnter a number to add 2 to it: "))
(+ a 2)
)
)
(defun looper ( func )
(while
(progn
(initget "Y N")
(/= "N" (getkword "\nContinue? [Y/N] <Y>: "))
)
((eval func))
)
)
(defun c:adder ( )
(looper 'c:add)
)
Передача символа в кавычках в качестве функционального аргумента более соответствует стандартным функциям AutoLISP, таким как mapcar
, apply
и т. Д.