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