diff --git a/runtime/src/main/fusion/modules/fusion/base.fusion b/runtime/src/main/fusion/modules/fusion/base.fusion index b8be3982d..d6affce75 100644 --- a/runtime/src/main/fusion/modules/fusion/base.fusion +++ b/runtime/src/main/fusion/modules/fusion/base.fusion @@ -75,6 +75,9 @@ To use this dialect for your module, declare it as follows: (require "/fusion/private/control") (provide and or when unless cond) + (require "/fusion/private/raise") + (provide exit) + (require "/fusion/equality") (provide = == === same ident) diff --git a/runtime/src/main/fusion/modules/fusion/private/builtins.fusion b/runtime/src/main/fusion/modules/fusion/private/builtins.fusion index c2c0fc92b..f558c99ff 100644 --- a/runtime/src/main/fusion/modules/fusion/private/builtins.fusion +++ b/runtime/src/main/fusion/modules/fusion/private/builtins.fusion @@ -16,7 +16,6 @@ (provide '#%top' apply - exit if is_blob is_bool diff --git a/runtime/src/main/fusion/modules/fusion/private/kernel2.fusion b/runtime/src/main/fusion/modules/fusion/private/kernel2.fusion index 55c1e62a2..d74d170ce 100644 --- a/runtime/src/main/fusion/modules/fusion/private/kernel2.fusion +++ b/runtime/src/main/fusion/modules/fusion/private/kernel2.fusion @@ -81,14 +81,6 @@ to the elements of `sequence`. The `proc` is called in tail position. (java_new "dev.ionfusion.fusion.ApplyProc")) - (define_values (exit) - ''' - (exit) -Exits the running Fusion program. - ''' - (java_new "dev.ionfusion.fusion.ExitProc")) - - (define_syntax if ''' (if test then else) diff --git a/runtime/src/main/fusion/modules/fusion/private/raise.fusion b/runtime/src/main/fusion/modules/fusion/private/raise.fusion index 949c64161..6a07bf879 100644 --- a/runtime/src/main/fusion/modules/fusion/private/raise.fusion +++ b/runtime/src/main/fusion/modules/fusion/private/raise.fusion @@ -7,6 +7,7 @@ (provide assert + exit raise raise_argument_error raise_arity_error @@ -88,4 +89,13 @@ Note that a `result_error` IS-A `contract_error`. ''' (java_new "dev.ionfusion.fusion.RaiseResultErrorProc")) + + (define_values (exit) + ''' + (exit) + +Terminates the current Fusion thread. + ''' + (lambda () + (raise (java_new "dev.ionfusion.fusion.ExitException")))) ) diff --git a/runtime/src/main/java/dev/ionfusion/fusion/ExitProc.java b/runtime/src/main/java/dev/ionfusion/fusion/ExitProc.java deleted file mode 100644 index cbc742f05..000000000 --- a/runtime/src/main/java/dev/ionfusion/fusion/ExitProc.java +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright Ion Fusion contributors. All rights reserved. -// SPDX-License-Identifier: Apache-2.0 - -package dev.ionfusion.fusion; - - -/** - * Throws an {@link ExitException}, which will generally cause the runtime - * to exit its evaluation. - */ -final class ExitProc - extends Procedure0 -{ - @Override - Object doApply(Evaluator eval) - throws ExitException - { - throw new ExitException(); - } -}