Awesome
_____ __ __ _____ _____ _____ _____ _____
| | | |___| __ | _ | __| | |
| | | |_ _|___| __ -| |__ |- -| --|
|_|_|_| |_| |_____|__|__|_____|_____|_____|
Copyright (C) 2011 - 2024 Tony Wang
Contents
Introduction
MY-BASIC is a lightweight BASIC interpreter written in standard C in dual files. It aims to be embeddable, extendable and portable. It is a dynamic typed programming language, reserves structured syntax, supports a style of prototype-based programming (OOP), also implements a functional paradigm by lambda abstraction. The core is written in a C source file and an associated header file. It's easy to either use it as a standalone interpreter or embed it with existing projects in C, C++, Java, Objective-C, Swift, C#, etc. and totally customizable by adding your own scripting interface.
Main features
MY-BASIC offers a wide range of features including:
- Written in standard C, source code is portable to a dozen of platforms
- Lightweight (within less than 128KB footprint), fast, and configurable
- With both retro and modern BASIC syntax
- Case-insensitive tokenization, and many other indelible BASIC flavour
- Unicode support
- Prototype-based programming, with reflection support
- Lambda abstraction enhanced functional programming
- Customizable referenced/non-referenced usertype
- Collection construction and manipulation functions for
LIST
andDICT
- Automatic releasing for referenced values (prototype, lambda, referenced usertype, list, dictionary, etc.) benefited from reference counting and garbage collection
- Common numeric and string functions
- Structured sub routine definition with the
DEF/ENDDEF
statements - Structured
IF/THEN/ELSEIF/ELSE/ENDIF
- Structured
FOR/TO/STEP/NEXT
,FOR/IN/NEXT
,WHILE/WEND
,DO/UNTIL
- Reserved retro
GOTO
,GOSUB/RETURN
- Importing multiple source files with the
IMPORT
statement - Debug API
- Customizable memory pool
- Easy API, for extending new BASIC functions
- Easy interacting BASIC facilities at native side, and vice versa
- More features under development
Get BASIC8 - the Fantasy Computer powered by MY-BASIC - on Steam for game and other program development in an integrated environment.
See awesome user creations.
BASIC at a glance
A "Hello World" convention in MY-BASIC:
input "What is your name: ", n$
def greeting(a, b)
return a + " " + b + " by " + n$ + "."
enddef
print greeting("Hello", "world");
Read the MY-BASIC Quick Reference to get details about how to program in MY-BASIC.
Installation
Using standalone interpreter binary
This repository contains precompiled binaries for Windows, macOS and Linux, the easiest way is to download to get a direct playground. Or you can make a build by:
- Using the Visual Studio solution
my_basic.sln
for Windows build - Using the Xcode workspace
my_basic_mac.xcodeproj
for macOS build - Using the
makefile
for Linux build
Follow these steps to compile an interpreter binary manually for other platform:
- Retrieve everything under the
core
andshell
folders for a minimum setup - Setup your toolchain for compiling and linking
- Compile
core/my_basic.c
andshell/main.c
, while both includescore/my_basic.h
; then link up an executable
The standalone interpreter supports three running modes:
- Execute the binary without arguments to use the interactive mode
- Type "HELP" and hint Enter to see usages
- Pass a file to the binary to load and run that BASIC source code
- Pass an argument
-e
followed with an expression to evaluate and print instantly as a simple calculator, eg.-e "22 / 7"
Combining with existing projects
Just copy core/my_basic.c
and core/my_basic.h
to your project and add them to the build pipeline. You can link with MY-BASIC as a lib as well.
For details about using MY-BASIC after integration, see MY-BASIC Quick Reference and read the Wiki pages.
Interpreter workflow diagram
MY-BASIC's workflow diagram can be concluded in a single image.
A simple setup:
#include "my_basic.h"
int main() {
struct mb_interpreter_t* bas = NULL;
mb_init();
mb_open(&bas);
mb_load_string(bas, "print 22 / 7;", true);
mb_run(bas, true);
mb_close(&bas);
mb_dispose();
return 0;
}
Wiki
The manual explains most of the fundamental topics, however it doesn't cover everything; read the Wiki for supplements, like machinism behind MY-BASIC, efficient practice, etc:
- Principles
- Coding
- Data types
- Standalone shell
- Integration
- Customization
- More scripting API
- FAQ
Donate
Consider supporting MY-BASIC development with a donation if you like this project.
One-off donation via PayPal.
<a href="http://paladin-t.github.io/my_basic/donate.html"> <img src="https://github.com/paladin-t/my_basic/wiki/img/button_donate.png" width="92"> </a>