从函数返回列表

问题描述

我是LISP的新手,想知道如何从函数中返回列表。
我需要编写一个将列表作为输入并输出列表的函数

如果第一个和最后一个元素是偶数:
返回前** 2和后** 4的列表
其他
返回包含第一个和最后一个元素的列表

如何正确返回列表?

(defun test (elements)
    (if (and (numberp (nth 0 elements))
            (numberp (last elements)))
        (if (and (evenp (nth 0 elements))
            (evenp (last elements)))
            (return from test (list (expt (last elements) 2) (expt (nth 0 elements) 4)))
        )
    )
    (return from test (list (nth 0 elements) (last elements)))
)
    

解决方法

示例:

(cond ((foo-p n) (list 1 2))  ; returns the list
      ((bar-p m) (list 3 4))  ; returns the list
      (t         (list 5 6))) ; returns the list

(if (foo-p n)
    (list 1 2)                ; returns the list
    (if (bar-p m)
        (list 3 4)            ; returns the list
        (list 5 6)))          ; returns the list
,

列表是成对的链。例如。 (1 2 3)(cons 1 (cons 2 (cons 3 '())))创建。如果您内心知道这一点,则列表处理会容易得多。

由于列表的结构,列表是从头到尾创建的,并从头到尾进行迭代。

例如。替换第一个元素很容易。您(cons (do-something (car elements)) (cdr elements)),并且有一个列表,其中第一个元素已更改。您可以使用(reverse elements)进行同样的操作,以在最后反转之前更改最后一个元素。将这两者放在一起,您将找到解决方案。

不需要return。例如。如果函数的主体如下,则some-expr为真时,该参数将在开头添加一个新元素,否则为实参。

(if some-expr
    (cons 3 elements)
    elements)

lisp的每个部分都是这样的。表达式可以看作是计算返回值。例如。 some-expr返回一个由if求值的值。例如。这不是您要退出的功能范围,而是表达式的每个级别。