Создание функций через макросы - 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
соответственно.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д