is a CoffeeScript dialect that aims to be more radical and practical.
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.
- Respect JS semantics and idioms.
- Die for DRY.
- Perl over Ruby.
- Fewer keywords, punctuations and runtime errors.
npm i -g coco
git clone git://github.com/satyr/coco.git && cd coco && bin/coke i
- 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:
- 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.
- Left hand of
- Made cascade, now
with
in disguise, require at least one&
in body. (#179) - Made
let
acceptthis =
on the first assignment to substitute oldwith
. - 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 tosuper::anotherMethod
works as expected. - Fixed:
- Fixed:
- Fixed #162.
- 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.catch
ed variables are now function-scoped. (coffee#2422)- Generated variables now get postfix
$
rather than prefix__
.
- 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-.call
s more than once.
- Implemented
implements
. (#144) - Top-level
void
s are now simply ignored and usable like Python's pass.
- Added
import
declaration in place of the implicitthis import
:import a, b
=>this <<< a <<< b
- Made
super
work in accessor methods. - Disallowed redeclarations via
var
. - Improved handling of nonexistent files.
- Node.js 0.8.x.
- Added
const
andvar
. (#139) - Made
function
variables read-only. - Removed
-n
shorthand for--nodejs
. (#142) - Bug fixes:
- 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}
.
- 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.
- Caught up Node.js 0.6.x.
!
against function/backcall now suppresses its auto-return.superclass
now points to the constructor that theclass extends
.super
now relies solely onsuperclass
rather than requiring special forms likeC::m = ->
.of
no longer delegates toArray::indexOf
, making it consistent withfor
-of
behavior.- Inline implicit objects now close at newline or
if
/for
/while
/until
. --print
no longer implies--compile
.--watch
now works on Windows.
- Fixed coffee#1715 etc.
- Trivial improvements.
- Added unary assignments:
!! = x
=>x = !!x
- Made
a? <<< b
short fora <<< b if a?
. - Improved stack traces from directly run .co files.
case
/of
/instanceof
now works better with array slice.instanceof
now rejects invalid right operands.
- Unary operators now spread into an array operand:
+[a, b]
=>[+a, +b]
..
now points to the constructor underclass
.- coke now works from subdirectories. (coffee#1687)
- Added pipe operator:
f! => g _
=>_ = f!; g _
- Fixed identifier lexing as per ES5.
- Improved label handlings.
- Helper functions are now declared last. (coffee#1638)
- 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.
- Allowed line folding after
for
prepositions. import
ing onto a soaked expression is now safe.--json
now modifies--ast
or--compile
.- Fixed #81 etc.
- Added soak assign.
- Added
<?
and>?
operators. - Loops can now have
else
clause. import x
is now short forthis <<< x
.,
after(
,[
or another,
now impliesvoid
.
- 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 delegatethis
. extended
hook is back.from
offor
is now optional, meaningfrom 0
.til
lessfrom
is no longer allowed.
while
/until
can now have update clause after test clause:continue while f(), g()
=>for (; f(); g()) {}
that
no longer triggers anaphoric conversion underunless
/until
.- Disallowed
a.=b = c
p:~ (a, b) ->
f ..., a
etc. - Fixed coffee#1416.
- Added
do
-while
/until
construction. - Added
$
flag to regexes. Same as.source
, but more efficient. - Suppressed implicit return on
new
ed/setter functions. - Sped up lexer.
- Added
!?
(inexistence) operator. function
no longer requires parens around parameters.class
block is now mandatory.- Bug fixes: coffee#1352 coffee#1354
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.
- 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.
- Dieted heregex:
->
is now optional whenfunction
is used.case
accepts comma-separated tests again.return
/throw
can now take a block.- REPL now uses ^J to continue lines.
- Enabled:
- ADI on
?.
- ACI on
++
/--
- conditional destructuring assignments
- colors and tab completion in REPL
- ADI on
- Made leading
*
s serve like list markers.
- Added string/array multiplication.
- Added label support.
- Aliased
constructor
as..
.
- Added
let
. Unarydo
is back at being simple call. - Added
with
. - Added semiautovivification.
- Made
::
a pure sugar forprototype
, 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.
- 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.
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.
- 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 thanslice
ing them. (coffee#870)- Compilation errors now report line numbers.
Coco
object now emits more events for use with--require
.
->=>
~>
->&.
~.
- 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 nowthis[0]
rather thanarguments[0]
.
is not
is the newisnt
.@'++'
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.
- 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 forfor i from 0 til x then
. - Disallowed duplicate formal arguments.
- Improved syntax-highlight in src/index.html.
- Version bump for Xmas, in concert with Coffee 1.0.0.
@@
is now a shorthand forarguments
.do
can now indicate a call against indented arguments.and
andor
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 toa[\b, \c]
(wasa(\b, \c)
).case
now requires brackets to have multiple conditions.- Added
--nodejs
option. See coffee#910. - Renamed
--stdio
to--stdin
.
- 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];
- Conditional control structures can now be anaphoric;
that
withinif
,while
orcase
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 toimport
/import all
- non-ASCII identifiers are now allowed.
.
and its families can now be used with numbers and strings, instead of[]
.a.0.'0'
compiles toa[0]['0']
.- Added syntax for cloning objects;
obj{key:val}
acts like a simple version of ES5Object.create
, creating a prototypal child ofobj
and assigning to.key
withval
. - default arguments can now choose to use
||
/&&
. super
under a class block now refers to the superclass.- .coffee extension is no longer supported.
- 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.
...
is now prefix.{0: first, (*-1): last} = array
now works.- Added
--lex
to thecoco
utility. Removed--lint
. - src/ now has doc view.
Release.