Scheme 用球拍做输入的最佳方法?

Scheme 用球拍做输入的最佳方法?,scheme,racket,Scheme,Racket,在racket中读取stdin输入的最佳方法是什么 特别是我想从C++中选择 CIN > C,在这里我指定我要读取的东西的类型,然后返回它们。 < P>我将使用 Read < /Cuff>程序。如果事先知道要读取的数据类型,请使用读取字符,读取字符串,读取字节 另外,看看Scheme中读取格式化输入-ascanf的实现。您几乎可以做任何您想做的事情。。。在低级别,我建议使用(读取行)和(读取字节)。对于更高级别的处理(例如scanf),我建议在输入上进行regexp匹配。比如说 (regexp

在racket中读取stdin输入的最佳方法是什么


<>特别是我想从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)