如何使用控制台作为Guile Scheme的输入和输出?

时间:2016-07-15 11:09:19

标签: console scheme mit-scheme guile

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

但是,诡计解释者说这是一个无约束变量。我想知道如何使用端口从Guile Scheme脚本中获取输入并输出到控制台(Unix中的终端)。我仍然是Scheme和Linux的新手,一步一步明确表示赞赏。

另外,(display <object>)如何运作?它本身是否使用端口还是有另一种方式。

P.S。如果还有其他方式没有使用端口,请告诉我如何使用它。

2 个答案:

答案 0 :(得分:3)

如果你想读写SExps,你可以在guile中读取(写入),(写入),(显示)等,如果你想读取字符只使用(read-char)和(write-char) - - 他们都使用输入/输出端口resp。你选择了,默认情况下他们是stdin和stdout。一切都很简单(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中查看漂亮的打印模块(在非常长的性行为上,它很慢,但输出的格式非常好,非常适合代码生成):

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

如果你需要自己的解析器,请查看lalr模块(system base lalr)。

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

#!/usr/bin/guile -s
!#

(let ((x (read)))
  (display (* x x))
  (newline))

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

编辑将表达式更改为让克里斯建议的格式,实际上更少的括号越好

答案 1 :(得分:2)

在guile中你有两个功能:current-input-portcurrent-output-portthe 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)))))
从stdin读取将是:

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

写入stdout你可以使用display它也接受第二个参数,即端口relevant docs