Определить функционал a-apply - Lisp
Формулировка задачи:
(defun a-apply (f x)
(cond
((null f) nil)
((null x) nil)
(t (cons
(cons (funcall (car f) (car x))
(cons (funcall (cadr f) (car x)) nil)) (a-apply (cddr f) (cdr x))))))
Проверка
> (defun Sum (x) (+ x x))
SUM
> (defun Razn (x) (- x 1))
RAZN
> (defun Mul (x) (* x x))
MUL
> (a-apply '(Sum Razn Razn Sum Mul Mul) '(2 3 4))
((4 1) (2 6) (16 16))Решение задачи: «Определить функционал a-apply»
(defn zipwith (f l1 l2) (cond (null? l1) nil (null? l2) nil (cons (f (car l1) (car l2)) (zipwith f (cdr l1) (cdr l2)))))
Объяснение кода листинга программы
В данном коде определен функционал zipwith, который принимает три аргумента: f, l1 и l2.
В первой строке кода используется функция cond, которая проверяет, является ли первый аргумент l1 равным nil. Если это так, то возвращается nil. В противном случае, проверяется второй аргумент l2 на nil. Если l2 равен nil, то также возвращается nil.
Если оба аргумента не равны nil, то возвращается новая функция, которая будет применяться к каждому элементу кортежей l1 и l2. Эта новая функция будет вызывать f с первым элементом l1 и первым элементом l2, а затем рекурсивно вызывать zipwith с оставшейся частью кортежей.
В итоге, функционал zipwith создает новую функцию, которая применяет функцию f к каждой паре элементов из двух кортежей, и возвращает результат в виде кортежа. Если один из кортежей пуст, то возвращается nil.