WIP
This commit is contained in:
parent
0ba9ac30ea
commit
825980ca31
2 changed files with 88 additions and 6 deletions
|
@ -379,7 +379,12 @@ const <name>: <type> = <value>
|
||||||
```
|
```
|
||||||
const foo: String = "foo"
|
const foo: String = "foo"
|
||||||
const bar: Int32 = 12
|
const bar: Int32 = 12
|
||||||
record Foo(x: String, y: Int32)
|
|
||||||
|
record Foo
|
||||||
|
x: String,
|
||||||
|
y: Int32,
|
||||||
|
end record
|
||||||
|
|
||||||
const baz: Foo = Foo(foo, bar)
|
const baz: Foo = Foo(foo, bar)
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -391,15 +396,29 @@ where input of type `A` produces a result of type `B`.
|
||||||
|
|
||||||
### Functions Without Arguments
|
### Functions Without Arguments
|
||||||
|
|
||||||
Technically, there are _no_ functions without arguments in Ava. However, the
|
Technically, there are _no_ functions without arguments in Ava. All functions
|
||||||
`Unit` type (the empty tuple) may be used to express that case.
|
are pure, and thus a function without arguments is just a value. The `Unit` type
|
||||||
|
can be used as a "nothing" argument, as it's a singleton object.
|
||||||
|
|
||||||
```
|
```
|
||||||
fn example: Unit -> Int32
|
given A
|
||||||
λ _ => 10
|
record IO
|
||||||
|
thunk: Unit -> A
|
||||||
|
end record
|
||||||
|
|
||||||
|
given A
|
||||||
|
fn io_new: (Unit -> A) -> IO A
|
||||||
|
λ thunk => IO(thunk = thunk)
|
||||||
end fn
|
end fn
|
||||||
|
|
||||||
let demonstrate: Int32 = example ()
|
fn demonstrate: Unit -> IO Int32
|
||||||
|
λ () =>
|
||||||
|
block
|
||||||
|
let foo: Int32 = 10
|
||||||
|
let bar: IO Int32 = io_new λ () => foo
|
||||||
|
bar
|
||||||
|
end block
|
||||||
|
end fn
|
||||||
```
|
```
|
||||||
|
|
||||||
### Functions With Multiple Arguments
|
### Functions With Multiple Arguments
|
||||||
|
|
63
docs/sketch-atomics-mutation.md
Normal file
63
docs/sketch-atomics-mutation.md
Normal file
|
@ -0,0 +1,63 @@
|
||||||
|
# Sketch: Atomics and Mutation
|
||||||
|
|
||||||
|
What does it look like to mutate state outside of the scope of a function?
|
||||||
|
|
||||||
|
## Problem Statement
|
||||||
|
|
||||||
|
I want the ability to _modify_, _in-place_, the value of some reference or some
|
||||||
|
value on the stack. I want the ability to do this _outside_ of the scope of a
|
||||||
|
single function.
|
||||||
|
|
||||||
|
## Example Functionality
|
||||||
|
|
||||||
|
What is a `State`? How is a `state_set` implementation possible?
|
||||||
|
|
||||||
|
```
|
||||||
|
fn example: State String -> String -> IO Unit
|
||||||
|
λ state newValue => state_set state newValue
|
||||||
|
end fn
|
||||||
|
```
|
||||||
|
|
||||||
|
## Problem: Thread-Safe Access
|
||||||
|
|
||||||
|
- All access to the `State` "thing" must be thread-safe.
|
||||||
|
|
||||||
|
## Problem: Representation
|
||||||
|
|
||||||
|
- Ava, to this point, has not had any record-mutable state or the notion of such
|
||||||
|
an object.
|
||||||
|
- Ava does not and will not have inheritance (precondition).
|
||||||
|
- Must Ava have a mutable primitive?
|
||||||
|
- How could Ava support mutability without direct access? This implies that
|
||||||
|
something like `mut` as a `record` field modifier is not sufficient.
|
||||||
|
|
||||||
|
## Idea: Support via Modifiers
|
||||||
|
|
||||||
|
The following implementation is incomplete and does not enforce any thread
|
||||||
|
safety, but illustrates how `private` access could help this work.
|
||||||
|
|
||||||
|
Also, it demonstrates that anonymous function syntax needs to be considered.
|
||||||
|
|
||||||
|
```
|
||||||
|
given A
|
||||||
|
record State
|
||||||
|
private mut data: A,
|
||||||
|
end record
|
||||||
|
|
||||||
|
given A
|
||||||
|
fn state_get: State A -> IO A
|
||||||
|
λ state => defer (λ => state.data)
|
||||||
|
end fn
|
||||||
|
|
||||||
|
given A
|
||||||
|
fn state_set: State A -> A -> IO State A
|
||||||
|
λ state newValue => map (defer (λ => state.data = newValue)) (λ => state)
|
||||||
|
end fn
|
||||||
|
|
||||||
|
given A
|
||||||
|
fn state_modify: State A -> (A -> A) -> IO State A
|
||||||
|
λ state f =>
|
||||||
|
map
|
||||||
|
(defer λ => state.data = f state.data)
|
||||||
|
λ => state
|
||||||
|
```
|
Loading…
Add table
Reference in a new issue