0

each在数组中引用:

(scratchpad) { "3.1415" "4" } [ string>number ] each
3.1415 
4

要在一个单词中执行此操作:

(scratchpad) : conveach ( x -- y z ) [ string>number ] each ;
(scratchpad) { "3.1415" "4" } conveach .

但这会引发错误:

The word conveach cannot be executed because it failed to compile

The input quotation to “each” doesn't match its expected effect
Input             Expected         Got
[ string>number ] ( ... x -- ... ) ( x -- x )

我究竟做错了什么?

4

1 回答 1

1

因子要求所有单词都具有已知的堆栈效应。编译器想知道这个词从堆栈中吃掉了多少项以及它放回了多少项。在侦听器中,您键入的代码没有该限制。

{ "3.1415" "4" } [ string>number ] each

不从堆栈中取出任何项目,但将两个放在那里。堆栈效应将表示为( -- x y )

[ string>number ] each 

另一方面,此代码获取一个项目,但将许多项目放回堆栈中为 0。这个数字取决于给每个序列的长度。

! ( x -- x y z w )
{ "3" "4" "5" "6" } [ string>number ] each
! ( x -- )
{ } [ string>number ] each 
! ( x -- x )
{ "2" } [ string>number ] each 

您可能想改用这个map词,它将您的序列从包含字符串的序列转换为包含数字的序列。像这样:

: convseq ( strings -- numbers ) [ string>number ] map ;
IN: scratchpad { "3" "4" } convseq .
{ 3 4 }
于 2016-03-17T09:12:21.700 回答