Как написать функционал по-очереди farg s1 s2.sk? - Lisp
Формулировка задачи:
Решение задачи: «Как написать функционал по-очереди farg s1 s2.sk?»
(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.