球拍 - 从标准输入读取到新线

时间:2016-04-09 01:04:26

标签: scheme racket

我想逐个元素地读取stdin,但是当我插入一个新行时我不知道如何停止。 这是我的代码:

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

3 个答案:

答案 0 :(得分: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 '())

编辑:它不会停留在newline上,而是eof

答案 1 :(得分: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)

答案 2 :(得分:0)

我这样做

compileSdkVersion

可能不是最惯用的,但它有效。使用(for ((_ (in-naturals))) (define l (read-line)) #:break (eof-object? l) (displayln l)) 或类似内容对正在读取的行执行更有用的操作。