| bin | ||
| lib | ||
| test | ||
| tools | ||
| .gitignore | ||
| .travis.yml | ||
| bower.json | ||
| demo.cola | ||
| LICENSE | ||
| package.json | ||
| README.md | ||
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. In present time compiler in development. Play with language you can here.
Install
First make sure you have installed the latest version of node.js (You may need to restart your computer after this step).
From NPM for use as a command line app:
npm install cola-script -g
From NPM for programmatic use:
npm install cola-script
From Git:
git clone git://github.com/TrigenSoftware/ColaScript.git
cd ColaScript
npm link .
Usage same as in UglifyJS2, except:
-j, --js, --javascript Work with JavaScript (by default Cola will
expect ColaScript). [boolean]
-n, --no-main-binding Disable `main` binding. [boolean]
Simple example of usage:
cola main.cola -o main.min.js -m -c
In browser
In developing more comfortable to compile the code directly in your browser, for this add browser-cola.js to your.html code:
<script src="path/to/browser-cola.js"></script>
Now you can run your Cola-Code:
<script type="text/colascript" src="path/to/your.cola"></script>
If your.cola depends on other scripts in your.html, better to notice browser-cola about it:
<script type="text/colascript" src="angular.min.js"></script>
<script type="text/colascript" src="path/to/your.cola"></script>
Overview
Need to know:
- not always valid-javascript is valid-colascript
- semicolon is always required
- in present time typing is just syntax
Variables
In current version you can set any type which you want, frankly speaking is not good.. In future we will have static typing.
var num = 1; // valid JavaScript
int i, j = 3;
String str = `someString`; // yes, you can use ` quotes
In ColaScript, like in CoffeScript, exists boolean-aliases:
yes == on == true;
no == off == false
Strings
We have templating! We can paste variable in string:
console.log("my login in twitter \@@twLogin");
Also we can paset expression this way:
console.log("length of my name @{ name.length }");
and this way:
console.log("first letter in my name is {{ name[0] }}");
Still possible to use raw strings:
console.log(r"\n\r\t@raw");
Any string in ColaScript is multiline:
console.log("
List1:
- Write code
- Drink tea
- Watch Instagram
List2
* Write code
* Read Habrahabr
* Listen music
");
align goes by closing-quote.
RegExps
Modifer x skips whitespaces and new-line same as if you use multiline RegExp:
RegExp url = /
^
(https?:\/\/)?
([\w\.]+)
\.([a-z]{2,6}\.?)
(\/[\w\.]*)*\/?
$/;
Arrays
Most of array features was taken from CoffeeScript:
Array arr = [0..9]; // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
// same as
Array arr = [0...10];
arr[0..2] = [584, 404]; // [584, 404, 3, 4, 5, 6, 7, 8, 9]
console.log(arr[0..2]); // [584, 404]
one feature getted from PHP:
arr[] = 22; // [584, 404, 3, 4, 5, 6, 7, 8, 9, 22]
absolutely new feature is:
console.log(arr[]); // 22
Functions
You have opportunity to declarate functions without function keyword, with and without type:
function f1(){
}
void f2(){
}
f2(){
}
From Dart we borrowd arrow-functions:
helloString(name) => "Hello @name!";
Arguments have positional or named types and can have default value:
hello(String name:) => console.log("Hello @name!");
hello(name: 'dangreen'); // Hello dangreen!
hello(name: "World") => console.log("Hello @name!");
hello(); // Hello World!
// or
hello(String name = "World") => console.log("Hello @name!");
hello('dangreen'); // Hello dangreen!
hello(); // Hello World!
As in CoffeScript we can declare splated argument
info(name, skills...){
console.log("My name is @name, my skills:");
skills.forEach((skill) => console.log("@skill,"));
}
All main functions in root namespace will bind on DOMContentLoaded event:
// lib.cola
main(){
console.log('Hello World from lib.cola!');
}
// main.cola
@require "lib.cola";
main(){
console.log('Hello World!');
}
Operators:
-
issetoperator,??alternative - which is better?bool a = true, b; console.log(isset a ? "seted" : "not seted"); // seted console.log(isset b ? "seted" : "not seted"); // not seted -
cloneof variable:Array a = [], b = clone a; b[0] = 584; // a == []if object have method
__clone__, object will be copied with it. -
Math.pow operator:
int pow = 5 ** 2; // 25 -
CoffeeScript's modulo operator:
int modulo = 5 %% 3; // 2 -
Existential assignment from CoffeeScript:
var undef, def = 5; def ?= undef; // def == 5 undef = 6; def ?= undef; // def == 6 -
a ? b, status: donevar a = undefined, b = 3; a ? b == 3; a = 11; a ? b == 1; -
is, status: donebool isRegExp = /[^\d]+/g is RegExp; // true -
isnt, status: donebool isntString = 3.14 isnt String; // true
Multiple
-
..:, status: doneObject 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, status: doneif( 0 < x < 100 ) console.log("x E (0; 100)");
Compiler
-
@require, status: done@require "./library/jquery.js" "./library/underscore.js" -
@include, status: done@include "./app/my.js" -
@use, status: done@use strict @use asmjs @use closure
Expressions
-
switchassignment, status: done!String weather = switch(temperature){ when -10: 'cold'; when 20: 'normal'; when 35: 'hot'; };
Vars
-
multiple assignment, status: done
[a, b, c] = [b, c, a]; var {poet: {String name, address: [street, city]}} = futurists; [a, ..., b] = someArray;
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; }
