Up to Main Index Up to Journal for September, 2022
JOURNAL FOR SATURDAY 17TH SEPTEMBER, 2022
______________________________________________________________________________
SUBJECT: Mere v0.0.4 — bug fixes and improvements
DATE: Sat 17 Sep 19:25:50 BST 2022
I’ve just updated Mere & Mere ICE in the annexed works[1] to v0.0.4 for people
to play with. A lot of the changes have been bug fixes and improvements to the
debugging facilities.
First up is a new assert built-in, so that I can write tests for Mere using
Mere itself. This has already paid off, hence many of the bug fixes. If an
assert failes then execution stops and an exit code of 4 is returned.
Additional context has been added to state dumps and traces. The state dump
has a new tokenized form of the program. Traces also include tokenized lines
of code before the compiled lines. For example:
>cat assert.mr
trace true
if !trace; goto skipDump
dump
skipDump:
x:int = 5
x-- // Oops...
trace false
assert x==5, "x: want 5, have "+string x
>bin/mere assert.mr
trace/0 1: if ! trace
trace/0 1: M M B[24:trace] O[8:not] B[11:if]
trace/0 1: | trace
trace/0 1: | not b[true]
trace/0 1: | if b[false]
trace/0 3: dump
trace/0 3: M B[3:dump]
trace/0 3: | dump
====================== Start State Dump =====================
pc: 3 inst: 5/- stacks: 0/0/- trace: true
--itab-------------------------------------------------------
skipDump(l): 1
x(i): 2
--ltab-------------------------------------------------------
1:skipDump: 4
--heap-------------------------------------------------------
--call stack-------------------------------------------------
0: 3: dump
--tokend-----------------------------------------------------
0: trace true
1: if ! trace
2: goto skipDump
3: dump
skipDump: (1)
4: x:int = 5
5: x --
6: trace false
7: assert x == 5 , "x: want 5, have " + string x
--code-------------------------------------------------------
0: M b[true] B[24:trace]
1: M M B[24:trace] O[8:not] B[11:if]
2: M Iu[1:] B[6:goto]
3: M B[3:dump]
skipDump: (1)
4: Ii[2:x] i[5] O[31:=]
5: Ii[2:x] O[10:--]
6: M b[false] B[24:trace]
7: M Ii[2:x] i[5] O[24:==] s["x: want 5, have "] Ii[2:x]
O[5:string] O[15:+] O[39:,] B[1:assert]
======================== End State Dump ======================
trace/0 4: x:int = 5
trace/0 4: Ii[2:x] i[5] O[31:=]
trace/0 4: | = Ii[2:x] i[5]
trace/0 5: x --
trace/0 5: Ii[2:x] O[10:--]
trace/0 5: | -- Ii[2:x]
trace/0 6: trace false
trace/0 6: M b[false] B[24:trace]
trace/0 6: | trace b[false]
assertion failed: x: want 5, have 4
2: goto skipDump
3: dump
4: x:int = 5
5: x --
6: trace false
7: assert x == 5 , "x: want 5, have " + string x
>echo $?
4
>
I then began writing tests, starting with the int and []int data types. After
a while I had 419 tests that took a reasonable time to run on the desktop. I
then wondered what the performance would be, compared to the desktop, across
my various Raspberry Pi:
--Machine---------- ---Test Time--- --Diff--
PC @3.4Ghz 64-bit: 228μs 0.0002s
Pi4 @1.8GHz 64-bit: 568μs 0.0005s +340μs
Pi4 @1.5GHz 32-bit: 927μs 0.0009s +699μs
Pi3 @1.2GHz 32-bit: 1899μs 0.0019s +1671μs
Pi0 @1.0GHz 32-bit: 5816μs 0.0058s +2222μs
Looks like I have a ways to go on optimizing Mere once it is more capable. I
already have some thoughts on that :)
The type, ×=, ÷=, &= and |= operators have been added. There is now proper
unary minus handling. This means the following now works:
a:int = 5
c:[]int = []int 7
a = -a
c[0] = -c[0]
b:int = -(a+c[0])
printf "a: %d, b: %d, c: %d" a b c
Results in:
a: -5, b: 12, c: [-7]
From the Mere ICE “What’s New” section:
• Fix -= using addition instead of subtraction in some instances.
• Add omitted &= and |= operators.
• Add missing ×= and ÷= operator aliases
• Add context for state dumps, traces & asserts.
• Add missing array comparisons for != operator.
• New assert built-in.
• Fix undefined type, later defined, corrupting other identifier references.
• New type operator to return type as a string.
• Implement array handling for string operator.
• Fix parsing quotes when quote preceded by '\'.
• Fix return type of int operator for strings.
• Properly support unary negation for integer constants, variables and array
elements.
--
Diddymus
[1] ../../../annex
Up to Main Index Up to Journal for September, 2022