User Tools

Site Tools


Sidebar

Passage markup

basics

coding

extra

list

section

whitespace

Macros

basics

colour

data structure

date and time

game state

live

maths

number

revision

saving

showing and hiding

string

styling

url

deprecated

Types of data

Special keywords

Special passage tags

harlowe:for

(for: lambda, …Any) → changer

Also known as: (loop:)

A command that repeats the attached hook, setting a temporary variable to a different value on each repeat.

Example usage:

  • (for: each _item, ...$arr) [You have the _item.] prints “You have the ” and the item, for each item in $arr.
  • (for: _ingredient where it contains "petal", ...$reagents) [Cook the _ingredient?] prints “Cook the ” and the string, for each string in $reagents which contains “petal”.

Rationale:

Suppose you're using arrays to store strings representing inventory items, or character datamaps, or other kinds of sequential game information - or even just built-in arrays like (history:) - and you want to print out a sentence or paragraph for each item. The (for:) macro can be used to print something “for each” item in an array easily - simply write a hook using a temp variable where each item should be printed or used, then give (for:) an “each” lambda that uses the same temp variable.

Details:

Don't make the mistake of believing you can alter an array by trying to (set:) the temp variable in each loop - such as (for: each _a, ...$arr)[(set: _a to it + 1)]. This will NOT change $arr - only the temp variable will change (and only until the next loop, where another $arr value will be put into it). If you want to alter an array item-by-item, use the (altered:) macro.

The temp variable inside the hook will shadow any other identically-named temp variables outside of it: if you (set: _a to 1), then (for: each _a, 2,3)[ (print: _a) ], the inner hook will print “2” and “3”, and you won't be able to print or set the “outer” _a.

You may want to simply print several copies of a hook a certain number of times, without any particular array data being looped over. You can use the (range:) macro with it instead: (for: each _i in ...(range:1,10)), and not use the temp variable inside the hook at all.

As it is a changer macro, (for:)'s value is a changer command which can be stored in a variable - this command stores all of the values originally given to it, and won't reflect any changes to the values, or their container arrays, since then.

Alternatives:

You may be tempted to use (for:) not to print anything at all, but to find values inside arrays using (if:), or form a “total” using (set:). The lambda macros (find:) and (folded:), while slightly less straightforward, are recommended to be used instead.

See also:

harlowe/for.txt · Last modified: 2017/10/10 00:39 (external edit)