2011-12-06 7 views
2

私は完全にlispプログラミングの新人です。私は、xmlドキュメントから単語を読み込むクラスのプログラムを書く必要があります。とにかく、私は配列(ワード)とファイルストリーム(in)をとるこの関数を書いています。収集された各文字を単語に追加しながら、ストリームの#スペースに達するまでループします。私はその言葉を返すことを望む。私は間違ったことをしていると確信していますが、ここに私が持っている方法があります。私は、最後にリターン機能は完全に場違いであることをかなり確信している:リスプで返す値を指定する

(defun get-string (in word) 
    (loop for char = (read-char in nil) 
     while (not (char= char #\space)) 
     do(vector-push-extend char word)) 
    (return word)) 

は今、私は葯の問題があります。ループはスペースを見つけた後に文字を探し続け、私はたくさんのnilsを取得します。また、私は改行を止める必要がありますが、どうすればよいか分かりません。私はこれを結んだが、それはすべての文字を読み込むだけです。

(defun get-string (in word) 
(loop for char = (read-char in nil) 
     while (not (or (char= char #\space) 
       (char= char #\newline))) 
    do(print char)) 
    word) 

私はデバッガをよく理解していないし、私が読んでいる文字を見たいので、印刷文字がそこにあります。

答えて

4

は変数であり、変数はその値を評価します。 DEFUN本文では、最後の式の値が返されます。したがって、wordの値を戻したい場合は、wordを返す必要はありません。

1

明示的なreturn文は必要ありません。これは、字句の範囲からの早期返品のためのものです。

(defun get-string (in word) 
    (loop for char = (read-char in nil) 
     while (not (char= char #\space)) 
     do (vector-push-extend char word)) 
    word) 

をしかし、私はあなたの関数内の別の事を思ったんだけど:だから、このバージョンでは動作しますワードパラメータは、空の配列を渡されることを意図していますか?文字列の処理にバッファを渡す必要はありません.LispはCではありません。自動メモリ管理のおかげで、関数内に文字列を作成して返すことができます。あなたの新しく追加された質問について

(defun read-word (&optional (stream *standard-input*)) 
    (with-output-to-string (word) 
    (loop for char = (read-char stream nil) 
     while (and char 
        (char/= char #\Space) 
        (char/= char #\Newline)) 
     do (write-char char word)))) 

したがって、私はこのような流れから、スペースで区切られた単語を読み取るための機能を記述し、あなたのループがときに停止するべきではない私はなぜ表示されませんスペースを読みました。 OTOH、あなたがチェックしていないのは、EOFの場合の戻り値であるNILです。だからこそ私自身の機能でandに最初の条件(ただchar)を追加したのです。

EDIT:自分の関数を、独自の行バッファリングを使用しない関数に置き換えました。これは、脆弱で複雑すぎるため、ここでは不要です。また、拡張質問への回答を追加しました。

+0

私はあなたが何を意味しているのか分かりませんが、ファイルから単語を読み込んでいるのでストリームを渡しています。この関数の前に、別の文字を使って<>で囲まれたテキストをスキップしてから、ストリームをget-word関数に渡します。これはxmlタグの間で文字列を引っ張ります。 – webhound

+1

閉鎖は良いアイデアですか?異なるストリームからの読み込みはどうですか?スレッドの安全性?また、LETはDEFUNがトップレベルの構造であるのを防ぎます。 –

+0

@RainerJoswig:うまく機能しているプログラムからコードをコピーしました。しかし、問題が発生するケースが多すぎることは間違いありませんので、私は編集でそれを置き換えます。 –

関連する問題