【发布时间】: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