3 class X
::MalException is Exception is export
{}
4 class X
::MalNoTokens is X
::MalException is export
{
5 method message
() { "got no tokens" }
7 class X
::MalIncomplete is X
::MalException is export
{
9 method message
() { "expected '$.end', got EOF" }
11 class X
::MalUnexpected is X
::MalException is export
{
13 method message
() { "unexpected '$.token'" }
15 class X
::MalNotFound is X
::MalException is export
{
17 method message
() { "'$.name' not found" }
19 class X
::MalOutOfRange is X
::MalException is export
{
20 method message
() { "nth: index out of range" }
22 class X
::MalThrow is X
::MalException is export
{
26 role MalValue is export
{
28 method CALL
-ME
($val) { self
.new
(:$val) }
30 role MalSequence is export
{
31 has
$.val handles
<cache AT
-POS EXISTS
-POS elems end iterator
>;
33 method CALL
-ME
($val) { self
.new
(:$val) }
35 role MalCallable is export
{
37 method apply
(*@_) { &!fn
(|@_) }
39 role MalMeta is export
{
43 class MalNil does MalValue is export
{
46 class MalTrue does MalValue is export
{}
47 class MalFalse does MalValue is export
{}
49 our $NIL is export
= MalNil
('nil');
50 our $TRUE is export
= MalTrue
('true');
51 our $FALSE is export
= MalFalse
('false');
53 class MalSymbol does MalValue does MalMeta is export
{}
55 class MalList does MalSequence is export
{
56 method conj
(@args) { return self
.new
(val
=> [|@args.reverse, |$.val
]) }
57 method seq
{ return self
.elems ?? self
!! $NIL }
60 class MalVector does MalSequence is export
{
61 method conj
(@args) { return self
.new
(val
=> [|$.val
, |@args]) }
62 method seq
{ return self
.elems ?? MalList
(self
.val
) !! $NIL }
65 class MalHashMap does MalMeta is export
{
66 has
$.val handles
<cache AT
-KEY EXISTS
-KEY elems pairs
keys values kv
>;
67 method CALL
-ME
($val) { self
.new
(:$val) }
70 class MalNumber does MalValue is export
{}
72 class MalString does MalValue is export
{
75 ?? MalList
(self
.val
.comb
.map({MalString
($_)}))
80 class MalCode does MalCallable does MalMeta is export
{
81 method CALL
-ME
(&fn
) { self
.new
(:&fn
) }
84 class MalFunction does MalCallable does MalMeta is export
{
88 has
$.is_macro is rw
= False
;
89 method CALL
-ME
($ast, $env, @params, &fn
) {
90 self
.bless(:$ast, :$env, :@params, :&fn
);
94 class MalAtom does MalValue does MalMeta is export
{}