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