我知道Scheme使用端口来执行输入和输出。在尝试学习如何获得控制台输入和输出时,我遇到了MIT-Scheme的console-i/o-port
变量。
但是,诡计解释者说这是一个无约束变量。我想知道如何使用端口从Guile Scheme脚本中获取输入并输出到控制台(Unix中的终端)。我仍然是Scheme和Linux的新手,一步一步明确表示赞赏。
另外,(display <object>)
如何运作?它本身是否使用端口还是有另一种方式。
P.S。如果还有其他方式没有使用端口,请告诉我如何使用它。
答案 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-port
和current-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)))))
从stdin读取将是:
(read-port (current-input-port))
写入stdout你可以使用display
它也接受第二个参数,即端口relevant docs