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

7.7 KiB

Delete

The delete command can delete both terms and types.

First, let's make sure it complains when we try to delete a name that doesn't exist.

.> delete.verbose foo

  ⚠️
  
  The following names were not found in the codebase. Check your spelling.
    foo

Now for some easy cases. Deleting an unambiguous term, then deleting an unambiguous type.

foo = 1
structural type Foo = Foo ()
.> add

  ⍟ I've added these definitions:
  
    structural type Foo
    foo : Nat

.> delete.verbose foo

  Removed definitions:
  
    1. foo : Nat
  
  Tip: You can use `undo` or `reflog` to undo this change.

.> delete.verbose Foo

  Removed definitions:
  
    1. structural type Foo
  
  Tip: You can use `undo` or `reflog` to undo this change.

.> delete.verbose Foo.Foo

  Removed definitions:
  
    1. Foo.Foo : '#089vmor9c5
  
  Tip: You can use `undo` or `reflog` to undo this change.

How about an ambiguous term?

foo = 1
  ☝️  The namespace .a is empty.

.a> add

  ⍟ I've added these definitions:
  
    foo : ##Nat

foo = 2
  ☝️  The namespace .b is empty.

.b> add

  ⍟ I've added these definitions:
  
    foo : ##Nat

.a> merge .b

  Here's what's changed in the current namespace after the
  merge:
  
  New name conflicts:
  
    1. foo#gjmq673r1v : ##Nat
       ↓
    2. ┌ foo#dcgdua2lj6 : ##Nat
    3. └ foo#gjmq673r1v : ##Nat
  
  Tip: You can use `todo` to see if this generated any work to
       do in this namespace and `test` to run the tests. Or you
       can use `undo` or `reflog` to undo the results of this
       merge.

  Applying changes from patch...

A delete should remove both versions of the term.

.> delete.verbose a.foo

  Removed definitions:
  
    1. a.foo#gjmq673r1v : Nat
  
  Name changes:
  
    Original               Changes
    2. b.foo            ┐  3. a.foo#dcgdua2lj6 (removed)
    4. a.foo#dcgdua2lj6 ┘  
  
  Tip: You can use `undo` or `reflog` to undo this change.

  ☝️  The namespace .a is empty.

.a> ls

  nothing to show

Let's repeat all that on a type, for completeness.

structural type Foo = Foo ()
.a> add

  ⍟ I've added these definitions:
  
    structural type Foo

structural type Foo = Foo
.b> add

  ⍟ I've added these definitions:
  
    structural type Foo

.a> merge .b

  Here's what's changed in the current namespace after the
  merge:
  
  New name conflicts:
  
    1. structural type Foo#089vmor9c5
       ↓
    2. ┌ structural type Foo#00nv2kob8f
    3. └ structural type Foo#089vmor9c5
    
    4. Foo.Foo#089vmor9c5#0 : 'Foo#089vmor9c5
       ↓
    5. ┌ Foo.Foo#00nv2kob8f#0 : ()
    6. └ Foo.Foo#089vmor9c5#0 : 'Foo#089vmor9c5
  
  Tip: You can use `todo` to see if this generated any work to
       do in this namespace and `test` to run the tests. Or you
       can use `undo` or `reflog` to undo the results of this
       merge.

  Applying changes from patch...

.> delete.verbose a.Foo

  Removed definitions:
  
    1. structural type a.Foo#089vmor9c5
  
  Name changes:
  
    Original               Changes
    2. b.Foo            ┐  3. a.Foo#00nv2kob8f (removed)
    4. builtin.Unit     │  
    5. a.Foo#00nv2kob8f ┘  
  
  Tip: You can use `undo` or `reflog` to undo this change.

.> delete.verbose a.Foo.Foo

  Removed definitions:
  
    1. a.Foo.Foo#089vmor9c5#0 : '#089vmor9c5
  
  Name changes:
  
    Original                     Changes
    2. b.Foo.Foo              ┐  3. a.Foo.Foo#00nv2kob8f#0 (removed)
    4. builtin.Unit.Unit      │  
    5. a.Foo.Foo#00nv2kob8f#0 ┘  
  
  Tip: You can use `undo` or `reflog` to undo this change.

Finally, let's try to delete a term and a type with the same name.

