2016-04-09 25 views
1

Stdin elementinden elemente okumak istiyorum ama yeni bir satır eklediğimde nasıl duracağımı bilmiyorum.Raket - stdin'den yeni hatlara kadar okunabilir

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

Tek bir satırı okumak için '(read-line)' seçeneğini kullanabilir, daha sonra bunu 'open-input-string' kullanarak 'read' olarak besleyebilirsiniz. Başka bir tür boşluk gibi yeni satırları kullanmamak için 'read' öğesini yapılandırabileceğini düşünmüyorum, ancak belki de okunabilir bir tablo kullanılarak yapılabilir mi? Bunun gerçekten işe yarayıp yaramadığından emin değilim. –

+0

Sadece ilk elemanı okuyacaktır. – zaig

+0

acctually çalışabilir – zaig

cevap

0

Ben beklendiği gibi çalışan bir çözüm buldu: İşte benim kodudur.

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

DÜZENLEME: newline üzerinde durmaz ancak eof

0

fonksiyon read için bütün bir referans noktasını okuyacaktır. Eğer siz yeni satır çarpana kadar karakterleri okumak istiyorsanız, aynı anda bir karaktere sahip olmanız gerekir.

Yeni satır karakteri #\newline yazılmıştır. Böyle

şey:

#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

Bu

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

gibi yapıyorum en deyimsel olmak, ama işe yarıyor olmayabilir. Okunan satırlarla daha faydalı bir şey yapmak için for/list veya benzeri kullanın.