Fuzion Logo
fuzion-lang.dev — The Fuzion Language Portal
JavaScript seems to be disabled. Functionality is limited.

args

envir.args

envir.args -- effect providing access to command line args

Functions

§
:
Any
 => 
bool 
[Inherited from  effect]
does this effect support abort?

Redefining this to return `false` helps to detect unexptected calls to
`abort` at runtime and ensure that the static analysis finds that the
code executed with this effect will always return normally and produce
a result. This is used, e.g, in `mutate` to avoid static analysis
reporting `panic` as an effect of the use of a local mutate instance.
collect the contents of this Sequence into an array
create an array backed version of this sequence in case this is not array
backed. This will ensure that operations like index[] or drop perform
in constant time.

returns Sequence.this if is_array_backed.
create a list from this searchable_sequence.

redefines:

convenience feature to work around type inference issues
NYI remove when type inference gets better
§
:
Any
 => 
String 
[Inherited from  Sequence]
create a string representation of this Sequence including all the string
representations of its contents, separated by ',' and enclosed in '['
and ']'.

In case this Sequence is known to be `finite` or has at most (Sequence T).type
.AS_STRING_NON_FINITE_MAX_ELEMENTS elements, all elements will be shown in the
resulting string. Otherwise, only the first elements will be shown followed by
",…" as in "[1,2,3,4,5,6,7,8,9,10,…]".

To force printing of all elements of a finite `Sequence` for which `finite` is
false (which may be the case since a Sequence in general might not know that it
if finite), you may use `as_string_all`.

redefines:

§(sep String)
:
Any
 => 
String 
[Inherited from  Sequence]
create a string representation of this Sequence including all the string
representations of its contents, separated by 'sep'.

NOTE: In case this Sequence is not finite, this will attempt to create an
infinitely long string resulting in failure due to resource exchaustion.
§
:
Any
 => 
String 
[Inherited from  Sequence]
create a string representation of this Sequence including all the string
representations of its contents, separated by ", " and enclosed in '['
and ']'.

NOTE: In case this Sequence is not finite, this will attempt to create an
infinitely long string resulting in failure due to resource exchaustion.
call 'as_string' on the elements
the arithmetic mean of the sequence
https://en.wikipedia.org/wiki/Arithmetic_mean
create a new list that contains the first elements of
this Sequence for which 'f e' is false
§(chunk_size i32)
:
Any
 => 
list (list Sequence.T) 
[Inherited from  Sequence]
chop this Sequence into chunks of `chunk_size`.
the last chunk may be smaller than `chunk_size`.
create a new Sequence from the result of applying 'f' to the
elements all combinations of elements of this Sequence and
all elements of 'b' iterating of 'b' repeatedly as follows

Sequence.this[0] , b[0]
Sequence.this[0] , b[1]
Sequence.this[0] , b[2]
Sequence.this[0] , ...
Sequence.this[0] , b.last
Sequence.this[1] , b[0]
Sequence.this[1] , b[1]
Sequence.this[1] , ...
... , ...
Sequence.this.last, b.last
create a Sequence that consists of all the elements of this Sequence followed
by all the elements of s
§
:
Any
 => 
i32 
[Inherited from  Sequence]
count the number of elements in this Sequence. Note that this typically
runs forever if executed on an endless list

For lists that are not array backed, this might require time in O(count).
get the number of non-overlapping matches of l within this
get the number of matches of l
§
:
Any
 => 
list Sequence.T 
[Inherited from  Sequence]
create a list that repeats the current Sequence indefinitely. In case 'Sequence.this'
is empty, returns 'nil'
§
:
Any
 => 
unit 
[Inherited from  effect]
convenience version of `type.default` for effect values whose type is
exactly the effect type (i.e., the value type does not inherit
from the effect type).

set default instance for effect type `effect.this` to value `effect.this`.

NYI: UNDER DEVELOPMENT: See type.default
§(n i32)
:
Any
 => 
