List 从循环中断到If语句LISP

List 从循环中断到If语句LISP,list,loops,if-statement,lisp,common-lisp,List,Loops,If Statement,Lisp,Common Lisp,我目前正在用LISP编写一个小程序,它将接受一个列表,并将其拆分为以下内容: (split '(1 2 3) returns-> ((1 2) (3)) 我觉得我非常接近,并且已经编写了它的基本逻辑,我的问题是如果if语句的计算结果为T,我必须执行2-3个操作。因此,我一直收到错误 错误、警告: ***-系统::%EXPAND-FORM:(推送(车辆LST)(CDR(最后一个新的LST))应为 lambda表达式 当if语句的计算结果为true时,我需要将当前列表的头部添加到列表变量n

我目前正在用LISP编写一个小程序,它将接受一个列表,并将其拆分为以下内容:

(split '(1 2 3) returns-> ((1 2) (3)) 
我觉得我非常接近,并且已经编写了它的基本逻辑,我的问题是如果if语句的计算结果为T,我必须执行2-3个操作。因此,我一直收到错误

错误、警告: ***-系统::%EXPAND-FORM:(推送(车辆LST)(CDR(最后一个新的LST))应为 lambda表达式

当if语句的计算结果为true时,我需要将当前列表的头部添加到列表变量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))
            ) 
     ) 
)
当您想要计算表达式序列
a
b
c
时,需要将它们放入
(progn a b c)
表单中。但在这里,您将它们包装在一个表单列表中:当您在正常的求值上下文中求值时,
(abc)
,即不是在宏、特殊表单中,
a
应该是一个使用参数
b
c
调用的函数。 这就是为什么会出现特定错误:
(push…
实际上不是函数名或lambda表达式

未定义变量 您正在对未绑定到已知变量(至少在函数中)的符号调用
setq
。大多数实现将赋值视为符号的
符号值
的赋值,即使行为未指定。您应该通过使用
let
绑定在函数中声明它们:

(let ((w (length list))
      (... ...))
  ...)
顺便说一下,在这个函数中,您可以计算两次列表的长度,长度只能计算一次,事实上,您只需要知道列表的cdr中是否有一个元素而没有列表:这是一个固定时间计算,而不像
list length
需要遍历整个列表

变量名,大小写 请注意如何命名变量,请使用
连字符分隔的单词,而不是混合使用大小写,以遵守Lisp惯例

当您想要计算表达式序列
a
b
c
时,需要将它们放入
(progn a b c)
表单中。但在这里,您将它们包装在一个表单列表中:当您在正常的求值上下文中求值时,
(abc)
,即不是在宏、特殊表单中,
a
应该是一个使用参数
b
c
调用的函数。 这就是为什么会出现特定错误:
(push…
实际上不是函数名或lambda表达式

未定义变量 您正在对未绑定到已知变量(至少在函数中)的符号调用
setq
。大多数实现将赋值视为符号的
符号值
的赋值,即使行为未指定。您应该通过使用
let
绑定在函数中声明它们:

(let ((w (length list))
      (... ...))
  ...)
顺便说一下,在这个函数中,您可以计算两次列表的长度,长度只能计算一次,事实上,您只需要知道列表的cdr中是否有一个元素而没有列表:这是一个固定时间计算,而不像
list length
需要遍历整个列表

变量名,大小写
注意如何命名变量,请使用
连字符分隔的单词,而不是混合使用大写和小写。

变量w、newlst和new2lst是未定义的。您需要定义它们。变量w、newlst和new2lst未定义。你需要定义它们。