Cheatsheet
Here's a quick overview of the language. For more detailed information take a look at the Reference.
ts
// Declarations
const x = 1
let y: number = 2
var z: string = "3"
x := 1 // const x = 1
y .= 2 // let y = 2
// Destructuring
[ a, b ] := x
[ ..., last ] := x
[ first, ...rest ] := x
[ first, ..., last ] := x
[ first, ...middle, last] := x
{ a, b } := c// Declarations
const x = 1
let y: number = 2
var z: string = "3"
x := 1 // const x = 1
y .= 2 // let y = 2
// Destructuring
[ a, b ] := x
[ ..., last ] := x
[ first, ...rest ] := x
[ first, ..., last ] := x
[ first, ...middle, last] := x
{ a, b } := cts
// Function application
f(x)
f(a, g(x))
f(...args, cb)
// Implicit application
f x // f(x)
f a, b, c // f(a, b, c)
f g x // f(g(x))
f a, b c // f(a, b(c))// Function application
f(x)
f(a, g(x))
f(...args, cb)
// Implicit application
f x // f(x)
f a, b, c // f(a, b, c)
f g x // f(g(x))
f a, b c // f(a, b(c))ts
// Conditionals
x && y
x and y // x && y
x || y
x or y // x || y
// relationals
x === y
x is y // x === y
x < y
x > y
// Chained relationals
x < y < z // x < y && y < z// Conditionals
x && y
x and y // x && y
x || y
x or y // x || y
// relationals
x === y
x is y // x === y
x < y
x > y
// Chained relationals
x < y < z // x < y && y < zts
// this
this
// shorthand
@ // this
@x // this.x
// instance of and typeof shorthand
x instanceof y
x <? Y // x instanceof y
typeof x === "string"
x <? "string" // typeof x === "string"// this
this
// shorthand
@ // this
@x // this.x
// instance of and typeof shorthand
x instanceof y
x <? Y // x instanceof y
typeof x === "string"
x <? "string" // typeof x === "string"ts
// strings
"I'm a string"
'I\'m also a string'
`I'm a ${template} string`
// Block Strings
"""
Block strings
will dedent
"""
'''
They work with all kinds of
strings
'''
```
I will dedent by removing
common indentation
```// strings
"I'm a string"
'I\'m also a string'
`I'm a ${template} string`
// Block Strings
"""
Block strings
will dedent
"""
'''
They work with all kinds of
strings
'''
```
I will dedent by removing
common indentation
```ts
// if conditions
if x < 3
"it's small"
if x > 11
"it's big"
unless paused
run()
// loops
while x < 10
f(x)
x++
for item of items
update item
for item, index of items
update item if index > 0
for key, value in object
log key, ':', value
for own key in object
log `my ${key}`// if conditions
if x < 3
"it's small"
if x > 11
"it's big"
unless paused
run()
// loops
while x < 10
f(x)
x++
for item of items
update item
for item, index of items
update item if index > 0
for key, value in object
log key, ':', value
for own key in object
log `my ${key}`ts
// Postfix loops/conditionals
f(x) if x
log name for name of names// Postfix loops/conditionals
f(x) if x
log name for name of namests
// Arrow Functions
inc := (x) => x + 1
add := <T>(a, b): T => a + b
// Thin arrow -> is equivalent to `function`
f := (this: ctx, a, b) ->
ctx.log a, b if ctx.debug// Arrow Functions
inc := (x) => x + 1
add := <T>(a, b): T => a + b
// Thin arrow -> is equivalent to `function`
f := (this: ctx, a, b) ->
ctx.log a, b if ctx.debugts
// Block shorthand
people.map .name // people.map($ => $.name)
numbers.filter & % 2 is 0
// numbers.filter($ => $ % 2 === 0)
// Conditional declarations
throw error if { error } := result
if [, dir, base] := /^(.*\/)?([^/]*)$/.exec file
console.log dir, base// Block shorthand
people.map .name // people.map($ => $.name)
numbers.filter & % 2 is 0
// numbers.filter($ => $ % 2 === 0)
// Conditional declarations
throw error if { error } := result
if [, dir, base] := /^(.*\/)?([^/]*)$/.exec file
console.log dir, basets
// Switch
switch dir
when '>' then civet.x++
when '<'
civet.x--
civet.x = 0 if civet.x < 0
else
civet.waiting += 5// Switch
switch dir
when '>' then civet.x++
when '<'
civet.x--
civet.x = 0 if civet.x < 0
else
civet.waiting += 5ts
// Pattern Matching
switch s
""
console.log "nothing"
/\s+/
console.log "whitespace"
"hi"
console.log "greeting"// Pattern Matching
switch s
""
console.log "nothing"
/\s+/
console.log "whitespace"
"hi"
console.log "greeting"ts
// Pattern destructuring
switch x
[{type: "text", content: /\s+/}, ...rest]
console.log "leading whitespace"
[{type: "text", content}, ...rest]
console.log "leading text:", content
[{type}, ...rest]
console.log "leading type:", type// Pattern destructuring
switch x
[{type: "text", content: /\s+/}, ...rest]
console.log "leading whitespace"
[{type: "text", content}, ...rest]
console.log "leading text:", content
[{type}, ...rest]
console.log "leading type:", typets
// JSX
// Better binding
<button props.onClick>Click Me</button>
<button @onClick>Click Me Also</button>
// Closing is optional
<div>
<button> Click Me
// class shorthand
<.items>
<.item>// JSX
// Better binding
<button props.onClick>Click Me</button>
<button @onClick>Click Me Also</button>
// Closing is optional
<div>
<button> Click Me
// class shorthand
<.items>
<.item>ts
// Object globs
point = data{x,y}
point = data.{x,y};
point.{x,y} = data
point3D = { point.{x,y}, z: 0 }
complex := obj.{x:a, b.c()?.y}
merged := data.{...global, ...user};
data.{a, b, ...rest} = result// Object globs
point = data{x,y}
point = data.{x,y};
point.{x,y} = data
point3D = { point.{x,y}, z: 0 }
complex := obj.{x:a, b.c()?.y}
merged := data.{...global, ...user};
data.{a, b, ...rest} = resultts
// Property Access
json.x.y
json.'long property'
json.`${movie} name`
matrix.0.0
array.-1
array.#// Property Access
json.x.y
json.'long property'
json.`${movie} name`
matrix.0.0
array.-1
array.#ts
// Await operators
await.allSettled promises
await.all promises
await.race promises// Await operators
await.allSettled promises
await.all promises
await.race promisests
// Range literals
letters := ['a'..'f']
numbers := [1..10]
reversed := [10..1]
indices := [0...array.length]// Range literals
letters := ['a'..'f']
numbers := [1..10]
reversed := [10..1]
indices := [0...array.length]ts
// slicing and splicing
start := numbers[..2]
mid := numbers[3...-2]
end := numbers[-2..]
numbers[1...-1] = []// slicing and splicing
start := numbers[..2]
mid := numbers[3...-2]
end := numbers[-2..]
numbers[1...-1] = []ts
// Pipe operator
data
|> Object.keys
|> console.log
x.length
|> & + 1
|> .toString()
fetch url
|> await
|> .json()
|> await
|> return
// Pipe assignment
data |>= .content// Pipe operator
data
|> Object.keys
|> console.log
x.length
|> & + 1
|> .toString()
fetch url
|> await
|> .json()
|> await
|> return
// Pipe assignment
data |>= .contentts
// Thick Pipes
array
||> .pop()
||> .push 5
||> .sort()
||> .reverse()
count |> & + 1
||> console.log
|> & * 2
||> console.log
url |> fetch |> await
||> (response) => console.log response.status
|> .json() |> await
||> (json) => console.log "json:", json
|> callback// Thick Pipes
array
||> .pop()
||> .push 5
||> .sort()
||> .reverse()
count |> & + 1
||> console.log
|> & * 2
||> console.log
url |> fetch |> await
||> (response) => console.log response.status
|> .json() |> await
||> (json) => console.log "json:", json
|> callbackts
// this.length shorthand
@[#] = item
@[index %% #]
floor # / 2// this.length shorthand
@[#] = item
@[index %% #]
floor # / 2ASCII Symbols
Here is a list of ASCII symbols and their various contextual meanings in Civet. (There are also more Unicode symbols.)
| Symbol | Meanings |
|---|---|
| space | Function call f x; TypeScript argument Set T |
? | Non-null test x?, if x? := foo(); non-null access x?.y, x?y, x?(...), x?[...]; null coalescing x ?? y (x ? y with coffeeBinaryExistential); TypeScript optionals (x?: T) => x; optional declaration let x?: T; optional types T?, T??; instanceof shorthand x <? Class; typeof shorthand x <? "string"; if/then/else ternary x ? y : z |
! | Negation !x; negated operators !=, !==, !in, !instanceof, is !like, !custom, !<?, !^, !^^; object flag {!x}; JSX flag <div !draggable>; TypeScript non-null assertion x!; non-null assertion access x!.y, x!y; non-null type T!; forced type assertion as!; negated extends shorthand !< |
@ | this shorthand @; this properties @x; method bind x@y, x@.y, @@x; decorators @@d |
# | private properties x.#y, #y; length shorthand x#, #; block comments ### ... ###; one-line comments # ... with coffeeComment; CoffeeScript string interpolations "x#{y}" with coffeeInterpolation |
$ | JavaScript identifier character; template interpolations `x${y}` |
_ | JavaScript identifier character |
% | Modulo operators x % y, x %% y; modulo indexing x[i %]; integer division %/ |
^ | Binary XOR x ^ y; logical XOR x ^^ y; logical XNOR x !^ y, x !^^ y; pin patterns (^x) =>; multi destructuring all^{x, y}, {x^: pattern} |
& | Binary AND x & y; logical AND x && y; TypeScript AND T & S; placeholder for function shorthand &[x]+1 |
| | Binary OR x | y; logical OR x || y; TypeScript OR T | S; pipeline |>, ||> |
+ | Addition x + y; positive +x; increment x++, ++x; object flag {+x}; JSX flag <div +draggable>; concatenation x ++ y |
- | Subtraction x - y; negation -x; decrement x--, --x; object flag {-x}; JSX flag <div -draggable>; function arrows ->; property name symbol x-y: z |
* | Multiplication x * y; exponentiation x ** y; generators function*, *method(), for*, yield*; comments /* x */ |
/ | Division x / y; integer division x %/ y (x // y with coffeeDiv); comments // x, /* x */; regular expressions /x/, ///x///; TypeScript triple-slash directive /// <reference/> |
\ | String escape "\""; regular expression escape /\// |
= | Assignment x = y, x op= y; comparisons x == y, x === y, x != y, x !== y; declaration shorthand x .= y, x := y; type shorthand T ::= x; function arrows => |
~ | Binary NOT ~x |
. | Property access x.y; property access function .x; argument placeholder f(x, .); bulleted list . x (after indentation); let shorthand x .= y; range literals [x..y]; spreads ...x |
: | Labels :x; symbols :x; object properties x: y, {x: y}; TypeScript types let x: T, (x: T) =>; property typing {x:: T}, [x:: T]; if/then/else ternary x ? y : z; const shorthand x := y; type shorthand T ::= x; implements shorthand class A <: B; prototype shorthand x::, x::y with coffeePrototype |
; | Statement separator x; y |
, | Argument separator f x, y; element separator [x, y]; property separator {x, y}; comma operator x, y |
' | Strings 'x', '''x'''; tagged template literals tag'x'; property access x's y; directives 'civet coffeeCompat' |
" | Strings "x", """x"""; tagged template literals tag"x"; directives "civet coffeeCompat" |
` | Template literals `x${y}`, ```x${y}```, tag`x${y}` |
</> | Comparison operators x < y > z; instanceof shorthand x <? Class; typeof shorthand x <? "string"; extends shorthand class A < B; implements shorthand class A <: B; TypeScript extends shorthand A < B, A > B, A !< B; JSX <div>, </div>; JSX code child > expr; TypeScript parameter Set<number>; range literals [x<..<y]; slices x[<i]; function arrows ->, =>; pipelines |>, ||> |
(/) | Operator ordering (x + y) * z; operator sections (* 2); operators as functions (*); function calls f(x); function parameters (x) => |
[/] | Property access x[y]; expression properties {[x]: y}; array literals [x, y], [] x, y; range literals [x..y] |
{/} | Object literals {x, y: z}, {} x, y: z; object globs x.{y,z}, x{y,z}; code blocks if (x) { y }; JSX attributes <div x={y}>; template interpolations `x${y}` |
Civet