найти положение элемента в строковом векторе в общем lisp - PullRequest
4 голосов
/ 14 марта 2012

Возвращение позиции элемента в строке и числовом векторе, а вектор символов работает с использованием position

CL-USER> (position #\T  "ACGT")
3
CL-USER> (position 2  #(1 2 3 4))
1

CL-USER> (position #\A  #(#\A #\C #\G #\T))
0

Следующее для строкового вектора не работает.Я предполагаю, что это потому, что строка сама по себе является вектором символов.Итак, что можно использовать?

CL-USER> (position "A"  #("A" "C" "G" "T"))
NIL

Ответы [ 2 ]

9 голосов
/ 14 марта 2012

По умолчанию POSITION тестирует элемент, используя EQL , что верно для большинства функций последовательности, использующих тесты, согласно CLHS 17.2.1 . Для векторов EQL сравнивается по идентичности, а не по содержанию, и две строки «A» обычно будут разными, даже если они выглядят одинаково. Для сравнения по содержанию вам нужно передать :test #'equal в POSITION. Или string = или string-equal , которые специализированы для строк и сообщат об ошибке, если один из аргументов не является строкой. Также string-equal нечувствителен к регистру.

2 голосов
/ 14 марта 2012

Попробуйте (position "A" #("A" "B" "C" "D") :test #'equal).

...