314 lines
5.7 KiB
Markdown
314 lines
5.7 KiB
Markdown

|
|
|
|
ColaScript is a language that compiles in JavaScript. This language is similar to Dart, CoffeeScript, Python and PHP, with some original ideas. Compiler based on [UglifyJS2](https://github.com/mishoo/UglifyJS2). In present time compiler in development. Play with language you can in `lib/index.html`.
|
|
|
|
# to do:
|
|
|
|
- semicolon is always required, status: done
|
|
|
|
## Operators:
|
|
|
|
### Unary
|
|
- `varname?`
|
|
|
|
bool exist = SOME?;
|
|
|
|
|
|
### Binary
|
|
- `**`, status: done
|
|
|
|
int pow = 5 ** 2; // 25
|
|
|
|
- `%%`, status: done
|
|
|
|
int modulo = 5 %% 3; // 2
|
|
|
|
- `?=`, status: done
|
|
|
|
var undef, def = 5;
|
|
|
|
def ?= undef; // def == 5
|
|
undef = 6;
|
|
def ?= undef; // def == 6
|
|
|
|
- `a ? b`
|
|
|
|
int a = 5, b = 3;
|
|
|
|
a = a > 10 ? b; // a == 5
|
|
a = 11;
|
|
a = a > 10 ? b; // a == 3
|
|
|
|
- `is`, status: done
|
|
|
|
bool isRegExp = /[^\d]+/g is RegExp; // true
|
|
|
|
- `isnt`, status: done
|
|
|
|
bool isntString = 3.14 isnt String; // true
|
|
|
|
|
|
|
|
|
|
### Multiple
|
|
- `..:`
|
|
|
|
Object profile = {
|
|
name : "dan",
|
|
nick : "dan",
|
|
friends : [
|
|
{ name : "eric", nick : "eric" }
|
|
],
|
|
"info" : "coder"
|
|
}
|
|
..name += "iil"
|
|
..nick += "green"
|
|
..friends[0]:
|
|
..name = profile.friends[0].name.capitalize()
|
|
..nick += "bro";
|
|
..info += ", student";
|
|
|
|
|
|
- `a > b > c`
|
|
|
|
if( 0 < x < 100 ) console.log("x E (0; 100)");
|
|
|
|
|
|
### Compilator
|
|
- `@require`
|
|
|
|
@require "./library/jquery.js", "./library/underscore.js"
|
|
|
|
- `@use`
|
|
|
|
@use strict, typing
|
|
@use asmjs
|
|
|
|
- `@if @end_if @else`
|
|
|
|
@if target == 'web'
|
|
@require './main.cola'
|
|
@else
|
|
@require './mobile/main.cola'
|
|
@end_if
|
|
|
|
|
|
## Expressins
|
|
- `switch` assigmention
|
|
|
|
String weather = switch(temperature){
|
|
case -10: 'cold';
|
|
case 20: 'normal';
|
|
case 35: 'hot';
|
|
};
|
|
|
|
- `with` scoping, status: it need??
|
|
|
|
with(document.body.querySelectorAll('ul').childNodes){
|
|
var txt = 'text';
|
|
|
|
forEach((li){
|
|
li.innerHTML = txt;
|
|
});
|
|
}
|
|
|
|
console.log(txt); // undefined
|
|
|
|
|
|
## Vars
|
|
- declaration with type
|
|
|
|
int b = 584;
|
|
Array arr = [];
|
|
Object obj = {};
|
|
String str = "";
|
|
|
|
- multiple assigment
|
|
|
|
[a, b, c] = [b, c, a];
|
|
{poet: {String name, address: [street, city]}} = futurists;
|
|
[a, ..., b] = someArray;
|
|
|
|
|
|
### bool
|
|
- aliases, status: done
|
|
|
|
yes === on === true;
|
|
no === off === false;
|
|
|
|
|
|
### String
|
|
- \` new string \`, status: done
|
|
|
|
String name = `dangreen`;
|
|
|
|
- multiline, status: done
|
|
|
|
String ml = "
|
|
|
|
Lorem ipsum,
|
|
Lorem ipsum.
|
|
|
|
";
|
|
|
|
- raw, status: done
|
|
|
|
String str = r"\n \r"; // "\\n \\r"
|
|
|
|
- templating, status : done
|
|
|
|
String name = "dan";
|
|
|
|
console.log("My name is @name."); // My name is dan.
|
|
name = "eric";
|
|
console.log("My name is @name."); // My name is eric.
|
|
console.log("My name is @{name.capitalize()} or {{name.capitalize()}}"); // My name is Eric.
|
|
|
|
### RegExp
|
|
- multiline ( and x flag ), status: done
|
|
|
|
RegExp re = /
|
|
([^\d]+)-
|
|
(\w+)
|
|
/gx;
|
|
|
|
|
|
### Arrays
|
|
- pushing
|
|
|
|
var arr = [3, 5, 6, 7];
|
|
arr[] = 4; // [3, 5, 6, 7, 4]
|
|
|
|
- part assigment
|
|
|
|
arr[0..2] = [0,1]; // [0, 1, 7, 4]
|
|
arr[0..2] = []; // [7, 4]
|
|
|
|
- inline array ranging
|
|
|
|
arr = [10..1]; // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
|
|
arr = [1..10]; // [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
|
|
|
|
### Functions
|
|
- without `function` keyword
|
|
|
|
void main(){
|
|
console.log('Hello World!');
|
|
}
|
|
|
|
- binding toplevel `main` functions to onload event
|
|
|
|
// lib.cola
|
|
|
|
main(){
|
|
console.log('Hello World from lib.cola!');
|
|
}
|
|
|
|
// main.cola
|
|
|
|
require "./lib.cola";
|
|
|
|
main(){
|
|
console.log('Hello World!');
|
|
}
|
|
|
|
- arrow functions
|
|
|
|
print(str) => console.log(str);
|
|
|
|
|
|
- named arguments
|
|
|
|
hello(String name:) => console.log("Hello @name!");
|
|
hello(name: 'dangreen'); // Hello dangreen!
|
|
|
|
hello(name: "World") => console.log("Hello @name!");
|
|
hello(); // Hello World!
|
|
|
|
- defaults for positional arguments
|
|
|
|
hello(String name = "World!") => console.log("Hello @name!");
|
|
hello('dangreen'); // Hello dangreen!
|
|
hello(); // Hello World!
|
|
|
|
- some arguments into array
|
|
|
|
main(name, skills...){
|
|
console.log("My name is @name, my skills:");
|
|
skills.forEach((skill) => console.log("@skill,"));
|
|
}
|
|
|
|
|
|
## Classes
|
|
- classes
|
|
- singletones
|
|
- injectors
|
|
|
|
class A {
|
|
|
|
private int a = 123;
|
|
protected var o = {};
|
|
|
|
readonly String about = "class";
|
|
|
|
A(a){
|
|
about = "some else";
|
|
}
|
|
|
|
static Hello() => "hello!";
|
|
|
|
public String about() => about;
|
|
}
|
|
|
|
class B extends A {
|
|
|
|
B(){
|
|
parent();
|
|
about += "!";
|
|
}
|
|
|
|
B.anotherConstructor(){
|
|
about = "ups!";
|
|
}
|
|
|
|
get some => "some " + about;
|
|
set some(val) => about += val;
|
|
}
|
|
|
|
singleton S { // in fact this is object
|
|
int x = 45;
|
|
String s = "txt";
|
|
|
|
say(some){
|
|
alert(some);
|
|
}
|
|
|
|
int operator[](int index) => index + 584;
|
|
operator[]=(int index, int val) => x = index + val;
|
|
|
|
String operator.(String key) => key + "!";
|
|
operator.(String key, String value) => s = "@key @value";
|
|
|
|
}
|
|
|
|
injector String {
|
|
String replaceAll(a, b){
|
|
String res = this;
|
|
while(res.indexOf(a) != -1) res = res.replace(a, b);
|
|
return res;
|
|
}
|
|
}
|
|
|
|
// or
|
|
|
|
String String::replaceAll(a, b){
|
|
String res = this;
|
|
while(res.indexOf(a) != -1) res = res.replace(a, b);
|
|
return res;
|
|
}
|
|
|
|
### Statistic
|
|
|
|
- 30 feature ( without classes )
|
|
- 12 done
|