Lisp “我该如何解决?”;绑定形式不是一个合适的列表”;错误

Lisp “我该如何解决?”;绑定形式不是一个合适的列表”;错误,lisp,common-lisp,Lisp,Common Lisp,我是lisp新手,我试图定义一个简单的函数来搜索列表中的元素。 我觉得自己不太适应这种语言,也不太理解错误/警告信息 (defun in-list (x l) (let y (car l)) (let z (cdr l)) (if (null l) nil (if (equal x y) t (in-list x z) ) ) ) 我还试图用seq替换let,但仍然对“假定为特殊的变量”发出警告。let的语法有错误

我是lisp新手,我试图定义一个简单的函数来搜索列表中的元素。 我觉得自己不太适应这种语言,也不太理解错误/警告信息

(defun in-list (x l)
  (let y (car l))
  (let z (cdr l))
  (if (null l)
      nil
    (if (equal x y)
        t
      (in-list x z)
      )
    )
)

我还试图用seq替换let,但仍然对“假定为特殊的变量”发出警告。

let的语法有错误。最重要的是:

所以你应该写:

(defun in-list (x l)
  (let ((y (car l))
        (z (cdr l)))
    (if (null l)
        nil
        (if (equal x y)
            t
            (in-list x z)))))
请注意,无需定义两个局部变量,因为对应的表达式只使用一次,因此可以用以下方式缩写函数:

(defun in-list (x l)
  (if (null l)
      nil
      (if (equal x (car l))
          t
          (in-list x (cdr l)))))
而且,由于您体内有三个不同的病例,您可以使用一个
cond
,而不是两个
if

(defun in-list (x l)
  (cond ((null l) nil)
        ((equal x (car l)) t)
        (t (in-list x (cdr l)))))

网上有非常好的免费书籍,是学习语言的基础。例如,请参阅。

let的语法中有一个错误。最重要的是:

所以你应该写:

(defun in-list (x l)
  (let ((y (car l))
        (z (cdr l)))
    (if (null l)
        nil
        (if (equal x y)
            t
            (in-list x z)))))
请注意,无需定义两个局部变量,因为对应的表达式只使用一次,因此可以用以下方式缩写函数:

(defun in-list (x l)
  (if (null l)
      nil
      (if (equal x (car l))
          t
          (in-list x (cdr l)))))
而且,由于您体内有三个不同的病例,您可以使用一个
cond
,而不是两个
if

(defun in-list (x l)
  (cond ((null l) nil)
        ((equal x (car l)) t)
        (t (in-list x (cdr l)))))

网上有非常好的免费书籍,是学习语言的基础。例如,请参见。

要能够使用
setq
,您可以在函数的lambda列表中的
&aux
关键字后声明函数的内部变量:

(defun in-list (x l &aux y z) 
    (setq y (car l) 
          z (cdr l)) 
    (and l 
         (or (equal x y) 
             (in-list x z))))
更好的样式是在声明点为辅助变量提供其值:

(defun in-list (x l &aux (y (car l)) (z (cdr l)))
    (and l 
         (or (equal x y) 
             (in-list x z))))

为了能够使用
setq
,您可以在函数的lambda列表中的
&aux
关键字之后声明函数的内部变量:

(defun in-list (x l &aux y z) 
    (setq y (car l) 
          z (cdr l)) 
    (and l 
         (or (equal x y) 
             (in-list x z))))
更好的样式是在声明点为辅助变量提供其值:

(defun in-list (x l &aux (y (car l)) (z (cdr l)))
    (and l 
         (or (equal x y) 
             (in-list x z))))

虽然技术上是正确的,但这不是一种好的风格。
&aux
基本上隐藏了lambda列表中的另一个
let*
,它有它的用途,但请不要仅仅声明要立即设置的变量。公共Lisp不是Scheme.:)此外,在重新阅读了我在这里写的内容后,这个答案并不提倡这种风格,只是回答了问题正文中的直接问题。@Svante谢谢你的评论,我已经编辑了答案。虽然技术上是正确的,但这不是一种好的风格。
&aux
基本上隐藏了lambda列表中的另一个
let*
,它有它的用途,但请不要仅仅声明要立即设置的变量。公共Lisp不是Scheme.:)此外,在重新阅读了我在这里写的内容后,这个答案并不提倡这种风格,只是回答了问题正文中的直接问题。@Svante谢谢你的评论,我已经编辑了答案。