我知道你可以使用(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)))
谢谢!
答案 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。
你不能只应用字符串,你只能应用方案数据,字符串是方案数据是的,但不是程序。