Racket-从stdin读取直到新行



我想从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或类似方法对正在读取的行执行更有用的操作。

最新更新