Compare commits
3 Commits
v0.27.0
...
778d00677d
| Author | SHA1 | Date | |
|---|---|---|---|
| 778d00677d | |||
| ba3dbb7f02 | |||
| 7285109115 |
+176
-35
@@ -79,20 +79,20 @@ Here are some examples of execution.
|
|||||||
# Type 'exit' or Ctrl+D to quit the program.
|
# Type 'exit' or Ctrl+D to quit the program.
|
||||||
|
|
||||||
[user]$ ./dev-expr
|
[user]$ ./dev-expr
|
||||||
dev-expr -- Expressions calculator v1.10.0(build 14),2024/06/17 (celestino.amoroso@portale-stac.it)
|
dev-expr -- Expressions calculator v1.12.0(build 1),2024/09/14 (celestino.amoroso@portale-stac.it)
|
||||||
Based on the Expr package v0.19.0
|
Based on the Expr package v0.26.0
|
||||||
Type help to get the list of available commands
|
Type help to get the list of available commands
|
||||||
See also https://git.portale-stac.it/go-pkg/expr/src/branch/main/README.adoc
|
See also https://git.portale-stac.it/go-pkg/expr/src/branch/main/README.adoc
|
||||||
>>> help
|
>>> help
|
||||||
--- REPL commands:
|
--- REPL commands:
|
||||||
source -- Load a file as input
|
|
||||||
tty -- Enable/Disable ansi output <1>
|
|
||||||
base -- Set the integer output base: 2, 8, 10, or 16
|
base -- Set the integer output base: 2, 8, 10, or 16
|
||||||
exit -- Exit the program
|
exit -- Exit the program
|
||||||
help -- Show command list
|
help -- Show command list
|
||||||
ml -- Enable/Disable multi-line output
|
ml -- Enable/Disable multi-line output
|
||||||
mods -- List builtin modules
|
mods -- List builtin modules
|
||||||
output -- Enable/Disable printing expression results. Options 'on', 'off', 'status'
|
output -- Enable/Disable printing expression results. Options 'on', 'off', 'status'
|
||||||
|
source -- Load a file as input
|
||||||
|
tty -- Enable/Disable ansi output <1>
|
||||||
|
|
||||||
--- Command line options:
|
--- Command line options:
|
||||||
-b <builtin> Import builtin modules.
|
-b <builtin> Import builtin modules.
|
||||||
@@ -155,9 +155,9 @@ _Expr_ supports three type of numbers:
|
|||||||
|
|
||||||
. [blue]#Integers#
|
. [blue]#Integers#
|
||||||
. [blue]#Floats#
|
. [blue]#Floats#
|
||||||
. [blue]#Factions#
|
. [blue]#Fractions#
|
||||||
|
|
||||||
In mixed operations involving integers, fractions and floats, automatic type promotion to the largest type take place.
|
In mixed operations involving integers, fractions and floats, automatic type promotion to the largest type is performed.
|
||||||
|
|
||||||
==== Integers
|
==== Integers
|
||||||
__Expr__'s integers are a subset of the integer set. Internally they are stored as Golang _int64_ values.
|
__Expr__'s integers are a subset of the integer set. Internally they are stored as Golang _int64_ values.
|
||||||
@@ -183,11 +183,11 @@ Value range: *-9223372036854775808* to *9223372036854775807*
|
|||||||
[cols="^1,^2,6,4"]
|
[cols="^1,^2,6,4"]
|
||||||
|===
|
|===
|
||||||
| Symbol | Operation | Description | Examples
|
| Symbol | Operation | Description | Examples
|
||||||
| [blue]`+` | _sum_ | Add two values | [blue]`-1 + 2` -> 1
|
| [blue]`+` | _Sum_ | Add two values | [blue]`-1 + 2` -> _1_
|
||||||
| [blue]`-` | _subtraction_ | Subtract the right value from the left one | [blue]`3 - 1` -> 2
|
| [blue]`-` | _Subtraction_ | Subtract the right value from the left one | [blue]`3 - 1` -> _2_
|
||||||
| [blue]`*` | _product_ | Multiply two values | [blue]`-1 * 2` -> -2
|
| [blue]`*` | _Product_ | Multiply two values | [blue]`-1 * 2` -> _-2_
|
||||||
| [blue]`/` | _Division_ | Divide the left value by the right one^(*)^ | [blue]`-10 / 2` -> 5
|
| [blue]`/` | _Integer division_ | Divide the left value by the right one^(*)^ | [blue]`-11 / 2` -> _-5_
|
||||||
| [blue]`%` | _Modulo_ | Remainder of the integer division | [blue]`5 % 2` -> 1
|
| [blue]`%` | _Modulo_ | Remainder of the integer division | [blue]`5 % 2` -> _1_
|
||||||
|===
|
|===
|
||||||
|
|
||||||
^(*)^ See also the _float division_ [blue]`./` below.
|
^(*)^ See also the _float division_ [blue]`./` below.
|
||||||
@@ -228,11 +228,11 @@ _dec-seq_ = _see-integer-literal-syntax_
|
|||||||
[cols="^1,^2,6,4"]
|
[cols="^1,^2,6,4"]
|
||||||
|===
|
|===
|
||||||
| Symbol | Operation | Description | Examples
|
| Symbol | Operation | Description | Examples
|
||||||
| [blue]`+` | _sum_ | Add two values | [blue]`4 + 0.5` -> 4.5
|
| [blue]`+` | _Sum_ | Add two values | [blue]`4 + 0.5` -> 4.5
|
||||||
| [blue]`-` | _subtraction_ | Subtract the right value from the left one | [blue]`4 - 0.5` -> 3.5
|
| [blue]`-` | _Subtraction_ | Subtract the right value from the left one | [blue]`4 - 0.5` -> 3.5
|
||||||
| [blue]`*` | _product_ | Multiply two values | [blue]`4 * 0.5` -> 2.0
|
| [blue]`*` | _Product_ | Multiply two values | [blue]`4 * 0.5` -> 2.0
|
||||||
| [blue]`/` | _Division_ | Divide the left value by the right one | [blue]`1.0 / 2` -> 0.5
|
| [blue]`/` | _Float division_ | Divide the left value by the right one | [blue]`1.0 / 2` -> 0.5
|
||||||
| [blue]`./`| _Float division_ | Force float division | [blue]`-1 ./ 2` -> -0.5
|
| [blue]`./`| _Forced float division_ | Force float division | [blue]`-1 ./ 2` -> -0.5
|
||||||
|===
|
|===
|
||||||
|
|
||||||
==== Fractions
|
==== Fractions
|
||||||
@@ -308,7 +308,7 @@ Strings are character sequences enclosed between two double quote [blue]`"`.
|
|||||||
`>>>` [blue]`"123\tabc"` +
|
`>>>` [blue]`"123\tabc"` +
|
||||||
[green]`123{nbsp}{nbsp}{nbsp}{nbsp}abc`
|
[green]`123{nbsp}{nbsp}{nbsp}{nbsp}abc`
|
||||||
|
|
||||||
Some arithmetic operators can also be used with strings.
|
Some arithmetic operators also apply to strings.
|
||||||
|
|
||||||
.String operators
|
.String operators
|
||||||
[cols="^1,^2,6,4"]
|
[cols="^1,^2,6,4"]
|
||||||
@@ -444,6 +444,7 @@ _non-empty-list_ = "**[**" _any-value_ {"**,**" _any-value_} "**]**" +
|
|||||||
| [blue]`[]` | _Item at index_ | Item at given position | [blue]`[1,2,3][1]` -> _2_
|
| [blue]`[]` | _Item at index_ | Item at given position | [blue]`[1,2,3][1]` -> _2_
|
||||||
| [blue]`in` | _Item in list_ | True if item is in list | [blue]`2 in [1,2,3]` -> _true_ +
|
| [blue]`in` | _Item in list_ | True if item is in list | [blue]`2 in [1,2,3]` -> _true_ +
|
||||||
[blue]`6 in [1,2,3]` -> _false_
|
[blue]`6 in [1,2,3]` -> _false_
|
||||||
|
| [blue]`#` | _Size_ | Number of items in a list | [blue]`#[1,2,3]` -> _3_
|
||||||
|===
|
|===
|
||||||
|
|
||||||
Array's items can be accessed using the index `[]` operator.
|
Array's items can be accessed using the index `[]` operator.
|
||||||
@@ -458,10 +459,16 @@ Array's items can be accessed using the index `[]` operator.
|
|||||||
*_slice_* = _string-expr_ "**[**" _integer-expr_ "**:**" _integer-expr_ "**]**"
|
*_slice_* = _string-expr_ "**[**" _integer-expr_ "**:**" _integer-expr_ "**]**"
|
||||||
====
|
====
|
||||||
|
|
||||||
.Items of list
|
.Examples: Getting items from lists
|
||||||
`>>>` [blue]`[1,2,3][1]` +
|
`>>>` [blue]`[1,2,3][1]` +
|
||||||
[green]`2`
|
[green]`2`
|
||||||
|
|
||||||
|
`>>>` [blue]`index=2; ["a", "b", "c", "d"][index]` +
|
||||||
|
[green]`c`
|
||||||
|
|
||||||
|
`>>>` [blue]`["a", "b", "c", "d"][2:]` +
|
||||||
|
[green]`["c", "d"]`
|
||||||
|
|
||||||
`>>>` [blue]`list=[1,2,3]; list[1]` +
|
`>>>` [blue]`list=[1,2,3]; list[1]` +
|
||||||
[green]`2`
|
[green]`2`
|
||||||
|
|
||||||
@@ -471,25 +478,44 @@ Array's items can be accessed using the index `[]` operator.
|
|||||||
`>>>` [blue]`list=["one","two","three"]; list[2-1]` +
|
`>>>` [blue]`list=["one","two","three"]; list[2-1]` +
|
||||||
[green]`two`
|
[green]`two`
|
||||||
|
|
||||||
|
`>>>` [blue]`list[1]="six"; list` +
|
||||||
|
[green]`["one", "six", "three"]`
|
||||||
|
|
||||||
`>>>` [blue]`list[-1]` +
|
`>>>` [blue]`list[-1]` +
|
||||||
[green]`three`
|
[green]`three`
|
||||||
|
|
||||||
`>>>` [blue]`list[10]` +
|
`>>>` [blue]`list[10]` +
|
||||||
[red]`Eval Error: [1:9] index 10 out of bounds`
|
[red]`Eval Error: [1:9] index 10 out of bounds`
|
||||||
|
|
||||||
|
.Example: Number of elements in a list
|
||||||
`>>>` [blue]`#list` +
|
`>>>` [blue]`#list` +
|
||||||
[green]`3`
|
[green]`3`
|
||||||
|
|
||||||
`>>>` [blue]`index=2; ["a", "b", "c", "d"][index]` +
|
.Examples: Element insertion
|
||||||
[green]`c`
|
`>>>` [blue]`"first" >> list` +
|
||||||
|
[green]`["first", "one", "six", "three"]`
|
||||||
|
|
||||||
|
`>>>` [blue]`list << "last"` +
|
||||||
|
[green]`["first", "one", "six", "three", "last"]`
|
||||||
|
|
||||||
|
.Examples: Element in list
|
||||||
|
`>>>` [blue]`"six" in list` +
|
||||||
|
[green]`true`
|
||||||
|
|
||||||
|
`>>>` [blue]`"ten" in list` +
|
||||||
|
[green]`false`
|
||||||
|
|
||||||
|
.Examples: Concatenation and filtering
|
||||||
|
`>>>` [blue]`[1,2,3] + ["one", "two", "three"]` +
|
||||||
|
[green]`[1, 2, 3, "one", "two", "three"]`
|
||||||
|
|
||||||
|
`>>>` [blue]`[1,2,3,4] - [2,4]` +
|
||||||
|
[green]`[1, 3]`
|
||||||
|
|
||||||
`>>>` [blue]`["a", "b", "c", "d"][2:]` +
|
|
||||||
[green]`["c", "d"]`
|
|
||||||
|
|
||||||
|
|
||||||
=== Dictionaries
|
=== Dictionaries
|
||||||
The _dictionary_, or _dict_, data-type is set of pairs _key/value_. It is also known as _map_ or _associative array_.
|
The _dictionary_, or _dict_, data-type represents sets of pairs _key/value_. It is also known as _map_ or _associative array_.
|
||||||
|
|
||||||
Dictionary literals are sequences of pairs separated by comma [blue]`,` enclosed between brace brackets.
|
Dictionary literals are sequences of pairs separated by comma [blue]`,` enclosed between brace brackets.
|
||||||
|
|
||||||
@@ -515,6 +541,7 @@ _non-empty-dict_ = "**{**" _key-scalar_ "**:**" _any-value_ {"**,**" _key-scalar
|
|||||||
| [blue]`[]` | _Dict item value_ | Item value of given key | [blue]`{"one":1, "two":2}["two"]` -> _2_
|
| [blue]`[]` | _Dict item value_ | Item value of given key | [blue]`{"one":1, "two":2}["two"]` -> _2_
|
||||||
| [blue]`in` | _Key in dict_ | True if key is in dict | [blue]`"one" in {"one":1, "two":2}` -> _true_ +
|
| [blue]`in` | _Key in dict_ | True if key is in dict | [blue]`"one" in {"one":1, "two":2}` -> _true_ +
|
||||||
[blue]`"six" in {"one":1, "two":2}` -> _false_
|
[blue]`"six" in {"one":1, "two":2}` -> _false_
|
||||||
|
| [blue]`#` | _Size_ | Number of items in a dict | [blue]`#{1:"a",2:"b",3:"c"}` -> _3_
|
||||||
|===
|
|===
|
||||||
|
|
||||||
.Examples
|
.Examples
|
||||||
@@ -533,6 +560,9 @@ _non-empty-dict_ = "**{**" _key-scalar_ "**:**" _any-value_ {"**,**" _key-scalar
|
|||||||
`>>>` [blue]`d={"one":1, "two":2}; d["six"]=6; d` +
|
`>>>` [blue]`d={"one":1, "two":2}; d["six"]=6; d` +
|
||||||
[green]`{"two": 2, "one": 1, "six": 6}`
|
[green]`{"two": 2, "one": 1, "six": 6}`
|
||||||
|
|
||||||
|
`>>>` [blue]`#d` +
|
||||||
|
[green]`3`
|
||||||
|
|
||||||
|
|
||||||
== Variables
|
== Variables
|
||||||
_Expr_, like most programming languages, supports variables. A variable is an identifier with an assigned value. Variables are stored in _contexts_.
|
_Expr_, like most programming languages, supports variables. A variable is an identifier with an assigned value. Variables are stored in _contexts_.
|
||||||
@@ -556,7 +586,7 @@ NOTE: The assign operator [blue]`=` returns the value assigned to the variable.
|
|||||||
`>>>` [blue]`a_b` +
|
`>>>` [blue]`a_b` +
|
||||||
[green]`3`
|
[green]`3`
|
||||||
|
|
||||||
`>>>` [blue]`x = 5.2 * (9-3)` [gray]_// The assigned value has the typical approximation error of the float data-type_ +
|
`>>>` [blue]`x = 5.2 * (9-3)` [gray]_// The assigned value here has the typical approximation error of the float data-type_ +
|
||||||
[green]`31.200000000000003`
|
[green]`31.200000000000003`
|
||||||
|
|
||||||
`>>>` [blue]`x = 1; y = 2*x` +
|
`>>>` [blue]`x = 1; y = 2*x` +
|
||||||
@@ -664,8 +694,8 @@ The [blue]`:` symbol (colon) is the separator of the selector-cases. Note that i
|
|||||||
[red]`Eval Error: [1:3] no case catches the value (10) of the selection expression`
|
[red]`Eval Error: [1:3] no case catches the value (10) of the selection expression`
|
||||||
|
|
||||||
|
|
||||||
=== Variable default value [blue]`??` and [blue]`?=`
|
=== Variable default value [blue]`??`, [blue]`?=`, and [blue]`?!`
|
||||||
The left operand of these two operators must be a variable. The right operator can be any expression. They return the value of the variable if this is defined; otherwise they return the value of the right expression.
|
The left operand of first two operators, [blue]`??` and [blue]`?=`, must be a variable. The right operator can be any expression. They return the value of the variable if this is defined; otherwise they return the value of the right expression.
|
||||||
|
|
||||||
IMPORTANT: If the left variable is defined, the right expression is not evaluated at all.
|
IMPORTANT: If the left variable is defined, the right expression is not evaluated at all.
|
||||||
|
|
||||||
@@ -673,6 +703,10 @@ The [blue]`??` operator do not change the status of the left variable.
|
|||||||
|
|
||||||
The [blue]`?=` assigns the calculated value of the right expression to the left variable.
|
The [blue]`?=` assigns the calculated value of the right expression to the left variable.
|
||||||
|
|
||||||
|
The third one, [blue]`?!`, is the alternate operator. If the variable on the left size is not defined, it returns [blue]_nil_. Otherwise it returns the result of the expressione on the right side.
|
||||||
|
|
||||||
|
IMPORTANT: If the left variable is NOT defined, the right expression is not evaluated at all.
|
||||||
|
|
||||||
.Examples
|
.Examples
|
||||||
`>>>` [blue]`var ?? (1+2)` +
|
`>>>` [blue]`var ?? (1+2)` +
|
||||||
[green]`3`
|
[green]`3`
|
||||||
@@ -686,6 +720,15 @@ The [blue]`?=` assigns the calculated value of the right expression to the left
|
|||||||
`>>>` [blue]`var` +
|
`>>>` [blue]`var` +
|
||||||
[green]`3`
|
[green]`3`
|
||||||
|
|
||||||
|
`>>>` [blue]`x ?! 5` +
|
||||||
|
[green]`nil`
|
||||||
|
|
||||||
|
`>>>` [blue]`x=1; x ?! 5` +
|
||||||
|
[green]`5`
|
||||||
|
|
||||||
|
`>>>` [blue]`y ?! (c=5); c` +
|
||||||
|
[red]`Eval Error: undefined variable or function "c"`
|
||||||
|
|
||||||
NOTE: These operators have a high priority, in particular higher than the operator [blue]`=`.
|
NOTE: These operators have a high priority, in particular higher than the operator [blue]`=`.
|
||||||
|
|
||||||
== Priorities of operators
|
== Priorities of operators
|
||||||
@@ -700,9 +743,10 @@ The table below shows all supported operators by decreasing priorities.
|
|||||||
| [blue]`[`...`]` | _Postfix_ | _Dict item_ | _dict_ `[` _any_ `]` -> _any_
|
| [blue]`[`...`]` | _Postfix_ | _Dict item_ | _dict_ `[` _any_ `]` -> _any_
|
||||||
.2+|*INC*| [blue]`++` | _Postfix_ | _Post increment_| _integer-variable_ `++` -> _integer_
|
.2+|*INC*| [blue]`++` | _Postfix_ | _Post increment_| _integer-variable_ `++` -> _integer_
|
||||||
| [blue]`++` | _Postfix_ | _Next item_ | _iterator_ `++` -> _any_
|
| [blue]`++` | _Postfix_ | _Next item_ | _iterator_ `++` -> _any_
|
||||||
.2+|*DEFAULT*| [blue]`??` | _Infix_ | _Default value_| _variable_ `??` _any-expr_ -> _any_
|
.3+|*DEFAULT*| [blue]`??` | _Infix_ | _Default value_| _variable_ `??` _any-expr_ -> _any_
|
||||||
| [blue]`?=` | _Infix_ | _Default/assign value_| _variable_ `?=` _any-expr_ -> _any_
|
| [blue]`?=` | _Infix_ | _Default/assign value_| _variable_ `?=` _any-expr_ -> _any_
|
||||||
.1+| *ITER*^1^| [blue]`()` | _Prefix_ | _Iterator value_ | `()` _iterator_ -> _any_
|
| [blue]`?!` | _Infix_ | _Alternate value_| _variable_ `?!` _any-expr_ -> _any_
|
||||||
|
//.1+| *ITER*^1^| [blue]`()` | _Prefix_ | _Iterator value_ | `()` _iterator_ -> _any_
|
||||||
.1+|*FACT*| [blue]`!` | _Postfix_ | _Factorial_| _integer_ `!` -> _integer_
|
.1+|*FACT*| [blue]`!` | _Postfix_ | _Factorial_| _integer_ `!` -> _integer_
|
||||||
.3+|*SIGN*| [blue]`+`, [blue]`-` | _Prefix_ | _Change-sign_| (`+`\|`-`) _number_ -> _number_
|
.3+|*SIGN*| [blue]`+`, [blue]`-` | _Prefix_ | _Change-sign_| (`+`\|`-`) _number_ -> _number_
|
||||||
| [blue]`#` | _Prefix_ | _Lenght-of_ | `#` _collection_ -> _integer_
|
| [blue]`#` | _Prefix_ | _Lenght-of_ | `#` _collection_ -> _integer_
|
||||||
@@ -741,7 +785,7 @@ The table below shows all supported operators by decreasing priorities.
|
|||||||
.1+|*RANGE*| [blue]`:` | _Infix_ | _Index-range_ | _integer_ `:` _integer_ -> _integer-pair_
|
.1+|*RANGE*| [blue]`:` | _Infix_ | _Index-range_ | _integer_ `:` _integer_ -> _integer-pair_
|
||||||
|===
|
|===
|
||||||
|
|
||||||
^1^ Experimental
|
//^1^ Experimental
|
||||||
|
|
||||||
|
|
||||||
== Functions
|
== Functions
|
||||||
@@ -752,25 +796,122 @@ Functions in _Expr_ are very similar to functions available in many programming
|
|||||||
|
|
||||||
|
|
||||||
=== _Expr_ function definition
|
=== _Expr_ function definition
|
||||||
A function is identified and referenced by its name. It can have zero or more parameter. _Expr_ functions also support optional parameters.
|
A function is identified and referenced by its name. It can have zero or more parameter. _Expr_ functions also support optional parameters and passing paramters by name.
|
||||||
|
|
||||||
.Expr's function definition syntax
|
.Expr's function definition syntax
|
||||||
====
|
====
|
||||||
*_function-definition_* = _identifier_ "**=**" "**func(**" [_param-list_] "**)**" "**{**" _multi-expression_ "**}**" +
|
*_function-definition_* = _identifier_ "**=**" "**func(**" [_formal-param-list_] "**)**" "**{**" _multi-expression_ "**}**" +
|
||||||
_param_list_ = _required-param-list_ [ "**,**" _optional-param-list_ ] +
|
_formal-param_list_ = _required-param-list_ [ "**,**" _optional-param-list_ ] +
|
||||||
_required-param-list_ = _identifier_ { "**,**" _identifier_ } +
|
_required-param-list_ = _identifier_ { "**,**" _identifier_ } +
|
||||||
_optional-param-list_ = _optional-parm_ { "**,**" _optional-param_ } +
|
_optional-param-list_ = _optional-parm_ { "**,**" _optional-param_ } +
|
||||||
_optional-param_ = _identifier_ "**=**" _any-expr_
|
_optional-param_ = _param-name_ "**=**" _any-expr_ +
|
||||||
|
_param-name_ = _identifier_
|
||||||
====
|
====
|
||||||
|
|
||||||
.Examples
|
.Examples
|
||||||
#TODO#
|
`>>>` [gray]_// A simple function: it takes two parameters and returns their "sum"_**^(*)^** +
|
||||||
|
`>>>` [blue]`sum = func(a, b){ a + b }` +
|
||||||
|
[green]`sum(a, b):any{}`
|
||||||
|
|
||||||
|
^(\*)^ Since the plus, *+*, operator is defined for multiple data-types, the _sum()_ function can be used for any pair of that types.
|
||||||
|
|
||||||
|
`>>>` [gray]_// A more complex example: recursive calculation of the n-th value of Fibonacci's sequence_ +
|
||||||
|
`>>>` [blue]`fib = func(n){ n ? [0] {0}: [1] {1} :: {fib(n-1)+fib(n-2)} }` +
|
||||||
|
[green]`fib(n):any{}`
|
||||||
|
|
||||||
|
|
||||||
|
`>>>` [gray]_// Same function fib() but entered by splitting it over mulple text lines_ +
|
||||||
|
`>>>` [blue]`fib = func(n){ \` +
|
||||||
|
`\...` [blue]`{nbsp}{nbsp}n ? \` +
|
||||||
|
`\...` [blue]`{nbsp}{nbsp}{nbsp}{nbsp}[0] {0} : \` +
|
||||||
|
`\...` [blue]`{nbsp}{nbsp}{nbsp}{nbsp}[1] {1} :: \` +
|
||||||
|
`\...` [blue]`{nbsp}{nbsp}{nbsp}{nbsp}{ \` +
|
||||||
|
`\...` [blue]`{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}fib(n-1) + fib(n-2) \` +
|
||||||
|
`\...` [blue]`{nbsp}{nbsp}{nbsp}{nbsp}} \` +
|
||||||
|
`\...` [blue]`}` +
|
||||||
|
[green]`fib(n):any{}`
|
||||||
|
|
||||||
|
`>>>` [gray]_// Required and optional parameters_ +
|
||||||
|
`>>>` [blue]`measure = func(value, unit="meter"){ value + " " + unit + (value > 1) ? [true] {"s"} :: {""}}` +
|
||||||
|
[green]`measure(value, unit="meter"):any{}`
|
||||||
|
|
||||||
|
|
||||||
=== _Golang_ function definition
|
=== _Golang_ function definition
|
||||||
Description of how to define Golan functions and how to bind them to _Expr_ are topics treated in another document that I'll write, one day, maybe.
|
Description of how to define Golan functions and how to bind them to _Expr_ are topics treated in another document that I'll write, one day, maybe.
|
||||||
|
|
||||||
=== Function calls
|
=== Function calls
|
||||||
#TODO: function calls operations#
|
To call a function, either Expr or Golang type, it is necessary to specify its name and, at least, its required parameters.
|
||||||
|
|
||||||
|
.Function invocation syntax
|
||||||
|
====
|
||||||
|
*_function-call_* = _identifier_ "**(**" _actual-param-list_ "**)**" +
|
||||||
|
_actual-param-list_ = [_positional-params_] [_named-parameters_] +
|
||||||
|
_positional-params_ = _any-value_ { "*,*" _any-value_ } +
|
||||||
|
_named-params_ = _param-name_ "**=**" _any-value_ { "*,*" _param-name_ "**=**" _any-value_ } +
|
||||||
|
_param-name_ = _identifier_
|
||||||
|
====
|
||||||
|
|
||||||
|
.Examples of calling the `sum()` functions defined above
|
||||||
|
`>>>` [gray]_// sum of two integers_ +
|
||||||
|
`>>>` [blue]`sum(-6, 2)` +
|
||||||
|
[green]`-4` +
|
||||||
|
`>>>` [gray]_// same as above but passing the parameters by name_ +
|
||||||
|
`>>>` [blue]`sum(a=-6, b=2)` +
|
||||||
|
[green]`-4` +
|
||||||
|
`>>>` [gray]_// again, but swapping parameter positions (see the diff() examples below)_ +
|
||||||
|
`>>>` [blue]`sum(b=2, a=-6)` +
|
||||||
|
[green]`-4` +
|
||||||
|
`>>>` [gray]_// sum of a fraction and an integer_ +
|
||||||
|
`>>>` [blue]`sum(3|2, 2)` +
|
||||||
|
[green]`7|2` +
|
||||||
|
`>>>` [gray]_// sum of two strings_ +
|
||||||
|
`>>>` [blue]`sum("bye", "-bye")` +
|
||||||
|
[green]`"bye-bye"` +
|
||||||
|
`>>>` [gray]_// sum of two lists_ +
|
||||||
|
`>>>` [blue]`sum(["one", 1], ["two", 2])` +
|
||||||
|
[green]`["one", 1, "two", 2]`
|
||||||
|
|
||||||
|
.Examples of calling a function with parameters passed by name
|
||||||
|
`>>>` [gray]_// diff(a,b) calculates a-b_ +
|
||||||
|
`>>>` [blue]`diff = func(a,b){a-b}` +
|
||||||
|
[green]`diff(a, b):any{}` +
|
||||||
|
`>>>` [gray]_// simple invocation_ +
|
||||||
|
`>>>` [blue]`diff(10,8)` +
|
||||||
|
[green]`2` +
|
||||||
|
`>>>` [gray]_// swapped parameters passed by name_ +
|
||||||
|
`>>>` [blue]`diff(b=8,a=10)` +
|
||||||
|
[green]`2`
|
||||||
|
|
||||||
|
.Examples of calling the `fib()` function defined above
|
||||||
|
`>>>` [gray]_// Fibonacci sequence: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ..._ +
|
||||||
|
`>>>` [blue]`fib(6)` +
|
||||||
|
[green]`8` +
|
||||||
|
`>>>` [blue]`fib(9)` +
|
||||||
|
[green]`34`
|
||||||
|
|
||||||
|
.Examples of calling the `measure()` functions defined above
|
||||||
|
`>>>` [gray]_// simple call_ +
|
||||||
|
`>>>` [blue]`measure(10,"litre")` +
|
||||||
|
[green]`"10 litres"` +
|
||||||
|
`>>>` [gray]_// accept the default unit_ +
|
||||||
|
`>>>` [blue]`measure(8)` +
|
||||||
|
[green]`"8 meters"` +
|
||||||
|
`>>>` [gray]_// without the required parameter 'value'_ +
|
||||||
|
`>>>` [blue]`measure(unit="degrees"))` +
|
||||||
|
[red]`Eval Error: measure(): missing params -- value`
|
||||||
|
|
||||||
|
.Examples of context binding (closures)
|
||||||
|
`>>>` [blue]`factory = func(n=2){ func(x){x*n} }` +
|
||||||
|
[green]`factory(n=2):any{}` +
|
||||||
|
`>>>` [blue]`double = factory()` +
|
||||||
|
[green]`double(x):any{}` +
|
||||||
|
`>>>` [blue]`triple = factory(3)` +
|
||||||
|
[green]`triple(x):any{}` +
|
||||||
|
`>>>` [blue]`double(5)` +
|
||||||
|
[green]`10` +
|
||||||
|
`>>>` [blue]`triple(5)` +
|
||||||
|
[green]`15`
|
||||||
|
|
||||||
|
|
||||||
Functions compute values in a local context (scope) that do not make effects on the calling context. This is the normal behavior. Using the reference operator [blue]`@` it is possibile to export local definition to the calling context.
|
Functions compute values in a local context (scope) that do not make effects on the calling context. This is the normal behavior. Using the reference operator [blue]`@` it is possibile to export local definition to the calling context.
|
||||||
|
|
||||||
|
|||||||
+224
-47
@@ -567,7 +567,7 @@ pre.rouge .ss {
|
|||||||
<li><a href="#_but_operator">4.2. <code class="blue">but</code> operator</a></li>
|
<li><a href="#_but_operator">4.2. <code class="blue">but</code> operator</a></li>
|
||||||
<li><a href="#_assignment_operator">4.3. Assignment operator <code class="blue">=</code></a></li>
|
<li><a href="#_assignment_operator">4.3. Assignment operator <code class="blue">=</code></a></li>
|
||||||
<li><a href="#_selector_operator">4.4. Selector operator <code class="blue">? : ::</code></a></li>
|
<li><a href="#_selector_operator">4.4. Selector operator <code class="blue">? : ::</code></a></li>
|
||||||
<li><a href="#_variable_default_value_and">4.5. Variable default value <code class="blue">??</code> and <code class="blue">?=</code></a></li>
|
<li><a href="#_variable_default_value_and">4.5. Variable default value <code class="blue">??</code>, <code class="blue">?=</code>, and <code class="blue">?!</code></a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<li><a href="#_priorities_of_operators">5. Priorities of operators</a></li>
|
<li><a href="#_priorities_of_operators">5. Priorities of operators</a></li>
|
||||||
@@ -687,20 +687,20 @@ pre.rouge .ss {
|
|||||||
<pre class="rouge highlight"><code data-lang="shell"><span class="c"># Type 'exit' or Ctrl+D to quit the program.</span>
|
<pre class="rouge highlight"><code data-lang="shell"><span class="c"># Type 'exit' or Ctrl+D to quit the program.</span>
|
||||||
|
|
||||||
<span class="o">[</span>user]<span class="nv">$ </span>./dev-expr
|
<span class="o">[</span>user]<span class="nv">$ </span>./dev-expr
|
||||||
dev-expr <span class="nt">--</span> Expressions calculator v1.10.0<span class="o">(</span>build 14<span class="o">)</span>,2024/06/17 <span class="o">(</span>celestino.amoroso@portale-stac.it<span class="o">)</span>
|
dev-expr <span class="nt">--</span> Expressions calculator v1.12.0<span class="o">(</span>build 1<span class="o">)</span>,2024/09/14 <span class="o">(</span>celestino.amoroso@portale-stac.it<span class="o">)</span>
|
||||||
Based on the Expr package v0.19.0
|
Based on the Expr package v0.26.0
|
||||||
Type <span class="nb">help </span>to get the list of available commands
|
Type <span class="nb">help </span>to get the list of available commands
|
||||||
See also https://git.portale-stac.it/go-pkg/expr/src/branch/main/README.adoc
|
See also https://git.portale-stac.it/go-pkg/expr/src/branch/main/README.adoc
|
||||||
<span class="o">>>></span> <span class="nb">help</span>
|
<span class="o">>>></span> <span class="nb">help</span>
|
||||||
<span class="nt">---</span> REPL commands:
|
<span class="nt">---</span> REPL commands:
|
||||||
<span class="nb">source</span> <span class="nt">--</span> Load a file as input
|
|
||||||
<span class="nb">tty</span> <span class="nt">--</span> Enable/Disable ansi output <i class="conum" data-value="1"></i><b>(1)</b>
|
|
||||||
base <span class="nt">--</span> Set the integer output base: 2, 8, 10, or 16
|
base <span class="nt">--</span> Set the integer output base: 2, 8, 10, or 16
|
||||||
<span class="nb">exit</span> <span class="nt">--</span> Exit the program
|
<span class="nb">exit</span> <span class="nt">--</span> Exit the program
|
||||||
<span class="nb">help</span> <span class="nt">--</span> Show <span class="nb">command </span>list
|
<span class="nb">help</span> <span class="nt">--</span> Show <span class="nb">command </span>list
|
||||||
ml <span class="nt">--</span> Enable/Disable multi-line output
|
ml <span class="nt">--</span> Enable/Disable multi-line output
|
||||||
mods <span class="nt">--</span> List <span class="nb">builtin </span>modules
|
mods <span class="nt">--</span> List <span class="nb">builtin </span>modules
|
||||||
output <span class="nt">--</span> Enable/Disable printing expression results. Options <span class="s1">'on'</span>, <span class="s1">'off'</span>, <span class="s1">'status'</span>
|
output <span class="nt">--</span> Enable/Disable printing expression results. Options <span class="s1">'on'</span>, <span class="s1">'off'</span>, <span class="s1">'status'</span>
|
||||||
|
<span class="nb">source</span> <span class="nt">--</span> Load a file as input
|
||||||
|
<span class="nb">tty</span> <span class="nt">--</span> Enable/Disable ansi output <i class="conum" data-value="1"></i><b>(1)</b>
|
||||||
|
|
||||||
<span class="nt">---</span> Command line options:
|
<span class="nt">---</span> Command line options:
|
||||||
<span class="nt">-b</span> <<span class="nb">builtin</span><span class="o">></span> Import <span class="nb">builtin </span>modules.
|
<span class="nt">-b</span> <<span class="nb">builtin</span><span class="o">></span> Import <span class="nb">builtin </span>modules.
|
||||||
@@ -805,12 +805,12 @@ dev-expr <span class="nt">--</span> Expressions calculator v1.10.0<span class="o
|
|||||||
<p><span class="blue">Floats</span></p>
|
<p><span class="blue">Floats</span></p>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<p><span class="blue">Factions</span></p>
|
<p><span class="blue">Fractions</span></p>
|
||||||
</li>
|
</li>
|
||||||
</ol>
|
</ol>
|
||||||
</div>
|
</div>
|
||||||
<div class="paragraph">
|
<div class="paragraph">
|
||||||
<p>In mixed operations involving integers, fractions and floats, automatic type promotion to the largest type take place.</p>
|
<p>In mixed operations involving integers, fractions and floats, automatic type promotion to the largest type is performed.</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="sect3">
|
<div class="sect3">
|
||||||
<h4 id="_integers"><a class="anchor" href="#_integers"></a><a class="link" href="#_integers">2.1.1. Integers</a></h4>
|
<h4 id="_integers"><a class="anchor" href="#_integers"></a><a class="link" href="#_integers">2.1.1. Integers</a></h4>
|
||||||
@@ -855,33 +855,33 @@ dev-expr <span class="nt">--</span> Expressions calculator v1.10.0<span class="o
|
|||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td class="tableblock halign-center valign-top"><p class="tableblock"><code class="blue">+</code></p></td>
|
<td class="tableblock halign-center valign-top"><p class="tableblock"><code class="blue">+</code></p></td>
|
||||||
<td class="tableblock halign-center valign-top"><p class="tableblock"><em>sum</em></p></td>
|
<td class="tableblock halign-center valign-top"><p class="tableblock"><em>Sum</em></p></td>
|
||||||
<td class="tableblock halign-left valign-top"><p class="tableblock">Add two values</p></td>
|
<td class="tableblock halign-left valign-top"><p class="tableblock">Add two values</p></td>
|
||||||
<td class="tableblock halign-left valign-top"><p class="tableblock"><code class="blue">-1 + 2</code> → 1</p></td>
|
<td class="tableblock halign-left valign-top"><p class="tableblock"><code class="blue">-1 + 2</code> → <em>1</em></p></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td class="tableblock halign-center valign-top"><p class="tableblock"><code class="blue">-</code></p></td>
|
<td class="tableblock halign-center valign-top"><p class="tableblock"><code class="blue">-</code></p></td>
|
||||||
<td class="tableblock halign-center valign-top"><p class="tableblock"><em>subtraction</em></p></td>
|
<td class="tableblock halign-center valign-top"><p class="tableblock"><em>Subtraction</em></p></td>
|
||||||
<td class="tableblock halign-left valign-top"><p class="tableblock">Subtract the right value from the left one</p></td>
|
<td class="tableblock halign-left valign-top"><p class="tableblock">Subtract the right value from the left one</p></td>
|
||||||
<td class="tableblock halign-left valign-top"><p class="tableblock"><code class="blue">3 - 1</code> → 2</p></td>
|
<td class="tableblock halign-left valign-top"><p class="tableblock"><code class="blue">3 - 1</code> → <em>2</em></p></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td class="tableblock halign-center valign-top"><p class="tableblock"><code class="blue">*</code></p></td>
|
<td class="tableblock halign-center valign-top"><p class="tableblock"><code class="blue">*</code></p></td>
|
||||||
<td class="tableblock halign-center valign-top"><p class="tableblock"><em>product</em></p></td>
|
<td class="tableblock halign-center valign-top"><p class="tableblock"><em>Product</em></p></td>
|
||||||
<td class="tableblock halign-left valign-top"><p class="tableblock">Multiply two values</p></td>
|
<td class="tableblock halign-left valign-top"><p class="tableblock">Multiply two values</p></td>
|
||||||
<td class="tableblock halign-left valign-top"><p class="tableblock"><code class="blue">-1 * 2</code> → -2</p></td>
|
<td class="tableblock halign-left valign-top"><p class="tableblock"><code class="blue">-1 * 2</code> → <em>-2</em></p></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td class="tableblock halign-center valign-top"><p class="tableblock"><code class="blue">/</code></p></td>
|
<td class="tableblock halign-center valign-top"><p class="tableblock"><code class="blue">/</code></p></td>
|
||||||
<td class="tableblock halign-center valign-top"><p class="tableblock"><em>Division</em></p></td>
|
<td class="tableblock halign-center valign-top"><p class="tableblock"><em>Integer division</em></p></td>
|
||||||
<td class="tableblock halign-left valign-top"><p class="tableblock">Divide the left value by the right one<sup>(*)</sup></p></td>
|
<td class="tableblock halign-left valign-top"><p class="tableblock">Divide the left value by the right one<sup>(*)</sup></p></td>
|
||||||
<td class="tableblock halign-left valign-top"><p class="tableblock"><code class="blue">-10 / 2</code> → 5</p></td>
|
<td class="tableblock halign-left valign-top"><p class="tableblock"><code class="blue">-11 / 2</code> → <em>-5</em></p></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td class="tableblock halign-center valign-top"><p class="tableblock"><code class="blue">%</code></p></td>
|
<td class="tableblock halign-center valign-top"><p class="tableblock"><code class="blue">%</code></p></td>
|
||||||
<td class="tableblock halign-center valign-top"><p class="tableblock"><em>Modulo</em></p></td>
|
<td class="tableblock halign-center valign-top"><p class="tableblock"><em>Modulo</em></p></td>
|
||||||
<td class="tableblock halign-left valign-top"><p class="tableblock">Remainder of the integer division</p></td>
|
<td class="tableblock halign-left valign-top"><p class="tableblock">Remainder of the integer division</p></td>
|
||||||
<td class="tableblock halign-left valign-top"><p class="tableblock"><code class="blue">5 % 2</code> → 1</p></td>
|
<td class="tableblock halign-left valign-top"><p class="tableblock"><code class="blue">5 % 2</code> → <em>1</em></p></td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
@@ -946,31 +946,31 @@ dev-expr <span class="nt">--</span> Expressions calculator v1.10.0<span class="o
|
|||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td class="tableblock halign-center valign-top"><p class="tableblock"><code class="blue">+</code></p></td>
|
<td class="tableblock halign-center valign-top"><p class="tableblock"><code class="blue">+</code></p></td>
|
||||||
<td class="tableblock halign-center valign-top"><p class="tableblock"><em>sum</em></p></td>
|
<td class="tableblock halign-center valign-top"><p class="tableblock"><em>Sum</em></p></td>
|
||||||
<td class="tableblock halign-left valign-top"><p class="tableblock">Add two values</p></td>
|
<td class="tableblock halign-left valign-top"><p class="tableblock">Add two values</p></td>
|
||||||
<td class="tableblock halign-left valign-top"><p class="tableblock"><code class="blue">4 + 0.5</code> → 4.5</p></td>
|
<td class="tableblock halign-left valign-top"><p class="tableblock"><code class="blue">4 + 0.5</code> → 4.5</p></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td class="tableblock halign-center valign-top"><p class="tableblock"><code class="blue">-</code></p></td>
|
<td class="tableblock halign-center valign-top"><p class="tableblock"><code class="blue">-</code></p></td>
|
||||||
<td class="tableblock halign-center valign-top"><p class="tableblock"><em>subtraction</em></p></td>
|
<td class="tableblock halign-center valign-top"><p class="tableblock"><em>Subtraction</em></p></td>
|
||||||
<td class="tableblock halign-left valign-top"><p class="tableblock">Subtract the right value from the left one</p></td>
|
<td class="tableblock halign-left valign-top"><p class="tableblock">Subtract the right value from the left one</p></td>
|
||||||
<td class="tableblock halign-left valign-top"><p class="tableblock"><code class="blue">4 - 0.5</code> → 3.5</p></td>
|
<td class="tableblock halign-left valign-top"><p class="tableblock"><code class="blue">4 - 0.5</code> → 3.5</p></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td class="tableblock halign-center valign-top"><p class="tableblock"><code class="blue">*</code></p></td>
|
<td class="tableblock halign-center valign-top"><p class="tableblock"><code class="blue">*</code></p></td>
|
||||||
<td class="tableblock halign-center valign-top"><p class="tableblock"><em>product</em></p></td>
|
<td class="tableblock halign-center valign-top"><p class="tableblock"><em>Product</em></p></td>
|
||||||
<td class="tableblock halign-left valign-top"><p class="tableblock">Multiply two values</p></td>
|
<td class="tableblock halign-left valign-top"><p class="tableblock">Multiply two values</p></td>
|
||||||
<td class="tableblock halign-left valign-top"><p class="tableblock"><code class="blue">4 * 0.5</code> → 2.0</p></td>
|
<td class="tableblock halign-left valign-top"><p class="tableblock"><code class="blue">4 * 0.5</code> → 2.0</p></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td class="tableblock halign-center valign-top"><p class="tableblock"><code class="blue">/</code></p></td>
|
<td class="tableblock halign-center valign-top"><p class="tableblock"><code class="blue">/</code></p></td>
|
||||||
<td class="tableblock halign-center valign-top"><p class="tableblock"><em>Division</em></p></td>
|
<td class="tableblock halign-center valign-top"><p class="tableblock"><em>Float division</em></p></td>
|
||||||
<td class="tableblock halign-left valign-top"><p class="tableblock">Divide the left value by the right one</p></td>
|
<td class="tableblock halign-left valign-top"><p class="tableblock">Divide the left value by the right one</p></td>
|
||||||
<td class="tableblock halign-left valign-top"><p class="tableblock"><code class="blue">1.0 / 2</code> → 0.5</p></td>
|
<td class="tableblock halign-left valign-top"><p class="tableblock"><code class="blue">1.0 / 2</code> → 0.5</p></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td class="tableblock halign-center valign-top"><p class="tableblock"><code class="blue">./</code></p></td>
|
<td class="tableblock halign-center valign-top"><p class="tableblock"><code class="blue">./</code></p></td>
|
||||||
<td class="tableblock halign-center valign-top"><p class="tableblock"><em>Float division</em></p></td>
|
<td class="tableblock halign-center valign-top"><p class="tableblock"><em>Forced float division</em></p></td>
|
||||||
<td class="tableblock halign-left valign-top"><p class="tableblock">Force float division</p></td>
|
<td class="tableblock halign-left valign-top"><p class="tableblock">Force float division</p></td>
|
||||||
<td class="tableblock halign-left valign-top"><p class="tableblock"><code class="blue">-1 ./ 2</code> → -0.5</p></td>
|
<td class="tableblock halign-left valign-top"><p class="tableblock"><code class="blue">-1 ./ 2</code> → -0.5</p></td>
|
||||||
</tr>
|
</tr>
|
||||||
@@ -1074,7 +1074,7 @@ dev-expr <span class="nt">--</span> Expressions calculator v1.10.0<span class="o
|
|||||||
<code class="green">123    abc</code></p>
|
<code class="green">123    abc</code></p>
|
||||||
</div>
|
</div>
|
||||||
<div class="paragraph">
|
<div class="paragraph">
|
||||||
<p>Some arithmetic operators can also be used with strings.</p>
|
<p>Some arithmetic operators also apply to strings.</p>
|
||||||
</div>
|
</div>
|
||||||
<table class="tableblock frame-all grid-all stretch">
|
<table class="tableblock frame-all grid-all stretch">
|
||||||
<caption class="title">Table 3. String operators</caption>
|
<caption class="title">Table 3. String operators</caption>
|
||||||
@@ -1393,6 +1393,12 @@ dev-expr <span class="nt">--</span> Expressions calculator v1.10.0<span class="o
|
|||||||
<td class="tableblock halign-left valign-top"><p class="tableblock"><code class="blue">2 in [1,2,3]</code> → <em>true</em><br>
|
<td class="tableblock halign-left valign-top"><p class="tableblock"><code class="blue">2 in [1,2,3]</code> → <em>true</em><br>
|
||||||
<code class="blue">6 in [1,2,3]</code> → <em>false</em></p></td>
|
<code class="blue">6 in [1,2,3]</code> → <em>false</em></p></td>
|
||||||
</tr>
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td class="tableblock halign-center valign-top"><p class="tableblock"><code class="blue">#</code></p></td>
|
||||||
|
<td class="tableblock halign-center valign-top"><p class="tableblock"><em>Size</em></p></td>
|
||||||
|
<td class="tableblock halign-left valign-top"><p class="tableblock">Number of items in a list</p></td>
|
||||||
|
<td class="tableblock halign-left valign-top"><p class="tableblock"><code class="blue">#[1,2,3]</code> → <em>3</em></p></td>
|
||||||
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
<div class="paragraph">
|
<div class="paragraph">
|
||||||
@@ -1415,11 +1421,19 @@ dev-expr <span class="nt">--</span> Expressions calculator v1.10.0<span class="o
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="paragraph">
|
<div class="paragraph">
|
||||||
<div class="title">Items of list</div>
|
<div class="title">Examples: Getting items from lists</div>
|
||||||
<p><code>>>></code> <code class="blue">[1,2,3][1]</code><br>
|
<p><code>>>></code> <code class="blue">[1,2,3][1]</code><br>
|
||||||
<code class="green">2</code></p>
|
<code class="green">2</code></p>
|
||||||
</div>
|
</div>
|
||||||
<div class="paragraph">
|
<div class="paragraph">
|
||||||
|
<p><code>>>></code> <code class="blue">index=2; ["a", "b", "c", "d"][index]</code><br>
|
||||||
|
<code class="green">c</code></p>
|
||||||
|
</div>
|
||||||
|
<div class="paragraph">
|
||||||
|
<p><code>>>></code> <code class="blue">["a", "b", "c", "d"][2:]</code><br>
|
||||||
|
<code class="green">["c", "d"]</code></p>
|
||||||
|
</div>
|
||||||
|
<div class="paragraph">
|
||||||
<p><code>>>></code> <code class="blue">list=[1,2,3]; list[1]</code><br>
|
<p><code>>>></code> <code class="blue">list=[1,2,3]; list[1]</code><br>
|
||||||
<code class="green">2</code></p>
|
<code class="green">2</code></p>
|
||||||
</div>
|
</div>
|
||||||
@@ -1432,6 +1446,10 @@ dev-expr <span class="nt">--</span> Expressions calculator v1.10.0<span class="o
|
|||||||
<code class="green">two</code></p>
|
<code class="green">two</code></p>
|
||||||
</div>
|
</div>
|
||||||
<div class="paragraph">
|
<div class="paragraph">
|
||||||
|
<p><code>>>></code> <code class="blue">list[1]="six"; list</code><br>
|
||||||
|
<code class="green">["one", "six", "three"]</code></p>
|
||||||
|
</div>
|
||||||
|
<div class="paragraph">
|
||||||
<p><code>>>></code> <code class="blue">list[-1]</code><br>
|
<p><code>>>></code> <code class="blue">list[-1]</code><br>
|
||||||
<code class="green">three</code></p>
|
<code class="green">three</code></p>
|
||||||
</div>
|
</div>
|
||||||
@@ -1440,22 +1458,42 @@ dev-expr <span class="nt">--</span> Expressions calculator v1.10.0<span class="o
|
|||||||
<code class="red">Eval Error: [1:9] index 10 out of bounds</code></p>
|
<code class="red">Eval Error: [1:9] index 10 out of bounds</code></p>
|
||||||
</div>
|
</div>
|
||||||
<div class="paragraph">
|
<div class="paragraph">
|
||||||
|
<div class="title">Example: Number of elements in a list</div>
|
||||||
<p><code>>>></code> <code class="blue">#list</code><br>
|
<p><code>>>></code> <code class="blue">#list</code><br>
|
||||||
<code class="green">3</code></p>
|
<code class="green">3</code></p>
|
||||||
</div>
|
</div>
|
||||||
<div class="paragraph">
|
<div class="paragraph">
|
||||||
<p><code>>>></code> <code class="blue">index=2; ["a", "b", "c", "d"][index]</code><br>
|
<div class="title">Examples: Element insertion</div>
|
||||||
<code class="green">c</code></p>
|
<p><code>>>></code> <code class="blue">"first" >> list</code><br>
|
||||||
|
<code class="green">["first", "one", "six", "three"]</code></p>
|
||||||
</div>
|
</div>
|
||||||
<div class="paragraph">
|
<div class="paragraph">
|
||||||
<p><code>>>></code> <code class="blue">["a", "b", "c", "d"][2:]</code><br>
|
<p><code>>>></code> <code class="blue">list << "last"</code><br>
|
||||||
<code class="green">["c", "d"]</code></p>
|
<code class="green">["first", "one", "six", "three", "last"]</code></p>
|
||||||
|
</div>
|
||||||
|
<div class="paragraph">
|
||||||
|
<div class="title">Examples: Element in list</div>
|
||||||
|
<p><code>>>></code> <code class="blue">"six" in list</code><br>
|
||||||
|
<code class="green">true</code></p>
|
||||||
|
</div>
|
||||||
|
<div class="paragraph">
|
||||||
|
<p><code>>>></code> <code class="blue">"ten" in list</code><br>
|
||||||
|
<code class="green">false</code></p>
|
||||||
|
</div>
|
||||||
|
<div class="paragraph">
|
||||||
|
<div class="title">Examples: Concatenation and filtering</div>
|
||||||
|
<p><code>>>></code> <code class="blue">[1,2,3] + ["one", "two", "three"]</code><br>
|
||||||
|
<code class="green">[1, 2, 3, "one", "two", "three"]</code></p>
|
||||||
|
</div>
|
||||||
|
<div class="paragraph">
|
||||||
|
<p><code>>>></code> <code class="blue">[1,2,3,4] - [2,4]</code><br>
|
||||||
|
<code class="green">[1, 3]</code></p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="sect2">
|
<div class="sect2">
|
||||||
<h3 id="_dictionaries"><a class="anchor" href="#_dictionaries"></a><a class="link" href="#_dictionaries">2.5. Dictionaries</a></h3>
|
<h3 id="_dictionaries"><a class="anchor" href="#_dictionaries"></a><a class="link" href="#_dictionaries">2.5. Dictionaries</a></h3>
|
||||||
<div class="paragraph">
|
<div class="paragraph">
|
||||||
<p>The <em>dictionary</em>, or <em>dict</em>, data-type is set of pairs <em>key/value</em>. It is also known as <em>map</em> or <em>associative array</em>.</p>
|
<p>The <em>dictionary</em>, or <em>dict</em>, data-type represents sets of pairs <em>key/value</em>. It is also known as <em>map</em> or <em>associative array</em>.</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="paragraph">
|
<div class="paragraph">
|
||||||
<p>Dictionary literals are sequences of pairs separated by comma <code class="blue">,</code> enclosed between brace brackets.</p>
|
<p>Dictionary literals are sequences of pairs separated by comma <code class="blue">,</code> enclosed between brace brackets.</p>
|
||||||
@@ -1514,6 +1552,12 @@ dev-expr <span class="nt">--</span> Expressions calculator v1.10.0<span class="o
|
|||||||
<td class="tableblock halign-left valign-top"><p class="tableblock"><code class="blue">"one" in {"one":1, "two":2}</code> → <em>true</em><br>
|
<td class="tableblock halign-left valign-top"><p class="tableblock"><code class="blue">"one" in {"one":1, "two":2}</code> → <em>true</em><br>
|
||||||
<code class="blue">"six" in {"one":1, "two":2}</code> → <em>false</em></p></td>
|
<code class="blue">"six" in {"one":1, "two":2}</code> → <em>false</em></p></td>
|
||||||
</tr>
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td class="tableblock halign-center valign-top"><p class="tableblock"><code class="blue">#</code></p></td>
|
||||||
|
<td class="tableblock halign-center valign-top"><p class="tableblock"><em>Size</em></p></td>
|
||||||
|
<td class="tableblock halign-left valign-top"><p class="tableblock">Number of items in a dict</p></td>
|
||||||
|
<td class="tableblock halign-left valign-top"><p class="tableblock"><code class="blue">#{1:"a",2:"b",3:"c"}</code> → <em>3</em></p></td>
|
||||||
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
<div class="paragraph">
|
<div class="paragraph">
|
||||||
@@ -1537,6 +1581,10 @@ dev-expr <span class="nt">--</span> Expressions calculator v1.10.0<span class="o
|
|||||||
<p><code>>>></code> <code class="blue">d={"one":1, "two":2}; d["six"]=6; d</code><br>
|
<p><code>>>></code> <code class="blue">d={"one":1, "two":2}; d["six"]=6; d</code><br>
|
||||||
<code class="green">{"two": 2, "one": 1, "six": 6}</code></p>
|
<code class="green">{"two": 2, "one": 1, "six": 6}</code></p>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="paragraph">
|
||||||
|
<p><code>>>></code> <code class="blue">#d</code><br>
|
||||||
|
<code class="green">3</code></p>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -1582,7 +1630,7 @@ The assign operator <code class="blue">=</code> returns the value assigned to th
|
|||||||
<code class="green">3</code></p>
|
<code class="green">3</code></p>
|
||||||
</div>
|
</div>
|
||||||
<div class="paragraph">
|
<div class="paragraph">
|
||||||
<p><code>>>></code> <code class="blue">x = 5.2 * (9-3)</code> <em class="gray">// The assigned value has the typical approximation error of the float data-type</em><br>
|
<p><code>>>></code> <code class="blue">x = 5.2 * (9-3)</code> <em class="gray">// The assigned value here has the typical approximation error of the float data-type</em><br>
|
||||||
<code class="green">31.200000000000003</code></p>
|
<code class="green">31.200000000000003</code></p>
|
||||||
</div>
|
</div>
|
||||||
<div class="paragraph">
|
<div class="paragraph">
|
||||||
@@ -1751,9 +1799,9 @@ Technically <code class="blue">;</code> is not treated as a real operator. It ac
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="sect2">
|
<div class="sect2">
|
||||||
<h3 id="_variable_default_value_and"><a class="anchor" href="#_variable_default_value_and"></a><a class="link" href="#_variable_default_value_and">4.5. Variable default value <code class="blue">??</code> and <code class="blue">?=</code></a></h3>
|
<h3 id="_variable_default_value_and"><a class="anchor" href="#_variable_default_value_and"></a><a class="link" href="#_variable_default_value_and">4.5. Variable default value <code class="blue">??</code>, <code class="blue">?=</code>, and <code class="blue">?!</code></a></h3>
|
||||||
<div class="paragraph">
|
<div class="paragraph">
|
||||||
<p>The left operand of these two operators must be a variable. The right operator can be any expression. They return the value of the variable if this is defined; otherwise they return the value of the right expression.</p>
|
<p>The left operand of first two operators, <code class="blue">??</code> and <code class="blue">?=</code>, must be a variable. The right operator can be any expression. They return the value of the variable if this is defined; otherwise they return the value of the right expression.</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="admonitionblock important">
|
<div class="admonitionblock important">
|
||||||
<table>
|
<table>
|
||||||
@@ -1774,6 +1822,21 @@ If the left variable is defined, the right expression is not evaluated at all.
|
|||||||
<p>The <code class="blue">?=</code> assigns the calculated value of the right expression to the left variable.</p>
|
<p>The <code class="blue">?=</code> assigns the calculated value of the right expression to the left variable.</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="paragraph">
|
<div class="paragraph">
|
||||||
|
<p>The third one, <code class="blue">?!</code>, is the alternate operator. If the variable on the left size is not defined, it returns <em class="blue">nil</em>. Otherwise it returns the result of the expressione on the right side.</p>
|
||||||
|
</div>
|
||||||
|
<div class="admonitionblock important">
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<td class="icon">
|
||||||
|
<i class="fa icon-important" title="Important"></i>
|
||||||
|
</td>
|
||||||
|
<td class="content">
|
||||||
|
If the left variable is NOT defined, the right expression is not evaluated at all.
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
<div class="paragraph">
|
||||||
<div class="title">Examples</div>
|
<div class="title">Examples</div>
|
||||||
<p><code>>>></code> <code class="blue">var ?? (1+2)</code><br>
|
<p><code>>>></code> <code class="blue">var ?? (1+2)</code><br>
|
||||||
<code class="green">3</code></p>
|
<code class="green">3</code></p>
|
||||||
@@ -1790,6 +1853,18 @@ If the left variable is defined, the right expression is not evaluated at all.
|
|||||||
<p><code>>>></code> <code class="blue">var</code><br>
|
<p><code>>>></code> <code class="blue">var</code><br>
|
||||||
<code class="green">3</code></p>
|
<code class="green">3</code></p>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="paragraph">
|
||||||
|
<p><code>>>></code> <code class="blue">x ?! 5</code><br>
|
||||||
|
<code class="green">nil</code></p>
|
||||||
|
</div>
|
||||||
|
<div class="paragraph">
|
||||||
|
<p><code>>>></code> <code class="blue">x=1; x ?! 5</code><br>
|
||||||
|
<code class="green">5</code></p>
|
||||||
|
</div>
|
||||||
|
<div class="paragraph">
|
||||||
|
<p><code>>>></code> <code class="blue">y ?! (c=5); c</code><br>
|
||||||
|
<code class="red">Eval Error: undefined variable or function "c"</code></p>
|
||||||
|
</div>
|
||||||
<div class="admonitionblock note">
|
<div class="admonitionblock note">
|
||||||
<table>
|
<table>
|
||||||
<tr>
|
<tr>
|
||||||
@@ -1857,7 +1932,7 @@ These operators have a high priority, in particular higher than the operator <co
|
|||||||
<td class="tableblock halign-center valign-top"><p class="tableblock"><em>iterator</em> <code>++</code> → <em>any</em></p></td>
|
<td class="tableblock halign-center valign-top"><p class="tableblock"><em>iterator</em> <code>++</code> → <em>any</em></p></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td class="tableblock halign-center valign-top" rowspan="2"><p class="tableblock"><strong>DEFAULT</strong></p></td>
|
<td class="tableblock halign-center valign-top" rowspan="3"><p class="tableblock"><strong>DEFAULT</strong></p></td>
|
||||||
<td class="tableblock halign-center valign-top"><p class="tableblock"><code class="blue">??</code></p></td>
|
<td class="tableblock halign-center valign-top"><p class="tableblock"><code class="blue">??</code></p></td>
|
||||||
<td class="tableblock halign-center valign-top"><p class="tableblock"><em>Infix</em></p></td>
|
<td class="tableblock halign-center valign-top"><p class="tableblock"><em>Infix</em></p></td>
|
||||||
<td class="tableblock halign-center valign-top"><p class="tableblock"><em>Default value</em></p></td>
|
<td class="tableblock halign-center valign-top"><p class="tableblock"><em>Default value</em></p></td>
|
||||||
@@ -1870,11 +1945,10 @@ These operators have a high priority, in particular higher than the operator <co
|
|||||||
<td class="tableblock halign-center valign-top"><p class="tableblock"><em>variable</em> <code>?=</code> <em>any-expr</em> → <em>any</em></p></td>
|
<td class="tableblock halign-center valign-top"><p class="tableblock"><em>variable</em> <code>?=</code> <em>any-expr</em> → <em>any</em></p></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>ITER</strong><sup>1</sup></p></td>
|
<td class="tableblock halign-center valign-top"><p class="tableblock"><code class="blue">?!</code></p></td>
|
||||||
<td class="tableblock halign-center valign-top"><p class="tableblock"><code class="blue">()</code></p></td>
|
<td class="tableblock halign-center valign-top"><p class="tableblock"><em>Infix</em></p></td>
|
||||||
<td class="tableblock halign-center valign-top"><p class="tableblock"><em>Prefix</em></p></td>
|
<td class="tableblock halign-center valign-top"><p class="tableblock"><em>Alternate value</em></p></td>
|
||||||
<td class="tableblock halign-center valign-top"><p class="tableblock"><em>Iterator value</em></p></td>
|
<td class="tableblock halign-center valign-top"><p class="tableblock"><em>variable</em> <code>?!</code> <em>any-expr</em> → <em>any</em></p></td>
|
||||||
<td class="tableblock halign-center valign-top"><p class="tableblock"><code>()</code> <em>iterator</em> → <em>any</em></p></td>
|
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>FACT</strong></p></td>
|
<td class="tableblock halign-center valign-top"><p class="tableblock"><strong>FACT</strong></p></td>
|
||||||
@@ -2107,9 +2181,6 @@ These operators have a high priority, in particular higher than the operator <co
|
|||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
<div class="paragraph">
|
|
||||||
<p><sup>1</sup> Experimental</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="sect1">
|
<div class="sect1">
|
||||||
@@ -2131,23 +2202,51 @@ These operators have a high priority, in particular higher than the operator <co
|
|||||||
<div class="sect2">
|
<div class="sect2">
|
||||||
<h3 id="_expr_function_definition"><a class="anchor" href="#_expr_function_definition"></a><a class="link" href="#_expr_function_definition">6.1. <em>Expr</em> function definition</a></h3>
|
<h3 id="_expr_function_definition"><a class="anchor" href="#_expr_function_definition"></a><a class="link" href="#_expr_function_definition">6.1. <em>Expr</em> function definition</a></h3>
|
||||||
<div class="paragraph">
|
<div class="paragraph">
|
||||||
<p>A function is identified and referenced by its name. It can have zero or more parameter. <em>Expr</em> functions also support optional parameters.</p>
|
<p>A function is identified and referenced by its name. It can have zero or more parameter. <em>Expr</em> functions also support optional parameters and passing paramters by name.</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="exampleblock">
|
<div class="exampleblock">
|
||||||
<div class="title">Example 14. Expr’s function definition syntax</div>
|
<div class="title">Example 14. Expr’s function definition syntax</div>
|
||||||
<div class="content">
|
<div class="content">
|
||||||
<div class="paragraph">
|
<div class="paragraph">
|
||||||
<p><strong><em>function-definition</em></strong> = <em>identifier</em> "<strong>=</strong>" "<strong>func(</strong>" [<em>param-list</em>] "<strong>)</strong>" "<strong>{</strong>" <em>multi-expression</em> "<strong>}</strong>"<br>
|
<p><strong><em>function-definition</em></strong> = <em>identifier</em> "<strong>=</strong>" "<strong>func(</strong>" [<em>formal-param-list</em>] "<strong>)</strong>" "<strong>{</strong>" <em>multi-expression</em> "<strong>}</strong>"<br>
|
||||||
<em>param_list</em> = <em>required-param-list</em> [ "<strong>,</strong>" <em>optional-param-list</em> ]<br>
|
<em>formal-param_list</em> = <em>required-param-list</em> [ "<strong>,</strong>" <em>optional-param-list</em> ]<br>
|
||||||
<em>required-param-list</em> = <em>identifier</em> { "<strong>,</strong>" <em>identifier</em> }<br>
|
<em>required-param-list</em> = <em>identifier</em> { "<strong>,</strong>" <em>identifier</em> }<br>
|
||||||
<em>optional-param-list</em> = <em>optional-parm</em> { "<strong>,</strong>" <em>optional-param</em> }<br>
|
<em>optional-param-list</em> = <em>optional-parm</em> { "<strong>,</strong>" <em>optional-param</em> }<br>
|
||||||
<em>optional-param</em> = <em>identifier</em> "<strong>=</strong>" <em>any-expr</em></p>
|
<em>optional-param</em> = <em>param-name</em> "<strong>=</strong>" <em>any-expr</em><br>
|
||||||
|
<em>param-name</em> = <em>identifier</em></p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="paragraph">
|
<div class="paragraph">
|
||||||
<div class="title">Examples</div>
|
<div class="title">Examples</div>
|
||||||
<p><mark>TODO</mark></p>
|
<p><code>>>></code> <em class="gray">// A simple function: it takes two parameters and returns their "sum"</em><strong><sup>(*)</sup></strong><br>
|
||||||
|
<code>>>></code> <code class="blue">sum = func(a, b){ a + b }</code><br>
|
||||||
|
<code class="green">sum(a, b):any{}</code></p>
|
||||||
|
</div>
|
||||||
|
<div class="paragraph">
|
||||||
|
<p><sup>(*)</sup> Since the plus, *+*, operator is defined for multiple data-types, the <em>sum()</em> function can be used for any pair of that types.</p>
|
||||||
|
</div>
|
||||||
|
<div class="paragraph">
|
||||||
|
<p><code>>>></code> <em class="gray">// A more complex example: recursive calculation of the n-th value of Fibonacci’s sequence</em><br>
|
||||||
|
<code>>>></code> <code class="blue">fib = func(n){ n ? [0] {0}: [1] {1} :: {fib(n-1)+fib(n-2)} }</code><br>
|
||||||
|
<code class="green">fib(n):any{}</code></p>
|
||||||
|
</div>
|
||||||
|
<div class="paragraph">
|
||||||
|
<p><code>>>></code> <em class="gray">// Same function fib() but entered by splitting it over mulple text lines</em><br>
|
||||||
|
<code>>>></code> <code class="blue">fib = func(n){ \</code><br>
|
||||||
|
<code>...</code> <code class="blue">  n ? \</code><br>
|
||||||
|
<code>...</code> <code class="blue">    [0] {0} : \</code><br>
|
||||||
|
<code>...</code> <code class="blue">    [1] {1} :: \</code><br>
|
||||||
|
<code>...</code> <code class="blue">    { \</code><br>
|
||||||
|
<code>...</code> <code class="blue">      fib(n-1) + fib(n-2) \</code><br>
|
||||||
|
<code>...</code> <code class="blue">    } \</code><br>
|
||||||
|
<code>...</code> <code class="blue">}</code><br>
|
||||||
|
<code class="green">fib(n):any{}</code></p>
|
||||||
|
</div>
|
||||||
|
<div class="paragraph">
|
||||||
|
<p><code>>>></code> <em class="gray">// Required and optional parameters</em><br>
|
||||||
|
<code>>>></code> <code class="blue">measure = func(value, unit="meter"){ value + " " + unit + (value > 1) ? [true] {"s"} :: {""}}</code><br>
|
||||||
|
<code class="green">measure(value, unit="meter"):any{}</code></p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="sect2">
|
<div class="sect2">
|
||||||
@@ -2159,7 +2258,85 @@ These operators have a high priority, in particular higher than the operator <co
|
|||||||
<div class="sect2">
|
<div class="sect2">
|
||||||
<h3 id="_function_calls"><a class="anchor" href="#_function_calls"></a><a class="link" href="#_function_calls">6.3. Function calls</a></h3>
|
<h3 id="_function_calls"><a class="anchor" href="#_function_calls"></a><a class="link" href="#_function_calls">6.3. Function calls</a></h3>
|
||||||
<div class="paragraph">
|
<div class="paragraph">
|
||||||
<p><mark>TODO: function calls operations</mark></p>
|
<p>To call a function, either Expr or Golang type, it is necessary to specify its name and, at least, its required parameters.</p>
|
||||||
|
</div>
|
||||||
|
<div class="exampleblock">
|
||||||
|
<div class="title">Example 15. Function invocation syntax</div>
|
||||||
|
<div class="content">
|
||||||
|
<div class="paragraph">
|
||||||
|
<p><strong><em>function-call</em></strong> = <em>identifier</em> "<strong>(</strong>" <em>actual-param-list</em> "<strong>)</strong>"<br>
|
||||||
|
<em>actual-param-list</em> = [<em>positional-params</em>] [<em>named-parameters</em>]<br>
|
||||||
|
<em>positional-params</em> = <em>any-value</em> { "<strong>,</strong>" <em>any-value</em> }<br>
|
||||||
|
<em>named-params</em> = <em>param-name</em> "<strong>=</strong>" <em>any-value</em> { "<strong>,</strong>" <em>param-name</em> "<strong>=</strong>" <em>any-value</em> }<br>
|
||||||
|
<em>param-name</em> = <em>identifier</em></p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="paragraph">
|
||||||
|
<div class="title">Examples of calling the <code>sum()</code> functions defined above</div>
|
||||||
|
<p><code>>>></code> <em class="gray">// sum of two integers</em><br>
|
||||||
|
<code>>>></code> <code class="blue">sum(-6, 2)</code><br>
|
||||||
|
<code class="green">-4</code><br>
|
||||||
|
<code>>>></code> <em class="gray">// same as above but passing the parameters by name</em><br>
|
||||||
|
<code>>>></code> <code class="blue">sum(a=-6, b=2)</code><br>
|
||||||
|
<code class="green">-4</code><br>
|
||||||
|
<code>>>></code> <em class="gray">// again, but swapping parameter positions (see the diff() examples below)</em><br>
|
||||||
|
<code>>>></code> <code class="blue">sum(b=2, a=-6)</code><br>
|
||||||
|
<code class="green">-4</code><br>
|
||||||
|
<code>>>></code> <em class="gray">// sum of a fraction and an integer</em><br>
|
||||||
|
<code>>>></code> <code class="blue">sum(3|2, 2)</code><br>
|
||||||
|
<code class="green">7|2</code><br>
|
||||||
|
<code>>>></code> <em class="gray">// sum of two strings</em><br>
|
||||||
|
<code>>>></code> <code class="blue">sum("bye", "-bye")</code><br>
|
||||||
|
<code class="green">"bye-bye"</code><br>
|
||||||
|
<code>>>></code> <em class="gray">// sum of two lists</em><br>
|
||||||
|
<code>>>></code> <code class="blue">sum(["one", 1], ["two", 2])</code><br>
|
||||||
|
<code class="green">["one", 1, "two", 2]</code></p>
|
||||||
|
</div>
|
||||||
|
<div class="paragraph">
|
||||||
|
<div class="title">Examples of calling a function with parameters passed by name</div>
|
||||||
|
<p><code>>>></code> <em class="gray">// diff(a,b) calculates a-b</em><br>
|
||||||
|
<code>>>></code> <code class="blue">diff = func(a,b){a-b}</code><br>
|
||||||
|
<code class="green">diff(a, b):any{}</code><br>
|
||||||
|
<code>>>></code> <em class="gray">// simple invocation</em><br>
|
||||||
|
<code>>>></code> <code class="blue">diff(10,8)</code><br>
|
||||||
|
<code class="green">2</code><br>
|
||||||
|
<code>>>></code> <em class="gray">// swapped parameters passed by name</em><br>
|
||||||
|
<code>>>></code> <code class="blue">diff(b=8,a=10)</code><br>
|
||||||
|
<code class="green">2</code></p>
|
||||||
|
</div>
|
||||||
|
<div class="paragraph">
|
||||||
|
<div class="title">Examples of calling the <code>fib()</code> function defined above</div>
|
||||||
|
<p><code>>>></code> <em class="gray">// Fibonacci sequence: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, …​</em><br>
|
||||||
|
<code>>>></code> <code class="blue">fib(6)</code><br>
|
||||||
|
<code class="green">8</code><br>
|
||||||
|
<code>>>></code> <code class="blue">fib(9)</code><br>
|
||||||
|
<code class="green">34</code></p>
|
||||||
|
</div>
|
||||||
|
<div class="paragraph">
|
||||||
|
<div class="title">Examples of calling the <code>measure()</code> functions defined above</div>
|
||||||
|
<p><code>>>></code> <em class="gray">// simple call</em><br>
|
||||||
|
<code>>>></code> <code class="blue">measure(10,"litre")</code><br>
|
||||||
|
<code class="green">"10 litres"</code><br>
|
||||||
|
<code>>>></code> <em class="gray">// accept the default unit</em><br>
|
||||||
|
<code>>>></code> <code class="blue">measure(8)</code><br>
|
||||||
|
<code class="green">"8 meters"</code><br>
|
||||||
|
<code>>>></code> <em class="gray">// without the required parameter 'value'</em><br>
|
||||||
|
<code>>>></code> <code class="blue">measure(unit="degrees"))</code><br>
|
||||||
|
<code class="red">Eval Error: measure(): missing params — value</code></p>
|
||||||
|
</div>
|
||||||
|
<div class="paragraph">
|
||||||
|
<div class="title">Examples of context binding (closures)</div>
|
||||||
|
<p><code>>>></code> <code class="blue">factory = func(n=2){ func(x){x*n} }</code><br>
|
||||||
|
<code class="green">factory(n=2):any{}</code><br>
|
||||||
|
<code>>>></code> <code class="blue">double = factory()</code><br>
|
||||||
|
<code class="green">double(x):any{}</code><br>
|
||||||
|
<code>>>></code> <code class="blue">triple = factory(3)</code><br>
|
||||||
|
<code class="green">triple(x):any{}</code><br>
|
||||||
|
<code>>>></code> <code class="blue">double(5)</code><br>
|
||||||
|
<code class="green">10</code><br>
|
||||||
|
<code>>>></code> <code class="blue">triple(5)</code><br>
|
||||||
|
<code class="green">15</code></p>
|
||||||
</div>
|
</div>
|
||||||
<div class="paragraph">
|
<div class="paragraph">
|
||||||
<p>Functions compute values in a local context (scope) that do not make effects on the calling context. This is the normal behavior. Using the reference operator <code class="blue">@</code> it is possibile to export local definition to the calling context.</p>
|
<p>Functions compute values in a local context (scope) that do not make effects on the calling context. This is the normal behavior. Using the reference operator <code class="blue">@</code> it is possibile to export local definition to the calling context.</p>
|
||||||
@@ -2204,7 +2381,7 @@ These operators have a high priority, in particular higher than the operator <co
|
|||||||
</div>
|
</div>
|
||||||
<div id="footer">
|
<div id="footer">
|
||||||
<div id="footer-text">
|
<div id="footer-text">
|
||||||
Last updated 2024-09-12 06:56:30 +0200
|
Last updated 2024-09-18 20:46:46 +0200
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
|
|||||||
@@ -417,6 +417,7 @@ func (parser *parser) parseGeneral(scanner *scanner, allowForest bool, allowVarR
|
|||||||
case SymEqual:
|
case SymEqual:
|
||||||
// if err = checkPrevSymbol(lastSym, SymIdentifier, tk); err == nil {
|
// if err = checkPrevSymbol(lastSym, SymIdentifier, tk); err == nil {
|
||||||
currentTerm, err = tree.addToken(tk)
|
currentTerm, err = tree.addToken(tk)
|
||||||
|
firstToken = true
|
||||||
// }
|
// }
|
||||||
case SymFuncDef:
|
case SymFuncDef:
|
||||||
var funcDefTerm *term
|
var funcDefTerm *term
|
||||||
@@ -483,7 +484,7 @@ func (parser *parser) parseGeneral(scanner *scanner, allowForest bool, allowVarR
|
|||||||
// return
|
// return
|
||||||
// }
|
// }
|
||||||
|
|
||||||
func (parser *parser) expandOpAssign(scanner * scanner, tree *ast, tk *Token, allowVarRef bool) (t *term, err error) {
|
func (parser *parser) expandOpAssign(scanner *scanner, tree *ast, tk *Token, allowVarRef bool) (t *term, err error) {
|
||||||
var opSym Symbol
|
var opSym Symbol
|
||||||
var opString string
|
var opString string
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user