Typed Racket の前例があるんで、マクロで型付きLispは実現可能だってことは知ってたんだけど、まさか Common Lisp でも Coalton というこんな本格的な型システムが実装されてしまうなんて。
Timeline for it list by senooken, page 96
-
きゅーけー (tojoqk@mastodon.tojo.tokyo)'s status on Friday, 31-Dec-2021 17:19:15 JST
きゅーけー
-
きゅーけー (tojoqk@mastodon.tojo.tokyo)'s status on Friday, 31-Dec-2021 17:17:30 JST
きゅーけー
Common Lisp は asdf 周りとか defsystem 周りでよく分かっていないところがあるんで本格的に使うならそこら辺を勉強しないとな。
-
きゅーけー (tojoqk@mastodon.tojo.tokyo)'s status on Friday, 31-Dec-2021 17:16:07 JST
きゅーけー
型クラスでなんかやりたいけど、動的型付きプログラミングに慣れすぎてしまってすぐには何も思いつけない。
-
きゅーけー (tojoqk@mastodon.tojo.tokyo)'s status on Friday, 31-Dec-2021 17:15:20 JST
きゅーけー
もちろん、実行時ではなくてコンパイル時に……。
-
きゅーけー (tojoqk@mastodon.tojo.tokyo)'s status on Friday, 31-Dec-2021 17:14:58 JST
きゅーけー
ちゃんと宣言した型と違うのを返そうとすると型エラーになるな。素晴しすぎて泣けてくる。
-
きゅーけー (tojoqk@mastodon.tojo.tokyo)'s status on Friday, 31-Dec-2021 17:10:51 JST
きゅーけー
ただどういうときに末尾再帰してくれるかは処理系によって違うんで理想的には Coalton 側が末尾再帰形式を変換してくれた方が良い感じする。
しかし、そもそもカリー化されてるためにいっぱい呼び出しを実行しちゃう問題も処理系の最適化に任せる雰囲気っぽいんであんまり期待できないかもしれない。https://github.com/coalton-lang/coalton/blob/b36c38226dcd2a6da3b3146125930eb179baa583/docs/design-docs/function-calls.md
-
きゅーけー (tojoqk@mastodon.tojo.tokyo)'s status on Friday, 31-Dec-2021 17:08:26 JST
きゅーけー
Coalton が末尾再帰の形式にしてくれない件は sbcl であれば (optimize (speed 3) (safety 0)) を指定することで回避できた。
-
きゅーけー (tojoqk@mastodon.tojo.tokyo)'s status on Friday, 31-Dec-2021 17:02:14 JST
きゅーけー
Coatlon 使ってれば型安全なんだし、safety とか要らんくね。
-
きゅーけー (tojoqk@mastodon.tojo.tokyo)'s status on Friday, 31-Dec-2021 17:01:50 JST
きゅーけー
Optimize 設定しようぜみたいな話は書いてあるな。https://github.com/coalton-lang/coalton/blob/b36c38226dcd2a6da3b3146125930eb179baa583/docs/design-docs/function-calls.md
-
きゅーけー (tojoqk@mastodon.tojo.tokyo)'s status on Friday, 31-Dec-2021 16:59:08 JST
きゅーけー
理屈の上ではできそうなんで移植性のことを考えると、末尾再帰の最適化は Coalton 側が請け負った方が良い気がするな。
とりあえず、sbcl でどうしたら回避できるか確認するか。
-
きゅーけー (tojoqk@mastodon.tojo.tokyo)'s status on Friday, 31-Dec-2021 16:57:34 JST
きゅーけー
スペシャル変数とフック以外のケースで末尾呼び出しが最適化された場合に関数の挙動が変わってしまうケースを知らない。
-
きゅーけー (tojoqk@mastodon.tojo.tokyo)'s status on Friday, 31-Dec-2021 16:56:10 JST
きゅーけー
ただ理屈の上では coalton 側で末尾再帰の最適化程度は可能なはず。Common Lisp で末尾再帰の最適化ができないのは主にスペシャル変数とフックのせいだし(個人的な認識です)。
-
きゅーけー (tojoqk@mastodon.tojo.tokyo)'s status on Friday, 31-Dec-2021 16:54:04 JST
きゅーけー
optimizeが指定できればいいんだけど。
-
きゅーけー (tojoqk@mastodon.tojo.tokyo)'s status on Friday, 31-Dec-2021 16:53:34 JST
きゅーけー
あ、coalton 側で tail recursion の最適化はしてくれないっぽいな。普通に SB-KERNEL::CONTROL-STACK-EXHAUSTED って言われてしまった。下の関数に (neko 100000) って入れただけなのに。これは回避法の模索が要るな。Coalton が関数型言語である以上、処理系に依存してでも末尾再帰は最適化されて欲しいところがある。
-
きゅーけー (tojoqk@mastodon.tojo.tokyo)'s status on Friday, 31-Dec-2021 16:48:57 JST
きゅーけー
とりあえず tail recursion の最適化がなされるのかどうか確認するか。coalton がやってくれるならそうとう嬉しいんだけど……。
-
きゅーけー (tojoqk@mastodon.tojo.tokyo)'s status on Friday, 31-Dec-2021 16:40:26 JST
きゅーけー
おおお、ちゃんと Coalton 動くー!すごい。Common Lisp で静的型付きプログラミングできるし型クラスまであるぞ!
-
きゅーけー (tojoqk@mastodon.tojo.tokyo)'s status on Friday, 31-Dec-2021 16:35:06 JST
きゅーけー
おお、coalton 動いた!これで Haskell 的な型システムでプログラミングして Common Lisp から使えるじゃん!これはやばい。
-
きゅーけー (tojoqk@mastodon.tojo.tokyo)'s status on Friday, 31-Dec-2021 16:31:08 JST
きゅーけー
いや、define のスペルをミスったアホなだけだった。
-
きゅーけー (tojoqk@mastodon.tojo.tokyo)'s status on Friday, 31-Dec-2021 16:30:21 JST
きゅーけー
とりあえず、factorial を定義して動いたら満足したい。
-
きゅーけー (tojoqk@mastodon.tojo.tokyo)'s status on Friday, 31-Dec-2021 16:29:37 JST
きゅーけー
お、coalton、インデントの設定を結構しないと使えない感じするな?