Определить функционал 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
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д