fd3d4b300a90b8b4b3dd763ee1d6d880bec18996
5 package body Types
.Atoms
is
7 function Atom
(Args
: in T_Array
) return T
is
9 Err
.Check
(Args
'Length = 1, "expected 1 parameter");
11 Ref
: constant Atom_Ptr
:= new Instance
;
13 Garbage_Collected
.Register
(Garbage_Collected
.Pointer
(Ref
));
14 Ref
.all.Data
:= Args
(Args
'First);
15 return (Kind_Atom
, Ref
);
19 function Deref
(Args
: in T_Array
) return T
is
21 Err
.Check
(Args
'Length = 1 and then Args
(Args
'First).Kind
= Kind_Atom
,
23 return Args
(Args
'First).Atom
.all.Data
;
26 function Deref
(Item
: in Instance
) return T
29 procedure Keep_References
(Object
: in out Instance
) is
35 function Meta
(Item
: in Instance
) return T
38 function Reset
(Args
: in T_Array
) return T
is
40 Err
.Check
(Args
'Length = 2 and then Args
(Args
'First).Kind
= Kind_Atom
,
41 "expected an atom then a value");
42 Args
(Args
'First).Atom
.all.Data
:= Args
(Args
'Last);
43 return Args
(Args
'Last);
46 function Swap
(Args
: in T_Array
) return T
is
48 Err
.Check
(2 <= Args
'Length and then Args
(Args
'First).Kind
= Kind_Atom
,
49 "expected an atom, optional arguments then a function");
51 X
: T
renames Args
(Args
'First).Atom
.all.Data
;
52 F
: T
renames Args
(Args
'First + 1);
53 A
: constant T_Array
:= X
& Args
(Args
'First + 2 .. Args
'Last);
57 X
:= F
.Builtin
.all (A
);
58 when Kind_Builtin_With_Meta
=>
59 X
:= F
.Builtin_With_Meta
.all.Builtin
.all (A
);
61 X
:= F
.Fn
.all.Apply
(A
);
63 Err
.Raise_With
("parameter 2 must be a function");
69 function With_Meta
(Item
: in Instance
;
70 Metadata
: in T
) return T
is
71 Ref
: constant Atom_Ptr
:= new Instance
;
73 Garbage_Collected
.Register
(Garbage_Collected
.Pointer
(Ref
));
74 Ref
.all.Data
:= Item
.Data
;
75 Ref
.all.F_Meta
:= Metadata
;
76 return (Kind_Atom
, Ref
);