Макрос для сложения N векторов - Lisp
Формулировка задачи:
Здравствуйте! Помогите, пожалуйста, с написанием макроса для сложения произвольного количества векторов. Я видел на форуме пример для сложения двух векторов, но переделать его под произвольное их количество не получается.
Решение задачи: «Макрос для сложения N векторов»
textual
Листинг программы
(defmacro sum-vect (v) mapcar + (map eval 'v)) => OK (sum-vect '(1 2 3) '(3 4 5) '(6 7 8)) ; с квотированием ; => (10 13 16) (defmacro sum-vect-1 (v) mapcar + 'v) => OK (sum-vect-1 (1 2 3) (3 4 5) (6 7 8)) ; без квотирования ; => (10 13 16)
Объяснение кода листинга программы
В этом коде определены два макроса: sum-vect
и sum-vect-1
. Оба макроса складывают векторы, но sum-vect
использует функцию mapcar
и eval
, а sum-vect-1
использует только mapcar
.
Вот что происходит в каждом из макросов:
sum-vect
:mapcar
применяется к символу+
(сложению), который будет применяться к каждому элементу вектора.- Затем применяется
eval
к каждому элементу вектора, чтобы преобразовать его из символьное выражение в число. - Результатом является вектор, полученный путем сложения всех чисел.
sum-vect-1
:mapcar
применяется к символу+
(сложению), который будет применяться к каждому элементу вектора.- Вектор передается как одна строка, поэтому нет необходимости в
eval
. - Результатом является вектор, полученный путем сложения всех чисел.
В обоих случаях результатом является вектор, полученный путем сложения всех чисел.
Обратите внимание, что в первом макросе векторы передаются как символьные выражения, а во втором макросе они передаются как числа. Это объясняет разницу в поведении при использовании
sum-vect
иsum-vect-1
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д