首先,Common Lisp 标准库已经有了它;它叫做position。
(position 'a '(a b c d e)) ==> 0
(position 'b '(a b c d e)) ==> 1
(position 'z '(a b c d e)) ==> NIL
一般来说,标准库中的东西是可以使用的。 (是的,position 提供了这些输出。我只是通过 REPL 运行了这些输出。)
其次,不要听起来比你更神圣或其他任何东西,但你的括号风格只会伤害我的眼睛。在列表中的第一件事前面放一个左括号,所有右括号与列表中的最后一个事物在同一行。例如:
(defun hello-world ()
(format t "Hello World!"))
或
(defun position-in-list (letter list)
(cond
((null list) nil)
((eq (car list) letter) count)
(t (position-in-list letter (cdr list))
count)))
(defun count ()
(+ 0 1))
这可能会让你觉得很难看 [一开始是为了我],但它可以帮助你更容易地发现错误。
第三,我不知道你的count 函数应该做什么,但position-in-list 可能没有按照你期望的方式做。试试这个:
(defun position-in-list (letter list)
(cond
((null list) nil)
((eq (car list) letter) 0)
(t (1+ (position-in-list letter (cdr list))))))
最终,如果在list 中找不到letter,则返回 NIL,否则返回索引。是的,我知道那些括号看起来不透明,但这就是 Lisp 的编写方式。你会习惯的。
tl;dr 在标准库中使用position;它做你想做的事。