![logo](http://trigen.pro/colalogo.png) 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??` and alternative `isset varname` - which is better? status: done bool exist = SOME??; bool exist2 = isset 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`, status: done var a = undefined, b = 3; a ? b == 3; a = 11; a ? b == 1; - `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)"); ### Compiler - `@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 ## Expressions - `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, status: done, only declaration 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