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.