need_result
// (2007/6/12) 間違えて、この日の日記を一回消してしまいました。
最近実験的に追加した機能で「need_result」というものがあります。
意味ですが、これは「関数呼び出し元が、戻り値を必要としているかどうか」をtrueかfalseかで返す擬似変数です。
例で示します。
foo: fun(){
if(need_result){
"yes".p
}else{
"no".p;
}
}
a: foo(); //=> yes
foo(); //=> no
このとおり、関数呼び出しの結果が使われないような関数呼び出しで、need_resultはfalseとなります。
利用方法として、例えば「副作用が無い関数なので、戻り値が使われないような使い方をされたらエラーにしたい」場合とか
fib: fun(i){
assert need_result;
if(i<2){
return 1;
}else{
return fib(i-2) + fib(i-1);
}
}
fib(30).p; // 答えが出力される
fib(30); // assertion error
「戻り値が要らないなら、返す値の計算はしない」場合とか
fib: fun(i){
if(!need_result){
return;
}
if(i<2){
return 1;
}else{
return fib(i-2) + fib(i-1);
}
}
fib(30).p; // そこそこ時間がかかる
fib(30); // 一瞬で終わる
このように、関数呼び出し側が戻り値を欲しがっているかどうかで処理を分岐させることが出来ます。
さて、今回この「need_result」に替わる、新たな名称を募集します。
現在この「need_result」は予約語な訳ですがどうも微妙な感じです。アンダースコアが入った予約語とか見たことありません。
あと、以下のような文を簡単に書ける特別なreturnも提供したいのですが、これの名称も募集してます。
foo: fun(){
return_if_need_result 5 + 5;
/* ↑が↓と同じ意味となる特別なreturn
if(need_result){
return 5 + 5;
}else{
return;
}
*/
}
そもそもこんな機能は要らないんじゃないか等の意見も募集しております。