2012-03-14 12 views
4

の文字列ベクトルの要素の位置を見つけ、文字ベクトルはposition文字列ベクトルは、次の文字列内の要素、数値ベクトルの位置を返すCommon Lispの

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 

答えて

8

デフォルトでは、POSITIONEQLを使用して要素をテストします。これは、CLHS 17.2.1のように、テストを使用するほとんどのシーケンス関数について真です。ベクトルの場合、EQLは内容ではなくアイデンティティによって比較され、2つの文字列 "A"は同じに見えますが、通常は異なります。内容によって比較するには、:test #'equalをPOSITIONに渡す必要があります。またはstring= or string-equalは、文字列に特化しており、引数の1つが文字列でない場合にエラーを通知します。また、string-equalは大文字と小文字を区別しません。

+0

ありがとう、それは非常に包括的な答えです。 'string ='と 'string-equal'を比較すると、あなたが参照したページを引用するだけです。私。 "string-equalは、文字列=と同じですが、大文字と小文字の違いは無視されますが、char-equalがtrueの場合、2文字は同じ文字とみなされます。 –

+0

私は 'POSITION'のCLHSページを見ましたが、' TEST'のデフォルト値への参照を見つけることができませんでした。これを明確にするCLHSリンクを提供することはできますか? (または、シーケンス関数の 'EQL'の使用法に関するガイドラインを提供するCLHSページへのリンク)。ありがとう! –

+0

@MironBrezuleanu:私はそれのためのリンクを見つけなければならないでしょう。しかし、一般にCommon Lispは、シーケンス関数のすべてのテスト関数のデフォルトとしてEQLを使用します。他に何かが必要な場合は、大部分が:テストキーワードパラメータ –

2

お試し(position "A" #("A" "B" "C" "D") :test #'equal)

+0

ありがとうございます。 –

関連する問題