**** New globals: {i4:i4, i8:i8, qi8:i8?, si8:i8*, ts:t*}
**** New udf: V, arity: 1

> si8 + i8
si8 + i8 : i8*
Binder : ForEach(*1: si8, Add(*1, i8))
Tupled : (ForEach(*1: si8, Add(*1, i8)), ForEach(*1: si8, Add(*1, i8)))
###
> si8 + i4
si8 + i4 : i8*
Binder : ForEach(*1: si8, Add(*1, Num<i8>(i4)))
Tupled : (ForEach(*1: si8, Add(*1, Num<i8>(i4))), ForEach(*1: si8, Add(*1, Num<i8>(i4))))
###
> si8 + i8 * i8
si8 + i8 * i8 : i8*
Binder : With(!1: Mul(i8, i8), ForEach(*2: si8, Add(*2, !1)))
Tupled : (With(!1: Mul(i8, i8), ForEach(*2: si8, Add(*2, !1))), With(!1: Mul(i8, i8), ForEach(*2: si8, Add(*2, !1))))
Reducer: With(!1: Mul(i8, i8), (ForEach(*2: si8, Add(*2, !1)), ForEach(*2: si8, Add(*2, !1))))
###
> si8 + qi8 * i8
si8 + qi8 * i8 : i8?*
Binder : With(!2: Guard(?1: qi8, Mul(?1, i8)), ForEach(*3: si8, Guard(?4: !2, Add(*3, ?4))))
Tupled : (With(!2: Guard(?1: qi8, Mul(?1, i8)), ForEach(*3: si8, Guard(?4: !2, Add(*3, ?4)))), With(!2: Guard(?1: qi8, Mul(?1, i8)), ForEach(*3: si8, Guard(?4: !2, Add(*3, ?4)))))
Reducer: With(!2: Guard(?1: qi8, Mul(?1, i8)), (ForEach(*3: si8, Guard(?4: !2, Add(*3, ?4))), ForEach(*3: si8, Guard(?4: !2, Add(*3, ?4)))))
###
> si8 + i8 * qi8
si8 + i8 * qi8 : i8?*
Binder : With(!2: Guard(?1: qi8, Mul(i8, ?1)), ForEach(*3: si8, Guard(?4: !2, Add(*3, ?4))))
Tupled : (With(!2: Guard(?1: qi8, Mul(i8, ?1)), ForEach(*3: si8, Guard(?4: !2, Add(*3, ?4)))), With(!2: Guard(?1: qi8, Mul(i8, ?1)), ForEach(*3: si8, Guard(?4: !2, Add(*3, ?4)))))
Reducer: With(!2: Guard(?1: qi8, Mul(i8, ?1)), (ForEach(*3: si8, Guard(?4: !2, Add(*3, ?4))), ForEach(*3: si8, Guard(?4: !2, Add(*3, ?4)))))
###
> (i8 * i8) + si8 + (i8 * i8)
i8 * i8 + si8 + i8 * i8 : i8*
Binder : With(!1: Mul(i8, i8), ForEach(*4: With(!2: Mul(i8, i8), ForEach(*3: si8, Add(!2, *3))), Add(*4, !1)))
Reducer: With(!1: Mul(i8, i8), ForEach(*2: si8, Add(!1, *2, !1)))
Hoister: With(!1: Mul(i8, i8), With(!2: Add(!1, !1), ForEach(*3: si8, Add(!2, *3))))
Reducer: With(!1: Mul(i8, i8), !2: Add(!1, !1), ForEach(*3: si8, Add(!2, *3)))
Tupled : (With(!1: Mul(i8, i8), ForEach(*4: With(!2: Mul(i8, i8), ForEach(*3: si8, Add(!2, *3))), Add(*4, !1))), With(!1: Mul(i8, i8), ForEach(*4: With(!2: Mul(i8, i8), ForEach(*3: si8, Add(!2, *3))), Add(*4, !1))))
Reducer: With(!1: Mul(i8, i8), (ForEach(*2: si8, Add(!1, *2, !1)), ForEach(*2: si8, Add(!1, *2, !1))))
Hoister: With(!1: Mul(i8, i8), (With(!2: Add(!1, !1), ForEach(*3: si8, Add(!2, *3))), With(!4: Add(!1, !1), ForEach(*3: si8, Add(!4, *3)))))
Reducer: With(!1: Mul(i8, i8), !2: Add(!1, !1), (ForEach(*3: si8, Add(!2, *3)), ForEach(*3: si8, Add(!2, *3))))
###
> Mod(si8, i8 * i8)
Mod(si8, i8 * i8) : i8*
Binder : With(!1: Mul(i8, i8), ForEach(*2: si8, Mod(*2, !1)))
Tupled : (With(!1: Mul(i8, i8), ForEach(*2: si8, Mod(*2, !1))), With(!1: Mul(i8, i8), ForEach(*2: si8, Mod(*2, !1))))
Reducer: With(!1: Mul(i8, i8), (ForEach(*2: si8, Mod(*2, !1)), ForEach(*2: si8, Mod(*2, !1))))
###
> Mod(si8, qi8 * i8)
Mod(si8, qi8 * i8) : i8?*
Binder : With(!2: Guard(?1: qi8, Mul(?1, i8)), ForEach(*3: si8, Guard(?4: !2, Mod(*3, ?4))))
Tupled : (With(!2: Guard(?1: qi8, Mul(?1, i8)), ForEach(*3: si8, Guard(?4: !2, Mod(*3, ?4)))), With(!2: Guard(?1: qi8, Mul(?1, i8)), ForEach(*3: si8, Guard(?4: !2, Mod(*3, ?4)))))
Reducer: With(!2: Guard(?1: qi8, Mul(?1, i8)), (ForEach(*3: si8, Guard(?4: !2, Mod(*3, ?4))), ForEach(*3: si8, Guard(?4: !2, Mod(*3, ?4)))))
###
> Mod(i8 * i8, si8)
Mod(i8 * i8, si8) : i8*
Binder : With(!1: Mul(i8, i8), ForEach(*2: si8, Mod(!1, *2)))
Tupled : (With(!1: Mul(i8, i8), ForEach(*2: si8, Mod(!1, *2))), With(!1: Mul(i8, i8), ForEach(*2: si8, Mod(!1, *2))))
Reducer: With(!1: Mul(i8, i8), (ForEach(*2: si8, Mod(!1, *2)), ForEach(*2: si8, Mod(!1, *2))))
###
> Mod(i8 * qi8, si8)
Mod(i8 * qi8, si8) : i8?*
Binder : With(!2: Guard(?1: qi8, Mul(i8, ?1)), ForEach(*3: si8, Guard(?4: !2, Mod(?4, *3))))
Tupled : (With(!2: Guard(?1: qi8, Mul(i8, ?1)), ForEach(*3: si8, Guard(?4: !2, Mod(?4, *3)))), With(!2: Guard(?1: qi8, Mul(i8, ?1)), ForEach(*3: si8, Guard(?4: !2, Mod(?4, *3)))))
Reducer: With(!2: Guard(?1: qi8, Mul(i8, ?1)), (ForEach(*3: si8, Guard(?4: !2, Mod(?4, *3))), ForEach(*3: si8, Guard(?4: !2, Mod(?4, *3)))))
###
> Date.Now.Utc() + ts // Note the doubling in "With" for the "tupled" output.
Date.Now.Utc() + ts : d*
Binder : With(!1: Date.Now.Utc(), ForEach(*2: ts, ChronoAdd(!1, *2)))
Tupled : (With(!1: Date.Now.Utc(), ForEach(*2: ts, ChronoAdd(!1, *2))), With(!1: Date.Now.Utc(), ForEach(*2: ts, ChronoAdd(!1, *2))))
Reducer: With(!1: Date.Now.Utc(), !2: Date.Now.Utc(), (ForEach(*3: ts, ChronoAdd(!1, *3)), ForEach(*3: ts, ChronoAdd(!2, *3))))
###
> V(3) + ts
V(3) + ts : d*
Binder : With(!2: With(!1: 3, ChronoAdd(Date.Now.Utc(), Time(!1))), ForEach(*3: ts, ChronoAdd(!2, *3)))
Reducer: With(!1: ChronoAdd(Date.Now.Utc(), Time(3)), ForEach(*2: ts, ChronoAdd(!1, *2)))
Tupled : (With(!2: With(!1: 3, ChronoAdd(Date.Now.Utc(), Time(!1))), ForEach(*3: ts, ChronoAdd(!2, *3))), With(!2: With(!1: 3, ChronoAdd(Date.Now.Utc(), Time(!1))), ForEach(*3: ts, ChronoAdd(!2, *3))))
Reducer: With(!1: ChronoAdd(Date.Now.Utc(), Time(3)), !2: ChronoAdd(Date.Now.Utc(), Time(3)), (ForEach(*3: ts, ChronoAdd(!1, *3)), ForEach(*3: ts, ChronoAdd(!2, *3))))
###
> NowUtc() + ts // Error: proc can't be used as function.
NowUtc() + ts : t*
*** Error: (6,7) Node: NowUtc(), Message: Procedure 'NowUtc' cannot be used as a function
*** Error: (6,7) Node: NowUtc(), Message: Invalid operand type: cannot convert type 'g' to 't'
Binder : With(!1: NowUtc(), ForEach(*2: ts, ChronoAdd(Error(ErrBadType_Src_Dst), *2)))
Reducer: ForEach(*1: ts, ChronoAdd(Error(ErrBadType_Src_Dst), *1))
Tupled : (With(!1: NowUtc(), ForEach(*2: ts, ChronoAdd(Error(ErrBadType_Src_Dst), *2))), With(!1: NowUtc(), ForEach(*2: ts, ChronoAdd(Error(ErrBadType_Src_Dst), *2))))
Reducer: (ForEach(*1: ts, ChronoAdd(Error(ErrBadType_Src_Dst), *1)), ForEach(*1: ts, ChronoAdd(Error(ErrBadType_Src_Dst), *1)))
###
