【发布时间】:2021-02-15 14:52:11
【问题描述】:
我目前正在用 LISP 编写一个小程序,它将接收一个列表,并将其拆分如下:
(split '(1 2 3) returns-> ((1 2) (3))
(split '(1 2 3 4) returns-> ((1 2) (3 4))
我觉得我很接近并且已经写了它的基本逻辑,我的问题是如果 if 语句的计算结果为 T,我必须执行 2-3 个操作。因此,我不断收到错误
错误、警告: *** - SYSTEM::%EXPAND-FORM: (PUSH (CAR LST) (CDR (LAST NEWLST))) 应该是 lambda 表达式
当 if 语句的计算结果为真时,我需要将当前列表的头部添加到我的列表变量 newLst 的末尾,然后我需要获取当前列表的尾部并设置我的另一个列表变量的值new2Lst 到那个。完成此操作后,我需要跳出循环并将两个列表相互附加。这可能没有多大意义,对不起,希望代码更有意义,请在下面找到它。提前感谢大家的帮助,我真的很感激它的每一点!
(defun split (lst)
(cond ((= (list-length lst) 1) lst)
(t (setq w (list-length lst))
(setq newLst (list (car lst)))
(setq new2Lst '())
(loop for x from 1 to (+ w 1) do
(if (= x (ceiling (/ w 2)))
( (push (car lst) (cdr( last newLst))) (setq new2Lst (cdr lst)) (return))
(push (car lst) (cdr( last newLst)))
)
(setq lst (cdr lst))
)
(append (list newLst) (list new2Lst))
)
)
)
【问题讨论】:
-
变量 w、newlst 和 new2lst 未定义。您需要定义它们。
标签: list loops if-statement lisp common-lisp