Up to Main Index Up to Journal for November, 2023
JOURNAL FOR SUNDAY 12TH NOVEMBER, 2023
______________________________________________________________________________
SUBJECT: On adding constants
DATE: Sun 12 Nov 19:48:35 GMT 2023
The work on adding the new data type any I believe is now complete. I need to
finish final testing and documentation before publishing a release. However, I
recently had my Covid and flu shots and feel awful :( In the meantime I’ve
been idly toying away at a feature often requested, constant values.
Constants are just that, variables you set to a value once and that value
never changes again for the execution of the program. The syntax implemented
so far looks like this:
const i := 3
Here the variable i is set to the integer value 3 and it cannot be changed.
Only the inferred define and assign ‘:=’ form of variable declaration is
supported by the const operator for now.
A constant can be initialised to any expression. For example:
const i := 3 + 5
const config := call init
Arrays and maps may be constants. However, while a different array or map
cannot be assigned to the constants the elements can be modified. This may
change in the future as I believe a constant should be completely constant.
Constants may be defined in functions:
// circle returns the area of the circle for the given radius
circle: func radius:float
const π := 245850922.0 / 78256779.0 // π is 3.141592653589793
return π * radius * radius
endfunc
println call circle 2.0 // displays 12.566370614359172
println call circle 4.0 // displays 50.26548245743669
One issue I’m still working on, functions do not have visibility of global
constants yet.
I did have some optimisations for constants working. The compiler should be
smart enough to replace constant variables with their literal values. For
example, given:
const i := 3
println i
In this case the compiler should rewrite ‘println i’ as ‘println 3’, omitting
the variable access. I’m now on my third attempt at implementing constants and
the optimisations for this iteration have not been added yet. It should be
noted that such optimisations would only apply for constants of simple types
that are not conditionally defined.
What happened to the other two attempts? They were… very messy — mostly due to
my sick and addled brain at the moment. This third implementation is clean and
simple with only a few code changes.
--
Diddymus
Up to Main Index Up to Journal for November, 2023