Laurel User Guide

10.1. Features Laurel does not have🔗

Laurel does not model these at all, so a front end must compile them away before or during translation:

  • metaprogramming: macros, reflection, runtime code generation;

  • pattern-matching syntax — use datatype testers and selectors;

  • literal syntax for collections;

  • first-class or higher-order procedure values;

  • modules and imports;

  • dedicated break and continue — build them from labelled blocks and exit;

  • Python-style MRO, or dispatch on anything other than the receiver's runtime type — dispatch on an overridden method is supported, so only rules that differ from it need emitting explicitly;

  • variance through a generic type's arguments — generic types are invariant for now;

  • native separation logic: no separating conjunction, ownership, permissions, heaplets, or reachability;

  • pointers and pointer arithmetic;

  • garbage-collection observability, object deallocation, field deletion, or dynamic field lookup;

  • preemptive concurrency. Cooperative coroutines are supported; see Coroutines.

Laurel's type system is roughly at the level of C#'s, so source type-system features beyond it — higher-kinded types, or advanced generics — also have to be erased or encoded before translation.