Создание функций через макросы - Lisp
Формулировка задачи:
Разбираюсь с тем, что указано в заголовке. Проблема возникла, когда я захотел генерировать функции с заданным именем.
(setf *print-pretty* t)
(defmacro make-fun (name)
(format t "name = ~A~%" name)
(cond ((stringp name) `(defun ,(intern name) () (write-line ,name)))
((symbolp name) `(defun ,name () (write-line ,(string name))))))
(defparameter x 'tt1)
(make-fun x) ;; как заставить макрос воспринимать x не как символ x, а как, в данном случае, 'tt1?
;; соответственно, дальше аналогичная проблема с остальными вызовами make-fun
(tt1)
(setf x "tt2")
(make-fun x)
(funcall (intern x))
(loop for x in '(f1 "f2") do
(make-fun (eval x))
(format t "~%Created ~w~%~w~%Result: "
x (macroexpand-1 `(make-fun ,x)))
(funcall (if (stringp x) (intern x) x)))Решение задачи: «Создание функций через макросы»
textual
Листинг программы
(defun make-fun (name parm body) (eval `(defun ,name ,parm ,body)) ) ==> MAKE-FUN (make-fun 'quadr '(x) '(* x x)) ==> QUADR (quadr 8) ==> 64 (make-fun 'qube '(x) '(* x x x)) ==> QUBE (qube 8) ==> 512
Объяснение кода листинга программы
В данном коде:
- Создаётся функция
make-funс тремя аргументамиname,parm,body. - Функция
make-funиспользует eval для создания новой функции с именемname, параметромparmи теломbody. - Затем, с помощью функции
make-fun, создаются две функцииquadrиqube. - Функция
quadrпринимает один параметрxи возвращает результат умноженияxнаx. - Функция
qubeтакже принимает один параметрx, но возвращает результат умноженияxнаxиx. - Наконец, функции
quadrиqubeвызываются с аргументом8и возвращают результаты64и512соответственно.