Explicit typing
Bigloo supports type annotation or type information. As shown in Section ref Module declaration, these annotations can be written both in the module clauses and in module bodies although module body type information is optional. It helps the compiler to produce better quality code and to reject incorrectly typed programs. Type annotations can describe both the result and formal parameter types for global functions and also types for local variable. Due to our module language design (in particular module initialization), Scheme global variables cannot support type information. Types are either atomic types (see Atomic types), foreign types (see Defining an extern type), or a classes (see Class declaration). Warning: All type annotations are ignored by the interpreter. Module body type annotations are introduced by the following special forms.define (f[::type] [a[::type]]...) bodybigloo syntax
define-inline (f[::type] [a[::type]]...) bodybigloo syntax
let ((var[::type] ...) ...) bodybigloo syntax
let loop ((var[::type] ...) ...) bodybigloo syntax
let* ((var[::type] ...) ...) bodybigloo syntax
letrec ((var[::type] ...) ...) bodybigloo syntax
labels ((var[::type] (var[::type]...) b) ...) bodybigloo syntax
Type annotations are optional. That is, for any of these constructions, if a type annotation is missing, Bigloo uses the default generic typeobj
instead.
Here is an example of type annotated program:
(module example (export (vector-fill!::vector ::vector ::obj))) (define (vector-fill! v filler) (let loop ((i::long (- (vector-length v) 1))) (if (< i 0) v (begin (vector-set! v i filler) (loop (- i 1)))))) (let ((v::vector (make-vector 3 4))) (vector-fill! v "dummy"))The types that can be used in annotations are any of:
- the basic Scheme types
pair
,null
,bstring
, - the basic extern types
long
,int
,char
, - the compound extern types described in Section Defining an extern type.
- the types introduced by class declarations (Section Class declaration).
bint
(presented in Section Defining an extern type).
string
presented in Section Defining an extern type.
(module foo (export (succ::int ::int))) (define (succ x) (+ 1 x))
.keep