Почему каждый ведет себя по-разному в определениях слов?
Сделать цитату для 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 }