1
1
mirror of https://github.com/kanaka/mal.git synced 2024-09-20 10:07:45 +03:00
mal/perl6/printer.pm
Hinrik Örn Sigurðsson a708140106 Add Perl 6 implementation
All tests pass, but readline support (via Linenoise module) is commented
out in step0_repl.pl as it is not a core module. Should maybe change it
when docker support is added.
2016-06-11 15:02:06 +00:00

30 lines
875 B
Raku

unit module printer;
use types;
sub pr_str ($exp, $print_readably = False) is export {
given $exp {
when MalFunction { "#<fn* ({$exp.params}) {pr_str($exp.ast)}>" }
when MalCode { "#<builtin_fn* {$exp.fn.gist}>" }
when MalList {
'(' ~ join(' ', |$exp.map({ pr_str($_, $print_readably) })) ~ ')';
}
when MalVector {
'[' ~ join(' ', |$exp.map({ pr_str($_, $print_readably) })) ~ ']';
}
when MalHashMap {
'{' ~ $exp.kv.flatmap({ MalString($^a), $^b }).map({ pr_str($_, $print_readably) }) ~ '}'
}
when MalString {
my $str = $exp.val;
if $str ~~ s/^\x29E/:/ || !$print_readably {
$str;
}
else {
'"' ~ $str.trans(/\\/ => '\\\\', /\"/ => '\\"', /\n/ => '\\n') ~ '"';
}
}
when MalAtom { "(atom {pr_str($exp.val, $print_readably)})" }
when MalValue { $exp.val }
}
}