1 with Ada
.Containers
.Hashed_Maps
;
2 with Ada
.Strings
.Unbounded
.Hash
;
8 type Env_Handle
is private;
10 Null_Env_Handle
: constant Env_Handle
;
12 function New_Env
(Outer
: Env_Handle
:= Null_Env_Handle
) return Env_Handle
;
14 -- Set adds an element to the environment E.
18 Elem
: Smart_Pointers
.Smart_Pointer
);
20 -- Get finds a key in the E env. If it can't be found it looks
21 -- in an outer env. If it runs out of envs, Not Found is raised.
22 function Get
(E
: Env_Handle
; Key
: String) return Smart_Pointers
.Smart_Pointer
;
24 Not_Found
: exception;
27 (E
: Env_Handle
; Outer_Env
: Env_Handle
);
29 -- Sym and Exprs are lists. Bind Sets Keys in Syms to the corresponding
30 -- expression in Exprs. Returns true if all the parameters were bound.
31 function Bind
(Env
: Env_Handle
; Syms
, Exprs
: Types
.List_Mal_Type
)
34 function To_String
(E
: Env_Handle
) return String;
36 Debug
: Boolean := False;
40 type Env_Handle
is new Smart_Pointers
.Smart_Pointer
;
42 Null_Env_Handle
: constant Env_Handle
:=
43 Env_Handle
(Smart_Pointers
.Null_Smart_Pointer
);
45 function Is_Null
(E
: Env_Handle
) return Boolean;
47 package String_Mal_Hash
is new Ada
.Containers
.Hashed_Maps
48 (Key_Type
=> Ada
.Strings
.Unbounded
.Unbounded_String
,
49 Element_Type
=> Smart_Pointers
.Smart_Pointer
,
50 Hash
=> Ada
.Strings
.Unbounded
.Hash
,
51 Equivalent_Keys
=> Ada
.Strings
.Unbounded
."=",
52 "=" => Smart_Pointers
."=");
54 type Env
is new Smart_Pointers
.Base_Class
with record
55 The_Map
: String_Mal_Hash
.Map
;
56 Outer_Env
: Env_Handle
;
60 type Env_Ptr
is access all Env
;
62 function Deref
(SP
: Env_Handle
) return Env_Ptr
;