list Sequence.T 
[Inherited from  Sequence]
create a list that consists of the elements of this Sequence except the first
n elements

NOTE: this may have performance in O(n) unless it is backed by an immutable array.
Lazily drop the first elements of this Sequence for which predicate 'p' holds.
§
:
Any
 => 
Type 
[Inherited from  Any]
Get the dynamic type of this instance. For value instances `x`, this is
equal to `type_of x`, but for `x` with a `ref` type `x.dynamic_type` gives
the actual runtime type, while `type_of x` results in the static
compile-time type.

There is no dynamic type of a type instance since this would result in an
endless hierarchy of types. So for Type values, dynamic_type is redefined
to just return Type.type.
§
:
Any
 => 
Sequence.T 
[Inherited from  Sequence]
the euclidean norm of this sequence
i.e. the square of the sum of squares of this sequence
filter elements using predicate f
values for which f is false are dropped
§
:
Any
 => 
unit 
[Inherited from  effect]
feature that will be called on the final instance of this effect
after it has been de-instated.

This happens either on a normal return form the code passed to
`instate`, on an abort perfomed on this effect or on an abort
performed on an effect instated prior to this effect's instation.

This can be used to perform actions when leaving an effect such
a cleanup up resources that were created or opened by operations
of this effect.
§(pattern Sequence Sequence.T)
:
Any
 => 
option i32 
[Inherited from  Sequence]
get the index of pattern within this Sequence or nil if it does not exist

uses the Knuth-Morris-Pratt algorithm
port of racket code from this paper:
https://www.cambridge.org/core/services/aop-cambridge-core/content/view/8EFA77D663D585B68630E372BCE1EBA4/S0956796824000017a.pdf/knuth-morris-pratt-illustrated.pdf

worst-case performance: O( seq_length ) + O( pattern_length )
worst-case space complexity: O( pattern_length )
§
:
Any
 => 
bool 
[Inherited from  searchable_sequence]
is this sequence known to be finite? For infinite sequences, features like
count diverge.

redefines:

§
:
Any
 => 
Sequence.T 
[Inherited from  Sequence]
get the first element of this Sequence

Sequence must not be empty, causes precondition failure if debug is enabled.
§(default Sequence.T)
:
Any
 => 
Sequence.T 
[Inherited from  Sequence]
get the first element of this Sequence or default if sequence is empty
map each element of this Sequence to Sequence
Then flatten the result by one level,
essentially combining all the sequences.
§(m Monoid Sequence.T)
:
Any
 => 
Sequence.T 
[Inherited from  Sequence]
fold the elements of this Sequence using the given monoid.

e.g., to sum the elements of a Sequence of i32, use s.fold i32.sum
fold the elements of this non-empty Sequence using the given function

e.g., to find the minimum of a Sequence of i32, use `s.fold1 (<=)`
§(B 
type
, f Function Sequence.foldf.B Sequence.foldf.B Sequence.T, e Sequence.foldf.B)
:
Any
 => 
Sequence.foldf.B 
[Inherited from  Sequence]
fold the elements of this Sequence using the given function and initial
value.

In case this Sequence is empty, the result is `e`.

e.g., to find the product of a Sequence of i32, use `s.foldf (*) 1`
create a list and call 'for_each f' on it
apply 'f' to each element 'e' as long as 'f e'
group the elements of this sequence by a key of type K

f determines the key of an element
get a function that, given an index, returns the element at that index
§(i i32)
:
Any
 => 
Sequence.T 
[Inherited from  Sequence]
the nth element in the sequence, must exist
§(x Sequence.T)
:
Any
 => 
option i32 
[Inherited from  Sequence]
determine the index of element x within this list. 0 if x is at the
head of the list, 1 if it comes directly after head, etc. nil if x is
not in the list.
adds the corresponding index to
every element in the sequence
§(I 
type
, start_idx Sequence.indexed.I)
:
Any
 => 
