ποΈ BaseScript is a programming language, which aims to compile your code to JavaScript.
Why to choose BaseScript?
- It is in the phase of active development, so more and more features are being added constantly. Also, check out RELEASE_NOTES.md, as well as Syntax Highlighter (updated) for the language
- Your ideas are also being reviewed and added, as the language is welcoming collaborations
- It provides you things, that JavaScript lacks:
- Custom operator declaration
- Pipe forward and pipe backward operators
- Emoji variables and operators
- Interfaces
- Typed functions and arguments
- Ability to get compile time errors to prevent runtime errors
- Syntax sugar from other languages, that are so excess
- Ability to customize your code the way you want it, and much more!
- Easy to switch and learn
- Code with ease
- Readable and efficient
- Boilerplate minimization
This page represents the simple to follow documentation of the language.
π¬ Email: basescriptnet@gmail.com
πΉ YouTube: BaseScript Channel
β’ Content:
- Getting started
- How to contact the creators
- Variables
- Arrays
- Objects (New Features)
- Strings
- Ternar operator
- Numbers
- BigInts
- Statement block scope
- LOG, print, WRITE and ERROR keywords
- Conditions
- if else statements
- Functions (New Features)
- Custom types
- Debugger
- try|catch|finally statement
- Switch cases
- Loops (New Features)
- Strict mode
- Interfaces
- Operators (New Features)
- Custom Operators
Learn more about CLI usage.
Install via npm
npm i basescript.js -gAt any directory use
bsc -f <file_name> [options?]For help use
bsc -helpTo install globally after git clone, you can use
npm install -g ./[Deprecated]: Include built-in functionality in .bs files
If you already have it in the main file, connected files won't need it (as well as with -r flag)
#include <builtins>Run from CLI without an output file
bsc -f <file_name> -rVariable declaration
let identifier = value
let num, num1 = 1, num2
\num3 // equivalent to let num3Const declaration
const identifier = valueVariable or value reassignment
identifier = value
array[0] = valueVariable or value reassignment
identifier = value
Object.doSomething = valueArray creation
new Array(length) // length is optional
[0, 1, 2]Getting an item from an array
array[index]Getting a slice of an array
// @params start:end[:direction(1 or -1)]
// direction is optional
array[start:end:direction]Getting the last element of the array
array[]Reassigning to the last element of the array
array[] = valueObject creation
new Object() // not recomended
{ x: 1 }Accessing items of the object
object.x
object['x']Assigning multiple items at once using
.{}operator
let object = {a: 'a'}
object.{
b: 'b',
c: 'c'
}
// object is {a: 'a', b: 'b', c: 'c'}String creation
new String() // not recomended
"Hello world"
'Programming is awesome'
`I am a
multiline string!`String item retraction
"Hello world"[4] // outputs 'o'String last item retraction
"Hello world"[] // outputs 'd'String slice
// @params start:end[:direction(1 or -1)]
"Hello world"[0:5:-1] // outputs 'olleH'The typeof operator returns a string
// returns the type of the value
typeof value
typeof(value)Regular JS way
isNaN(value) ? 1 : 0
isNaN(value) ? isFinite(value) ? 1 : 0 : -1Shortened way
With if else
true if isNaN(value) else falseDeclaration
// All followings are examples
// of the same Integer 1000
1000
1000.00
1_000
1_000.00The sizeof operator returns a number
// this returns the length of the object keys
// or if not iterable - 0
sizeof value
sizeof(value)BigInts are threated as numbers, but return typeof BigInt
1000n
1_000n
// 1000.00n will throw an error
// floating point numbers are not allowedExample with if block
if value {
...statements
}
if value BEGIN
...statements
END
if value do
statement
if value:
statementprint and LOG
// they do the same thing
// just a syntax sugar
print 10 // console.log(10)
print(10) // console.log(10)
print if defined I_dont_exist // will not print anything unless the condition is truthy!
LOG "hello world" // console.log("hello world")// appends the message to the HTML body element
// equivalent to document.write() method
WRITE "Message" // document.write("Message")
```-->
> ERROR
```javascript
// equivalent to console.error() method
ERROR "Something went wrong"
// console.error("Something went wrong")
ERROR if errorMessage // shows an error if errorMessage is not falsyComparision operators
==, !=, ===, !==, >, <, >=, <=, is, is not
// is transforms into ===
// is not transforms into !==Multivalue comparision
// Note: list of values always must be righthand
name == ('John', 'Danny', 'Charlie')
// automatically transforms into
name == 'John' || name == 'Danny' || name == 'Charlie'
random > (some_number, other_number, 20)
// same as
random > some_number && random > other_number && random > 20
// basically said, you have a callback result for your expression
// whatever the first two arguments are,
// it needs to be at least more, than 20
βοΈ Ternary if
num if num > 0
num if num > 0 and num < 5 else num == undefined
num ? num > 0
num ? num > 0 and num < 5 : num == undefinedIf statement without else
if num < 0:
num = 0
if num < 0 {
num = 0
num1 = 10
}
if (num < 0):
num = 0
if (num < 0) {
num = 0
}If statement with else
if temperature > 25:
print "It's hot!"
else print "It's cold!"Unless statement
unless isAdmin:
print "You don't have access."
// same as
if (!isAdmin) {
console.log("You don't have access.");
}Declaration
function a () {
// ...statements
return value
}
// if no arguments are carried,
// no parenthesis are required
function a {
// ...statements
return value
}
// same as
def a () {
// ...statements
return value
}
// or
def a {
// ...statements
return value
}Shortcut for return
return value
// same as
=> value
function add(a, b):=> a + bCalling functions
add(10, 20)If a function needs to be called multiple times, use the
->()operator
let elementsToWatch = document.querySelector->(
'#login',
'#password',
'#submitBtn',
) // returns an array of elements
let content = readFile->(
&('header', 'utf8'),
&('content', 'utf8'),
&('footer', 'utf8'),
).join('\n')
// returns an array, then uses the join methodFor object properties, use
->[]operator to return an array with multiple property calls
let game = new Game()
game->[
player,
getEnemies(),
getEntities()
] // returns an array of the property call results
// Note: all of those are methods and properties of game
// but you won't need to specify `game.player`. Simple:)
// This, in fact, uses the javascript `with` statement under the hood for now, which might be updated for safety purposes in the futureTyped arguments and args constant
π NOTE: every function contains args constant, which is an array representation of arguments object
// this ensures that a and b are integers
// anything else will throw an error
function add(Int a, Int b) {
return a + b
}
// only strings are allowed
function say(String text) {
WRITE text // deprecated
}Declaration
type NotEmptyArray (Array value) {
if value.length !== 0: => true
}Notes: type name must start with uppercase letter
Exactly one argument is required
Starting the debugger
if num < 0 {
debugger
}try without catch and finally
try: isWorking(1)
// same as:
try {
isWorking(1)
}
// catch block is automatically inserted
// automatically outputs console.warn(err.message)try with catch
try: isWorking(1)
catch: console.error(err)
// variable err is automatically declared
// same as:
try {
isWorking(1)
} catch err {
console.error(err)
}try with finally
try: isWorking(1)
finally: doSomethingElse()
// same as:
try {
isWorking(1)
} finally {
doSomethingElse()
}Declaration, cases?, default?
switch typeof value {
case 'String':
return value
case 'Number':
case 'Null':
case 'Undefined':
case 'NaN':
return value + '';
default: return '';
}To instantly break the case, use
case*feature
let error = ''
switch errorNumber {
case* 403: error = 'Forbidden'
case* 404: error = 'Not Found'
case* 500: error = 'Internal Server Error'
}Use
switch*clause as a value
let error = switch errorNumber {
case 403: 'Forbidden'
case 404: 'Not Found'
case 500: 'Internal Server Error'
}Declaration using
timeskeyword (not a reserved one)
8 times {
print 'Yes!'
}
// Note: For now, only a numeric value is allowed before `times` keywordDeclaration of while loop
while isTrue {
print true
}
// or
while (isTrue):
print trueDeclaration of for loop
for key in object {
print object[key]
}
for value of object {
print value
}
for i of range(0, 10) {
print i
}
for i from 0 till 10 {
print i
}
for i from 0 through 10 {
print i
}
// notice, const or let are alowed here, but not necessary
for i = 0; i < 10; i++ {
print i
}Declaration
'use strict'
// learn more at https://www.w3schools.com/js/js_strict.aspDeclaration
interface Person {
name: String,
age: Int,
children: Person[] | Null
}Usage
let people = []
function addToArray(Person person) {
people.push(person)
}
addToArray({
name: 'John',
age: 19,
children: null
})Arrow and dot operators,
->[],->(),.{}(see Functions, Objects)
->() // Calls a function if used on functions multiple times, depending on argument length
->[] // Calls an object property/properties multiple times, without the need to refer to the object each time
.{} // assigns or reassigns multiple properties and methods to an object at once, and returns the resultArithmetic Operators
+ Plus
- Minus
* Multiply
/ Divide
~/ Divide and drop the floating part
% Modulus
** Exponentiation
++ Increment
-- DecrementLogical Operators
&& Logical and
|| Logical or
! Logical notBitwise operators
& AND
| OR
~ NOT
^ XOR
<< Left shift
>> Right shift
>>> Unsigned right shiftType And Size Operators
typeof // describes the type of the object
sizeof // describes the size of the object, or returns nullThe instanceof operator
value instanceof Array
// as well as
value not instanceof Array
// or
value !instanceof ArrayThe in operator
value in object
// as well as
value not in object
// or
value !in objectPipe Forward And Pipe Back Operators
|> Pipe forward
<| Pipe back
// example
// pipe forward
num + 5 |> Array // Same as Array(num + 5)
num + 5 |> Array(0, 1) // Same as Array(num + 5, 0, 1)
num + 5 |> Array(0, 1, .) // Same as Array(0, 1, num + 5)
' How\'s it going? '
|> escape
|> trim
|> write('file.txt', .)
// pipe back
write('file.txt', .)
<| trim
<| escape
<| ' How\'s it going? 'Declaration
// operator "#" [A-Za-z0-9_\/*+-.&|$@!^#~]:+ ...
operator #/ (Number left, Number right) {
if isNaN(left / right): return 0
return left / right;
}Usage
// outputs 0 instead of NaN
print Infinity #/ InfinityThe documentation is not final, and more examples and syntax sugar tricks will be added
We are constantly updating, fixing and adding new features!
π Free Software, Hell Yeah!
This project is open-sourced software licensed under the MIT License.
See the LICENSE file for more information.