Как использовать элементы в списке в качестве аргументов функции в LISP? - PullRequest
0 голосов
/ 30 марта 2020

Это для школьного задания.

Я написал несколько функций, каждая с разным количеством аргументов. Мне необходимо создать функцию REPL, которая будет работать со всеми функциями в моем проекте.

Для каждой функции:

  • Запрашивать у пользователя список аргументов.

    • Если пользователь вводит ноль, остановитесь, переходите к следующей функции

    • Если пользователь вводит правильный ввод (a список аргументов), вызовите функцию, используя элементы этого списка.

    • Предположим, что неверный ввод никогда не вводится.

Вот что у меня есть, поскольку моя функция REPL:

(setq funcList '(append. reverse map fold member insert intersection
                 union abs factorial right-tri gcd perfectp abundantp
                 deficientp))

(defun repl ()
  (loop for f in funcList do
    (loop
      (format t "Enter a list of arguments for ~s (NIL to stop): " f)
      (setq argsList (read))
      (when (eq argsList nil) return nil)
      (format t "(~s arguments-here) => output-of-function-here" f)
    )
  )
)

Я абсолютный новичок, когда дело доходит до lisp, поэтому, пожалуйста, не стесняйтесь критиковать мой код.

В любом случае я хочу использовать элементы в списке, которые я предлагаю пользователю ввести в качестве различных аргументов, требуемых текущей функцией, которую тестирует пользователь. Затем я бы вызвал функцию, используя что-то вроде:

(funcall f arg1 arg2...argk)

Я не знаю, каким образом я могу разделить элементы в списке на отдельные аргументы.

Есть ли способ сделать это? Я не обязан делать это со списком, поэтому примеры разных способов более чем приветствуются.

Спасибо.

1 Ответ

0 голосов
/ 30 марта 2020

Функция, которая применяет функции к списку аргументов, называется apply в Лиспе. В разных Лиспах были немного разные соглашения для apply, но у всех языков семейства Лисп, которые мне известны, есть какой-то вариант. Это важная часть написания чего-то вроде оценщика для Lisp.

...