list (tuple Sequence.indexed.I Sequence.T) 
[Inherited from  Sequence]
adds an index to every element
in the sequence starting at start_idx
consume all elements of this Sequence by f. This is an infix operator alias
for for_each.

Ex.: To print all the elements of a list, you can use

1..10 ! say
filter elements using predicate f, infix operator
synonym of filter.

NYI: What is better, 'infix |&' or 'infix &', or something else?
infix operand synonym for concat_sequences
map the Sequence to a new Sequence applying function f to all elements

This is an infix operator alias of map enabling piping code like

l := 1..10 | *10 | 300-

to obtain 290,280,270,...200

Note that map and therefore also this operator is lazy, so

_ := (1..10 | say)

will not print anything while

(1..10 | say).for_each _->unit

will print the elements since `for_each` is not lazy.
filter elements using predicate f, infix operator
synonym of filter.
check if predicate f holds for all elements
check if predicate f holds for at least one element
§(at i32, v Sequence.T)
:
Any
 => 
list Sequence.T 
[Inherited from  Sequence]
insert element v at position at
§(R 
type
, code Function effect.instate_self.R)
:
Any
 => 
effect.instate_self.R 
[Inherited from  effect]
convenience version of `instate` for effect values whose type is
exactly the effect type (i.e., the value type does not inherit
from the effect type).

Execute 'code' in a context where this effect instance has been
instated for effect type `effect.this`.

In case `f` returns normally, this will return `f`'s result.

In case `f` aborts this effect, this will panic.
apply transducer to sequence, returning a sequence of results

example usage:
human(age i32) is
ages := map (Sequence i32) human i32 (x -> x.age)
gt_ten := filter (Sequence i32) i32 (x -> x > 10)
xf := ages ∘ gt_ten
say ([human(4), human(12), human(30)].into xf) # [12,30]
§
:
Any
 => 
bool 
[Inherited from  Sequence]
is this Sequence known to be array backed? If so, this means that operations
like index[] are fast.
§
:
Any
 => 
bool 
[Inherited from  Sequence]
is this Sequence empty?
§(i i32)
:
Any
 => 
bool 
[Inherited from  Sequence]
check if argument is a valid index in this sequence.

Note that this may have a performance in O(i) unless this
Sequence is_array_backed.
§
:
Any
 => 
Sequence.T 
[Inherited from  Sequence]
get the last element of this Sequence

Sequence must not be empty, causes precondition failure if debug is enabled.

This may take time in O(count), in particular, it may not terminate
for an infinite Sequence.
§(default Sequence.T)
:
Any
 => 
Sequence.T 
[Inherited from  Sequence]
get the last element of this Sequence or default if sequence is empty
map the Sequence to a new Sequence applying function f to all elements

This performs a lazy mapping, f is called only when the elements
in the resulting list are accessed.
Map this Sequence to f applied to neighboring pairs of values
in this Sequence.

In case this Sequence has less than two elements, the result will
be the empty list.

ex. to obtain a list of differences you, you may use `map_pairs (-)`:

[2,3,5,7,11,13,17,19,23,29].map_pairs a,b->b-a

results in `[1,2,2,4,2,4,2,4,6]`
§
:
Any
 => 
option Sequence.T 
[Inherited from  Sequence]
maximum value in the sequence
§
:
Any
 => 
option Sequence.T 
[Inherited from  Sequence]
the median of the sequence
https://en.wikipedia.org/wiki/Median
§
:
Any
 => 
option Sequence.T 
[Inherited from  Sequence]
minimum value in the sequence
§(n i32)
:
Any
 => 
option Sequence.T 
[Inherited from  Sequence]
the nth element in the sequence if it exists, wrapped in an option,
nil otherwise.

Complexity: if Sequence is array backed O(1) otherwise O(n)
create a new Sequence from tuples of all combinations of elements
of this Sequence and all elements of 'b' iterating of 'b' repeatedly
as follows

