Создание функций через макросы - Lisp

Узнай цену своей работы

Формулировка задачи:

Разбираюсь с тем, что указано в заголовке. Проблема возникла, когда я захотел генерировать функции с заданным именем.
Листинг программы
  1. (setf *print-pretty* t)
  2. (defmacro make-fun (name)
  3. (format t "name = ~A~%" name)
  4. (cond ((stringp name) `(defun ,(intern name) () (write-line ,name)))
  5. ((symbolp name) `(defun ,name () (write-line ,(string name))))))
  6. (defparameter x 'tt1)
  7. (make-fun x) ;; как заставить макрос воспринимать x не как символ x, а как, в данном случае, 'tt1?
  8. ;; соответственно, дальше аналогичная проблема с остальными вызовами make-fun
  9. (tt1)
  10. (setf x "tt2")
  11. (make-fun x)
  12. (funcall (intern x))
  13. (loop for x in '(f1 "f2") do
  14. (make-fun (eval x))
  15. (format t "~%Created ~w~%~w~%Result: "
  16. x (macroexpand-1 `(make-fun ,x)))
  17. (funcall (if (stringp x) (intern x) x)))

Решение задачи: «Создание функций через макросы»

textual
Листинг программы
  1. (defun make-fun (name parm body)
  2.   (eval `(defun ,name ,parm ,body)) )
  3.  
  4. ==> MAKE-FUN
  5.  
  6. (make-fun 'quadr '(x) '(* x x))
  7.  
  8. ==> QUADR
  9.  
  10. (quadr 8)
  11.  
  12. ==> 64
  13.  
  14. (make-fun 'qube '(x) '(* x x x))
  15.  
  16. ==> QUBE
  17.  
  18. (qube 8)
  19.  
  20. ==> 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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут