如何在 LISP 中传递列表参数

use*_*716 1 lisp common-lisp factorial

我目前正在尝试为一个类实现阶乘函数。我的函数接受一个参数n ,并列出 0, 1, 2, ... n的阶乘。

这就是我目前所拥有的:

这是我将要调用的函数,现在它只返回N的阶乘:

(defun factor3 (N)
    (apply #'* (loop :for n :from 1 :below (+ 1 N) :collect n))   
)
Run Code Online (Sandbox Code Playgroud)

这是一个辅助函数,返回从 1 到num的整数列表。Acc 在最初调用时将NIL作为空列表来累积值:

(defun my-seq (num acc) 
    (if (eq num 0) 
        acc
        (my-seq (- num 1) (cons num acc)))
Run Code Online (Sandbox Code Playgroud)

这些函数中的每一个都按预期单独运行,现在我想将Factor3函数应用于从my-seq返回的列表中的每个成员,并且我的教授暗示了两个关键字:

  • 使用apply

  • 使用mapcar

然而,当我打电话时

(mapcar 'factor3 '(my-seq 5 NIL))

我明白了

*** - +: MY-SEQ is not a number

因此,我尝试将my-seq返回的列表保存到变量b,然后调用

(mapcar 'factor3 'b)

我得到

*** - MAPCAR: A proper list must not end with B

我尝试了许多不同的变量名称,但得到了相同的错误。我应该如何实现这段代码?

似乎我需要做的就是将返回值作为参数传递,但互联网上的 LISP 语言资源非常有限。

如有任何帮助,我们将不胜感激,谢谢。

Bar*_*mar 5

不要引用应该计算的表达式和变量。

(mapcar 'factor3 (my-seq 5 NIL))
Run Code Online (Sandbox Code Playgroud)

或者

(defvar b (my-seq 5 NIL))
(mapcar 'factor3 b)
Run Code Online (Sandbox Code Playgroud)