【问题标题】:Breaking From Loop Through If Statement LISP通过 If 语句 LISP 打破循环
【发布时间】: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


【解决方案1】:

progn

当您想要对一系列表达式abc 进行求值时,您需要将它们放入(progn a b c) 形式中。但是在这里,您将它们包装在表格列表中:当您在正常评估上下文中评估 (a b c) 时,即。不在宏、特殊形式...中,a 应该是一个使用参数bc 调用的函数。 这就是为什么你有这个特定的错误:(push ...) 确实不是函数名或 lambda 表达式。

未定义的变量

您正在对未绑定到已知变量的符号调用setq,至少在您的函数中是这样。然后大多数实现将分配视为对符号symbol-value 的分配,即使行为未指定。您应该通过 let 绑定在您的函数中声明它们:

(let ((w (length list))
      (... ...))
  ...)

顺便说一句,你在这个函数中计算了两次列表的长度,长度可以只计算一次,实际上你只需要知道列表是否有一个元素并且它的cdr中没有列表:这是恒定时间计算,不像list-length 需要遍历整个列表。

变量名,大小写

注意变量的命名方式,请遵守 Lisp 约定,使用 hyphen-separated-words,而不是混合使用大小写。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-28
    相关资源
    最近更新 更多