assert.apl

    ⍝
    ⍝ Author:       Jürgen Sauermann
    ⍝ Date:         May 31, 2015
    ⍝ Copyright:    Copyright (C) 2015 by Jürgen Sauermann
    ⍝ License:      LGPL, see http://www.gnu.org/licenses/lgpl.html
    ⍝ email:        bug-apl@gnu.org
    ⍝ Portability:  L3 (GNU APL)
    ⍝
    ⍝ Purpose:
    ⍝
    ⍝ Check a condition and complain if it is not true
    ⍝
    ⍝ Description:
    ⍝
    ⍝ this file contains a function 'assert' that can be used for debugging APL
    ⍝ programs. assert checks a condition and if the condition is false
    ⍝ (i.e. not 1) then it prints the failed condition and the )SI stack to
    ⍝ locate the failed assertion. If the condition ends with a variable name
    ⍝ then the value of the variable is also printed.
    ⍝
    ⍝ )COPY assert or cut-and paste 'assert'
    ⍝
    ⍝ Then try
    ⍝
    ⍝ Q←5
    ⍝ Assert 4 = 2 + 2 ⍝ OK
    ⍝ Assert 3 = 2 + 2 ⍝ not OK: print failed condition and SI stack
    ⍝ Assert 3 = Q     ⍝ not OK: print failed condition, value of Q, and SI stack
    ⍝

    ⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝⍝
    ⍝ assert: check a condition
    ⍝
    ∇assert B;COND;LOC;VAR;VCHAR
     →(1≡B)⍴0 ⍝ condition is true: do noting
     ' ' ◊ COND←7↓,¯2 ⎕SI 4 ◊ LOC←,¯2 ⎕SI 3
     '************************************************'
     '*** Assertion (', COND, ') failed at ',LOC
     ⍝ maybe show variable (if COND ends with a valid variable name)
     VCHAR←'∆⍙',⎕UCS ,64 96 ∘.+⍳26 ◊ VAR←(⌽∧\⌽(COND∈VCHAR))/COND
     →((⎕NC VAR)∈2 6)↓1+↑⎕LC ◊ 'Variable ',VAR,':' ◊ 4 ⎕CR ⍎VAR
     ⍝ show stack
     'SI Stack:' ◊ 7 ⎕CR ⊃¯1↓⎕SI 3
     '************************************************'
     →
    ∇

    ⍝
    ⍝ EOF