(Sequence.this[0] , b[0] )
(Sequence.this[0] , b[1] )
(Sequence.this[0] , b[2] )
(Sequence.this[0] , ... )
(Sequence.this[0] , b.last)
(Sequence.this[1] , b[0] )
(Sequence.this[1] , b[1] )
(Sequence.this[1] , ... )
(... , ... )
(Sequence.this.last, b.last)
calls `f` for element in the Sequence.

Unlike `for_each` this returns itself
allowing easier composition with
other Sequence features.

example:
[1,2,3,4,5]
.filter is_prime
.peek say
.drop_while <10
§
:
Any
 => 
String 
[Inherited from  Any]
convenience prefix operator to create a string from a value.

This permits usage of `$` as a prefix operator in a similar way both
inside and outside of constant strings: $x and "$x" will produce the
same string.
§(R 
type
, init Sequence.reduce.R, f Function (choice Sequence.reduce.R (abort Sequence.reduce.R)) Sequence.reduce.R Sequence.T)
:
Any
 => 
Sequence.reduce.R 
[Inherited from  Sequence]
reduce this Sequence to R with an initial value init
and a reducing function f.
the reduction is finished once f yields abort or
if the end of the sequence is reached.
reduce this Sequence to `outcome R`
with an initial value `init` and a reducing function `f`.
the reduction is finished once `f` yields `abort` or
if the end of the sequence is reached.
§
:
Any
 => 
unit 
[Inherited from  effect]
replace existing effect of type `effect.this` by the new effect value `effect.this`.

This is a convenience feature for value type effects for which the type of
the effect instance equals the effect type. `ref` type effects typically have
values that may be children of the effect type that are of a different type, so
`effect_type.replace new_value` must be used.

replace may only be called during the execution of an operation of a currently instated
effect of the same effect type.
replace all occurrences of old by new
replace the first n occurrences of old by new
reverse the order of the elements in this Sequence
map this Sequence to a list that contains the result of folding
all prefixes using the given monoid.

e.g., for a Sequence of i32 s, s.scan i32.sum creates a list of
partial sums (0..).map x->(s.take x).fold i32.sum
§(from i32, to i32)
:
Any
 => 
Sequence Sequence.T 
[Inherited from  Sequence]
create a slice from this Sequence that consists of the elements starting at index
from (including) up to index to (excluding).
sort this Sequence using the total order defined by less_or_equal
sort this Sequence using total order defined for 'f a[i]'
create a tuple of two Sequences by splitting this at the given index, i.e.,
a Sequence of length 'at' and one of length 'count-at'.

at may be <= 0 or >= count, in which case the resulting tuple will be the
(empty list, Sequence.this.as_list) or (Sequence.this.as_list, empty list), resp.
does this sequence start with l?
the standard deviation of the sequence
https://en.wikipedia.org/wiki/Standard_deviation
create a lazy list of all the tails of this Sequence, including the complete Sequence
as a list and the empty list 'nil'.
§(n i32)
:
Any
 => 
list Sequence.T 
[Inherited from  Sequence]
create a list that consists only of the first n elements of this
Sequence, fewer if this Sequence has fewer elements
Lazily take the first elements of this Sequence for which predicate 'p' holds.
takes a transducer xf, a reducer f and an initial value
returns the result of applying the reducer xf f to the Sequence
the variance of the sequence
https://en.wikipedia.org/wiki/Variance
create a new list from the result of applying 'f' to the
elements of this Sequence and 'b' in order.

Type Features

§
:
Any
 is
 
[Inherited from  effect]
Abort code execution for the instated effect.this.env and return to the point
where the effect was instated.
§(e effect.this.type)
:
Any
 is
 
[Inherited from  effect]
replace existing effect for type `effect.this` by the new effect value `e`
and abort code execution to return to the point where the effect was instated.
§
:
Any
 is
 
[Inherited from  Type]
string representation of this type to be used for debugging.

result has the form "Type of '<name>'", but this might change in the future

