Values and types Isis software documentation

Values and types

This document explains the value and type operators in Isis, including routines for comparing values, checking types, and casting values to different types.


Logical operators

The Isis core syntax provides the logical operators and, or, nand, and nor:
( and exp exp ... )
( or exp exp ... )
( nand exp exp ... )
( nor exp exp ... )
The and statement returns True only if all its expressions evaluate to logically true values. The or statement returns True if just one or more of its expressions evaluate to logically true values. Otherwise, these expressions return False. nand and nor are analogous to and and or except they will return the opposite value ("not" and and "not" or).

Isis considers a value to be logically true if it is a non-zero number, character, or address, or if the value is a procedure or a non-empty list, or if it is the boolean True. Any other value, including Null, is considered logically false.

In these constructs, Isis only evaluates the necessary expressions from left to right to determine the result. For example, if the first expression in an and statement evaluates to a false value, any remaining expressions are not evaluated, because their values would have no effect on the final result.

Read the Isis primer for more information on these operators and the constructs for conditional evaluation.


Logical not operator

(not val) # invert logical value of val This operator inverts a value's logical value, and returns either True or False. See above for information on what kinds of values are considered logically true or logically false.
-> (not False) True -> (not 10.1) False -> (not 0) True


Equality operators

(= val val ...) # return True if vals are equal (!= val val ...) # return True if vals are not equal (eq? val val ...) # same as = (equal) (neq? val val ...) # same as != (not equal) These operators are used for comparing two or more values. For eq? or =, the result is True if all the values are identical, and False otherwise. neq? and != return the opposite result (effectively the same as (not (eq? ...)) ). Any type of Isis value is allowed, including lists, in which case corresponding elements are compared.

Note that the types of the arguments must match in order to be considered equal (i.e. the integer 3 is not equal to the real number 3.0). If necessary, you can use the type casting operators explained below to convert arguments to the same type.

-> (set x [2 3]) [ 2 3 ] -> (set y [2 3]) [ 2 3 ] -> (set z [4 5]) [ 4 5 ] -> (!= x y) False -> (= x y) True -> (= x y z) False


Inequality operators

(< val1 val2) # return True if val1 < val2 (> val1 val2) # return True if val1 > val2 (<= val1 val2) # return True if val1 <= val2 (>= val1 val2) # return True if val1 >= val2 (lt? val1 val2) # same as < (less than) (gt? val1 val2) # same as > (greater than) (leq? val1 val2) # same as <= (less than or equal to) (geq? val1 val2) # same as >= (greater than or equal to) These operators each expect two arguments, which must be integers or real numbers. The types of the values need not match. The result is True if the condition holds, and False of not, or Null if the values are not of the expected type.
-> (> 2 4) False -> (>= 10 10.1) False -> (> [2 3] [4 5]) ** >: 1st arg not a number. Null


Type queries

(integer? val) # return True if val is an integer (real? val) # return True if val is a real number (boolean? val) # return True if val is a boolean (character? val) # return True if val is a character (address? val) # return True if val is a memory address (procedure? val) # return True if val is a procedure (list? val) # return True if val is a list (integer-list? val) # return True if val is a list of integers (real-list? val) # return True if val is a list of real numbers (boolean-list? val) # return True if val is a list of booleans (character-list? val) # return True if val is a list of characters (string? val) # same as character-list? (address-list? val) # return True if val is a list of memory addresses (procedure-list? val) # return True if val is a list of procedures (list-list? val) # return True if val is a list of lists These procedures check the type of a single argument. The list routines check if the argument is a non-empty list containing only items of the specified type. The result is either True or False.
-> (integer? 3) True -> (integer? 3.0) False -> (procedure? +) True -> (procedure? (proc (x) x)) True -> (list? [2 3 4]) True -> (list? "sparky") True -> (integer-list? [1 2 3]) True -> (integer-list? [1 2 3.3]) False -> (string? "yojimbo") True -> (string? [ 'f' 'i' 's' 'h' ]) True -> (string? "") False -> (real-list? []) False -> (list-list? [ [2 3] [4 5] [6 9] ]) True -> (list-list? [ "time" "bandit" ]) True -> (list-list? [ [] [] [] ]) True -> (list-list? [ 3 2 [ 10 11 ] ]) False


Type casting

(integer val) # convert val to an integer (real val) # convert val to a real number (boolean val) # convert val to a boolean (character val) # convert val to a character (address val) # convert val to a memory address (procedure val) # convert val to a procedure These primitives accept a single value and cast it to the specified type. Not all casts are valid, in which case an error message will be printed and Null will be returned.
-> (integer 3.5) 3 -> (real -10) -10.000000 -> (character 42) '*' -> (boolean 0) False -> (address 100000) 0x186a0 -> (procedure 81) ** procedure: Invalid cast. Null