Skip to content

Structs

tim-hardcastle edited this page Aug 14, 2023 · 10 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.ch".

def

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

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 def 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.

User-defined types should be named in PascalCase.

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

→ hub run "examples/struct.ch" as "Struct" 
Starting script 'examples/struct.ch' 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 Charm. 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 →   

🧿 Pipefish

Clone this wiki locally