/coco

Unfancy CoffeeScript

Primary LanguageJavaScriptMIT LicenseMIT

Coco

is a CoffeeScript dialect that aims to be more radical and practical.

Why

On its way to hide JavaScript's bad parts, CoffeeScript has accumulated own quirks: horrible variable scope, awkward ranges, confusing and/or pointless keywords, verbose file extension, and so on. Coco tries to amend them, entwining good parts of both.

Principles

  • Respect JS semantics and idioms.
  • Die for DRY.
  • Perl over Ruby.
  • Fewer keywords, punctuations and runtime errors.

Differences

Documents

Installation

Get Node.js and npm, then:

  • npm i -g coco
  • git clone git://github.com/satyr/coco.git && cd coco && bin/coke i

Changelog

0.9.1

  • Added if-block. (#151)
  • Added for-let. (#164)
  • Added <> aka lef. (#180)
  • Gave |> the lowest precedence.
  • Made block constructions directly dot-accessible.
  • Made JS literal Markdown-esque. To include N `, close with N+1 `: ``` '``' ```
  • Quit reusing temporary variables.
  • File extensions like co.json, coon, or cocoon now imply --json.
  • Fixed:

0.9.0

  • Literal & is now used to reference several new targets:
    • Left hand of |> (in place of _).
    • Current item of newly added quick map: for [0 1] => &+2 # [2 3]
    • Subject of new with as proposed in #172.
  • Made cascade, now with in disguise, require at least one & in body. (#179)
  • Made let accept this = on the first assignment to substitute old with.
  • Made bodyless catch return the catchee.
  • Made by -1 implied on downward ranges.
  • Made interpolation apply to #& and #@.
  • Quit expanding super followed by :: to parent method, so that call to super::anotherMethod works as expected.
  • Fixed:

0.8.2

0.8.1

0.8.0

  • Allowed hyphenated alphabets within identifiers as alias to their upper case: encode-URI-component => encodeURIComponent
  • Added cascade. (#72
  • Changed the pipe operator to |>.
  • Revised => as another block creation operator.
  • export/import/const/var can now appear anywhere.
  • catched variables are now function-scoped. (coffee#2422)
  • Generated variables now get postfix $ rather than prefix __.

0.7.6

  • Added export const.
  • Enabled object splat within brace objects via ...:.
  • Allowed array repetition to work on slices and comprehensions.
  • Disallowed malformed hex/unicode escape sequence in string.
  • Quit overloading + for array concatenation.
  • class can be bodyless again.
  • super no longer auto-.calls more than once.

0.7.5

  • Implemented implements. (#144)
  • Top-level voids are now simply ignored and usable like Python's pass.

0.7.4

  • Added import declaration in place of the implicit this import: import a, b => this <<< a <<< b
  • Made super work in accessor methods.
  • Disallowed redeclarations via var.
  • Improved handling of nonexistent files.

0.7.3

  • Node.js 0.8.x.
  • Added const and var. (#139)
  • Made function variables read-only.
  • Removed -n shorthand for --nodejs. (#142)
  • Bug fixes:
    • super with nested classes and methods
    • f a, while b then c etc.
    • and others: #138 #141 #143

0.7.2

  • Revised accessor. (#5)
  • Allowed implicit array after some unary operators.
  • Added named backcall: <-:f g => g(:f ->)
  • Made {[q]:p} short for {p: [q]:p}.

0.7.1

  • Added export statement. (#121)
  • Made {{q}:p} short for {p: {q}:p}.
  • Allowed keyword literals as object shorthand: {true} => {true: true}
  • Allowed decimals and $ in number comments.
  • Removed uppercase radix prefixes and exponential notation as per coffee#2061.
  • Labelling a function (literal or IIFE sugar) now names it. E.g. :f -> compiles to (function f(){}).
  • super call to a bound class now works as expected.
  • All compiler-generated variables are now double-underscore prefixed.
  • --interactive no longer implies --bare. Use -bi when you want top-level variables to persist.

0.7.0

  • Caught up Node.js 0.6.x.
  • ! against function/backcall now suppresses its auto-return.
  • superclass now points to the constructor that the class extends.
  • super now relies solely on superclass rather than requiring special forms like C::m = ->.
  • of no longer delegates to Array::indexOf, making it consistent with for-of behavior.
  • Inline implicit objects now close at newline or if/for/while/until.
  • --print no longer implies --compile.
  • --watch now works on Windows.

0.6.7

0.6.6

  • Added unary assignments: !! = x => x = !!x
  • Made a? <<< b short for a <<< b if a?.
  • Improved stack traces from directly run .co files.

0.6.5

  • case/of/instanceof now works better with array slice.
  • instanceof now rejects invalid right operands.

0.6.4

  • Unary operators now spread into an array operand: +[a, b] => [+a, +b]
  • .. now points to the constructor under class.
  • coke now works from subdirectories. (coffee#1687)

0.6.3

  • Added pipe operator: f! => g _ => _ = f!; g _
  • Fixed identifier lexing as per ES5.
  • Improved label handlings.
  • Helper functions are now declared last. (coffee#1638)

0.6.2

  • Added character ranges: [\a to \d] => [\a \b \c \d]
  • Added named destructuring: {p, q}:o = f! => o = f!; {p, q} = o
  • Numbers can no longer start with ..
  • function can no longer prefix ->/~>. Use ~function to declare bound functions instead.

0.6.1

  • Allowed line folding after for prepositions.
  • importing onto a soaked expression is now safe.
  • --json now modifies --ast or --compile.
  • Fixed #81 etc.

0.6.0

Additions

Changes

  • Added object slice.
  • Added bang call: f! => f()
  • Revised clone syntax from x{} to ^x.
  • Revised semiautovivification syntax from .!/.@ to .@/.@@.
  • Variable interpolations no longer require braces: "(#id)" => "(" + id + ")"
  • Spaced dots now close implicit calls. See coffee#1407.
  • Direct calls to super now delegate this.
  • extended hook is back.
  • from of for is now optional, meaning from 0. tilless from is no longer allowed.

0.5.4

  • while/until can now have update clause after test clause: continue while f(), g() => for (; f(); g()) {}
  • that no longer triggers anaphoric conversion under unless/until.
  • Disallowed a.=b = c p:~ (a, b) -> f ..., a etc.
  • Fixed coffee#1416.

0.5.3

  • Added do-while/until construction.
  • Added $ flag to regexes. Same as .source, but more efficient.
  • Suppressed implicit return on newed/setter functions.
  • Sped up lexer.

0.5.2

  • Added !? (inexistence) operator.
  • function no longer requires parens around parameters.
  • class block is now mandatory.
  • Bug fixes: coffee#1352 coffee#1354

0.5.1

  • a.b.c?.=d.e now works as expected.
  • a[b, c] = d now works as expected.
  • extras/coco.js works again on WSH.
  • --output implies --compile again.

0.5.0

  • Added ** operator.
  • Overloaded +/-// (in addition to *) for arrays and strings.
  • Revised let: let (a) ~> => let a then
  • Allowed underscores within number literals.
  • Major regex changes:
    • Dieted heregex: /// re /// => // re //
    • Allowed leading whitespace in normal regex literals when unambiguous.
    • No longer accepts invalid regexes.
  • -> is now optional when function is used.
  • case accepts comma-separated tests again.
  • return/throw can now take a block.
  • REPL now uses ^J to continue lines.

0.4.2

  • Enabled:
    • ADI on ?.
    • ACI on ++/--
    • conditional destructuring assignments
    • colors and tab completion in REPL
  • Made leading *s serve like list markers.

0.4.1

  • Added string/array multiplication.
  • Added label support.
  • Aliased constructor as ...

0.4.0

  • Added let. Unary do is back at being simple call.
  • Added with.
  • Added semiautovivification.
  • Made :: a pure sugar for prototype, which can now directly refer to @:: under class body.
  • ?. can now appear anywhere a normal dot can be used.
  • ~. is changed to . ~.
  • new no longer accepts splatted arguments.
  • --interactive now works with --compile and --bare.
  • Renamed --nodes option and .nodes method to --ast/.ast.
  • Fixed the performance bug wrt long method chains.
  • Quit supporting Node.js 0.3.x or lower.

0.3.2

  • Unrestricted ADI for identifiers beyond @ and ::.
  • Expanded property shorthands beyond @foo.
  • Added typeof!, which inspects the internal [[Class]] property.
  • Added shebang support.
  • REPL results now evaluate more intuitively.
  • Disallowed whitespace mixup for indentations.

0.3.1

  • debugger now works anywhere.
  • Revised heregex flag syntax: ///#{x}#{y}///? -> RegExp('' + x, y);
  • Removed Coco.eval.
  • Made extras/coco.js work as a mini-compiler on WSH.
  • Added extras/mode-coco.js, an editing mode for Ace.
  • Added --json option.

0.3.0

Pure Additions

  • Added backcall, a sugar to flatten nested callbacks.
  • do block can now work as a pair of normal parentheses.
  • Improved ACI (automatic comma insertion): f {} [] x -> f({}, [], x);
  • Improved ADI (automatic dot insertion): @@0'!' -> arguments[0]['!'];
  • Multiline block on the RHS of object property now works as an implicit array.
  • Heregexes now support dynamic flags: /// x #{? y } /// -> RegExp('x', y);
  • Enabled compound accessigns: a.+=b -> a += a.b;
  • ... in array destructuring (same as ...[]) now skips items rather than sliceing them. (coffee#870)
  • Compilation errors now report line numbers.
  • Coco object now emits more events for use with --require.

Incompatible Changes

  • => -> ~>
  • &. -> ~.
  • Braceless objects no longer consume property shorthands. (coffee#618)
  • Indentations within non-here strings are now stripped.
  • Fixed block comment syntax to good ol' /* */.
  • @0 is now this[0] rather than arguments[0].

0.2.2

  • is not is the new isnt.
  • @'++' is now valid as a shorthand for @['++'].
  • Commas between primitive values are now optional.
  • coke now automatically aliases tasks.
  • extras/coco.js now works as a Gecko JS Module.
  • Grouped documentation suite into doc/ for portability.
  • Rewrote src/optparse.co.

0.2.1

  • Added numeric ranges.
  • Destructuring assignments can now specify default values using logical operators. Default arguments syntax has been changed accordingly. ((a || b) -> instead of (a ||= b) ->)
  • do now performs special conversions against function literals with parameters, making it work as pseudo-let and Coffee 1.0.0 compliant.
  • Allowed for i from x then as a sugar for for i from 0 til x then.
  • Disallowed duplicate formal arguments.
  • Improved syntax-highlight in src/index.html.

0.2.0

  • Version bump for Xmas, in concert with Coffee 1.0.0.
  • @@ is now a shorthand for arguments.
  • do can now indicate a call against indented arguments.
  • and and or now close implicit calls, making you write even less parens: f x and g y or z -> f(x) && g(y) || z;
  • catch's variable declaration is no longer required.
  • a<[ b c ]> is now equivalent to a[\b, \c] (was a(\b, \c)).
  • case now requires brackets to have multiple conditions.
  • Added --nodejs option. See coffee#910.
  • Renamed --stdio to --stdin.

0.1.6

  • Added character/word literal: \C + \++ -> 'C' + '++';
  • Retrieving multiple properties at once is now possible: a[b, c] -> [a[b], a[c]];
  • Destructuring into an object's properties is now possible:
    • a[b, c] = d -> a[b] = d[0], a[c] = d[1];
    • a{b, c} = d -> a.b = d.b, a.c = d.c;
  • Compound assignments can now destructure: [@a, @b] /= c -> this.a /= c[0], this.b /= c[1];

0.1.5

  • Conditional control structures can now be anaphoric; that within if, while or case block now refers to the condition value.
  • Decimal numbers can now have arbitrary trailing alphabets as comments. e.g. 9times, 1.5s
  • Added <<</<<<< as aliases to import/import all
  • non-ASCII identifiers are now allowed.

0.1.4

  • . and its families can now be used with numbers and strings, instead of []. a.0.'0' compiles to a[0]['0'].
  • Added syntax for cloning objects; obj{key:val} acts like a simple version of ES5 Object.create, creating a prototypal child of obj and assigning to .key with val.
  • default arguments can now choose to use ||/&&.
  • super under a class block now refers to the superclass.
  • .coffee extension is no longer supported.

0.1.3

  • Compilation now prefers single quotes.
  • AST now compiles faster, roughly 1.4 times than 0.1.2.
  • []/{} can now be safely used as an placeholder within array destructuring.
  • Improved --nodes output.

0.1.2

  • ... is now prefix.
  • {0: first, (*-1): last} = array now works.
  • Added --lex to the coco utility. Removed --lint.
  • src/ now has doc view.

0.1.1

Release.