Jamie Balfour

Welcome to my personal website.

Find out more about me, my personal projects, reviews, courses and much more here.

Jamie Balfour'sPersonal blog

ZPE 1.14.2 has been released this weekend. The new version brings a ton of new enhancements including the ability to view variables at certain points in the program through proper debugging tools that offer step over and execution pausing - not just termination.

ZIDE v.0.1.0-alpha has also been released, and this is the first version to be properly released. You can download the JAR from my GitHub and the individual binaries from my website (Linux coming soon).

ZIDE is not like ZPE in the sense that ZIDE is still in very early days. Each time a new binary is built, it will automatically be uploaded to my website for downloading. GitHub also will continue to feature release tags for each version. You can see the full source code for ZIDE on my GitHub as well.

ZPE 1.14.2 brings three major features.

Universal template parsing

Template parsing was introduced some time ago, but was released only in January 2026 with ZPE version 1.14.1. In the latest release, version 1.14.2, template parsing is available anywhere, including in parameters and return values.

Scope blocks

Many languages have scope blocks, and now YASS does too. They are nice and easy to use as well. Simply using the double brace syntax ({{ }} or the block syntax (block . . . end block), you can create an isolated scope block:

YASS
// Everything here runs inside the implicit GLOBAL function

$total = 100
print("Start total: " & $total)

block

  // This variable exists ONLY inside the block
  $total = 25
  print("Inside block: " & $total)

  // Blocks can still see outer variables
  $discount = 10
  $total = $total - $discount
  print("After discount: " & $total)

end block

// Block variables are discarded
print("End total: " & $total)

Variable scoping

Additionally, variables declared as private in a function are scoped to the containing function and no longer modify parent or global variables, allowing safer encapsulation while preserving YASS’s simple scoping model.

As the title suggests, ZPE 1.14.1 is just about ready. This version is more of a bug-fix version, but it does bring some nice new changes. 

For a start, ZPE no longer relies on native access for the command-line interface jLine. It also introduces tabbing in the command line via jLine. This is a really welcome addition. Changes to ZPEX mean that the -g and -q modes are no longer included in those builds. Minor performance improvements have also been brought to ZPE and, best of all, the JAR is more than 4MB smaller than before.

It's been a while since I uploaded a new version of ZPE, and it's not because I'm done with it or anything. 

ZPE is mature, powerful and robust, and I'm not desperately in need of updating it right now. I am, however, working on adding code blocks to the YASS language but that's not due until the end of December. 

As a result, I've released the version planned for the end of October, which has now been rebranded as ZPE 1.13.11 Walmgate. 

ZPE 1.13.8 is only just out, and we've already got the headline feature of ZPE 1.13.9, and it's all about security. 

Plugin security has been non-existent over the last few versions due to changes and deprecations in the underlying Java language. Anyway, today I decided it's time to relook at this and I've come up with my own way of doing this. Simply put, it forces plugin developers to develop an alternative way of accessing files, and that's using the new ZPE Sandbox Security file system. It also prevents access to certain other things, like running commands on the command line through the shell and restricts users to the built-in ZPE shell. 

Overall, this is the first step to a more secure plugin-based environment and I'm really happy with it.

Most of the focus of the new Colliergate release is on the new and improved parser. The parser claims up to 24% increases in performance, and that's because it finally brings a new means of peeking.

What I'm talking about is that the Zenith Parsing Engine version 1.5 no longer wastes parsing time when peeking - once a token has been read, it is stored and it's never reparsed. Because of this, when ZPE asks the parser to peek ahead, the parser checks if the token has been parsed, and if not, it parses it, then returns that token. See, whenever you do a K(n) peek ahead, you parse n tokens, but in previous versions of the Zenith Parsing Engine, these tokens were discarded and reparsed again when the parser re-peeked at them or tokenised them, thus, storing a token cache, we can easily discern its value without reparsing it.

It's just astoundingly fast, and this improves CSV, XML, JSON, TOML, JBML and INI parsing too.

What this means is that ZPE is catching up to competitors for parsing speed, and there's still room for further enhancements that are planned for version 1.6. 

The new version of ZPE will be released on Friday, marking one of the most exciting updates to date. Spanning three months rather than the usual one, it brings a slew of new features and changes designed to improve performance, add functionality, tighten the syntax, and enhance the UI.

It contains several significant changes, including the headline feature: a new parser, the Zenith Parsing Engine version 1.5, which offers up to 24% faster parsing speed by reducing backtracking in the parser. 

Constructs

Labels and GoTo have been added to YASS. This is something I have tried to implement in the past, but have always disliked the way I've done it. I also think that, given YASS is meant to be object-oriented and unprocedural, it's not something that fits in with the standard, but it is here anyway.

YASS
$i = 0
label openloop
print($i++)
if ($i < 10)
  goto openloop
end if
print("Done")

Assertion has seen a massive change to make it more like other languages:

YASS
assert($a == [5, 8, 13, 21, 34])

Not only that, but the error identification is so much better than before when using assertions.

Bugs

Many bugs have been fixed, including:

  • All properties of anonymous objects are now always accessible.
  • Fixed a bug in the list_zpe_properties function to ensure it always returns all functions
  • Added a new and more effective means of determining whether the program is run from a command line/headless
  • Fixed the JSON parser to ensure it no longer double-checks every string for quote marks

Functions

Several new functions have been added:

  • get_environment_variables
  • get_percentile
  • base64_encode
  • base64_decode
  • histogram

The beep function has also been significantly improved with more accurate frequencies.

Objects

Added two new objects:

  • Colour
  • Point

GUI

The GUI has been updated considerably:

  • The rogue white line at the bottom has finally been removed!
  • The curved UI has been improved further, as has the menu.
  • The macOS icons are now manually rendered rather than relying on PNGs (this was always temporary)
  • There's now support for BalfLaf Themes (blt) files
  • There's now a property editor dialog for changing properties of ZPE
  • There's now a lockdown option that can be set on individual installations of ZPE
  • Symbols are no longer highlighted as part of the keyword set in the editor
  • Built-in objects and imported objects are now highlighted
  • New, clean and straightforward white icons are used at the top right of the GUI instead of the multi-coloured ones
  • There is now an option to run ZPE Native if it is found in the correct place
  • There's no longer an option to run code locally, and without running it through a separate ZPE process, which makes it easier to work with and prevents the GUI from crashing. The 'local' option is only used as a fallback.

The Quick Fire Command Window (-q) has also undergone significant improvements in both form and functionality.

ZPE Macro Interface Editor

There's a lot to discuss here, but in short, the macro editor has improved significantly over the last few months to the point that it's now become a key part of my other software. It has always been able to act on an object provided to it, but now it can give information on functions provided in the object, it can be used to not only make simple code and execute it, but also provide code back to the calling program that can be used call a macro when a button is clicked for example. See eTraxion for more information on how this is used.

Other changes

ZPE now stores data in a new folder on the system. For macOS, this is the Library/Application Support folder; for Windows, it is AppData; and for Linux and other operating systems, it remains the home directory. 

Mathematical functions have been split into two separate categories: Numerical and Arithmetic, and Scientific Mathematics. This is because the Mathematics category was getting too large.

New ZPEKit methods have been added to provide more comprehensive access to the ZPE Core. 

That's just been a quick overview of the main new features coming to ZPE in version 1.13.8, which will be released on Friday. I'm exceedingly excited!

Ten years ago today, in May 2015, I rebuilt ZPE from the ground up, developing a parser that still powers it today. That parser, the Zenith Parsing Engine, completely changed ZPE and made it possible to create large programs that didn't experience slowdown. It also allowed me to develop more complex constructs and statements and build in backtracking, a once fundamental step in ZPE as a program. 

It was also the day I introduced the YASS language (known back then as Zenlang). 

ZPE 1.3 was the foundation of what ZPE is today. It completely changed ZPE. It's incredible to think how far it's come, and it's also amazing to believe that it's been a project for ten years!

I also intentionally timed it so that the next version of ZPE would be released today. So, ZPE 1.13.7 was also released today. This is an anniversary edition since it marks the ten-year anniversary.

You may also notice that I pushed a few more versions this year to try and get to 13.7 for this release, and that's because my birthday is 13-7-1991, so I wanted that to coincide with this release. 

I will launch modules for the YASS language in a very near future release. These modules will further compartmentalise the YASS language and add to its object-oriented paradigm. 

Modules are the parents of structures, objects, and functions. Their primary purpose is to use static methods, like the library system currently does, but in a far more flexible manner. This will involve many underlying changes to the systems of the ZPE Programming Environment core. It's currently planned for a July release. 

After a weekend of looking at my whiteboard, this is what I've come up with.

I'm pleased to announce that after nearly ten years of using hash maps in ZPE, I've switched to using my new binary search tree implementation. This improves performance further than before since in some cases my hash map, which is some 8 years old, would lead to collisions that in turn presented a O(n) case. This was not good. 

The worst case for a binary search tree is indeed O(n) also and it's best case is actually worse than that of a hash map, which is O(1), but I've been testing out a new binary search tree I've developed and it performs marginally better. What's really cool about the binary search tree implementation is that it is actually a drop in replacement for the hash map I've been using for the last few years with methods like put, get and so on. 

Throughout the next few weeks I'll continue to assess this. 

Powered by DASH 2.0