redefines:

Maximum number of elements shown for on a call to `as_string` for a non-finite
Sequence.
monoid of Sequences with infix concatentation operation.
§(e effect.this.type)
:
Any
 is
 
[Inherited from  effect]
set default instance for effect type `effect.this` to `e`

NYI: UNDER DEVELOPMENT: This is a manual work-around to automatically install
default effects. It should be replaced by a effect configuration file that
is defined locally to a fuzion project or globally to the fuzion installation
the defines the default effects to be used. The DFA should then automatically
determine the required effects and create code to instate them at the beginning
of an application.
§
:
Any
 is
 
[Inherited from  Type]
There is no dynamic type of a type instance since this would result in an
endless hierarchy of types, so dynamic_type is redefined to just return
Type.type here.

redefines:

§(a property.equatable.this.type, b property.equatable.this.type)
:
Any
 is
 
[Inherited from  equatable]
 
[Abstract feature]
equality implements the default equality relation for values of this type.

This relation must be

- reflexive (equality a b),
- symmetric (equality a b = equality b a), and
- transitive ((equality a b && equality b c) : equality a c).

result is true iff 'a' is considered to represent the same abstract value
as 'b'.
§
:
Any
 is
 
[Inherited from  effect]
has an effect of the given type been instated?
§(T 
type
)
:
Any
 is
 
[Inherited from  Type]
Is this type assignable to a type parameter with constraint `T`?

The result of this is a compile-time constant that can be used to specialize
code for a particular type.

is_of_integer_type(n T : numeric) => T : integer
say (is_of_integer_type 1234) # true
say (is_of_integer_type 3.14) # false

it is most useful in conjunction preconditions or `if` statements as in

pair(a,b T) is

=>

or

val(n T) is

§(R 
type
, e effect.this.type, code Function effect.type.instate.R)
:
Any
 is
 
[Inherited from  effect]
execute 'code' in a context where the effect instance `e` has been
installed for effect type `effect.this`.

In case `f` returns normally, this will return `f`'s result.

In case `f` aborts this effect, this will panic.
§(R 
type
, e effect.this.type, code Function effect.type.instate.R, def Unary effect.type.instate.R effect.this.type)
:
Any
 is
 
[Inherited from  effect]
execute 'code' in a context where the effect instance `e` has been
installed for effect type `effect.this`.

In case `f` returns normally, this will return `f`'s result.

In case `f` aborts this effect, return `def()`.
§
:
Any
 is
 
[Inherited from  effect]
has an effect of this type been instated?
§
:
Any
 is
 
[Inherited from  Type]
name of this type, including type parameters, e.g. 'option (list i32)'.
§(e effect.this.type)
:
Any
 is
 
[Inherited from  effect]
replace existing effect for type `effect.this` by the new effect value `e`.

For effects that model the outside world (e.g., i/o, time, sensors and actuators, etc.),
the effect might be a unit type, so the replace is effectively a no-operation. However,
the call to `replace` is used ot model the change of the outside world and must be
included for analysis tools to appreciate this.

replace may only be called during the execution of an operation of a currently instated
effect of the same effect type.

NYI: BUG: It is currently not enforced that replace is only called during the execution
of an operation of a currenlty instated effect of the same effect type.
§
:
Any
 is
 
[Inherited from  effect]
abort the current execution and return from the surrounding call to
`instate`.

NYI: CLEANUP: `return` is the same as `abort`. The term `return` seems
common for algebraic effects, but is confusing since it is different to
returning from a call. We need to decide to break with algebraic effect
jargon (and remove `return`) or to stick with it (and rename `abort` as
`return`).
§
:
Any
 is
 
[Inherited from  Any]
Get a type as a value.

This is a feature with the effect equivalent to Fuzion's `expr.type` call tail.
It is recommended to use `expr.type` and not `expr.type_value`.

`type_value` is here to show how this can be implemented and to illustrate the
difference to `dynamic_type`.