在Scheme中获取一行用户输入?

时间:2010-07-04 00:32:20

标签: scheme

我知道你可以使用(read)来获取用户输入的表达式,但是(read)只会获得第一个表达式,之后会对其进行评估。我想知道是否有任何方法可以读取整行用户输入,或许将该行转换为列表?

(let ((input (read-user-line)))
   ;; user could type "cons 2 3" without quotes
   ;; input could contain '(cons 2 3)
   (apply (car input) (cdr input)))

谢谢!

3 个答案:

答案 0 :(得分:5)

如果您的Scheme是R6RS实现,您可以使用GET-LINE。如果同一个Scheme也实现了SRFI-13,您可以使用STRING-TOKENIZE将其转换为列表。

符合资格的一个方案是Ypsilon:

(import (srfi srfi-13))

(let ((input (get-line (current-input-port))))
  (for-each (lambda (x) (display x) (newline))
            (string-tokenize input)))
$ ypsilon try.scm
the quick brown fox jumps over the lazy dog.
the
quick
brown
fox
jumps
over
the
lazy
dog.

否则,您可以使用您的实现提供的任何非标准扩展。

答案 1 :(得分:2)

某些Scheme有一个read-line函数,它读取一行并将其作为字符串返回。

(但要从那里得到apply可能是另一回事。)

答案 2 :(得分:0)

您可以使用read-line将其作为字符串读取。

你刚刚将空格分成字符串列表

然后对那些使用with-input-from-string

的人使用read

然后你使用apply。

你不能只应用字符串,你只能应用方案数据,字符串是方案数据是的,但不是程序。