Почему каждый ведет себя по-разному в определениях слов?

Сделать цитату для 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 )

Что я делаю неправильно?

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 }
Другие вопросы по тегам