2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ゴール指向評価型言語 idol 入門

Last updated at Posted at 2024-11-28

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言語でもこのように書けます。

idol
let age = 7;
if (6 <= age <= 12) "小学生"

このゴール指向評価の仕組みを逆説的に言えば、普通のif文でRustにおけるif letのようなエラー処理が出来るって事です。

idol
func { inc n } (n + 1);
if { inc 5 } it else "fault";
if { ink 5 } it else "fault";

このコードの場合、2行目はinc関数が定義されているので6が返されますが、3行目のinkは定義されてないので"fault"が返ります。

サンプルコード

お約束のFizzBuzz問題を解くプログラムです。

idol
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言語はまだまだ開発途中なのでこれからも機能を追加していくつもりです。

ありがとうございました!

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?