Classes

As of v4, KERN has classes — single inheritance, abstract classes, fields, getters, setters, and static members. One definition compiles to both TypeScript and Python with identical behavior.

Fields, constructor, methods

A class node holds field, constructor, and method children. Handlers use the portable KERN expression syntax.

class name=Point export=true
  field name=x type=number
  field name=y type=number
  constructor
    param name=x type=number
    param name=y type=number
    handler
      assign target="this.x" value="x"
      assign target="this.y" value="y"
  method name=sum returns=number
    handler
      return value="this.x + this.y"

Single inheritance

Use extends for single inheritance. Call super(...) in the constructor and super.method() from an override.

class name=Animal export=true
  field name=name type=string
  constructor
    param name=name type=string
    handler
      assign target="this.name" value="name"
  method name=describe returns=string
    handler
      return value="`${this.name} is an animal`"
class name=Dog extends=Animal export=true
  constructor
    param name=name type=string
    handler
      do value="super(name)"
  method name=describe returns=string
    handler
      return value="`${super.describe()} (a dog)`"

Abstract classes

Mark a class abstract=true and declare methods with no handler. Concrete subclasses provide the implementation; a base-typed reference dispatches polymorphically to the override on both targets.

class name=Shape abstract=true export=true
  method name=area returns=number
class name=Square extends=Shape export=true
  field name=side type=number value={{ 3 }}
  method name=area returns=number
    handler
      return value="this.side * this.side"

fn name=measure returns=number
  param name=shape type=Shape
  handler
    return value="shape.area()"

Getters, setters, static members

Add getter and setter children for accessors, and static=true for static methods and fields.

class name=Person export=true
  field name=first type=string
  field name=last type=string
  getter name=full returns=string
    handler
      return value="`${this.first} ${this.last}`"

class name=MathBox export=true
  method name=double static=true returns=number
    param name=n type=number
    handler
      return value="n * 2"

Parity and type checking

Class behavior is proven identical across targets by differential conformance fixtures that compile to TypeScript and Python and require the same result. Override variance is Liskov-checked by kern check, which also verifies call-site arity, argument types, and declared returns.