Как написать функционал по-очереди farg s1 s2.sk? - Lisp

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

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

Как написать функционал по-очереди farg s1 s2..sk,который применяет функцию farg сначала к первым элементам списков s1,s2...sk,затем - ко вторым, и т.д. и формирующий список результатов?

Решение задачи: «Как написать функционал по-очереди farg s1 s2.sk?»

textual
Листинг программы
(defun task (f &rest args)
 (if (member nil args) nil
  (let ((b nil)
        (a nil))
   (iter (for z in args)
     (collecting (car z) into a)
     (collecting (cdr z) into b))
    (cons (apply f a) (apply 'task (cons f b)))))) 
 
==> TASK
 
(task '* '(2 3 4) '(2 3 4) '(2 3 4))
 
==> (8 27 64)

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

В коде определён функциoн task, который принимает один обязательный аргумент f и произвольное количество аргументов args. Если args пуст, то возвращается nil. В противном случае, в функции создаются две переменные a и b, и в цикле iter происходит перебор всех элементов args. В каждой итерации, элемент z проверяется на ноль (что эквивалентно nil), если это так, то ничего не происходит. Если это не так, то car z (то есть, функция, которая возвращает голову списка z) присваивается переменной a, а cdr z (то есть, функция, которая возвращает хвост списка z) присваивается переменной b. После завершения цикла, функция apply применяется к переменной f с аргументом a, а затем функция task рекурсивно вызывается с аргументами f и b. Результатом всего этого является список, содержащий результаты вызова функции f с аргументом a, а затем результаты вызова функции task с аргументами f и b. Поэтому, если мы вызываем функцию task с аргументами '*', '(2 3 4)' и '(2 3 4)' (как в примере), то результатом будет (8 27 64), потому что *'(2 3 4) равно 8, (2 3 4) равно 27, и (2 3 4) равно 64.

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


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

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

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