Макрос для сложения 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. Вот что происходит в каждом из макросов:

  1. sum-vect:
    • mapcar применяется к символу + (сложению), который будет применяться к каждому элементу вектора.
    • Затем применяется eval к каждому элементу вектора, чтобы преобразовать его из символьное выражение в число.
    • Результатом является вектор, полученный путем сложения всех чисел.
  2. sum-vect-1:
    • mapcar применяется к символу + (сложению), который будет применяться к каждому элементу вектора.
    • Вектор передается как одна строка, поэтому нет необходимости в eval.
    • Результатом является вектор, полученный путем сложения всех чисел. В обоих случаях результатом является вектор, полученный путем сложения всех чисел. Обратите внимание, что в первом макросе векторы передаются как символьные выражения, а во втором макросе они передаются как числа. Это объясняет разницу в поведении при использовании sum-vect и sum-vect-1.

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

8   голосов , оценка 3.875 из 5
Похожие ответы