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)のリストを受けとることができ,関数名につづく()にリストが記述される. greetstr(文字列)型の引数をuserという名前で受けとる.関数は処理の結果を呼び出し元に_返す_ことができる. asknamestr型の返り値を返す. 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_で,[]u8io::EOFを残して,プログラムを終了させる.

これに対応するために,as演算子を使って,値を[]u8とみなすように処理する - これは,型アサーションと呼ばれる.他のアサーションと同じく,コンパイラは,処理内容をチェックし,間違っていることが分ればプログラムをクラッシュさせる.プログラムを実行し,名前を入力する代わりにCtrl+Dを押すことで,これのケースを再現させることができる.

ここでの収穫はharedocツールである.hareで処理する時には自由につかえる.このサンプルで使っているlstrigns::fromutf8のような,他の標準ライブラリの関数を学ぶためにも,使ってみてほしい.モジュールそのものについて確認することもできる - haredoc fmtharedoc stringsを試してみよう.