#include <comelang.h>
exception int fun()
{
return 1;
}
exception int fun2()
{
return fun();
}
int main(int argc, char** argv)
{
int x = fun2();
puts("OK");
printf("x %d\n", x);
return 0;
}
OK
x 1
#include <comelang.h>
exception int fun()
{
return none(s"ERR");
}
exception int fun2()
{
int y = fun();
printf("y %d\n", y);
return 9;
}
int main(int argc, char** argv)
{
int x = fun2();
puts("OK");
printf("x %d\n", x);
return 0;
}
ERR
#include <comelang.h>
exception int fun()
{
return 1;
}
exception int fun2()
{
int y = fun();
printf("y %d\n", y);
return 9;
}
int main(int argc, char** argv)
{
int x = fun2();
puts("OK");
printf("x %d\n", x);
return 0;
}
y 1
OK
x 9
#include <comelang.h>
exception int fun()
{
return none(s"ERR");
}
exception int fun2()
{
int y = fun();
printf("y %d\n", y);
return 9;
}
int main(int argc, char** argv)
{
int x = fun2().rescue {
puts("UHO!");
puts(Err);
return 0;
}
puts("OK");
printf("x %d\n", x);
return 0;
}
UHO!
ERR
#include <comelang.h>
exception int fun()
{
return 1;
}
exception int fun2()
{
int y = fun();
printf("y %d\n", y);
return none(s"ERR");
}
int main(int argc, char** argv)
{
int x = fun2().rescue {
puts("UHO!");
puts(Err);
return 0;
}
puts("OK");
printf("x %d\n", x);
return 0;
}
y 1
UHO!
ERR
exceptionを戻り値に持つ関数の中ではreturn none(string);が使えます。これを呼び出すと例外が発生します。stringは例外のメッセージです。呼び出し元の関数では.resuceしないと例外の文字列を表示してexitしてしまいます。.resuceすると例外が発生してもプログラムは終了しません。.resuceの中ではErrという変数に例外のメッセージが入ってます。関数がネストする場合はexceptionを呼び出し元の関数につけると深いネストでもreturn none(string);された時点で大域脱出して.resuceで例外を捕捉できます。