我正在从这里和这里查看类似于 REPL 的代码评估,并尝试为其制作一个非常小的版本,但它失败了:
\nuse nqp;\n\nclass E {\n\n has Mu $.compiler;\n has $!save_ctx;\n\n method evaluate(@fragments) {\n for @fragments -> $code {\n my $*MAIN_CTX;\n my $*CTXSAVE := self;\n\n $!compiler.eval($code,\n outer_ctx => nqp::ctxcaller(nqp::ctx()));\n\n if nqp::defined($*MAIN_CTX) {\n $!save_ctx := $*MAIN_CTX;\n }\n }\n }\n\n method ctxsave(--> Nil) {\n say "*in ctxsave*";\n $*MAIN_CTX := nqp::ctxcaller(nqp::ctx());\n $*CTXSAVE := 0;\n }\n\n}\n\nmy $e := E.new(compiler => nqp::getcomp("Raku"));\nnqp::bindattr($e, E, \'$!save_ctx\', nqp::ctx());\n$e.evaluate: (\'say my @vals = 12, 3, 4;\', \'say @vals.head\');\nRun Code Online (Sandbox Code Playgroud)\n我从上面的链接中拼凑而成,但不太知道我在做什么:)运行时,会发生这种情况:
\n*in ctxsave*\n[12 3 …Run Code Online (Sandbox Code Playgroud) raku ×1