Word signature in factor

73 views Asked by At

i try to iterate over a an array which contains weather data. That works fine already and I also can load the datas from the array which are important for me. Therefore I wrote a helping word which looks like this:

: get-value ( hsh str -- str ) swap at* drop ;

[ "main" get-value "temp" get-value ] each 9 [ + ] times

This code pushes the temperature values from the array on the stack and builds the sum. "main" and "temp" are the key values of the arrays.

I execute it with this command: get-weather-list generates the array

"Vienna" get-weather-list [ "main" get-value "temp" get-value ] each 9 [ + ] times

The result is a number on the stack. Now I want to split this call into one or two words. For example:

: get-weather-information ( city -- str ) get-weather-list [ "main" get-value "temp" get-value ] each 9 [ + ] times ;

The problem is that I don't really understand the word's signature. I always get "The input quotation to “each” doesn't match its expected effect". I tried a lot but can't find a solution to fix this problem. May anyone have an idea? I am grateful for any help :)

Cheers Stefan

1

There are 1 answers

0
fede s. On

This is a very old question by now, but it still may be useful to someone.

First, about each: the stack effect of the quotation is (... x -- ...).

That means it consumes an input, and outputs nothing. Your quotation worked on the interpreter because it lets you get away with "wrong" code. But for calling each from a defined word, your quotation can't output anything.

So each is not what you want. If you try to push a variable amount of values to the stack, you'll have the same kind of trouble again. Sequence words all output a fixed amount of values.

What you want to do is one of two things:

  1. Make a new sequence with just the values you want, and then call sum on it.

  2. Use something like reduce, to accumulate the sum as you process your list.

For example, with reduce:

 get-weather-list 0 [ "main" get-value "temp" get-value + ] reduce ;