2016-04-09 30 views
1

我想从标准输入读取元素,但我不知道如何停止当我插入一条新线。 这里是我的代码:球拍 - 从标准输入读取,直到新线

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

您可以使用'(读线)'读取一行,然后使用'open-input-string'将其提供给'read'。我不认为可以将'read'配置为不像其他类型的空白那样消耗换行符,尽管使用readtable可能是可行的吗?我不确定这是否会起作用。 –

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

编辑:它不会停止在newlineeof

0

功能read将读取整个数据。 如果你想阅读字符,直到你点击换行符, ,你将不得不一次一个字符。

换行符写为#\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或类似的方法可以对正在读取的行更有用。