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
breakandcontinue— build them from labelled blocks andexit; -
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.