跳到内容

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();

readCharreadToken 函数都返回字符串。Sway 使用与 C 编程语言相同的规则来确定哪些字符构成整数和实数。这些函数都不接受参数;它们使用当前输入端口。

要读取符号,请将symbol 函数与readToken 函数结合使用

   s = symbol(readToken());

要读取一行文本,请使用内置的readLine 函数

   l = readLine();
   

readLine 函数读取到下一个换行符(包括换行符),但换行符不属于返回的字符串。

pause 函数始终从stdin读取,无论当前输入端口是什么。它读取(并丢弃)一行文本(直到换行符)。其目的是在调试时暂停程序执行。

大多数输出函数写入当前输出端口。

最简单的输出函数是display。它接受一个参数,可以是任何 Sway 对象

   display("Hello, world!\n");

字符序列“\”后跟“n”表示要显示一个换行符。

比 display 更有用的是函数printprintln,因为它们接受任意数量的参数

   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,无论当前输出端口是什么。

漂亮打印

[编辑 | 编辑源代码]

有三个内置漂亮打印函数:ppppFlatppObject。它们将所有 Sway 对象的合理表示打印到当前输出端口。ppppFlat 之间的区别在于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 函数接受一个字符串作为其唯一参数,但只回退字符串的第一个字符;字符串中的后续字符将被忽略。


递归 · 数组和列表

华夏公益教科书