https://github.com/egison/egison-tutorial をやりました。Egison 3.7.12 を使用。

本文中に Egison ソースコードへのリンクがありますが、すべてコミットハッシュでリンクしているため最新版ではないかもしれません。

Stack でインストールする

Egison の README.md には cabal install egison egison-tutorial せよと書かれていますが、cabal hell が嫌なので Stack を使いました。

egisonegison-tutorial は現状 Stack のパッケージ・リポジトリに登録されていないためか、そのままだと上手くインストールされてくれませんでした。stack install egison は成功しますがその後 stack install egison-tutorial でエラーが出ます。

C:\Users\nek>stack install egison-tutorial

Error: While constructing the build plan, the following exceptions were encountered:

In the dependencies for egison-tutorial-3.7.9:
    egison must match >=3.7.9, but the stack configuration has no specified version  (latest
           matching version is 3.7.12)
needed since egison-tutorial is a build target.

Some different approaches to resolving this:

  * Consider trying 'stack solver', which uses the cabal-install solver to attempt to find some
    working build configuration. This can be convenient when dealing with many complicated
    constraint errors, but results may be unpredictable.

  * Recommended action: try adding the following to your extra-deps
    in C:\sr\global-project\stack.yaml:

- egison-3.7.12

Plan construction failed.

エラーメッセージに書かれているように extra-depsegison を追加したら上手くインストールできました。

egison-tutorial をやりながら戸惑ったこと

  • 途中で (/ (power pi 2) 6) が出てきますが、これの型がよく分かりませんでした (追記: 現在この式は出てきません)。「級数で近似しよう!」という流れだったので小数としての値を見ようとしてみても、上手くいきませんでした。これは pi が単にシンボルであるということと、power は整数用だということが原因です。
    • pilib/math/common/constants.egi で定義されているシンボリックな定数。また f.pihs-src/Language/Egison/Primitives.hs で定義されている float の定数。
    • Egison は束縛されていない変数をシンボルとして扱い、計算をシンボリックに行います。pi(define $pi π) として定義されていて、π は束縛されていないのでシンボルとして扱われます。
    • (f./ (f.* f.pi f.pi) 6.0) なら小数で出てくるので、これを付記したらどう? という issue を立てました。 → 提案が受け入れられて式が更新されました。
  • 値の再帰的定義をするときの @ を、再帰的な呼び出しを行う関数の定義にも使うのかと思いました。 この項目に書かれていたことは僕の事実誤認でした。@ は変数を再帰的に参照するときにつける記号ではなく、collection を 1 段階 flatten するための記号です。(この説明を追加する PR を送りました。 → マージされました。)
  • {e1 e2 e3 ... en} がコレクションであり、[e1 e2 e3 ... en] がタプル。1項タプルは要素レベルまで潰されます。コレクションには carcdr が使えます。
  • ((lambda [$n $m] (+ n m)) 1 2)((lambda [$n $m] (+ n m)) [1 2]) はともにエラーが出ない。((lambda [$n $m $r] (+ n m r)) [1 2] 3) はエラー (Wrong number of arguments)。
    • マニュアルには、タプルを引数全体とするときには apply 式を使え、と書いてあるのですが無くても大丈夫なのは何故でしょうか。