2

Common Lisp では、実数のリストの形式でユーザー入力をキャプチャする必要があります。このリストは、連続する 2 つのゼロで終了します。たとえば5.0 0 6.0 3 2.0 5 1.0 7 13.0 8 0 0、 list を返す必要があります(5.0 0 6.0 3 2.0 5 1.0 7 13.0 8)

私は関数に出くわしましたread-delimited-list、これは単一の文字を終点として受け取ります。単一のゼロで停止することはできますが、この関数を展開する方法がわかりません。また、char の代わりに区切られた文字列を取る別の関数も知りません。

編集受け入れられた回答のおかげで、私は以下を開発しました:

(butlast (loop for y = -1 then x for x = (read stream) until (and (= 0 x) (= 0 y))
    collect x)))

私にはもう少し読みやすいように思えます (そして、この時点で、私の Lisp の目はわずか 3 日しか経っていないことを公然と認めています)、パフォーマンスへの影響についてはわかりません (collectループがスコープを終了した後にリストを追加または反転します) ? 最後の要素を切り落とす、または単純に追加しない簡単な方法はありますか?)。

4

2 に答える 2

0

Common Lisp で数値を解析する最良の方法は、ライブラリを使用することですparse-number。ユーザー入力を 1 行ずつ読み取ることができる場合は、単純に行を空白で分割parse-numberし、結果で使用できます。

于 2012-09-07T18:50:51.477 に答える