Updated docs with blockless & anonymous functions, added variable mutation disclaimer, updated landing page pascaligo example.

This commit is contained in:
Matej Sima 2019-11-19 01:44:36 +01:00
parent 63822e0430
commit 5ba34b3ac3
7 changed files with 59 additions and 51 deletions

View File

@ -36,7 +36,9 @@ Here's how you define a basic function that accepts two `ints` and returns a sin
```pascaligo ```pascaligo
function add(const a: int; const b: int): int is function add(const a: int; const b: int): int is
block { skip } with a + b begin
const result: int = a + b;
end with result;
``` ```
The function body consists of two parts: The function body consists of two parts:
@ -44,9 +46,14 @@ The function body consists of two parts:
- `block {<code>}` - logic of the function - `block {<code>}` - logic of the function
- `with <value>` - the return value of the function - `with <value>` - the return value of the function
> 💡 `skip` can be used as a placeholder for empty function blocks, when all the neccessary logic fits into `with` at the end. It is also possible to omit `block { skip } with` #### Blockless functions
in the above example, leaving only `a + b`.
Functions that can contain all of their logic into a single instruction/expression, can be defined without the surrounding `block`.
Instead, you can inline the necessary logic directly, like this:
```pascaligo
function add(const a: int; const b: int): int is a + b
```
<!--Cameligo--> <!--Cameligo-->
@ -65,3 +72,25 @@ value.
<!--END_DOCUSAURUS_CODE_TABS--> <!--END_DOCUSAURUS_CODE_TABS-->
<!--DOCUSAURUS_CODE_TABS-->
<!--Pascaligo-->
```pascaligo
const increment : (int -> int) = (function (const i : int) : int is i + 1);
// a = 2
const a: int = increment(1);
```
<!--END_DOCUSAURUS_CODE_TABS-->
## Anonymous functions
Functions without a name, also known as anonymous functions are useful in cases when you want to pass the function as an argument or assign it to a key in a record/map.
Here's how to define an anonymous function assigned to a variable `increment`, with it's appropriate function type signature.
<!--DOCUSAURUS_CODE_TABS-->
<!--Pascaligo-->
```pascaligo
const increment : (int -> int) = (function (const i : int) : int is i + 1);
// a = 2
const a: int = increment(1);
```
<!--END_DOCUSAURUS_CODE_TABS-->

View File

@ -0,0 +1,4 @@
function add(const a: int; const b: int): int is
begin
const result: int = a + b;
end with result;

View File

@ -0,0 +1,3 @@
const increment : (int -> int) = (function (const i : int) : int is i + 1);
// a = 2
const a: int = increment(1);

View File

@ -0,0 +1 @@
function add(const a: int; const b: int): int is a + b

View File

@ -43,6 +43,9 @@ Variables, unlike constants, are mutable. They can't be used in a *global scope*
> 💡 Don't worry if you don't understand the function syntax yet. We'll get to it in upcoming sections of the docs. > 💡 Don't worry if you don't understand the function syntax yet. We'll get to it in upcoming sections of the docs.
> ⚠️ Please be wary that mutation only works within the function scope itself, values outside of the function scope will not be affected.
```pascaligo ```pascaligo
// won't work, use const for global values instead // won't work, use const for global values instead

View File

@ -18,55 +18,25 @@ const GridBlock = CompLibrary.GridBlock;
const pre = "```"; const pre = "```";
const pascaligoExampleSmall = `${pre}pascaligo const pascaligoExampleSmall = `${pre}pascaligo
// variant defining pseudo multi-entrypoint
// actions
type action is
| Increment of int
| Decrement of int
function add
(const a: int; const b: int): int is
block { skip } with a + b
function subtract
(const a: int; const b: int): int
is block { skip } with a - b
// real entrypoint that re-routes the flow
// based on the action provided
function main
(const p: action; const s: int):
(list(operation) * int) is
block { skip }
with ((nil : list(operation)),
case p of
| Increment(n) -> add(s, n)
| Decrement(n) -> subtract(s, n)
end)
${pre}`;
const pascaligoExample = `${pre}pascaligo
// variant defining pseudo multi-entrypoint actions // variant defining pseudo multi-entrypoint actions
type action is type action is
| Increment of int | Increment of int
| Decrement of int | Decrement of int
function add (const a : int ; const b : int) : int is function add (const a : int ; const b : int) : int is a + b
block { skip } with a + b
function subtract (const a : int ; const b : int) : int is function subtract (const a : int ; const b : int) : int is a - b
block { skip } with a - b
// real entrypoint that re-routes the flow based // real entrypoint that re-routes the flow based on the action provided
// on the action provided function main (const p : action ; const s : int) : (list(operation) * int) is
function main (const p : action ; const s : int) : ((nil : list(operation)),
(list(operation) * int) is
block { skip } with ((nil : list(operation)),
case p of case p of
| Increment(n) -> add(s, n) | Increment (n) -> add (s, n)
| Decrement(n) -> subtract(s, n) | Decrement (n) -> subtract (s, n)
end) end)
${pre}`; ${pre}`;
const pascaligoExample = pascaligoExampleSmall;
const cameligoExampleSmall = `${pre}ocaml const cameligoExampleSmall = `${pre}ocaml
type storage = int type storage = int

View File

@ -3,15 +3,13 @@ type action is
| Increment of int | Increment of int
| Decrement of int | Decrement of int
function add (const a : int ; const b : int) : int is function add (const a : int ; const b : int) : int is a + b
block { skip } with a + b
function subtract (const a : int ; const b : int) : int is function subtract (const a : int ; const b : int) : int is a - b
block { skip } with a - b
// real entrypoint that re-routes the flow based on the action provided // real entrypoint that re-routes the flow based on the action provided
function main (const p : action ; const s : int) : (list(operation) * int) is function main (const p : action ; const s : int) : (list(operation) * int) is
block {skip} with ((nil : list(operation)), ((nil : list(operation)),
case p of case p of
| Increment (n) -> add (s, n) | Increment (n) -> add (s, n)
| Decrement (n) -> subtract (s, n) | Decrement (n) -> subtract (s, n)