Another week, another pair of software releases...
Humbug v57
New features:
- Added a Quick Switcher (Cmd+P / Ctrl+P) that fuzzy-filters open tabs, conversations, and files across the mindspace and jumps straight to the selected one.
- Markdown tables now render with proportional spacing of columns to make things more readable. If a markdown table is detected to be written with the first character in Arabic then the table is rendered from the right and not the left.
- Added the
enumspecial form to the Menai syntax highlighter. - Added a Pascal syntax highlighter.
- Added Claude Haiku 5.5.
- Removed Claude Haiku 4.5.
- Added the ability to launch an app window per-mindspace.
- A mindspace can now only be open in one Humbug instance at a time. Opening the same mindspace twice previously let each instance overwrite the other's session, usage, and interaction log without warning.
Bug fixes:
- Made a minor adjustment to tab bar labels to make them more distinct.
- AI tools that access the filesystem are now correctly blocked from accessing the mindspace
.humbugdirectory. All file accesses are now standardized through a single mechanism.
Internal structure changes:
- The tests directory structure now mirrors the main directory hierarchy. Tests for code in
srcnow appear intest/src.
Menai v0.8
New features:
- Added a new "trivial phi elimination" operation inside the CFG collapse phi pass.
- Added a register dump capability to capture state when an error is raised inside the VM.
- Added a
base64-decodemodule to the standard library. It decodes Base64 text (RFC 4648) to bytes. - Added a
base64-encodemodule to the standard library. It encodes a bytes value as Base64 text, selecting the standard or URL-safe alphabet and padded or unpadded output. It is the inverse ofbase64-decode. - Added a
csv-decodemodule to the standard library. It decodes RFC 4180 CSV text (as a string) to a vector of rows, each row a vector of field strings, so both rows and fields are reachable in O(1) by position. - Added a
csv-encodemodule to the standard library. It encodes a vector of rows (each a vector of field strings) as RFC 4180 CSV text. It is the inverse ofcsv-decode. - Added a
regexpmodule to the standard library. It compiles a regular-expression pattern and searches, splits, or replaces within strings. - Added
xml-decodeandxml-encodemodules to the standard library. They parse XML text into a value tree and serialise it back. - Added
docx-decodeanddocx-encodemodules to the standard library. They decode a DOCX package into a value tree that faithfully captures its OOXML parts and encode it back. - Added an
enumtype: a nominal, closed set of named variants, compared for identity only.
Bug fixes:
- Updated the LICM pass to handle the nested loops introduced by the letrec inliner optimization.
- Fixed a hash reinitialization bug in the VM.
- Parenthesis errors now report the line and column to change rather than the line where the offending form opened. A missing
)is reported at its insertion point, and an extra)at the)that cannot be matched, naming any earlier)that closed a form before its body as the likely culprit. Errors also include a per-line parenthesis depth table. - A parse error no longer leaves the AST builder's unclosed-form stack populated, which previously inflated the depth reported for the next parse.
- Two top-level expressions are no longer misreported as a premature closing parenthesis.
- A structural error caused by a
)that closed an enclosing form before its body is now reported at that). - Fixed a miscompile in the CFG branch constant propagation pass. It dropped a phi whose result fed a branch directly and was also used downstream, leaving the downstream use undefined.
- Fixed a miscompile in the interprocedural type analysis. A call whose callee could not be resolved contributed no return-type information instead of an unknown type, so a function returning such a call was reported as returning only the types of its other return paths.
- Fixed a miscompile in the slot allocator. A closure result coalesced into a slot it captured overwrote the captured value before it was patched, so the closure captured itself.
- Fixed a scope bug when desugaring a
let*that binds an imported module. A binding value that referenced a module member failed to compile because the module's bindings were not in scope for it. - Fixed an IR dead binding elimination quirk. An unreachable group of mutually-recursive bindings can now be eliminated.
- Fixed a VCode issue affecting tail recursive variadic functions.
Internal structure changes:
- Any opcode that has a register source operand has now been updated to take an optional constant operand too. A new peephole pass merges constant loads into opcodes, giving benchmark gains typically around 4-5%.
- Test
testsdirectory now accurately reflects the source tree. - Removed the
menai-checktool. The compiler reports parenthesis errors more accurately, and editors highlight matching parentheses visually, so the tool no longer earned its place.