For an extremely long time, ZPE has relied on native Object types for return values. I never wanted to keep this because it meant a lot of type casting, type inference, potential bugs, a lack of security regarding what was passed around ZPE, and also a lot of type checking. This slowed down ZPE and meant it didn't feel particularly stable.
As of version 1.12.9, ZPE is now fully locked down to the ZPEType return type, which includes ZPEStrings, ZPENumbers, ZPEBooleans, ZPEObjects, ZPEFunctions, ZPERecords, ZPETuples, ZPELists, ZPEArrays, ZPEMaps, and ZPEOrderedMaps. This reduces ZPE's flexibility, making the Core much more stable.
As I say, this is one of the biggest updates to ZPE in a long time and it paves the way to further updates that will strengthen this.
What's really cool about this update, nothing has changed in the compiler so no scripts that have been compiled need to be changed, and in fact, nothing needs to be changed in any existing scripts.