如何使用列表中的项目作为 LISP 中函数的参数?
How to use items in a list as arguments to a function in LISP?
这是学校作业。
我写了多个函数,每个函数都有不同数量的参数。我需要创建一个适用于我项目中所有函数的 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)
我不知道用什么方法可以将列表中的项目分成单独的参数。
有什么办法吗?我不需要用列表来做,所以非常欢迎不同方式的例子。
谢谢。
将函数应用于参数列表的函数在 Lisp 中称为 apply
。不同的 Lisp 对 apply
的约定略有不同,但我所知道的所有 Lisp 家族语言都有一些变体。这是编写类似 Lisp 求值器之类的东西的重要部分。
这是学校作业。
我写了多个函数,每个函数都有不同数量的参数。我需要创建一个适用于我项目中所有函数的 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)
我不知道用什么方法可以将列表中的项目分成单独的参数。
有什么办法吗?我不需要用列表来做,所以非常欢迎不同方式的例子。
谢谢。
将函数应用于参数列表的函数在 Lisp 中称为 apply
。不同的 Lisp 对 apply
的约定略有不同,但我所知道的所有 Lisp 家族语言都有一些变体。这是编写类似 Lisp 求值器之类的东西的重要部分。