【问题标题】:How to use items in a list as arguments to a function in LISP?如何使用列表中的项目作为 LISP 中函数的参数?
【发布时间】:2020-03-30 03:21:14
【问题描述】:

这是学校作业。

我编写了多个函数,每个函数都有不同数量的参数。我需要创建一个可以与我项目中的所有函数一起使用的 REPL 函数。

对于每个函数:

  • 提示用户输入参数的列表

    • 如果用户输入nil,停止,移动到下一个函数

    • 如果用户输入有效输入(参数列表),则使用该列表中的项目调用函数。

    • 假设从未输入过无效输入。

这是我的 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)

我不知道我可以通过什么方式将列表中的项目分成单独的参数。

有没有办法做到这一点?我不需要使用列表来完成,因此非常欢迎不同方式的示例。

谢谢。

【问题讨论】:

  • 如果我理解正确,您有一个与函数同时使用的参数列表。例如,如果函数是 + 并且您有列表 argsList '(1 2 3),您只需要执行 (apply func argsList) => 6
  • @Leo 还有其他方法吗?我只是好奇。
  • 你可以这样做 (eval (cons '+ args))。如果参数没有分组到列表中,也可以使用 (funcall #'+ 1 2 3)。此外,在 + 的特殊情况下,它接受任意数量的参数,您可以使用 (reduce '+ args)

标签: list function arguments lisp common-lisp


【解决方案1】:

将函数应用于参数列表的函数在 Lisp 中称为 apply。不同的 Lisp 对 apply 的约定略有不同,但我所知道的所有 Lisp 系列语言都有一些变体。这是编写 Lisp 评估器之类的重要部分。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 2023-01-30
    • 2014-05-03
    • 1970-01-01
    • 2020-07-13
    相关资源
    最近更新 更多