-
Notifications
You must be signed in to change notification settings - Fork 6
Restructuring
See also: Destructuring, Structuring, Extract-Destructuring and Assignment-Destructuring
# setup
foo = a: 1, b: 2, c: 3, d: 4, e: 5, g: 6
# restructuring:
bar = {a, c, e} = foo
# bar == a: 1, c: 3, e: 5
Create a new object out of selected fields from another object.
Restructuring is integral to the destructuring/restructuring system. Any destructured assignment returns a newly structured object as shown below. (For those concerned about performance, the structured object is only created if it is used either by capturing it with assignment, as part of an expression, or as the return value of a block or function.)
A restructuring statement looks like this:
a = {...} = b
It is logically the same as a destructuring statement followed by a structuring statement:
{...} = b
a = {...}
Another example:
extractXAndY = (o) ->
{x, y} = o
# means this:
extractXAndY = (o) ->
{x, y} = o
{x, y}
Note, JavaScript and CoffeeScript both have destructuring and structuring, but they do not have restructuring.
# the following:
a = {...} = b
# is interpreted by JavaScript or CoffeeScript as:
{...} = b
a = b
I chose to change the semantics for the following reasons:
- Though JavaScript's interpretation is logically consistent along one dimension (assignments return the right-value), it breaks other, logically reasonable expectations: Decomposing
a = b = c
, intob = c
and thena = b
doesn't change the semantics. JavaScript's interpretation of the return value of destructuring-assignment, however, is not consistent under decomposition. - JavaScript's interpretation isn't useful. There is no leverage in
a = {...} = b
if it only meansa = b
. My experience is destructuring is therefore only used as a pure statement of the form:let {...} = b;
- JavaScript's interpretation does not support functional programming, since it is only useful as a pure statement.
- JavaScript's interpretation isn't as syntactically stable:
# given this statement:
foo = {a, b, c}
# adding this below radically changes the interpretation of the line above
= bar
- logically consistent under decomposition
- useful in expressions
- supports using destructuring in a pure-functional way
- more syntactically stable (i.e. small edits == small semantic changes)
- Home
- Get Started
- Benefits
- Highlights
- Productivity by Design
- CaffeineScript Design
- What is CaffeineScript Good For?
- Get the most out of JavaScript
- Language Comparison
- CHANGELOG
- Blocks Instead of Brackets
- Binary Line-Starts
- Everything Returns a Value
- Streamlined Modules
- Scopes and Variables
- Optional Commas
- Semantics
- Ambiguities