Egison チュートリアルで遊びました
https://github.com/egison/egison-tutorial をやりました。Egison 3.7.12 を使用。
本文中に Egison ソースコードへのリンクがありますが、すべてコミットハッシュでリンクしているため最新版ではないかもしれません。
Stack でインストールする
Egison の README.md には cabal install egison egison-tutorial
せよと書かれていますが、cabal hell が嫌なので Stack を使いました。
egison
と egison-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-deps
へ egison
を追加したら上手くインストールできました。
egison-tutorial をやりながら戸惑ったこと
- 途中で
(/ (power pi 2) 6)
が出てきますが、これの型がよく分かりませんでした (追記: 現在この式は出てきません)。「級数で近似しよう!」という流れだったので小数としての値を見ようとしてみても、上手くいきませんでした。これはpi
が単にシンボルであるということと、power
は整数用だということが原因です。pi
は lib/math/common/constants.egi で定義されているシンボリックな定数。またf.pi
は hs-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項タプルは要素レベルまで潰されます。コレクションにはcar
やcdr
が使えます。((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
式を使え、と書いてあるのですが無くても大丈夫なのは何故でしょうか。
- マニュアルには、タプルを引数全体とするときには
コメント
このページへのコメントはこちらまで (GitHub Issueに飛びます)