One solution is to pass-through the made value instead of stringifying. There may be a better way of doing this (update: the post by moritz below is that better way), but this at least works:
token value {
<val=object> | <val=string> | <val=number>
| true | false | null
}
# ...
given ~$/ {
when "true" {make Bool::True;}
when "false" {make Bool::False;}
when "null" {make Any;}
default { make $<val>.made; }
}
Though it would probably be better to pass-through if $<val> is defined at all rather than rely on the stringified fall-through:
return make $<val>.made if $<val>;
given ~$/ {
when "true" {make Bool::True;}
when "false" {make Bool::False;}
when "null" {make Any;}
default { die; }
}