mirror of https://github.com/Wilfred/difftastic/
1124 lines
29 KiB
Plaintext
1124 lines
29 KiB
Plaintext
================================================================================
|
|
Function examples
|
|
================================================================================
|
|
|
|
fn add(x: Int, y: Int) -> Int {
|
|
x + y
|
|
}
|
|
fn twice(f: fn(t) -> t, x: t) -> t {
|
|
f(f(x))
|
|
}
|
|
fn inferred_identity(x) {
|
|
x
|
|
}
|
|
fn replace(
|
|
in string: String,
|
|
each pattern: String,
|
|
with replacement: String
|
|
) {
|
|
string.replace(in: string, each: pattern, with: replacement)
|
|
}
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(source_file
|
|
(function
|
|
name: (identifier)
|
|
parameters: (function_parameters
|
|
(function_parameter
|
|
name: (identifier)
|
|
type: (type
|
|
name: (type_identifier)))
|
|
(function_parameter
|
|
name: (identifier)
|
|
type: (type
|
|
name: (type_identifier))))
|
|
return_type: (type
|
|
name: (type_identifier))
|
|
body: (block
|
|
(binary_expression
|
|
left: (identifier)
|
|
right: (identifier))))
|
|
(function
|
|
name: (identifier)
|
|
parameters: (function_parameters
|
|
(function_parameter
|
|
name: (identifier)
|
|
type: (function_type
|
|
parameter_types: (function_parameter_types
|
|
(type_var))
|
|
return_type: (type_var)))
|
|
(function_parameter
|
|
name: (identifier)
|
|
type: (type_var)))
|
|
return_type: (type_var)
|
|
body: (block
|
|
(function_call
|
|
function: (identifier)
|
|
arguments: (arguments
|
|
(argument
|
|
value: (function_call
|
|
function: (identifier)
|
|
arguments: (arguments
|
|
(argument
|
|
value: (identifier)))))))))
|
|
(function
|
|
name: (identifier)
|
|
parameters: (function_parameters
|
|
(function_parameter
|
|
name: (identifier)))
|
|
body: (block
|
|
(identifier)))
|
|
(function
|
|
name: (identifier)
|
|
parameters: (function_parameters
|
|
(function_parameter
|
|
label: (label)
|
|
name: (identifier)
|
|
type: (type
|
|
name: (type_identifier)))
|
|
(function_parameter
|
|
label: (label)
|
|
name: (identifier)
|
|
type: (type
|
|
name: (type_identifier)))
|
|
(function_parameter
|
|
label: (label)
|
|
name: (identifier)
|
|
type: (type
|
|
name: (type_identifier))))
|
|
body: (block
|
|
(function_call
|
|
function: (field_access
|
|
record: (identifier)
|
|
field: (label))
|
|
arguments: (arguments
|
|
(argument
|
|
label: (label)
|
|
value: (identifier))
|
|
(argument
|
|
label: (label)
|
|
value: (identifier))
|
|
(argument
|
|
label: (label)
|
|
value: (identifier)))))))
|
|
|
|
================================================================================
|
|
Public function examples
|
|
================================================================================
|
|
|
|
pub fn add(x: Int, y: Int) -> Int {
|
|
x + y
|
|
}
|
|
pub fn twice(f: fn(t) -> t, x: t) -> t {
|
|
f(f(x))
|
|
}
|
|
pub fn inferred_identity(x) {
|
|
x
|
|
}
|
|
pub fn replace(
|
|
in string: String,
|
|
each pattern: String,
|
|
with replacement: String
|
|
) {
|
|
string.replace(in: in, each: each, with: with)
|
|
}
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(source_file
|
|
(function
|
|
(visibility_modifier)
|
|
name: (identifier)
|
|
parameters: (function_parameters
|
|
(function_parameter
|
|
name: (identifier)
|
|
type: (type
|
|
name: (type_identifier)))
|
|
(function_parameter
|
|
name: (identifier)
|
|
type: (type
|
|
name: (type_identifier))))
|
|
return_type: (type
|
|
name: (type_identifier))
|
|
body: (block
|
|
(binary_expression
|
|
left: (identifier)
|
|
right: (identifier))))
|
|
(function
|
|
(visibility_modifier)
|
|
name: (identifier)
|
|
parameters: (function_parameters
|
|
(function_parameter
|
|
name: (identifier)
|
|
type: (function_type
|
|
parameter_types: (function_parameter_types
|
|
(type_var))
|
|
return_type: (type_var)))
|
|
(function_parameter
|
|
name: (identifier)
|
|
type: (type_var)))
|
|
return_type: (type_var)
|
|
body: (block
|
|
(function_call
|
|
function: (identifier)
|
|
arguments: (arguments
|
|
(argument
|
|
value: (function_call
|
|
function: (identifier)
|
|
arguments: (arguments
|
|
(argument
|
|
value: (identifier)))))))))
|
|
(function
|
|
(visibility_modifier)
|
|
name: (identifier)
|
|
parameters: (function_parameters
|
|
(function_parameter
|
|
name: (identifier)))
|
|
body: (block
|
|
(identifier)))
|
|
(function
|
|
(visibility_modifier)
|
|
name: (identifier)
|
|
parameters: (function_parameters
|
|
(function_parameter
|
|
label: (label)
|
|
name: (identifier)
|
|
type: (type
|
|
name: (type_identifier)))
|
|
(function_parameter
|
|
label: (label)
|
|
name: (identifier)
|
|
type: (type
|
|
name: (type_identifier)))
|
|
(function_parameter
|
|
label: (label)
|
|
name: (identifier)
|
|
type: (type
|
|
name: (type_identifier))))
|
|
body: (block
|
|
(function_call
|
|
function: (field_access
|
|
record: (identifier)
|
|
field: (label))
|
|
arguments: (arguments
|
|
(argument
|
|
label: (label)
|
|
value: (identifier))
|
|
(argument
|
|
label: (label)
|
|
value: (identifier))
|
|
(argument
|
|
label: (label)
|
|
value: (identifier)))))))
|
|
|
|
================================================================================
|
|
Basic functions
|
|
================================================================================
|
|
|
|
fn unfinished() {}
|
|
fn str() {
|
|
"Hello, World!"
|
|
}
|
|
fn integer() {
|
|
42
|
|
}
|
|
fn float() {
|
|
12.34
|
|
}
|
|
fn record() {
|
|
Cat(name: "Nubi")
|
|
}
|
|
fn remote_record() {
|
|
cats.Cat(name: "Nubi")
|
|
}
|
|
fn var(x) {
|
|
x
|
|
}
|
|
fn funcall() {
|
|
myfun()
|
|
}
|
|
fn unfinished() {
|
|
todo as "Finish me!"
|
|
}
|
|
fn do_panic() {
|
|
panic
|
|
panic as "aaaah!"
|
|
}
|
|
fn tuple(x) {
|
|
#(x, 1)
|
|
}
|
|
fn list(x) {
|
|
[1, 2, ..x]
|
|
}
|
|
fn bit_string() {
|
|
<<0:4, 1:3, 1:1>>
|
|
}
|
|
fn return_fun(x) {
|
|
fn(y: Int) { x + y }
|
|
}
|
|
fn block() {
|
|
{
|
|
1 + 1
|
|
"Hello, World!"
|
|
}
|
|
}
|
|
fn foob(x, y) {
|
|
case x, y {
|
|
1, 2 | 3, 4 -> True
|
|
_else -> False
|
|
}
|
|
}
|
|
fn assert_assignment() {
|
|
let assert Ok(a) = Ok(1)
|
|
let assert x = {
|
|
1 + 1
|
|
"Hello, World!"
|
|
}
|
|
let assert y = x
|
|
let assert #(x, _) = #(1, 2)
|
|
let assert Ok(_) = Ok(10) as "This never fails"
|
|
let assert 10 = 11 as { "message1" <> "message2" }
|
|
}
|
|
fn assignment() {
|
|
let x = {
|
|
1 + 1
|
|
"Hello, World!"
|
|
}
|
|
let y = x
|
|
let #(x, _) = #(1, 2)
|
|
}
|
|
fn assertions() {
|
|
assert True && False
|
|
assert add(1, 2) == 3
|
|
assert !some_value
|
|
assert {
|
|
10
|
|
11
|
|
} != 10
|
|
assert result.is_ok(Ok(10))
|
|
}
|
|
fn update(x) {
|
|
Cat(..x, name: "Nubi", cuteness: 1000 + 1001)
|
|
animals.Dog(..myfun(), name: "Rey", cuteness: 1950)
|
|
}
|
|
fn tuple_access(x) {
|
|
x.1
|
|
}
|
|
fn field_access(x) {
|
|
x.name
|
|
}
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(source_file
|
|
(function
|
|
name: (identifier)
|
|
parameters: (function_parameters)
|
|
body: (block))
|
|
(function
|
|
name: (identifier)
|
|
parameters: (function_parameters)
|
|
body: (block
|
|
(string
|
|
(quoted_content))))
|
|
(function
|
|
name: (identifier)
|
|
parameters: (function_parameters)
|
|
body: (block
|
|
(integer)))
|
|
(function
|
|
name: (identifier)
|
|
parameters: (function_parameters)
|
|
body: (block
|
|
(float)))
|
|
(function
|
|
name: (identifier)
|
|
parameters: (function_parameters)
|
|
body: (block
|
|
(record
|
|
name: (constructor_name)
|
|
arguments: (arguments
|
|
(argument
|
|
label: (label)
|
|
value: (string
|
|
(quoted_content)))))))
|
|
(function
|
|
name: (identifier)
|
|
parameters: (function_parameters)
|
|
body: (block
|
|
(record
|
|
name: (remote_constructor_name
|
|
module: (identifier)
|
|
name: (constructor_name))
|
|
arguments: (arguments
|
|
(argument
|
|
label: (label)
|
|
value: (string
|
|
(quoted_content)))))))
|
|
(function
|
|
name: (identifier)
|
|
parameters: (function_parameters
|
|
(function_parameter
|
|
name: (identifier)))
|
|
body: (block
|
|
(identifier)))
|
|
(function
|
|
name: (identifier)
|
|
parameters: (function_parameters)
|
|
body: (block
|
|
(function_call
|
|
function: (identifier)
|
|
arguments: (arguments))))
|
|
(function
|
|
name: (identifier)
|
|
parameters: (function_parameters)
|
|
body: (block
|
|
(todo
|
|
message: (string
|
|
(quoted_content)))))
|
|
(function
|
|
name: (identifier)
|
|
parameters: (function_parameters)
|
|
body: (block
|
|
(panic)
|
|
(panic
|
|
message: (string
|
|
(quoted_content)))))
|
|
(function
|
|
name: (identifier)
|
|
parameters: (function_parameters
|
|
(function_parameter
|
|
name: (identifier)))
|
|
body: (block
|
|
(tuple
|
|
(identifier)
|
|
(integer))))
|
|
(function
|
|
name: (identifier)
|
|
parameters: (function_parameters
|
|
(function_parameter
|
|
name: (identifier)))
|
|
body: (block
|
|
(list
|
|
(integer)
|
|
(integer)
|
|
spread: (identifier))))
|
|
(function
|
|
name: (identifier)
|
|
parameters: (function_parameters)
|
|
body: (block
|
|
(bit_string
|
|
(bit_string_segment
|
|
value: (integer)
|
|
options: (bit_string_segment_options
|
|
(integer)))
|
|
(bit_string_segment
|
|
value: (integer)
|
|
options: (bit_string_segment_options
|
|
(integer)))
|
|
(bit_string_segment
|
|
value: (integer)
|
|
options: (bit_string_segment_options
|
|
(integer))))))
|
|
(function
|
|
name: (identifier)
|
|
parameters: (function_parameters
|
|
(function_parameter
|
|
name: (identifier)))
|
|
body: (block
|
|
(anonymous_function
|
|
parameters: (function_parameters
|
|
(function_parameter
|
|
name: (identifier)
|
|
type: (type
|
|
name: (type_identifier))))
|
|
body: (block
|
|
(binary_expression
|
|
left: (identifier)
|
|
right: (identifier))))))
|
|
(function
|
|
name: (identifier)
|
|
parameters: (function_parameters)
|
|
body: (block
|
|
(block
|
|
(binary_expression
|
|
left: (integer)
|
|
right: (integer))
|
|
(string
|
|
(quoted_content)))))
|
|
(function
|
|
name: (identifier)
|
|
parameters: (function_parameters
|
|
(function_parameter
|
|
name: (identifier))
|
|
(function_parameter
|
|
name: (identifier)))
|
|
body: (block
|
|
(case
|
|
subjects: (case_subjects
|
|
(identifier)
|
|
(identifier))
|
|
clauses: (case_clauses
|
|
(case_clause
|
|
patterns: (case_clause_patterns
|
|
(case_clause_pattern
|
|
(integer)
|
|
(integer))
|
|
(case_clause_pattern
|
|
(integer)
|
|
(integer)))
|
|
value: (record
|
|
name: (constructor_name)))
|
|
(case_clause
|
|
patterns: (case_clause_patterns
|
|
(case_clause_pattern
|
|
(discard)))
|
|
value: (record
|
|
name: (constructor_name)))))))
|
|
(function
|
|
name: (identifier)
|
|
parameters: (function_parameters)
|
|
body: (block
|
|
(let_assert
|
|
pattern: (record_pattern
|
|
name: (constructor_name)
|
|
arguments: (record_pattern_arguments
|
|
(record_pattern_argument
|
|
pattern: (identifier))))
|
|
value: (record
|
|
name: (constructor_name)
|
|
arguments: (arguments
|
|
(argument
|
|
value: (integer)))))
|
|
(let_assert
|
|
pattern: (identifier)
|
|
value: (block
|
|
(binary_expression
|
|
left: (integer)
|
|
right: (integer))
|
|
(string
|
|
(quoted_content))))
|
|
(let_assert
|
|
pattern: (identifier)
|
|
value: (identifier))
|
|
(let_assert
|
|
pattern: (tuple_pattern
|
|
(identifier)
|
|
(discard))
|
|
value: (tuple
|
|
(integer)
|
|
(integer)))
|
|
(let_assert
|
|
pattern: (record_pattern
|
|
name: (constructor_name)
|
|
arguments: (record_pattern_arguments
|
|
(record_pattern_argument
|
|
pattern: (discard))))
|
|
value: (record
|
|
name: (constructor_name)
|
|
arguments: (arguments
|
|
(argument
|
|
value: (integer))))
|
|
message: (string
|
|
(quoted_content)))
|
|
(let_assert
|
|
pattern: (integer)
|
|
value: (integer)
|
|
message: (block
|
|
(binary_expression
|
|
left: (string
|
|
(quoted_content))
|
|
right: (string
|
|
(quoted_content)))))))
|
|
(function
|
|
name: (identifier)
|
|
parameters: (function_parameters)
|
|
body: (block
|
|
(let
|
|
pattern: (identifier)
|
|
value: (block
|
|
(binary_expression
|
|
left: (integer)
|
|
right: (integer))
|
|
(string
|
|
(quoted_content))))
|
|
(let
|
|
pattern: (identifier)
|
|
value: (identifier))
|
|
(let
|
|
pattern: (tuple_pattern
|
|
(identifier)
|
|
(discard))
|
|
value: (tuple
|
|
(integer)
|
|
(integer)))))
|
|
(function
|
|
name: (identifier)
|
|
parameters: (function_parameters)
|
|
body: (block
|
|
(assert
|
|
value: (binary_expression
|
|
left: (record
|
|
name: (constructor_name))
|
|
right: (record
|
|
name: (constructor_name))))
|
|
(assert
|
|
value: (binary_expression
|
|
left: (function_call
|
|
function: (identifier)
|
|
arguments: (arguments
|
|
(argument
|
|
value: (integer))
|
|
(argument
|
|
value: (integer))))
|
|
right: (integer)))
|
|
(assert
|
|
value: (boolean_negation
|
|
(identifier)))
|
|
(assert
|
|
value: (binary_expression
|
|
left: (block
|
|
(integer)
|
|
(integer))
|
|
right: (integer)))
|
|
(assert
|
|
value: (function_call
|
|
function: (field_access
|
|
record: (identifier)
|
|
field: (label))
|
|
arguments: (arguments
|
|
(argument
|
|
value: (record
|
|
name: (constructor_name)
|
|
arguments: (arguments
|
|
(argument
|
|
value: (integer))))))))))
|
|
(function
|
|
name: (identifier)
|
|
parameters: (function_parameters
|
|
(function_parameter
|
|
name: (identifier)))
|
|
body: (block
|
|
(record_update
|
|
constructor: (constructor_name)
|
|
spread: (identifier)
|
|
arguments: (record_update_arguments
|
|
(record_update_argument
|
|
label: (label)
|
|
value: (string
|
|
(quoted_content)))
|
|
(record_update_argument
|
|
label: (label)
|
|
value: (binary_expression
|
|
left: (integer)
|
|
right: (integer)))))
|
|
(record_update
|
|
constructor: (remote_constructor_name
|
|
module: (identifier)
|
|
name: (constructor_name))
|
|
spread: (function_call
|
|
function: (identifier)
|
|
arguments: (arguments))
|
|
arguments: (record_update_arguments
|
|
(record_update_argument
|
|
label: (label)
|
|
value: (string
|
|
(quoted_content)))
|
|
(record_update_argument
|
|
label: (label)
|
|
value: (integer))))))
|
|
(function
|
|
name: (identifier)
|
|
parameters: (function_parameters
|
|
(function_parameter
|
|
name: (identifier)))
|
|
body: (block
|
|
(tuple_access
|
|
tuple: (identifier)
|
|
index: (integer))))
|
|
(function
|
|
name: (identifier)
|
|
parameters: (function_parameters
|
|
(function_parameter
|
|
name: (identifier)))
|
|
body: (block
|
|
(field_access
|
|
record: (identifier)
|
|
field: (label)))))
|
|
|
|
================================================================================
|
|
Cases
|
|
================================================================================
|
|
|
|
fn trial(x, y, z) {
|
|
case x {
|
|
1 -> 2
|
|
2 -> 3
|
|
_ -> 4
|
|
}
|
|
|
|
case y {
|
|
#(z, _) | #(_, z) if z.1 == 5 -> True
|
|
#(_, z) if z.2 >= 4 < 5 || z.1 > 6 -> True
|
|
}
|
|
|
|
case #(x, y) {
|
|
#(1, 2) -> #(3, 4)
|
|
_ -> #(5, 6)
|
|
}
|
|
|
|
case z {
|
|
Uri(scheme: Some("https"), ..) -> True
|
|
_ -> False
|
|
}
|
|
}
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(source_file
|
|
(function
|
|
name: (identifier)
|
|
parameters: (function_parameters
|
|
(function_parameter
|
|
name: (identifier))
|
|
(function_parameter
|
|
name: (identifier))
|
|
(function_parameter
|
|
name: (identifier)))
|
|
body: (block
|
|
(case
|
|
subjects: (case_subjects
|
|
(identifier))
|
|
clauses: (case_clauses
|
|
(case_clause
|
|
patterns: (case_clause_patterns
|
|
(case_clause_pattern
|
|
(integer)))
|
|
value: (integer))
|
|
(case_clause
|
|
patterns: (case_clause_patterns
|
|
(case_clause_pattern
|
|
(integer)))
|
|
value: (integer))
|
|
(case_clause
|
|
patterns: (case_clause_patterns
|
|
(case_clause_pattern
|
|
(discard)))
|
|
value: (integer))))
|
|
(case
|
|
subjects: (case_subjects
|
|
(identifier))
|
|
clauses: (case_clauses
|
|
(case_clause
|
|
patterns: (case_clause_patterns
|
|
(case_clause_pattern
|
|
(tuple_pattern
|
|
(identifier)
|
|
(discard)))
|
|
(case_clause_pattern
|
|
(tuple_pattern
|
|
(discard)
|
|
(identifier))))
|
|
guard: (case_clause_guard
|
|
(binary_expression
|
|
left: (tuple_access
|
|
tuple: (identifier)
|
|
index: (integer))
|
|
right: (integer)))
|
|
value: (record
|
|
name: (constructor_name)))
|
|
(case_clause
|
|
patterns: (case_clause_patterns
|
|
(case_clause_pattern
|
|
(tuple_pattern
|
|
(discard)
|
|
(identifier))))
|
|
guard: (case_clause_guard
|
|
(binary_expression
|
|
left: (binary_expression
|
|
left: (binary_expression
|
|
left: (tuple_access
|
|
tuple: (identifier)
|
|
index: (integer))
|
|
right: (integer))
|
|
right: (integer))
|
|
right: (binary_expression
|
|
left: (tuple_access
|
|
tuple: (identifier)
|
|
index: (integer))
|
|
right: (integer))))
|
|
value: (record
|
|
name: (constructor_name)))))
|
|
(case
|
|
subjects: (case_subjects
|
|
(tuple
|
|
(identifier)
|
|
(identifier)))
|
|
clauses: (case_clauses
|
|
(case_clause
|
|
patterns: (case_clause_patterns
|
|
(case_clause_pattern
|
|
(tuple_pattern
|
|
(integer)
|
|
(integer))))
|
|
value: (tuple
|
|
(integer)
|
|
(integer)))
|
|
(case_clause
|
|
patterns: (case_clause_patterns
|
|
(case_clause_pattern
|
|
(discard)))
|
|
value: (tuple
|
|
(integer)
|
|
(integer)))))
|
|
(case
|
|
subjects: (case_subjects
|
|
(identifier))
|
|
clauses: (case_clauses
|
|
(case_clause
|
|
patterns: (case_clause_patterns
|
|
(case_clause_pattern
|
|
(record_pattern
|
|
name: (constructor_name)
|
|
arguments: (record_pattern_arguments
|
|
(record_pattern_argument
|
|
label: (label)
|
|
pattern: (record_pattern
|
|
name: (constructor_name)
|
|
arguments: (record_pattern_arguments
|
|
(record_pattern_argument
|
|
pattern: (string
|
|
(quoted_content))))))
|
|
(pattern_spread)))))
|
|
value: (record
|
|
name: (constructor_name)))
|
|
(case_clause
|
|
patterns: (case_clause_patterns
|
|
(case_clause_pattern
|
|
(discard)))
|
|
value: (record
|
|
name: (constructor_name))))))))
|
|
|
|
================================================================================
|
|
Let expressions
|
|
================================================================================
|
|
|
|
let foo: fn(Int) -> Int = fn(x) { x }
|
|
let fun_ref = float.to_string
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(source_file
|
|
(let
|
|
pattern: (identifier)
|
|
type: (function_type
|
|
parameter_types: (function_parameter_types
|
|
(type
|
|
name: (type_identifier)))
|
|
return_type: (type
|
|
name: (type_identifier)))
|
|
value: (anonymous_function
|
|
parameters: (function_parameters
|
|
(function_parameter
|
|
name: (identifier)))
|
|
body: (block
|
|
(identifier))))
|
|
(let
|
|
pattern: (identifier)
|
|
value: (field_access
|
|
record: (identifier)
|
|
field: (label))))
|
|
|
|
================================================================================
|
|
Complex binary expressions
|
|
================================================================================
|
|
|
|
fn complicated(x, y) {
|
|
x > y && x >= y || x + y |> fun() < x * y + 1
|
|
}
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(source_file
|
|
(function
|
|
name: (identifier)
|
|
parameters: (function_parameters
|
|
(function_parameter
|
|
name: (identifier))
|
|
(function_parameter
|
|
name: (identifier)))
|
|
body: (block
|
|
(binary_expression
|
|
left: (binary_expression
|
|
left: (binary_expression
|
|
left: (identifier)
|
|
right: (identifier))
|
|
right: (binary_expression
|
|
left: (identifier)
|
|
right: (identifier)))
|
|
right: (binary_expression
|
|
left: (binary_expression
|
|
left: (binary_expression
|
|
left: (identifier)
|
|
right: (identifier))
|
|
right: (function_call
|
|
function: (identifier)
|
|
arguments: (arguments)))
|
|
right: (binary_expression
|
|
left: (binary_expression
|
|
left: (identifier)
|
|
right: (identifier))
|
|
right: (integer)))))))
|
|
|
|
================================================================================
|
|
Complex nesting of field and tuple access
|
|
================================================================================
|
|
|
|
fn complex_data_fun(x, y) {
|
|
y.barbaz.2.thing
|
|
x.1.qux.10
|
|
x.2.foobar.1("Hello", 1)
|
|
y.quux.2.quuz(12.34, "a")
|
|
}
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(source_file
|
|
(function
|
|
name: (identifier)
|
|
parameters: (function_parameters
|
|
(function_parameter
|
|
name: (identifier))
|
|
(function_parameter
|
|
name: (identifier)))
|
|
body: (block
|
|
(field_access
|
|
record: (tuple_access
|
|
tuple: (field_access
|
|
record: (identifier)
|
|
field: (label))
|
|
index: (integer))
|
|
field: (label))
|
|
(tuple_access
|
|
tuple: (field_access
|
|
record: (tuple_access
|
|
tuple: (identifier)
|
|
index: (integer))
|
|
field: (label))
|
|
index: (integer))
|
|
(function_call
|
|
function: (tuple_access
|
|
tuple: (field_access
|
|
record: (tuple_access
|
|
tuple: (identifier)
|
|
index: (integer))
|
|
field: (label))
|
|
index: (integer))
|
|
arguments: (arguments
|
|
(argument
|
|
value: (string
|
|
(quoted_content)))
|
|
(argument
|
|
value: (integer))))
|
|
(function_call
|
|
function: (field_access
|
|
record: (tuple_access
|
|
tuple: (field_access
|
|
record: (identifier)
|
|
field: (label))
|
|
index: (integer))
|
|
field: (label))
|
|
arguments: (arguments
|
|
(argument
|
|
value: (float))
|
|
(argument
|
|
value: (string
|
|
(quoted_content))))))))
|
|
|
|
================================================================================
|
|
Unusual function invocations
|
|
================================================================================
|
|
|
|
fn weird(x) {
|
|
x(name: "Nubi")
|
|
fn (x) { x + 1 }(3)
|
|
{
|
|
let fun = fn (x) { x + 1 }
|
|
}(3)
|
|
case 5 {
|
|
5 -> fn (x) { x + 1 }
|
|
}(3)
|
|
returns_fun(1)(5)
|
|
}
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(source_file
|
|
(function
|
|
name: (identifier)
|
|
parameters: (function_parameters
|
|
(function_parameter
|
|
name: (identifier)))
|
|
body: (block
|
|
(function_call
|
|
function: (identifier)
|
|
arguments: (arguments
|
|
(argument
|
|
label: (label)
|
|
value: (string
|
|
(quoted_content)))))
|
|
(function_call
|
|
function: (anonymous_function
|
|
parameters: (function_parameters
|
|
(function_parameter
|
|
name: (identifier)))
|
|
body: (block
|
|
(binary_expression
|
|
left: (identifier)
|
|
right: (integer))))
|
|
arguments: (arguments
|
|
(argument
|
|
value: (integer))))
|
|
(function_call
|
|
function: (block
|
|
(let
|
|
pattern: (identifier)
|
|
value: (anonymous_function
|
|
parameters: (function_parameters
|
|
(function_parameter
|
|
name: (identifier)))
|
|
body: (block
|
|
(binary_expression
|
|
left: (identifier)
|
|
right: (integer))))))
|
|
arguments: (arguments
|
|
(argument
|
|
value: (integer))))
|
|
(function_call
|
|
function: (case
|
|
subjects: (case_subjects
|
|
(integer))
|
|
clauses: (case_clauses
|
|
(case_clause
|
|
patterns: (case_clause_patterns
|
|
(case_clause_pattern
|
|
(integer)))
|
|
value: (anonymous_function
|
|
parameters: (function_parameters
|
|
(function_parameter
|
|
name: (identifier)))
|
|
body: (block
|
|
(binary_expression
|
|
left: (identifier)
|
|
right: (integer)))))))
|
|
arguments: (arguments
|
|
(argument
|
|
value: (integer))))
|
|
(function_call
|
|
function: (function_call
|
|
function: (identifier)
|
|
arguments: (arguments
|
|
(argument
|
|
value: (integer))))
|
|
arguments: (arguments
|
|
(argument
|
|
value: (integer)))))))
|
|
|
|
================================================================================
|
|
Various discard variables
|
|
================================================================================
|
|
|
|
fn ignores(foo, _bar) {
|
|
let _baz = 4
|
|
qux(foo, _hole)
|
|
}
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(source_file
|
|
(function
|
|
name: (identifier)
|
|
parameters: (function_parameters
|
|
(function_parameter
|
|
name: (identifier))
|
|
(function_parameter
|
|
name: (discard)))
|
|
body: (block
|
|
(let
|
|
pattern: (discard)
|
|
value: (integer))
|
|
(function_call
|
|
function: (identifier)
|
|
arguments: (arguments
|
|
(argument
|
|
value: (identifier))
|
|
(argument
|
|
value: (hole)))))))
|
|
|
|
================================================================================
|
|
Weird lists
|
|
================================================================================
|
|
|
|
fn lists(x) {
|
|
[]
|
|
[1,]
|
|
[1 ..x]
|
|
[1,..x]
|
|
}
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(source_file
|
|
(function
|
|
name: (identifier)
|
|
parameters: (function_parameters
|
|
(function_parameter
|
|
name: (identifier)))
|
|
body: (block
|
|
(list)
|
|
(list
|
|
(integer))
|
|
(list
|
|
(integer)
|
|
spread: (identifier))
|
|
(list
|
|
(integer)
|
|
spread: (identifier)))))
|
|
|
|
================================================================================
|
|
Comment in string
|
|
================================================================================
|
|
|
|
io.println("// hello world!\n")
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(source_file
|
|
(function_call
|
|
function: (field_access
|
|
record: (identifier)
|
|
field: (label))
|
|
arguments: (arguments
|
|
(argument
|
|
value: (string
|
|
(quoted_content)
|
|
(escape_sequence))))))
|
|
|
|
================================================================================
|
|
Call with label shorthand
|
|
================================================================================
|
|
|
|
wibble(arg1:, arg2:)
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(source_file
|
|
(function_call
|
|
(identifier)
|
|
(arguments
|
|
(argument
|
|
(label))
|
|
(argument
|
|
(label)))))
|