我想从stdin逐元素读取,但我不知道如何在插入新行时停止。这是我的代码:
(define readNext
(lambda (tmp)
(let ([a (read)])
(if (equal? a ??????)
tmp
(readNext (cons (read) tmp))))))
我找到了一个可以按预期工作的解决方案。
(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:它不会在newline
上停止,但对于eof
函数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)
我是这样做的
(for ((_ (in-naturals)))
(define l (read-line))
#:break (eof-object? l)
(displayln l))
可能不是最地道的,但它很管用。使用for/list
或类似方法对正在读取的行执行更有用的操作。