Sway 参考手册/输入和输出
Sway 使用一个端口系统进行输入和输出。当 Sway 启动时,当前输入端口默认为stdin(键盘),而当前输出端口默认为stdout(屏幕)。
要更改这些端口,首先创建一个新的端口,然后设置端口。例如,要从文件(例如“data”)而不是键盘读取,首先创建一个文件端口
var p = open("data",:read); //p points to a port var oldInput = setPort(p);
设置端口后,所有输入将来自新端口。
要更改输出端口,过程类似,只是符号:write被使用。
var p = open("data",:write); //p points to a port var oldOutput = setPort(p);
在:write模式下打开文件将覆盖文件;要将内容追加到现有文件,请使用:append符号代替。
Sway 仅允许在任何给定时间打开有限数量的端口。如果您不再需要端口,请使用内置函数close关闭它,该函数接受端口作为其唯一参数
close(p);
Sway 提供内置函数来读取字符、整数、实数、字符串和空格分隔的标记
s = readChar(); i = readInt(); r = readReal(); s = readString(); t = readToken();
readChar 和 readToken 函数都返回字符串。Sway 使用与 C 编程语言相同的规则来确定哪些字符构成整数和实数。这些函数都不接受参数;它们使用当前输入端口。
要读取符号,请将symbol 函数与readToken 函数结合使用
s = symbol(readToken());
要读取一行文本,请使用内置的readLine 函数
l = readLine();
readLine 函数读取到下一个换行符(包括换行符),但换行符不属于返回的字符串。
pause 函数始终从stdin读取,无论当前输入端口是什么。它读取(并丢弃)一行文本(直到换行符)。其目的是在调试时暂停程序执行。
大多数输出函数写入当前输出端口。
最简单的输出函数是display。它接受一个参数,可以是任何 Sway 对象
display("Hello, world!\n");
字符序列“\”后跟“n”表示要显示一个换行符。
比 display 更有用的是函数print 和println,因为它们接受任意数量的参数
print("(f(x) is ",f(x),"\n"); println("(f(x) is ",f(x));
println 函数与print 类似,只是在显示最后一个参数后输出一个换行符。因此,上面的两个调用产生相同的输出。
当打印字符串时,引号不会显示。同样,当打印符号时,冒号也不会显示。
inspect 函数在../ch10中有更详细的讨论,但简而言之,它打印出其参数的未评估版本,然后是其已评估的参数
sway> inspect(f(x)); f(x) is 3 INTEGER: 3
inspect 函数始终打印到stdout,无论当前输出端口是什么。
有三个内置漂亮打印函数:pp、ppFlat 和ppObject。它们将所有 Sway 对象的合理表示打印到当前输出端口。pp 和ppFlat 之间的区别在于ppFlat 将所有连续的空白(包括制表符和换行符)合并为单个空格,从而在一行上打印表示形式。
ppObject 函数用于以对象形式打印 Sway 函数。给定函数
function f(x) { var y = x + 1; y * y; }
pp 函数输出
sway> pp(f); function f(x) { var y = x + 1; y * y; } FUNCTION: <function f(x)>
而ppObject 函数输出
sway> ppObject(f); <FUNCTION 2626>: context: <OBJECT 807> prior: :null filter: :null parameters: (x) code: { var y = x + 1; y * y } name: f FUNCTION: <function f(x)>
如果默认格式不可接受,可以使用fmt 函数格式化数字和字符串。它使用 C 编程语言格式化方案,接受格式规范作为字符串,以及要格式化的项目。该函数返回一个字符串。
例如,
sway>"<" + fmt("%6d",3) + ">"; STRING: "< 3>" sway>"<" + fmt("%-6d",3) + ">"; STRING: "<3 >"
格式规范以“%”开头,通常后面跟着一个数字,表示结果字符串的宽度(以字符数表示)。如果宽度为正数,则项目在结果字符串中右对齐。如果宽度为负数,则项目左对齐。在任何宽度规范之后是一个字符,指定要格式化的项目的类型:“d”表示整数,“f”表示字符串,而“s”表示字符串。
格式规范比这里显示的要复杂得多。您可以在 Linux 系统上通过在系统提示符处键入命令“man 3 printf”来了解更多信息。
eof? 函数可用于测试上次读取是否成功。该函数不用于测试下一个读取是否成功。以下是在标记文件中使用eof? 的典型示例
t = readToken(); while (eof?() == :false) { store(t); t = readToken(); }
有时,需要从输入中读取多一个字符。这种情况发生在诸如前进到输入中的空格之类的用例中。以下是一个典型的清除空格循环
ch = readChar(); while (space?(ch)) { ch = readChar(); }
//last character read wasn't whitespace //so push it back to be read again later
pushBack(ch);
pushBack 函数接受一个字符串作为其唯一参数,但只回退字符串的第一个字符;字符串中的后续字符将被忽略。