Определить функцию и передать её в apply - Lisp

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

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

Задание такое: в зависимости от переданного значения функции, с помощью apply выполнять либо сложение элементов списка, либо умножение элементов списка. т.е
Листинг программы
  1. apply func(x) '(1 2 3 4)
если x = 1, то результат 10, если x=2, то 24 вот, что сделал я: определяю функцию func
Листинг программы
  1. (defun func_(x) (cond ((eql 1 x)(plus))(eql 2 x)(TIMES))
затем пытаюсь вызвать apply
Листинг программы
  1. (apply func_(1) '(1 2 3 4))
но компилятор выдает ошибку
Листинг программы
  1. Error: The variable FUNC_ is unbound.
  2. Fast links are on: do (si::use-fast-links nil) for debugging
  3. Error signalled by EVAL.
  4. Backtrace: EVAL
  5. Broken at SYSTEM::GCL-TOP-LEVEL.

Решение задачи: «Определить функцию и передать её в apply»

textual
Листинг программы
  1. (defun funct (n)
  2.   (cond ((= n 1) #'+)
  3.         ((= n 2) #'*)
  4.         (t (lambda (&rest x) x))))
  5.  
  6. ==> FUNCT
  7.  
  8. (apply (funct 1) '(1 2 3 4))
  9.  
  10. ==> 10
  11.  
  12. (apply (funct 2) '(1 2 3 4))
  13.  
  14. ==> 24
  15.  
  16. (apply (funct 3) '(1 2 3 4))
  17.  
  18. ==> (1 2 3 4)

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

В коде определена функция со строковым именем funct. Данная функция принимает один аргумент n. В зависимости от значения этого аргумента, функция возвращает один из трех возможных операторов:

  1. Если n равно 1, то возвращается оператор сложения (+).
  2. Если n равно 2, то возвращается оператор умножения (*).
  3. Если n не равно 1 и 2, то возвращается лямбда-функция, которая принимает произвольное количество аргументов (представленных в виде списка) и возвращает этот список без изменений. Затем функция funct передается в функцию apply, которая применяет функцию funct к списку '(1 2 3 4). При этом, функция apply передает каждый элемент списка в функцию funct по одному, пока не закончатся элементы списка. Результат выполнения кода: — При передаче функции funct с аргументом 1 в функцию apply, результатом будет 10, так как 10 - это результат сложения чисел 1, 2, 3 и 4. — При передаче функции funct с аргументом 2 в функцию apply, результатом будет 24, так как 24 - это результат умножения чисел 1, 2, 3 и 4. — При передаче функции funct с аргументом 3 в функцию apply, результатом будет список (1 2 3 4), так как лямбда-функция, возвращаемая при n=3, возвращает список без изменений.

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


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

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

9   голосов , оценка 3.778 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы