<commit_before># enoki-lang 🍄

Yet another compiles to JS language.

All I really want from programming languages is immutability by default,
I also wanted to have fun with automatic currying.

The compiler is written in CLJS but should compile to clean JS that could
be ran in a web browser.

## Features

* None of the extra baggage of JS.
* Immutability.
* No operators, only functions.
* Automatic currying.
* Simple JS interop.
* No semicolons.
* Hard to type file extensions.

## Examples

There are no operators, only functions:

    +(1, 3) = 4

Currying is automatic, which is a fancy way of saying that if
you supply less arguments than the total number of arguments a function
takes then it will return a function with the partially applied arguments
already applied. For example:

    +(1) = [a function that takes one argument and adds 1 to it]

Because `+` takes two arguments, and we only supplied 1 we get back a function that 
takes one argument and adds `1` to it.

## Usage

First compile the compiler:

    lein cljsbuild once

Right now you unfortunately need ImmutableJS installed globally:

    npm install -g immutable

Now run the example:

    cat example.🍄 | node out/main.js stdlib.🍄 | node

Yeah that's right, the file ext is an emoji. You're welcome.
New enoki source files can be created with the provided helper:

    bin/mush mynewfile

## TODO

* Strings
* Maps
* Sets
* Keywords
* EDN support instead of JSON - maybe.

## License

Copyright © 2016 <NAME>

Distributed under the Eclipse Public License either version 1.0 or (at
your option) any later version.<commit_msg>Readme updates.<commit_after># enoki-lang 🍄

Yet another compiles to JS language.

All I really want from programming languages is immutability by default,
I also wanted to have fun with automatic currying.

The compiler is written in CLJS but should compile to clean JS that could
be ran in a web browser.

## Features

* None of the extra baggage of JS.
* Immutability.
* No operators, only functions.
* Automatic currying.
* Simple JS interop.
* No semicolons.
* Hard to type file extensions.

## Examples

There are no operators, only functions:

    +(1, 3) = 4

Currying is automatic, which is a fancy way of saying that if
you supply less arguments than the total number of arguments a function
takes then it will return a function with the partially applied arguments
already applied. For example:

    +(1) = [a function that takes one argument and adds 1 to it]

Because `+` takes two arguments, and we only supplied 1 we get back a function that 
takes one argument and adds `1` to it.

Lambdas are defined just like they are in JavaScript, except you can omit the parenthesis
for lambdas that take zero arguments.

    my-cool-add-fn = (a, b) => +(a, b)
    some-other-fn = => 3

JavaScript interop is simple. Simply surround source code in backticks `\`` and it will
get spat out into the target source.

    my-fancy-println = (a) => `console.log(a)`

The compiler won't mangle names in JS output, except in the case where it does. For example if you use `+`,
`-`, `/`, `*`, or anytime you use kebab case like in the above examples it will get converted
to a JS friendly name.

    foo-bar-baz becomes foo_bar_baz
    +, -, *, / become add, sub, mul, and div respectively

## Usage

First compile the compiler:

    lein cljsbuild once

Right now you unfortunately need ImmutableJS installed globally:

    npm install -g immutable

Now run the example:

    cat example.🍄 | node out/main.js stdlib.🍄 | node

Yeah that's right, the file ext is an emoji. You're welcome.
New enoki source files can be created with the provided helper:

    bin/mush mynewfile

## TODO

* Strings
* Branching - currently use JS interop for if statements :P woops.
* Maps
* Sets
* Keywords
* EDN support instead of JSON - maybe.

## License

Copyright © 2016 <NAME>

Distributed under the Eclipse Public License either version 1.0 or (at
your option) any later version.
{'fraction_non_alphanumeric': 0.06476814516129033, 'fraction_numerical': 0.006804435483870968, 'mean_word_length': 3.5990730011587484, 'pattern_counts': {'":': 0, '<': 5, '<?xml version=': 0, '>': 8, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '1282271', 'n_tokens_mistral': 1187, 'n_tokens_neox': 1108, 'n_words': 601}