unison/unison-src/transcripts/suffixes.output.md

170 lines
3.7 KiB
Markdown
Raw Permalink Normal View History

# Suffix-based resolution of names
Any unique name suffix can be used to refer to a definition. For instance:
``` unison
-- No imports needed even though FQN is `builtin.{Int,Nat}`
foo.bar.a : Int
foo.bar.a = +99
-- No imports needed even though FQN is `builtin.Optional.{None,Some}`
optional.isNone = cases
None -> true
Some _ -> false
```
2020-03-19 21:30:30 +03:00
This also affects commands like find. Notice lack of qualified names in output:
``` ucm
scratch/main> add
2020-03-19 21:30:30 +03:00
⍟ I've added these definitions:
2020-02-25 02:40:54 +03:00
2020-03-19 21:30:30 +03:00
foo.bar.a : Int
optional.isNone : Optional a -> Boolean
scratch/main> find take
1. builtin.Bytes.take : Nat -> Bytes -> Bytes
2. builtin.List.take : Nat -> [a] -> [a]
3. builtin.Text.take : Nat -> Text -> Text
4. builtin.io2.MVar.take.impl : MVar a ->{IO} Either Failure a
5. builtin.io2.MVar.tryTake : MVar a ->{IO} Optional a
2020-02-25 02:40:54 +03:00
2020-03-19 21:18:56 +03:00
```
2020-03-19 21:30:30 +03:00
The `view` and `display` commands also benefit from this:
2020-03-19 21:18:56 +03:00
``` ucm
scratch/main> view List.drop
2020-03-19 21:18:56 +03:00
2021-09-28 00:25:23 +03:00
builtin builtin.List.drop : builtin.Nat -> [a] -> [a]
2020-03-19 21:18:56 +03:00
scratch/main> display bar.a
2020-03-19 21:30:30 +03:00
+99
```
In the signature, we don't see `base.Nat`, just `Nat`. The full declaration name is still shown for each search result though.
Type-based search also benefits from this, we can just say `Nat` rather than `.base.Nat`:
``` ucm
scratch/main> find : Nat -> [a] -> [a]
1. builtin.List.drop : Nat -> [a] -> [a]
2. builtin.List.take : Nat -> [a] -> [a]
2020-02-25 02:40:54 +03:00
2022-04-07 08:42:59 +03:00
```
2024-03-19 19:56:03 +03:00
## Preferring names not in `lib.*.lib.*`
2022-04-07 08:42:59 +03:00
2024-03-19 19:56:03 +03:00
Suffix-based resolution prefers names that are not in an indirect dependency.
2022-04-07 08:42:59 +03:00
``` unison
2022-04-07 08:42:59 +03:00
cool.abra.cadabra = "my project"
lib.distributed.abra.cadabra = "direct dependency 1"
lib.distributed.baz.qux = "direct dependency 2"
lib.distributed.lib.baz.qux = "indirect dependency"
```
``` ucm
2022-04-07 08:42:59 +03:00
Loading changes detected in scratch.u.
2022-04-07 08:42:59 +03:00
I found and typechecked these definitions in scratch.u. If you
do an `add` or `update`, here's how your codebase would
change:
⍟ These new definitions are ok to `add`:
cool.abra.cadabra : Text
lib.distributed.abra.cadabra : Text
lib.distributed.baz.qux : Text
lib.distributed.lib.baz.qux : Text
```
``` ucm
scratch/main> add
2022-04-07 08:42:59 +03:00
⍟ I've added these definitions:
cool.abra.cadabra : Text
lib.distributed.abra.cadabra : Text
lib.distributed.baz.qux : Text
lib.distributed.lib.baz.qux : Text
2024-03-19 19:56:03 +03:00
```
``` unison
2024-03-19 19:56:03 +03:00
> abra.cadabra
```
``` ucm
2024-03-19 19:56:03 +03:00
Loading changes detected in scratch.u.
I couldn't figure out what abra.cadabra refers to here:
1 | > abra.cadabra
The name abra.cadabra is ambiguous. I couldn't narrow it down
by type, as any type would work here.
I found some terms in scope that have matching names and
types. Maybe you meant one of these:
cool.abra.cadabra : Text
distributed.abra.cadabra : Text
2024-03-19 21:48:27 +03:00
```
``` unison
2024-03-19 21:48:27 +03:00
> baz.qux
```
``` ucm
2024-03-19 21:48:27 +03:00
Loading changes detected in scratch.u.
scratch.u changed.
Now evaluating any watch expressions (lines starting with
`>`)... Ctrl+C cancels.
1 | > baz.qux
"direct dependency 2"
2022-04-07 08:42:59 +03:00
```
``` ucm
scratch/main> view abra.cadabra
2022-04-07 08:42:59 +03:00
cool.abra.cadabra : Text
cool.abra.cadabra = "my project"
2024-03-19 19:56:03 +03:00
lib.distributed.abra.cadabra : Text
lib.distributed.abra.cadabra = "direct dependency 1"
2022-04-07 08:42:59 +03:00
scratch/main> view baz.qux
2022-04-07 08:42:59 +03:00
lib.distributed.baz.qux : Text
lib.distributed.baz.qux = "direct dependency 2"
```
Note that we can always still view indirect dependencies by using more name segments:
``` ucm
scratch/main> view distributed.abra.cadabra
2022-04-07 08:42:59 +03:00
lib.distributed.abra.cadabra : Text
lib.distributed.abra.cadabra = "direct dependency 1"
scratch/main> names distributed.lib.baz.qux
2022-04-07 08:42:59 +03:00
Term
Hash: #nhup096n2s
Names: lib.distributed.lib.baz.qux
```