Макрос для сложения 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.