idol言語は私が開発した自作言語です。Iconという昔あった言語とその特徴的な仕組みであるゴール指向評価のアイデアに興味を持って、自分でもさっそく実装してみました。
そもそもゴール指向評価とは?
Wikipediaの解説が分かりやすかったので引用します。
Iconの中心的な特徴の1つは制御構造を真理値によるものから、成功か失敗によるものへと変更したことである。このモデルでは、
if a < b
のような単純な比較は多くの言語のように「もし式全体が真と評価されるならば」 という意味ではなく、「もし処理全体が成功ならば」 というような意味である。この場合は比較が成り立つなら、
<
演算子は成功する。よってIconとその他の言語で実行結果は同じとなる。この方式がより興味深いのは、if a < b < c
のような場合である。
<
演算子は、比較が成り立つときは成功であると同時に、二番目の引数を値として返す。したがって、a < b
の部分を評価して成功すれば、値としてb
を返すので、つづいてb < c
を評価することになる。当然、評価の時に一度でも失敗すれば、全体として失敗である。 このような比較は、ほとんどの言語ではこのまま記述することができないが、Iconでは可能である。
出典:https://ja.wikipedia.org/wiki/Icon#ゴール指向評価
なるほど、面白いなー(感心)
idol言語
私のidol言語でもこのように書けます。
let age = 7;
if (6 <= age <= 12) "小学生"
このゴール指向評価の仕組みを逆説的に言えば、普通のif
文でRustにおけるif let
のようなエラー処理が出来るって事です。
func { inc n } (n + 1);
if { inc 5 } it else "fault";
if { ink 5 } it else "fault";
このコードの場合、2行目はinc
関数が定義されているので6
が返されますが、3行目のink
は定義されてないので"fault"
が返ります。
サンプルコード
お約束のFizzBuzz問題を解くプログラムです。
func ( fizzbuzz n ) {
if (n % 15 == 0) "FizzBuzz"
else {
if (n % 3 == 0) "Fizz"
else {
if (n % 5 == 0) "Buzz"
else { fault }
}
}
};
let i = 1;
while (1 <= i <= 100) {
print {
if { fizzbuzz i } it
else { cast i to text }
} + new-line;
let i = i + 1
}
まとめ
ゴール指向評価は個人的に好きで、もっと広く使われて然るべきと思います。
他の言語でもゴール指向評価を採用してるのがあればコメントして教えて頂けると嬉しいです。
idol言語はまだまだ開発途中なのでこれからも機能を追加していくつもりです。
ありがとうございました!