Releases: BartJongejan/Bracmat
Miitak
18 February 2026
The Linux and MacOS versions use the GNU readline library for a friendlier user interface when running bracmat interactively.
Backspace deletes previous character, up and down arrow keys scroll through earlier inputs. The Windows version has
always had this behaviour.
3 February 2026
Result from calling a method of a built-in object (hash, calculation a.k.a. UFP) can now be negated with the ~ (negation) flag
This is especially useful with the `find' method of a hash object.
5 January 2026
Reading a large XML file with the TRM (collapse white space to single blank) option was unnecessary slow.
More efficient reading of large XML file with TRM option: fread instead of fgetc.
2 January 2026
Before we had ~<> for case insensitive matching. Now we also have <> for negated case insensitive matching.
Example:
aap:<>AAP fails, because aap and AAP match, if we ignore case differences. <> is negation.
18 November 2025
Updated with http://unicode.org/Public/UNIDATA/UnicodeData.txt (2025-08-15 19:45)
Klim
-
New functionality
If you want to check which parts of a Bracmat program are visited and which are not, then
a) compile Bracmat with the -DUNVISITED flag
b) run the Bracmat program
c) list the Bracmat program using lst$. Add the new VIS option.
All unvisited binary nodes are affixed with a pair of braces {}. -
Bug fix
Fixed error in strcasecompu. (Case insensitive string compare)
Martinia
This version fixes a bug in string pattern matching. Patterns that could be interpreted as a 'double', e.g. "54.", where not handled correctly during string pattern matching. Thus, the operation
@("54.321":"54.321")
did not succeed. This bug arose with the introduction of floating point capabilities in Bracmat.
Mardak
-
A real bug has been fixed! The following expression failed:
a*b*c:(a*b*c ?)*?z&!z:1
The product a*b*c is just an example. Any product or sum of three or more elements would show the bug: !z would evaluate to the product (or sum) without the first two elements. In the example, z would evaluate to c.
- sys$ always returned 0, now it only returns 0 if the system call was successful.
Nahami
New features:
-
tme$ function gives local time. tme$GMT gives UTC (Coordinated Universal Time). Output contains all fields in C's tm struct, but with month, year, day of the week day and day of the year given in conventional ranges instead of starting from 0.
-
map$, mop$ and vap$ functions can take empty string as `map function'. Result: elements passed on unchanged.
-
The mop$ function can take an extra argument that indicates the operator to be used to separate the elements in the output. The output list is sorted if the output separator is * or +, using merge sort.
-
lst$ function is set to fail if given a symbol without a binding.
-
Changed ' to ' in toML function, since ' is not a valid HTML entity.
-
Allow / in unquoted HTML(5) attribute, even if followed by >. This change was necessary because https://html.spec.whatwg.org/ contains such attribute values, and validates with https://validator.w3.org/.
Keba
Improvements since september 2023
- UFP export function accepts more formats: "%f" or F, %a or H, N, Q and %e or R.
- toML function: Removed the space before the slash in empty tags (void elements).
- nestML function: If a </html> tag is present, make sure there also is a <html> tag
- nestML function: explicitly close non-empty elements such as in <p>abra<p>cadabra.
- Improved error messages when something is wrong in function call in UFP object.
- Embed `normal' Bracmat expression in UFP object using eval'(expression).
- For now, no value is passed to or returned from eval. (This might change.)
- Expression can export data from UFP object.
v6.19.2-Makkatti
Traditional Bracmat with Floating Point capabilities.
A new object type, UFP (Un-I-fancy-fied Floating Point) fulfils a dream I have had for decades: the ability to handle Floating Point calculations in Bracmat. This is not a trivial problem: bignums and C "double"s don't mix well. The current solution solves this problem by ensuring that Bracmat never has to mix floating point numbers and bignums in the same numerical operation. All floating point operations are delegated to UFP objects and UFP objects are only able to handle floating point numbers.
UFP objects execute code that is compiled to a bytecode. UFP operations are much faster than the bignum operations performed by Bracmat.
Source code for UFP objects is parsed as Bracmat code and can be built and modified as any other Bracmat code.
The encapsulation of floating point operations in UFP objects guarantees that old Bracmat code continues to work.
The following files are generated from the source code in this release:
- bracmat-Windows32.exe, bracmat-Windows64.exe: Windows executables 32 and 64 bit
- bracmat-Linux: Linux executable, statically linked
- bracmat-macOS: macOS executable
- bracmat.html, bracmat.pdf: Documentation created from and by Bracmat script doc/help
- bracmatJS.html: Bracmat compiled to WebAssembly and embedded in a HTML file. Runs in your browser independently of any server.
Potu
New built-in function mop$.
If you wanted to iterate over all terms in a sum, all factors in a product, all elements in a comma-separated list, etc., outputting a space separated list with the elements in the same order, the fastest solution required two whl'() loops: One whl' loop to create a space separated list by prepending elements to an initially empty list, and another whl' loop to get the elements in the right order.
{?} 2*a+b*c+d^f:?sum & !sum
{!} 2*a+d^f+b*c
{?} :?INV & whl'(!sum:?%term+?sum & !term !INV:?INV) & :?ANSW & whl'(!INV:?%term ?INV & !term !ANSW:?ANSW) & !ANSW
{!} 2*a d^f b*c
The mop$ function makes this much simpler and faster.
{?} 2*a+b*c+d^f:?sum & !sum
{!} 2*a+d^f+b*c
{?} mop$((=.!arg).!sum.(=+))
{!} 2*a d^f b*c
Holberg
This release contains binaries for Windows (32 and 64 bit) and Linux (64 bit).
bracmat.exe : 32 bit windows version
bracmat64.exe : 64 bit windows version
bracmat: 64 bit Linux version (statically linked)