Scheme 用球拍做输入的最佳方法?
在racket中读取stdin输入的最佳方法是什么Scheme 用球拍做输入的最佳方法?,scheme,racket,Scheme,Racket,在racket中读取stdin输入的最佳方法是什么 特别是我想从C++中选择 CIN > C,在这里我指定我要读取的东西的类型,然后返回它们。 < P>我将使用 Read < /Cuff>程序。如果事先知道要读取的数据类型,请使用读取字符,读取字符串,读取字节 另外,看看Scheme中读取格式化输入-ascanf的实现。您几乎可以做任何您想做的事情。。。在低级别,我建议使用(读取行)和(读取字节)。对于更高级别的处理(例如scanf),我建议在输入上进行regexp匹配。比如说 (regexp
<>特别是我想从C++中选择<代码> CIN <代码> > C,在这里我指定我要读取的东西的类型,然后返回它们。 < P>我将使用<代码> Read < /Cuff>程序。如果事先知道要读取的数据类型,请使用
读取字符
,读取字符串
,读取字节
另外,看看Scheme中读取格式化输入-a
scanf
的实现。您几乎可以做任何您想做的事情。。。在低级别,我建议使用(读取行)和(读取字节)。对于更高级别的处理(例如scanf),我建议在输入上进行regexp匹配。比如说
(regexp-match #px" *([0-9]+)" (current-input-port))
这很容易。要跨Unix和Windows进行移植,需要附加选项
(read-line (current-input-port) 'any)
转换后检测到返回字符和换行字符
在文本模式下读取文件时自动执行。对于
例如,在Windows上以文本模式读取文件会自动更改
将换行符组合返回到换行符。因此,当文件
以文本模式打开,“换行符通常是合适的读取行
模式
因此,当输入端口不是文件(标准输入)时,“any”必须是可移植的
测试程序:
#lang racket
(let loop ()
(display "Input: ")
(define a (read-line (current-input-port) 'any))
(printf "input: ~a, length: ~a, last character: ~a\n"
a
(string-length a)
(char->integer (string-ref a (- (string-length a) 1))))
(loop))
在Windows中,将
(读取行(当前输入端口)'any)
替换为(读取行)
,然后查看发生了什么。以下是球拍方案中逐行处理的基础。它不会将输入行拆分为多个单词,也不会进行键入输入,但这似乎是一个放置它的好地方
(define (get)
(read-line (current-input-port)))
(define (put . vs)
(for-each display vs)
(displayln ""))
(define (sed fn)
(let ((line (get)))
(if (not (eof-object? line))
(begin
(fn line)
(sed fn))
'true)))
(sed (lambda (line)
(put "Hello, " line)))
这里有一个可以进行分割输入,也可以对CSV进行编码,以便更好地测量
(define (get)
(read-line (current-input-port)))
(define split string-split)
(define sep ",")
(define enc identity)
(define (enc-csv s)
(string-append "\"" (string-replace s "\"" "\"\"") "\""))
(define enc enc-csv)
(define (put . vs)
(displayln (string-join (map enc vs) sep)))
(define (sed fn)
(let ((line (get)))
(if (not (eof-object? line))
(begin
(fn line)
(sed fn))
'true)))
(sed (lambda (line)
(apply put (split line))))
这在球拍中起作用。我不确定其中有多少是特定于球拍的。如果输入中有括号,Read似乎有问题。什么样的问题?它对我来说工作得很好,括号中的表达式作为符号列表返回——正如预期的那样。你看过我链接的图书馆了吗?这类似于
scanf
,但在SchemeFor示例中,尝试使用它作为输入:(1 2 3
。然后调用(read)(read)(read)(read)(read)
。而不是生成四个字符串((
,1
,2
,3
),它产生了一个错误。这个库看起来很棒-谢谢!我希望找到一些内置的东西,这样我就可以看到这类东西的标准做法是什么。约翰·克莱门茨的答案正是我所寻找的。我理解read
的功能-这不是我所寻找的。@ÓscarLópez坏链接:c@cat我用simila更新了它r link,原来的版本已经一去不返了:(实际上,readline
应该可以跨Unix和Windows移植,而无需设置不同的选项(在文档中进一步提到)。这将导致:;字符串引用:契约冲突;预期:精确的非负整数?;给定:-1;参数位置:第二;其他参数…:;”;上下文:;标准输入:1:1循环
(Racket 6.10.1)