2016-04-09 6 views
1

stdin要素から要素を読み込みたいが、新しい行を挿入するときにどのように停止するかわからない。Racket - stdinから新しい行までを読み取る

(define readNext 
    (lambda (tmp) 
    (let ([a (read)]) 
    (if (equal? a ??????) 
     tmp 
     (readNext (cons (read) tmp)))))) 
+1

'(read-line)'を使って1行を読み込んでから、 'open-input-string'を使って' read'に送ることができます。他の種類の空白のように改行を消費しないように 'read'を設定することは可能ですが、読み込み可能なテーブルを使って行うことは可能でしょうか?それが実際に動くかどうかは分かりません。 –

+0

最初の要素だけが読み込まれます。 – zaig

+0

実際に動作する可能性があります – zaig

答えて

0

は私が期待どおりに動作解決策を見つけた: はここに私のコードです。

(define a (open-input-string (read-line))) 
(define readNext 
    (lambda (tmp) 
    (let ([b (read a)]) 
    (if (equal? b eof) 
     tmp 
     (readNext (append tmp (list b))))))) 

(readNext '()) 

編集:それはnewlineに停止しませんが、eof

0

機能readのための全体データムを読み込みます。 改行するまで文字を読みたい場合は、 を一度に1文字ずつ使用する必要があります。

改行文字は#\newlineと書かれています。このような

何か:

#lang racket 
(define read-a-line-as-list 
    (lambda() 
    (let ([c (read-char)]) 
    (if (equal? C#\newline) 
     '() 
     (cons c (read-a-line-as-list)))))) 

(define read-a-line 
    (lambda() 
    (list->string (read-a-line-as-list)))) 

(read-a-line) 
0

私が最も慣用的であってもよいが、それが動作しない場合があります。この

(for ((_ (in-naturals))) 
    (define l (read-line)) 
    #:break (eof-object? l) 
    (displayln l)) 

ようにそれをやっています。 for/listなどを使用して、読み込み中の行にもっと便利な処理をしてください。

関連する問題