Создание функций через макросы - 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

Объяснение кода листинга программы

В данном коде:

  1. Создаётся функция make-fun с тремя аргументами name, parm, body.
  2. Функция make-fun использует eval для создания новой функции с именем name, параметром parm и телом body.
  3. Затем, с помощью функции make-fun, создаются две функции quadr и qube.
  4. Функция quadr принимает один параметр x и возвращает результат умножения x на x.
  5. Функция qube также принимает один параметр x, но возвращает результат умножения x на x и x.
  6. Наконец, функции quadr и qube вызываются с аргументом 8 и возвращают результаты 64 и 512 соответственно.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 3.8 из 5