2016-04-08 12 views
0

私はCommon LispとFunctional Programmingには一般的に新しいです。私は関数を "wordToNumber"と呼ぶことができます。入力文字列が "one" "two" "three" ..など(0-9)のみであるかどうかをチェックしたいと思います。私は1 2 3等を返すようにしたい(wordToNumber "one")1を出力する必要があります。私は文字列の比較に問題がありますが、eqとeqlを使って試しましたが、動作しません。実際の文字列ではないメモリ位置を比較します。これについて簡単に行く方法はありますか、それとも文字列を比較するための方法がありますか?私は純粋に関数型プログラミングであり、ループやものではない例が必要です。これは私が学校で働いているプロジェクトのほんの一部です。Common Lispでの文字列の比較

ああ、ちょうどこのような瞬間に、単純な関数を使って文字列比較IM用:

(defun wordToNumber(x) 
    (if(eq 'x "one")(return-from wordToNumber 1))) 

、これでそれを呼び出す:(wordToNumber「1」) キープがnilが返さなっ

感謝任意のヘルプ

答えて

4

文字列を比較する関数は、大文字小文字を区別するかどうかによって、string= and string-equalになります。

変数の値を比較する場合は、評価を防止する目的で引用するため、変数の値を引用してはいけません。

(defun word-to-number (x) 
    (cond ((string-equal x "one") 1) 
      ((string-equal x "two") 2) 
      ((string-equal x "three") 3) 
      ... 
     )) 
0

Lispについての素晴らしい点の1つは、apropos機能です。 Lispは大きな言語で、通常はあなたが望むものを持っています。私はまた、Lisp Hyperpecをお勧めします:http://www.lispworks.com/documentation/HyperSpec/Front/

eqはシンボル、CLOSオブジェクト、コンスセルにも適していますが、注意が必要です:(eq(list 1)(list 1))は、同じ番号を指しています。

eqlは数字と文字でよく、eqで処理できるものはありません。 1つの素晴らしいことは、xが数字ではなくても(eql x 42)は動作します。その場合は(= x 42)うまくいかないでしょう。

リストと配列には等しいが必要です。文字列は配列なので、それを使用できます。それから、私はエクササイズとして残すイコールです。

1

実際には、10分岐を条件付きにする前に、string=string-equal(および他の2進関数)を:test引数としてほとんどのシーケンス関数に渡すことができます。シーケンス関数を見て、この問題に関連すると思われるものがあるかどうかを確認してください。 http://l1sp.org/cl/17.3(全部あります!)