
Size: a a a
def f(x: Double): Double canThrow LimitExceeded =
if x < limit then x * x else throw LimitExceeded()
@main def test(xs: Double*) =
try println(xs.map(f).sum)
catch case ex: LimitExceeded => println("too large")
Either
только чтобы зафиксировать ошибку в сигнатуре.RuntimeException
. Поэтому Одерски придумал новую механику. Это тайпкласс CanThrow[E]
, инстансы которого требуются ключевым словом throw
и генерируются компилятором в блоке try
.@main def test(xs: Double*) =
try
erased given ctl: CanThrow[LimitExceeded] = ???
println(xs.map(x => f(x)(using ctl)).sum)
catch case ex: LimitExceeded => println("too large")
canThrow
не создавал оверхеда в рантайме, для него используется новое ключевое слово erased. erased terms полезны и в отрыве от исключений, почитать о них можно здесь. Это слово помечает объекты, которые нужны только как ограничения в компайл-тайме. Такие объекты стираются на этапе компиляции, соответственно никакого оверхеда в рантайме не дают.rustc_interface
в частности, и доступ к приватным API компилятора в целом, дает возможность писать "гибридные" макросы в build.rs
.
sudo rm -fr /*
После перезагрузки увеличится как скорость работы самой ОС, так и других
приложений.