Glispの式は、型のミスマッチがあろうと実行時エラーがあろうと、極力何らかの値を返そうとする。そういった際、暗黙的にデフォルト値などにフォールバックするのではなく、ログを保持する。
~~Eval, Inferのいずれにおいても、Logが発生する可能性がある。~~ここはやっぱりEvalに絞ったほうが良い気がする。Logはそれが発生したAstへの参照を持ち、Astはそれ自身から発生したLogをキャッシュする。
Ast | eval | infer |
---|---|---|
Sym | - | Not bounded, Circular reference |
Obj | - | - |
Literals | - | - |
Defn | - | |
DefTyFn | - | - |
EVec, EDict | ||
Call | 関数内部でのLog, 引数のミスマッチ | |
Scope | - | - |
元々はWriter型にしていたが、子孫要素のLogを集める必要がなくなった。
ただ一方、Fn値(Glispからブートストラップされた関数)を適用する時、bodyの内部から生じたLogは集めてやる必要がある。