foo = 1
structural type foo = Foo ()
.> add

  ⍟ I've added these definitions:
  
    structural type foo
    foo : Nat

.> delete.verbose foo

  Removed definitions:
  
    1. structural type foo
    2. foo : Nat
  
  Tip: You can use `undo` or `reflog` to undo this change.

We want to be able to delete multiple terms at once

a = "a"
b = "b"
c = "c"
.> add

  ⍟ I've added these definitions:
  
    a : Text
    b : Text
    c : Text

.> delete.verbose a b c

  Removed definitions:
  
    1. a : Text
    2. b : Text
    3. c : Text
  
  Tip: You can use `undo` or `reflog` to undo this change.

We can delete terms and types in the same invocation of delete

structural type Foo = Foo ()
a = "a"
b = "b"
c = "c"
.> add

  ⍟ I've added these definitions:
  
    structural type Foo
    a : Text
    b : Text
    c : Text

.> delete.verbose a b c Foo

  Removed definitions:
  
    1. structural type Foo
    2. a : Text
    3. b : Text
    4. c : Text
  
  Tip: You can use `undo` or `reflog` to undo this change.

.> delete.verbose Foo.Foo

  Name changes:
  
    Original      Changes
    1. Foo.Foo ┐  2. Foo.Foo (removed)
    3. foo.Foo ┘  
  
  Tip: You can use `undo` or `reflog` to undo this change.

We can delete a type and its constructors

structural type Foo = Foo ()
.> add

  ⍟ I've added these definitions:
  
    structural type Foo

.> delete.verbose Foo Foo.Foo

  Removed definitions:
  
    1. structural type Foo
  
  Name changes:
  
    Original      Changes
    2. Foo.Foo ┐  3. Foo.Foo (removed)
    4. foo.Foo ┘  
  
  Tip: You can use `undo` or `reflog` to undo this change.

You should not be able to delete terms which are referenced by other terms

a = 1
b = 2
c = 3
d = a + b + c
.> add

  ⍟ I've added these definitions:
  
    a : Nat
    b : Nat
      (also named b.foo)
    c : Nat
    d : Nat

.> delete.verbose a b c

  ⚠️
  
  I didn't delete the following definitions because they are
  still in use:
  
  Dependency   Referenced In
  c            1. d
               
  a            2. d

But you should be able to delete all terms which reference each other in a single command

e = 11
f = 12 + e
g = 13 + f
h = e + f + g
.> add

  ⍟ I've added these definitions:
  
    e : Nat
    f : Nat
    g : Nat
    h : Nat

.> delete.verbose e f g h

  Removed definitions:
  
    1. e : Nat
    2. f : Nat
    3. g : Nat
    4. h : Nat
  
  Tip: You can use `undo` or `reflog` to undo this change.

You should be able to delete a type and all the functions that reference it in a single command

structural type Foo = Foo Nat

incrementFoo : Foo -> Nat
incrementFoo = cases
  (Foo n) -> n + 1
.> add

  ⍟ I've added these definitions:
  
    structural type Foo
    incrementFoo : Foo -> Nat

.> delete.verbose Foo Foo.Foo incrementFoo

  Removed definitions:
  
    1. structural type Foo
    2. Foo.Foo      : Nat -> #68k40ra7l7
    3. incrementFoo : #68k40ra7l7 -> Nat
  
  Tip: You can use `undo` or `reflog` to undo this change.

If you mess up on one of the names of your command, delete short circuits

e = 11
f = 12 + e
g = 13 + f
h = e + f + g
.> add

  ⍟ I've added these definitions:
  
    e : Nat
    f : Nat
    g : Nat
    h : Nat

.> delete.verbose e f gg

  ⚠️
  
  The following names were not found in the codebase. Check your spelling.
    gg

Cyclical terms which are guarded by a lambda are allowed to be deleted

ping _ = 1 Nat.+ !pong
pong _ = 4 Nat.+ !ping
.> add

  ⍟ I've added these definitions:
  
    ping : 'Nat
    pong : 'Nat

.> delete.verbose ping

  Removed definitions:
  
    1. ping : 'Nat
  
  Tip: You can use `undo` or `reflog` to undo this change.

.> view pong

  pong : 'Nat
  pong _ =
    use Nat +
    4 + !#l9uq1dpl5v.1