endbasic 0.11.1

The EndBASIC programming language - CLI
' EndBASIC
' Copyright 2024 Julio Merino
'
' Licensed under the Apache License, Version 2.0 (the "License"); you may not
' use this file except in compliance with the License.  You may obtain a copy
' of the License at:
'
'     http://www.apache.org/licenses/LICENSE-2.0
'
' Unless required by applicable law or agreed to in writing, software
' distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
' WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
' License for the specific language governing permissions and limitations
' under the License.

PRINT ">>> argless functions with default return values"

FUNCTION argless_default_default
END FUNCTION

FUNCTION argless_boolean_default?
END FUNCTION

FUNCTION argless_double_default#
END FUNCTION

FUNCTION argless_integer_default%
END FUNCTION

FUNCTION argless_string_default$
END FUNCTION

PRINT "argless_default_default: "; argless_default_default
PRINT "argless_boolean_default: "; argless_boolean_default
PRINT "argless_double_default: "; 1 + argless_double_default + 3
PRINT "argless_integer_default: "; 1 + argless_integer_default + 3
PRINT "argless_string_default: "; argless_string_default + "bar"

PRINT ">>> argless functions with explicit return values"

FUNCTION argless_default_set
    argless_default_set = 5
END FUNCTION

FUNCTION argless_boolean_set?
    argless_boolean_set = TRUE
END FUNCTION

FUNCTION argless_double_set#
    argless_double_set = 5.2
END FUNCTION

FUNCTION argless_integer_set%
    argless_integer_set = 123
END FUNCTION

FUNCTION argless_string_set$
    argless_string_set = "foo"
END FUNCTION

PRINT "argless_default_set: "; argless_default_set
PRINT "argless_boolean_set: "; argless_boolean_set
PRINT "argless_double_set: "; 1 + argless_double_set + 3
PRINT "argless_integer_set: "; 1 + argless_integer_set + 3
PRINT "argless_string_set: "; argless_string_set + "bar"

PRINT ">>> Call chains"

FUNCTION second$
    second = "foo"
END FUNCTION

FUNCTION first%
    IF second = "foo" THEN
        first = 5
    ELSE
        first = 3
    END IF
END FUNCTION

PRINT "first: "; first
PRINT "second: "; second

PRINT ">>> Local variables"

defined_globally = 1

FUNCTION local
    defined_globally = 2
    defined_locally = 3
    PRINT "defined_globally on exit: "; defined_globally
    PRINT "defined_locally on exit: "; defined_locally
END FUNCTION

PRINT local
PRINT defined_globally
defined_locally = "foo"  ' Would yield type error if not unset on exit.

PRINT ">>> Global variables"

DIM SHARED really_global
really_global = 1

FUNCTION get_really_global
    get_really_global = really_global * 2
    really_global = really_global + 1
END FUNCTION

PRINT "get_really_global returned: "; get_really_global
PRINT "get_really_global returned: "; get_really_global
PRINT "really_global is: "; really_global

PRINT ">>> Arguments with annotations"

param_b = 1234

FUNCTION annotated_params(param_b?, param_d#, param_i%, param_s$)
    PRINT "param_b is "; param_b
    PRINT "param_d is "; param_d
    PRINT "param_i is "; param_i
    PRINT "param_s is "; param_s
END FUNCTION

PRINT annotated_params(TRUE, 3.4, 5, "hello")

PRINT ">>> Arguments with types"

FUNCTION params_with_as(b AS BOOLEAN, d AS DOUBLE, i AS INTEGER, s AS STRING)
    PRINT "b is "; b
    PRINT "d is "; d
    PRINT "i is "; i
    PRINT "s is "; s
END FUNCTION

PRINT params_with_as(FALSE, -1.0, 2, "foo")

PRINT ">>> Type promotion in arguments"

FUNCTION args_promotion(d AS DOUBLE, i AS INTEGER)
    PRINT "d is "; d
    PRINT "i is "; i
END FUNCTION

PRINT args_promotion(5, 2.6)

PRINT ">>> Type promotion in return values"

FUNCTION return_promotion%
    return_promotion = 2.8
END FUNCTION

PRINT return_promotion

PRINT ">>> Recursion"

FUNCTION recurse(i)
    IF i > 0 THEN
       PRINT "entering level: "; i
       PRINT recurse(i - 1)
       PRINT "leaving level: "; i
    END IF
END FUNCTION

PRINT recurse(3)