将序列解构为词法变量
destructure sequence into lexical variables
我有一个元素数量已知的序列(来自 pcre 匹配项),我想将其映射到词法变量中。
我可能可以遍历序列并将每个元素放入堆栈,然后 :> ( a b c d )
但是有没有一种惯用的方法可以做到这一点?
哦,我的序列有 4 个以上的元素,所以 first4
不会削减它,尽管我显然可以在序列的子集上使用 first4
然后 first3
.
如果您确定那是您真正想要做的,您可以使用 quotations.generalizations
中的 firstn
:
SYMBOLS: a b c d e f g h ;
[let
{ 1 2 3 4 5 6 7 8 }
8 firstn :> ( a b c d e f g h )
a b c d e f g h . . . . . . . . ]
但这听起来像是个坏主意。这很棘手,因为词法变量不是 "real" 变量,编译器将它们转换为堆栈洗牌。这就是为什么他们不能很好地使用宏并且 :>
不能像普通单词一样被调用。
如果使用动态变量会更简单:
SYMBOLS: a b c d e f g h ;
{ 1 2 3 4 5 6 7 8 }
{ a b c d e f g h } [ set ] 2each
{ a b c d e f g h } [ get . ] each
我有一个元素数量已知的序列(来自 pcre 匹配项),我想将其映射到词法变量中。
我可能可以遍历序列并将每个元素放入堆栈,然后 :> ( a b c d )
但是有没有一种惯用的方法可以做到这一点?
哦,我的序列有 4 个以上的元素,所以 first4
不会削减它,尽管我显然可以在序列的子集上使用 first4
然后 first3
.
如果您确定那是您真正想要做的,您可以使用 quotations.generalizations
中的 firstn
:
SYMBOLS: a b c d e f g h ;
[let
{ 1 2 3 4 5 6 7 8 }
8 firstn :> ( a b c d e f g h )
a b c d e f g h . . . . . . . . ]
但这听起来像是个坏主意。这很棘手,因为词法变量不是 "real" 变量,编译器将它们转换为堆栈洗牌。这就是为什么他们不能很好地使用宏并且 :>
不能像普通单词一样被调用。
如果使用动态变量会更简单:
SYMBOLS: a b c d e f g h ;
{ 1 2 3 4 5 6 7 8 }
{ a b c d e f g h } [ set ] 2each
{ a b c d e f g h } [ get . ] each