Skip to content

Structs

tim-hardcastle edited this page Sep 23, 2024 · 8 revisions

In this page we will discuss the struct type, its constructors, and its operations.

Defining structs

As an example, consider the file examples/struct.pf.

newtype

Person = struct(name string, age int)
Cat = struct(name string, nobelPrizes int, pink bool)
CatOwner = struct(name string, pet Cat)

const

CAT_DEFAULTS = nobelPrizes::0, pink::false

var

doug = Person "Douglas", 42
joe = Person with name::"Joseph", age::22
tom = Person with age::49, name::"Thomas"
myCat = Cat with name::"Felix", CAT_DEFAULTS
me = CatOwner("Tim", myCat)
myField = name

The struct type is defined in the newtype section of the script, as for example Person = struct(name string, age int). This creates the Person type and specifies the types of its fields. It also supplies us with a "short constructor" of the form Person <name>, <age>, and a "long constructor" of the form Person with name::<name>, age::<age>, where the fields come in any order. As we will see later on, functions can be overloaded, and this includes the short constructor.

User-defined types should be named in PascalCase.

Let's demonstrate in the REPL that the script above does what you think it would do.

→ hub run "examples/struct.pf" as "Struct" 
Starting script 'examples/struct.pf' as service 'Struct'.
Struct → doug
Person with (name::Douglas, age::42)
Struct → me                             
CatOwner with (name::Tim, pet::Cat with (name::Felix, nobelPrizes::0, pink::false))
Struct →   

Indexing structs

Structs are indexed using square brackets, just like everything else in Pipefish. The fields of structs are first-class objects. Let's demonstrate in the REPL:

Struct → doug[age]                                                                           
42
Struct → me[pet][pink] 
false
Struct → tom[myField] 
Thomas
Struct → 

with

In common with the list, map, and tuple types, we can use the with keyword to produce an altered copy of a struct:

Struct → doug with age::43 
Person with (name::Douglas, age::43)
Struct → me with [pet, pink]::true
CatOwner with (name::Tim, pet::Cat with (name::Felix, nobelPrizes::0, pink::true))
Struct → joe with name::"Josephine", age::23                                                
Person with (name::Josephine, age::23)
Struct →   
Clone this wiki locally