Skip to content

With and without

tim-hardcastle edited this page Sep 10, 2024 · 1 revision

with

In Pipefish, all values are immutable. You cannot change the nth item of a list or struct, or add a key to a map, or change the value associated with an existing key. Instead, you can ask Pipefish for a copy of the list/map/struct with an element or elements changed. Let's demonstrate in the REPL with lists.

→ ["a", "b", "c", ["d", "e"]] with 1::"x"         
[a, x, c, [d, e]]
→ ["a", "b", "c", ["d", "e"]] with 1::"x", 2::"y" 
[a, x, y, [d, e]]
→ 

Or by using a list of indexes, you can copy-and-change an element of an element, etc:

→ ["a", "b", "c", ["d", "e"]] with [3, 1]::"z"    
[a, b, c, [d, z]]     
→                                                                                  →

And the same works for keys and maps, and with labels and structs. E.g.

→ map("a"::[0, 1], "b"::[2, 3]) with ["b", 1]::42
map("a"::[0, 1], "b"::[2, 42])
→ 

without

The without operator for maps returns a copy of the map with the given key or keys removed.

→ map(1::"a", 2::"b", 3::"c") without 2 
map (1::a, 3::c)
→ map(1::"a", 2::"b", 3::"c") without 1, 3 
map (2::b)
→

No error is returned if the key is not in the map: Pipefish consistently treats deletion as an idempotent operation.

Clone this wiki locally