2023/5/9 Unisonを軽く触る
from Unison
Unisonを入れて簡単なプログラムを動かしてみる
Unison何もわかってないが、とりあえず触ってみる
参考
⏳ Three-minute quickstart guide · Unison programming language
👀 Unison at a glance · Unison programming language
Unison言語でHello worldする
Nixでunisonを入れる
$ nix-shell -p unison-ucm
とりあえずDesktopで適当なディレクトリを作ってみて試す
$ cd ~/Desktop
$ mkdir unison
$ cd unison
Unisonを起動する
$ ucm
インタプリタが立ち上がり何かが諸々ダウンロードされる
標準ライブラリがダウンロードされてるらしい
https://gyazo.com/10e5caf0075bab4eebce696897afd135
このタイミングで、~/.uniosn/v2/uniosn.sqlite3というのができてたmrsekut.icon
名前空間を切る
code:ucm
.> cd quickstart
(以下、ucmというコードブロックはインタプリタ上の表示を表すことにする)
https://gyazo.com/63bd22e29ce880c393ef79bd3db2e421
この名前空間内にライブラリのコピーを作成する(?)
libという名前空間に依存関係の諸々があるらしい
forkコマンドを使って、lib.baseを.baseにコピーする
code:ucm
.quickstart> fork .base lib.base
Done.
viewコマンドを見るとlibで提供されているコードの定義が見れる
https://gyazo.com/f499a9a411dc3f9fad1d953a2743c928
適当にファイルを作る
$ touch aa.u
拡張子が.uなら何でも良いっぽい
下記を書いて保存する
code:aa.u(hs)
myTerm = List.map (x -> x * 10) 1,2,3,4,5,6
インタプリタのほうがなんか反応する
https://gyazo.com/de7207097125319dec6050456ff875c9
更に以下のように1行足すと、
code:aa.u(hs)
myTerm = List.map (x -> x * 10) 1,2,3,4,5,6
myTerm
実行された結果が表示される
https://gyazo.com/9fb8d6e7ee34bef81d8d5b61dbe5dcd4
>から始まる式をwatch expressionと呼ぶらしい
hello worldを書く
code:aa.u(hs)
helloWorld : '{IO, Exception} ()
helloWorld = do
printLine ("Hello World")
'{..}はEffectやね
何故かこれは> helloWorldで実行できない
インタプリタ上で以下のようにすると実行できた
code:ucm
.quickstart> run helloWorld
Hello World
()
pipeline operatorある
code:aa.u(hs)
sum =
Nat.range 0 10
|> List.map (x -> x Nat.* 100)
|> List.filter (const true)
|> List.foldLeft (Nat.+) 0
sum
フィボナッチを書いてみる
code:aa.u(hs)
fib : Nat -> Nat
fib n =
use Nat *
if n == 0 then 0
else if n == 1 then 1
else fib (n - 1) + fib (n - 2)
> fib 26とかすると一瞬待つが2回目以降はすぐ答えが得られるのがわかる
キャッシュされている