Switch to dark mode

learn

Extending Data

Lemma has no separate type system. Types are declared inline on Data slots and extended with -> commands. This chapter covers declaring parent types and reusing them across Specs.

Declaring parent types

Declare a primitive or parent Data name on the right-hand side, then chain -> Data commands. Other Data extend it by naming it:

spec warehouse_types

data money: measure
  -> unit eur 1.00
  -> unit usd 0.91
  -> decimals 2
  -> minimum 0 eur

data mass: measure
  -> unit kilogram 1.0
  -> unit gram 0.001
  -> unit pound 0.453592

data price:  100 eur
data weight: 75 kilogram

Reuse across Specs

Import a Spec with Uses and reference its Data declarations as parent types via qualified paths (alias.field):

spec base_types

data currency: text
  -> option "EUR"
  -> option "USD"

data rate: ratio
  -> maximum 100%


spec checkout

uses base: base_types

data payment_currency: base.currency
data discount_rate: base.rate
  -> maximum 50%

The imported data currency declaration becomes the type for payment_currency; the local slot can add further constraints (-> maximum 50% on discount_rate).

See Extending Data in the language reference for the full list of Data commands.

Next up

Composing Specs: Uses, temporal versions, planning checks, repositories, and the registry.