4

Visual Lisp では、 を使用(atoi "123")して に変換"123"できます123。clisp には「atoi」のような関数がないようです。

どんな提案でも大歓迎です!


'(1 2 3 20 30)に変換したいのですが"1 2 3 20 30"、それを行う最善の方法は何ですか?

parse-interger文字列を整数に変換でき、整数を文字列に変換する方法は? format関数を使用する必要がありますか?

(map 'list #'(lambda (x) (format nil "~D" x)) '(1 2 3)) => ("1" "2" "3")

しかし、haskellのようにそれをcnovertする方法が"1 2 3"わかりません:

concat $ intersperse " " ["1","2","3","4","5"] => "1 2 3 4 5"

心から!

4

1 に答える 1

10

read-from-stringCommon Lisp では、この目的のために関数を使用できます。

> (read-from-string "123")
123 ;
3

ご覧のとおり、主な戻り値は読み取られたオブジェクトであり、この場合はたまたま整数です。2 番目の値 (位置)は説明が難しいですが、ここでは、同じ入力を消費する読み取り関数への後続の呼び出しで次に読み取る必要がある文字列内の次の文字を示しています。

整数を読み取るためだけに調整されていないことread-from-stringは明らかです。そのために、parse-integer関数に目を向けることができます。そのインターフェースは次のようになりread-from-stringます。

> (parse-integer "123")
123 ;
3

への類似物を求めていたことを考えるとatoiparse-integer関数はより適切な選択です。


質問の 2 番目の部分である後編集に対処すると、format関数を使用して文字列をインターリーブ (または「散在」) させることができます。この例では、format反復制御ディレクティブ ~{(開始)、~}(終了)、および~^(残りの入力が空の場合は終了)を使用して、単一のスペース文字を区切り文字列としてハードコーディングします。

> (format nil "Interleaved: ~{~S~^ ~}." '(1 2 3))
"Interleaved: 1 2 3."

大まかに翻訳すると、フォーマット文字列は次のようになります。

入力リスト ( ) の各項目について~{、通常の変換 ( ~S) で項目を出力します。アイテムが残っていない場合は、反復を停止します ( ~^)。それ以外の場合は、スペースを出力してから、次の項目 ( ) でプロセスを繰り返します~}

そこに単一のスペースをハードコーディングすることを避け、区切り文字列を個別に指定された値として受け入れたい場合は、いくつかの方法があります。ここでそれほどの柔軟性が必要かどうかは明らかではありません。

于 2011-09-20T04:14:00.023 に答える