Add perl6-eval interop function
authorHinrik Örn Sigurðsson <hinrik.sig@gmail.com>
Tue, 7 Jun 2016 09:16:48 +0000 (09:16 +0000)
committerHinrik Örn Sigurðsson <hinrik.sig@gmail.com>
Sat, 11 Jun 2016 15:02:11 +0000 (15:02 +0000)
perl6/core.pm

index 04e92ea..a3f2025 100644 (file)
@@ -23,6 +23,22 @@ sub equal ($a, $b) {
   }
 }
 
+sub perl6-eval ($code) {
+  my &convert = -> $data {
+    given $data {
+      when Array|List { MalList($_.map({&convert($_)}).Array) }
+      when Hash { MalHashMap($_.map({.key => &convert(.value)}).Hash) }
+      when Bool { $_ ?? $TRUE !! $FALSE }
+      when Int { MalNumber($_) }
+      when Nil { $NIL }
+      default { $_.^name eq 'Any' ?? $NIL !! MalString($_.gist) }
+    }
+  };
+
+  use MONKEY-SEE-NO-EVAL;
+  return &convert(EVAL($code));
+}
+
 our %ns = (
   '+'         => MalCode({ MalNumber($^a.val + $^b.val) }),
   '-'         => MalCode({ MalNumber($^a.val - $^b.val) }),
@@ -81,4 +97,5 @@ our %ns = (
   seq         => MalCode({ $^a.seq }),
   with-meta   => MalCode({ return $NIL if !$^a.can('meta'); my $x = $^a.clone; $x.meta = $^b; $x }),
   meta        => MalCode({ $^a.?meta // $NIL }),
+  perl6-eval  => MalCode({ perl6-eval($^a.val) }),
 );