【问题标题】:How to use console as input and output for Guile Scheme?如何使用控制台作为 Guile Scheme 的输入和输出?
【发布时间】:2016-11-18 13:52:08
【问题描述】:

我了解 Scheme 使用端口来执行输入和输出。在尝试学习如何获取控制台输入和输出时,我遇到了 MIT-Scheme 的 console-i/o-port 变量。

但是,狡猾的解释器说它是一个未绑定变量。我想知道我们如何使用端口在 Guile 方案脚本中从控制台(Unix 中的终端)获取输入和输出。本人还是Scheme和Linux的菜鸟,清晰的一步一步来,不胜感激。

另外,(display <object>) 是如何工作的?它是固有地使用端口还是有其他方式。

附:如果有其他不使用端口的方法,请告诉我如何使用它。

【问题讨论】:

    标签: console scheme mit-scheme guile


    【解决方案1】:

    如果你想读和写 SExp,在 guile 你有 (read), (write), (display) 等等,如果你想读字符只使用 (read-char) 和 (write-char) - - 他们都使用输入/输出端口。您选择,默认情况下它们是标准输入和标准输出。一切都很简单 (https://www.gnu.org/software/guile/manual/html_node/Input-and-Output.html#Input-and-Output)。

    您可能还对 guile-ncurses (https://www.gnu.org/software/guile-ncurses/) 感兴趣。

    在更多好东西中,请查看来自 ice-9 的漂亮打印模块(在很长的 sexps 上它很慢,但输出它们的格式非常好,非常适合例如代码生成):

      (use-modules (ice-9 pretty-print))
      (pretty-print `(super cool stuff (+ 2 3) => ,(+ 2 3)))
    

    如果您需要自己的解析器,请查看 lalr 模块(系统基础 lalr)。

    编辑一个小例子,它读取一个数字,相乘并打印出结果:

    #!/usr/bin/guile -s
    !#
    
    (let ((x (read)))
      (display (* x x))
      (newline))
    

    (记得 chmod +x 这个脚本)。

    edit 将表达式更改为 let form 正如 Chris 所建议的那样,确实括号越少越好

    【讨论】:

    • 你能给我一个小脚本,用于从终端读取并将其平方和打印。我想知道 MIT-Scheme 中是否有 console-i/o-port 的替代方案?
    • @TarunMaganti 你去,这对你有帮助吗?也许你想要一个更精细的,但是这个与 stdin/out 配合得很好(我经常使用 guile ang gambit 和其他东西)。
    • 顺便说一句,((lambda (x) (* x x)) (read)) 更习惯地写成(let ((x (read))) (* x x))..
    • @ChrisJester-Young 谢谢,现在看起来好多了:)
    【解决方案2】:

    在 guile 中你有 2 个函数:current-input-portcurrent-output-port (the docs)

    要读取文本并将其放入字符串(如果您不想读取 s 表达式),您可以使用此函数:

    (define (read-port port)
        (let iter ((result '()) (chr (read-char port)))
            (if (eof-object? chr)
                (list->string result)
                (iter (append result (list chr)) (read-char port)))))
    

    从标准输入读取将是:

    (read-port (current-input-port))
    

    要写入标准输出,您可以使用display 它还接受第二个参数,即端口relevant docs

    【讨论】:

    猜你喜欢
    • 2019-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-05
    • 1970-01-01
    • 1970-01-01
    • 2019-08-20
    相关资源
    最近更新 更多