mirror of
https://github.com/erg-lang/erg.git
synced 2025-09-28 12:14:43 +00:00
137 lines
2.9 KiB
Markdown
137 lines
2.9 KiB
Markdown
# Tips
|
|
|
|
## Want to change the language in which errors are displayed
|
|
|
|
Please download Erg for your language.
|
|
However, external libraries may not support multiple languages.
|
|
|
|
## Want to change only certain attributes of a record
|
|
|
|
```python
|
|
record: {.name = Str; .age = Nat; .height = CentiMeter}
|
|
{height; ...rest} = record
|
|
mut_record = {.height = !height; ...rest}
|
|
```
|
|
|
|
## Want to shadow variables
|
|
|
|
Shadowing in the same scope is not possible with Erg. However, you can redefine them if the scope changes (This is a syntax called instance block).
|
|
|
|
````python
|
|
## Get a T!-type object and finally assign it to a variable as type T
|
|
x: T =
|
|
x: T! = foo()
|
|
x.bar!()
|
|
x.freeze()
|
|
````
|
|
|
|
## Want to reuse a final class (non-inheritable class) somehow
|
|
|
|
You can create a wrapper class. This is a so-called composition pattern.
|
|
|
|
```python
|
|
FinalWrapper = Class {inner = FinalClass}
|
|
FinalWrapper.
|
|
method self =
|
|
self::inner.method()
|
|
...
|
|
```
|
|
|
|
## Want to use an enumerated type that is not a string
|
|
|
|
You can define a traditional enumerated type (algebraic data type) commonly found in other languages as follows
|
|
If you implement `Singleton`, classes and instances are identical.
|
|
Also, if you use `Enum`, the type of choice is automatically defined as a redirect attribute.
|
|
|
|
```python
|
|
Ok = Class Impl := Singleton
|
|
Err = Class Impl := Singleton
|
|
ErrWithInfo = Inherit {info = Str}
|
|
Status = Enum Ok, Err, ErrWithInfo
|
|
stat: Status = Status.new ErrWithInfo.new {info = "error caused by ..."}
|
|
match! stat:
|
|
Status.Ok -> ...
|
|
Status.Err -> ...
|
|
Status.ErrWithInfo::{info} -> ...
|
|
```
|
|
|
|
```python
|
|
Status = Enum Ok, Err, ErrWithInfo
|
|
# is equivalent to
|
|
Status = Class Ok or Err or ErrWithInfo
|
|
Status.
|
|
Ok = Ok
|
|
Err = Err
|
|
ErrWithInfo = ErrWithInfo
|
|
```
|
|
|
|
## I want to enumerate at the beginning of 1
|
|
|
|
method 1:
|
|
|
|
```python
|
|
arr = [...]
|
|
for! arr.iter().enumerate(start := 1), i =>
|
|
...
|
|
```
|
|
|
|
method 2:
|
|
|
|
```python
|
|
arr = [...]
|
|
for! arr.iter().zip(1...) , i =>
|
|
...
|
|
```
|
|
|
|
## Want to test a (white box) non-public API
|
|
|
|
The private API in `foo.er` is specially accessible in the module `foo.test.er`.
|
|
The `foo.test.er` module cannot be imported, so it remains hidden.
|
|
|
|
```python
|
|
# foo.er
|
|
private x = ...
|
|
```
|
|
|
|
```python
|
|
# foo.test.er
|
|
foo = import "foo"
|
|
|
|
@Test
|
|
'testing private' x =
|
|
...
|
|
y = foo::private x
|
|
...
|
|
```
|
|
|
|
## Want to define a (variable) attribute that is read-only from the outside
|
|
|
|
You can make the attribute private and define a getter.
|
|
|
|
```python
|
|
C = Class {v = Int!}
|
|
C::
|
|
inc_v!(ref! self) = self::v.inc!()
|
|
...
|
|
C.
|
|
get_v(ref self): Int = self::v.freeze()
|
|
...
|
|
```
|
|
|
|
## When implementing a trait's methods, warnings are given for variables that were not used
|
|
|
|
You can use `discard`.
|
|
|
|
```python
|
|
T = Trait {.f = (Self, x: Int, s: Str) -> Int}
|
|
|
|
C = Class T
|
|
C|<: T|.
|
|
f self, x, s =
|
|
discard s
|
|
...
|
|
```
|
|
|
|
## Want to stop warnings
|
|
|
|
There is no option in Erg to stop warnings (this is by design). Please rewrite your code.
|