Skip to content

Instantly share code, notes, and snippets.

@todays-mitsui
Last active January 25, 2020 00:49
Show Gist options
  • Save todays-mitsui/b14e9f1abd228213928c2ba06b592401 to your computer and use it in GitHub Desktop.
Save todays-mitsui/b14e9f1abd228213928c2ba06b592401 to your computer and use it in GitHub Desktop.
Mogul の文法・記法

REPL

https://mogul-lang.mudatobunka.org/

左下の枠に評価したい式を入力し、エンターキーを押下すると実行されます。
実行結果は左上の枠に表示されます。定義済みの関数は右の枠に一覧表示されます。

Syntax

変数

大文字アルファベット, 小文字アルファベット, アラビア数字, アンダースコアを変数名に使うことができます。
x, X, 0, 1, _, foo, Bar これらは全て正しい式で、それぞれ単体で評価できます。

例えば foo を評価すると結果は foo になります。
これは単に「foo は foo である」という意味です。

無名関数

仮引数 x を取り x を返す無名関数は以下のように書けます。

(x) => (x)

# または
x => (x)

# または
x => x

2変数以上の無名関数の例、
仮引数 x, y を取り、 x を返す無名関数は以下のように書けます。

(x, y) => x

実際には、 Mogul には1引数関数しか在りません。
2引数以上の関数は標準でカリー化されます。

上記の関数は実際には以下の関数を同等です。

# (x, y) => x と以下の式は同じもの
x => (y => x)

# または以下のように書くこともできる
x => y => x

関数呼び出し

無名関数には引数を与えて呼び出すことができます。(関数実行)
無名関数 x => x に引数 A を与えて呼び出すには以下のように書きます。

(x => x)(A)

関数呼び出しの結果は A になります。

(x => x)(A)
# => A

関数定義

変数や無名関数に名前を付けることができます。
例えば、無名関数 x => xi という名前を付けるには以下のように書きます。

i = x => x

名前を付けることで、無名関数を直接記述する代わりに名前を使って関数を呼び出せるようになります。
例えば、無名関数 x => x に引数 A を与えて呼び出す代わりに、先ほどの i を使って以下のように書けます。

i(A)
# 結果は (x => x)(A) の時と同じく A になる

Mogul には標準で多くの関数が定義済みです。

例えば論理代数でおなじみの true, false, and, or, not などが Mogul の関数として定義済みです。
試しに式 and(false, or(true, false)) を評価してみてください。

シンボル

変数とよく似たのものとしてシンボルがあります。シンボルはコロン : から始まります。 例えば、 :x, :A, :1, :_ などはみなシンボルです。

シンボルは通常の変数と同様に関数に与えて呼び出したり、引数を取って呼び出されたりできます。

# 関数 f にシンボル :x を与えて呼び出す
f(:x)

# シンボル :g を、引数 y で呼び出す
:g(y)

シンボルを特徴づけるのは、シンボルは関数名として使うことはできないということです。

# このようには書けない
:k = x => y => x

この特徴によってシンボルは「定義済み関数ではないことが確定している識別子」として振る舞います。

関数定義を調べる

定義済み関数の定義式を調べたいときには ? コマンドを使います。
例えばさきほど紹介した true の定義式を調べるには以下のようにします。

? true

すると以下のような応答があります。

true = x=>y=>x

このことから、 truex => y => x と同等のものとして定義されていることが分かります。

関数を削除する

定義済み関数を削除することができます。 例えば定義済みの関数 i を削除するには以下のように書きます。

i = i

この式が意味するのは「関数 i の定義を変数 i そのもので上書きすることができる」ということです。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment