问题描述
我是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
求值的值。例如。这不是您要退出的功能范围,而是表达式的每个级别。