2016-04-05 19 views
1

Racket, STDIN'den bir dize okuma yeteneğinden yoksun gibi görünüyor. TamamRacket'te gerçek standart girdi

$ racket 
Welcome to Racket v6.4. 
-> (define (s) (read-line))   

, sread-line bir çağrı için bir diğer adıdır.

-> (printf "You entered: ~a\n" s) 
You entered: 

Hatası: dize yazdırılır, ancak Raket basışı beklemez/STDIN/EOF/EOL.

-> (define n (read)) 
a 
-> n 
'a 

Arıza: Bu read bir çağrı yapar ve EOF/EOL bekler, sonra n atadığı ancak nsembolü değildizea'a atanır.

-> (read-line) 
"" 

Hatası: STDIN'den beklemez read-line arayarak, sadece boş bir dize döndürür.

-> (read-string 5) 
asdasdasdasd 
"\nasda" 
; sdasdasd: undefined; 
; cannot reference undefined identifier 
; [,bt for context] 

Hatası: Sadece STDIN'den 5 bayt ve görünüşe eval s gerisi okur ...?

-> (read-string 500000) 
asdasd 
asdasdaas 
a 
asdasd 
asdasd 


asdasd 

Hatası: Tam 500000 bayt okundu kadar dönmez ve EOL üzerinde dönmez. Python'un EOL olduğu zaman bir dizi döndüren input() benzeri veya Factor adlı readln benzeri, ham verileri current-input-port'dan nasıl okuyabilirim?

cevap

3

Bu, Racket REPL'nin giriş işleminin bir sınırlamasıdır. Bağımsız bir program yazarsanız iyi çalışır.

bilinen bir sınırlaması:

Burada sorunu açıklar posta listesinden bir alıntı. Düz "raket" tarafından uygulanan REPL, giriş akışını programın giriş akışından REPL ifadeleri için ayırmaz.

Daha fazla detay: Bu tür rahatsız edici olsa https://groups.google.com/d/msg/racket-users/0TTsA9-3HDs/9_mMWsgKFOMJ

+0

Yararlı bilgiler, teşekkür ederim. Bir geçici çözüm var mı yoksa düzeltilecek mi? – cat

+0

'(define (benim-oku-satırım) (let ([content (read-line)]) (if (string =? Content" ") (read-line) İçindekiler))) what is I şimdi kullanacağımı varsayalım. – cat