我想在字符串上重用<< ... >>
的解析逻辑以返回列表。说,我已经将字符串包含在变量$input
中,如何在不使用EVAL
(例如EVAL "<< $input >>"
)的情况下解析它?
一个更普遍的问题可能是:如何重用各种引用结构(例如qqww:v:!c
)使用的任何解析逻辑?
答案 0 :(得分:5)
对于您的特定示例,您可以使用val
:
my $a = 42;
say << $a b c >>.perl; # (IntStr.new(42, "42"), "b", "c")
say ("$a", "b", "c")>>.&val.perl; # same
say << "$a b" c >>.perl; # ("42 b", "c")
say ("$a b", "c" )>>.&val.perl; # same
但是您必须了解val
。
我想在字符串上重用
<< ... >>
的解析逻辑以返回列表。
您可以拼写Rakudo编译器的源代码以放大正在调用的函数。因此,您可能会发现val
是与您的示例相关的功能。
语言结构的解析从Grammar.nqp开始。
对<<
的页内搜索会产生很多匹配项。我碰巧知道<< ... >>
构造是一个“ circumfix”运算符。所以几秒钟后,我来到了the line in Grammar.nqp where its parsing starts。重新格式化为几行,行可以归结为
token circumfix:sym«<< >>» {
:dba('shell-quote words')
'<<' ~ '>>'
<nibble(
self.quote_lang(
self.slang_grammar('Quote'),
"<<", ">>", ['qq', 'ww', 'v']
)
)>
}
然后,这条小径立即变冷。在同一个源文件中有一个quote_lang
方法,但是它显然太高了。 slang_grammar
在哪里定义?
如果遇到这样的死胡同,下一个要看的地方是NQP。确实可以找到matches there。
但是现在呢?真的,这太复杂了。
一个更普遍的问题可能是:如何重用各种引用结构(例如
qqww:v:!c
)使用的任何解析逻辑?
确实。
阅读文档是另一种方法,通常比窃取源代码更好。但是在这种情况下,我找不到从qq:ww:v
到val
的明显路径。
这会导致第三条路线-发表SO问题。 :)
此答案是...不完整。但无论如何,我将按原样发布它,以期对它有所帮助,并且/或者我今晚或明天将有时间对其进行改进。或者,更好的是,也许有人有更好的答案。