From Tapestries MUCK
This takes a list and stores the first two items in var1 and var2, then evaluates expr.
The value returned by expr is then put in var1, and the next list item is put in var2. Expr keeps being evaluated in this way until there are no more list items left.
This returns the last value returned by expr. If a sep argument is given, the input list is assumed to have its individual items delimited by that string, otherwise it assumes a carriage return.