Написать программу ввода списка имен функций - Lisp (229884)
Формулировка задачи:
Решение задачи: «Написать программу ввода списка имен функций»
(defun task (flist arglist) (mapcar #'(lambda (f arg) (if (eq f 'eval) (funcall f arg) (apply f arg))) flist arglist)) ==> task (task '(+ - > eval expt exp) '((1 2 3) (6 7 8) (1 4 2) (+ 5 7) (2 5) (1))) ==> (6 -9 NIL 12 32 2.71828182845905) (task '(+ - > eval eq expt exp) '((1 2 3) (6 7 8) (1 4 2) (+ 5 7) (a b) (2 5) (1))) ==> (6 -9 NIL 12 NIL 32 2.71828182845905)
Объяснение кода листинга программы
В этом коде определена функция task, которая принимает два аргумента: flist и arglist.
flist — это список функций, которые нужно вызвать.
arglist — это список аргументов, которые нужно передать в эти функции.
Внутри функции task используется операция mapcar, которая применяет к каждому элементу flist анонимную функцию. Эта анонимная функция принимает два аргумента: функцию и её аргумент. Если функция имеет имя eval, то ей передаётся аргумент. В противном случае, аргумент передаётся в функцию.
Результатом работы функции task является список результатов вызова функций из flist с аргументами из arglist.
В первом примере вызывается функция task с flist = (+ - > eval expt exp) и arglist = '((1 2 3) (6 7 8) (1 4 2) (+ 5 7) (2 5) (1)). Результатом будет (6 -9 NIL 12 32 2.71828182845905).
Во втором примере вызывается функция task с flist = (+ - > eval eq expt exp) и arglist = '((1 2 3) (6 7 8) (1 4 2) (+ 5 7) (a b) (2 5) (1)). Результатом будет (6 -9 NIL 12 NIL 32 2.71828182845905).