Во-первых, стандартная библиотека 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))))))
В конечном итоге, возвращает NIL, если letter
не найден в list
, или индекс, если он есть.Да, я знаю, что эти парены выглядят непрозрачными, но так написано на Лиспе.Вы привыкнете к этому.
tl; dr Используйте position
в стандартной библиотеке;он делает то, что вы хотите.