TMBASIC is a programming language for writing non-graphical programs. The modern BASIC language is easy for beginners to learn. Experienced programmers will find it familiar and productive after a brief glance at the cheat sheet.
TMBASIC is under development. Stay tuned!
Easy to learn — The BASIC language will feel familiar to anyone with programming experience. New programmers will enjoy a cohesive, batteries-included learning experience. Everything you need to develop and distribute sophisticated apps is included in TMBASIC.
Easy to write — Developing a high-quality modern GUI requires professional-level expertise. Text-based apps have few options for visual effects, and even a novice can produce quality results.
Easy to share — TMBASIC apps are standalone executables that require no external library files. They can be copied and opened without installation. TMBASIC can cross-compile native executables targeting Windows, macOS, and Linux.
dim a as Number dim b as String dim c as Boolean dim d = 1.2345 dim e = "hello world!" dim f = true
Declare variables with dim
, providing either an explicit
type or an initial value. The simple types are:
Number
— 128-bit
decimal floating-pointString
— UTF-8 textBoolean
— true
or false
dim myList = [1, 2, 3] dim combinedList = myList + [4, 5, 6] + 7
dim myMap as Map from Number to String myMap(123) = "hello" print ContainsKey(myMap, 123) ' true
dim set mySet for i = 1 to 100 step 2 yield i next end dim
The collection types are:
List of T
— An ordered array of values of type
T
. List indices start at zero.Map from T1 to T2
— A dictionary with keys of type
T1
and values of type T2
.Set of T
— A group of unique values of type
T
.Use dim list
, dim map
, and
dim set
to build collections efficiently. Each
yield
statement adds an element to the collection.
These collection types are generic, but you can’t define your own generic types.
dim d = DateFromParts(2021, 3, 12) dim dt = DateTimeFromParts(2021, 3, 12, 4, 30, 0, 0) dim tz = TimeZoneFromName("America/New_York") dim offsets = UtcOffsets(dt, tz) dim dto = DateTimeOffsetFromParts(2021, 3, 12, 4, 30, 0, 0, offsets(0))
The date and time types are:
Date
— A day without a time.DateTime
— A date and local time without any time
zone.DateTimeOffset
— A date and local time with the time
zone offset from UTC.TimeSpan
— A duration of time.TimeZone
— A time zone defined by the IANA.type ExampleRecord foo as Number bar as String end type
dim myAnonymousRecord1 as Record (foo as Number, bar as String) dim myAnonymousRecord2 = { foo: 100, bar: "hello" } dim myNamedRecord = myAnonymousRecord2 as ExampleRecord
Both anonymous and named record types are supported. The literal
syntax for anonymous records resembles JavaScript. Anonymous records can
be converted to named records with the as
operator.
dim a = { foo: 1, bar: 2 } dim b = a ' makes a copy b.foo = 999 ' a.foo is still 1
All types, including records and collections, have value semantics. There are no references or pointers. Assigning to a variable or passing to a function always makes a copy of the value.
sub Main() print Squared(5) end sub
function Squared(x as Number) as Number return x * x end function
Programs are broken down into functions and subroutines. A function
returns a value to its caller. A subroutine does not return anything.
Program execution begins in the Main
subroutine.
Windows |
|
macOS |
Intel • Apple Silicon |
Linux |
|
iOS |
iSH
Shell (Linux |
Android | Termux (Linux ARM64) |
TMBASIC is open source
software that is available free of charge. TMBASIC builds your
programs using many open source components. See
a list of components here. These components have permissive and
commercial-friendly licenses that you must obey when you publish your
programs written in TMBASIC. When you build your program, TMBASIC
produces a LICENSE.txt
file for your convenience. Include
this license file when sharing your TMBASIC apps.