2016-04-09 10 views
1

Ich möchte von stdin Element für Element lesen, aber ich weiß nicht, wie man stoppt, wenn ich eine neue Zeile einfügen. Hier ist mein Code:Racket - lesen von stdin bis neue Zeile

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

Sie können '(read-line)' verwenden, um eine einzelne Zeile zu lesen, dann füttern Sie diese mit 'open-input-string' in' read'. Ich denke nicht, dass es möglich ist, 'read' so zu konfigurieren, dass Zeilenumbrüche nicht wie bei anderen Whitespaces konsumiert werden, obwohl es vielleicht mit einer Lesetabelle möglich wäre. Ich bin mir nicht sicher, ob das tatsächlich funktionieren würde oder nicht. –

+0

Es wird nur das erste Element gelesen. – zaig

+0

Akkurat könnte es funktionieren – zaig

Antwort

0

ich eine Lösung gefunden, die funktioniert wie ich erwartet hatte.

(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 '()) 

EDIT: Es wird nicht auf newline zu stoppen, aber für eof

0

Die Funktion read wird einen ganzen Bezug lesen. Wenn Sie Zeichen lesen möchten, bis Sie auf Newline, , drücken, müssen Sie jeweils ein Zeichen eingeben.

Das Zeilenumbruchzeichen wird geschrieben #\newline.

Etwas wie folgt aus:

#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

ich es wie dieses

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

mache vielleicht nicht die meisten idiomatische sein, aber es funktioniert. Verwenden Sie for/list oder ähnliches, um etwas Nützlicheres mit den gelesenen Zeilen zu tun.