Lisp “我该如何解决?”;绑定形式不是一个合适的列表”;错误
我是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的语法有错误
(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谢谢你的评论,我已经编辑了答案。