Ada: fix Makefile and re-write early steps to remove some dependencies
[jackhill/mal.git] / ada / envs.ads
1 with Ada.Containers.Hashed_Maps;
2 with Ada.Strings.Unbounded.Hash;
3 with Smart_Pointers;
4 limited with Types;
5
6 package Envs is
7
8 type Env_Handle is private;
9
10 Null_Env_Handle : constant Env_Handle;
11
12 function New_Env (Outer : Env_Handle := Null_Env_Handle) return Env_Handle;
13
14 -- Set adds an element to the environment E.
15 procedure Set
16 (E : Env_Handle;
17 Key : String;
18 Elem : Smart_Pointers.Smart_Pointer);
19
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;
23
24 Not_Found : exception;
25
26 procedure Set_Outer
27 (E : Env_Handle; Outer_Env : Env_Handle);
28
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)
32 return Boolean;
33
34 function To_String (E : Env_Handle) return String;
35
36 Debug : Boolean := False;
37
38 private
39
40 type Env_Handle is new Smart_Pointers.Smart_Pointer;
41
42 Null_Env_Handle : constant Env_Handle :=
43 Env_Handle (Smart_Pointers.Null_Smart_Pointer);
44
45 function Is_Null (E : Env_Handle) return Boolean;
46
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."=");
53
54 type Env is new Smart_Pointers.Base_Class with record
55 The_Map : String_Mal_Hash.Map;
56 Outer_Env : Env_Handle;
57 Level: Natural;
58 end record;
59
60 type Env_Ptr is access all Env;
61
62 function Deref (SP : Env_Handle) return Env_Ptr;
63
64 end Envs;