' 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)