Hare Lang Tutorial1からの続き...
関数とパラメーター(Functions & parameters)
function_and_parameter.ha
use bufio;
use fmt;
use os;
use strings;
export fn main() void = {
const user = askname();
greet(user);
};
// Ask the user to provide their name.
fn askname() str = {
fmt::println("Hello! Please enter your name:")!;
const name = bufio::read_line(os::stdin)! as []u8;
return strings::fromutf8(name)!;
};
// Greets a user by name.
fn greet (user: str) void = {
fmt::printfln("Hello, {}!", user)!;
};
プログラムを実行するとHello! Please enter your name:
のあとにプロンプトで入力を待ち憂け,入力された値をユーザー名として"Hellor! {ユーザー名}“のように出力する. 関数はプログラムの処理を実行する基本単位で複数のタスクをひとかたまりにして呼べるようにしたもの. 関数は,引数(parameters)のリストを受けとることができ,関数名につづく()
にリストが記述される. greet
はstr
(文字列)型の引数をuser
という名前で受けとる.関数は処理の結果を呼び出し元に_返す_ことができる. askname
はstr
型の返り値を返す. main
関数では返り値を変数
の保存してgreet
関数に_渡している_.
入力待ちをくわしく(A closer look at bufio::read_line)
askname
のように,標準ライブラリの関数bufio::read_line
も返り値を返す. heredoc bufio::read_line
コマンドでドキュメントをみてみる.
fn read_line(h: iohandle) ([]u8 | io::EOF | io::error)
関数のシグニチャ(パラメーターと返り値の組み合わせ)は少し複雑で,タグ付き共有体(tagged union) とよばれる,値のいくつかの種類(または 型 )のうちひとつを返す.[]u8
- 読み出したいバイト列を格納した"slice"か,io::EOF
- “end of file"に到達したことを示すか,io::error
- I/Oエラーを示す,のいずれかを返す.
haredoc io::error
コマンドを実行すると,シグニチャの前に!
(error_flag)が付いている.これはio::errorが error type であることを意味する.次にharedoc io::EOF
コマンドを実行し!
が付いていないことを見る.ファイルの終端への到達はエラーとみなさない.前述のとおり,!
はプログラムにおいてエラーケースとして扱われる_error_assertion operator_で,[]u8
とio::EOF
を残して,プログラムを終了させる.
これに対応するために,as
演算子を使って,値を[]u8
とみなすように処理する - これは,型アサーションと呼ばれる.他のアサーションと同じく,コンパイラは,処理内容をチェックし,間違っていることが分ればプログラムをクラッシュさせる.プログラムを実行し,名前を入力する代わりにCtrl+Dを押すことで,これのケースを再現させることができる.
ここでの収穫はharedocツールである.hareで処理する時には自由につかえる.このサンプルで使っているlstrigns::fromutf8
のような,他の標準ライブラリの関数を学ぶためにも,使ってみてほしい.モジュールそのものについて確認することもできる - haredoc fmt
やharedoc strings
を試してみよう.