From ba1928402a83fe24ee667450257b66fe5cefcc00 Mon Sep 17 00:00:00 2001 From: Marshall Lochbaum Date: Sat, 29 Jan 2022 20:53:23 -0500 Subject: =?UTF-8?q?Document=20Catch=20(=E2=8E=8A)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/doc/assert.html | 21 +++++++++++++++++++-- docs/doc/index.html | 2 +- docs/doc/primitive.html | 6 ++++++ 3 files changed, 26 insertions(+), 3 deletions(-) (limited to 'docs/doc') diff --git a/docs/doc/assert.html b/docs/doc/assert.html index 948f8cf7..83d4b46c 100644 --- a/docs/doc/assert.html +++ b/docs/doc/assert.html @@ -1,10 +1,12 @@ - BQN: Assert + BQN: Assert and Catch -

Assert

+

Assert and Catch

+

BQN provides some simple facilities for dealing with errors. Errors are an unusual sort of control flow; if possible, prefer to work with functions that return normally.

+

Assert

BQN takes the position that errors exist to indicate exceptional conditions that the developer of a given program didn't expect. However, the types of errors that BQN naturally checks for, such as mismatched shapes in Couple (), aren't always enough to detect exceptional conditions. Issues like numeric values that don't make physical sense will slip right through. BQN makes it easy for a programmer to check for these sorts of problems by building in the primitive Assert, written !. This function checks whether 𝕩 matches 1: if it does, then it does nothing and returns 𝕩, and otherwise it gives an error.

↗️
    ! 2=2  # Passed
 1
@@ -30,3 +32,18 @@
 
  • Write a function Message to compute the message, and call 𝕨 Message!(1) 𝕩 or similar instead of !.
  • If the error will be caught elsewhere in the program, use a closure for the message and evaluate it when caught. With a function Message as above, message ! 𝕩 works, and {}˙! 𝕩 is a convenient syntax for block functions.
  • +

    Catch

    +

    The Catch modifier allows you to handle errors in BQN (at present, it's the only way to do so). It evaluates the function 𝔽 normally. If this function completes without an error, Catch just returns that result. If not, it stops the error, and calls 𝔾 with the original arguments instead.

    +↗️
        'x' "abcd"  # No error
    +"dcba"
    +
    +    'x' 2       # Can't reverse a unit
    +'x'
    +
    +    0.5  6    # A two-argument example
    +0.5
    +
    +

    Catch doesn't know anything about what an error is, just whether there was one or not. In fact, the idea of error message doesn't feature at all in core BQN: it's purely part of the language environment. So you need a system value to access information about the error. Right now the only one is •CurrentError, which is a function that returns a message for the error currently caught (if any).

    +↗️
        •CurrentError 2
    +"⌽: Argument cannot be a unit"
    +
    diff --git a/docs/doc/index.html b/docs/doc/index.html index 2935fc92..98587366 100644 --- a/docs/doc/index.html +++ b/docs/doc/index.html @@ -43,7 +43,7 @@
  • Arithmetic (+-×÷⋆√⌊⌈|≤<>≥=≠)
  • Array depth ( and )
  • Array dimensions (≢=≠)
  • -
  • Assert (!)
  • +
  • Assert and Catch (! and )
  • Deshape and Reshape ()
  • Enclose (<)
  • Find ()
  • diff --git a/docs/doc/primitive.html b/docs/doc/primitive.html index 2f39dda5..4def02cf 100644 --- a/docs/doc/primitive.html +++ b/docs/doc/primitive.html @@ -533,5 +533,11 @@ + + + + +Catch + -- cgit v1.2.3