跳到內容

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 函式接受一個字串作為其唯一引數,但只回退字串的第一個字元;字串中的後續字元將被忽略。


遞迴 · 陣列和列表

華夏公益教科書