Why must EK9 constructs be used in their valid context?
← Syntax and Structure Rules · Ref: Q952
Language constructs must be used in their valid context.
EK9 enforces that constructs appear only where they are valid:
VALID CONTEXTS
'defines class' — inside module, contains classes 'defines function' — inside module, contains functions 'defines record' — inside module, contains records 'defines trait' — inside module, contains traits 'defines service' — inside module, contains services 'defines program' — inside module, contains programs 'defines constant' — inside module, contains constants 'defines application' — inside module, contains applications
STRUCTURE
Every .ek9 file starts with 'defines module <name>' and contains one or more 'defines <section>' blocks. Each section can only contain its declared construct type.
See Q725 for class body ordering. See Q726 for module reference syntax. See Q893 for section headers.
Example
#!ek9 defines module qa.syntax.wrongcontext defines class <?- Classes go in 'defines class' section. -?> Point x <- Float() y <- Float() default private Point() as pure Point() as pure -> x as Float y as Float this.x :=: x this.y :=: y default operator <=> default operator $ default operator :=: override operator ? as pure <- rtn as Boolean: x? and y? defines program ConstructContextDemo() stdout <- Stdout() p1 <- Point(3.0, 4.0) p2 <- Point(3.0, 4.0) stdout.println(`p1: ${p1}`) stdout.println(`p1 == p2: ${p1 == p2}`) stdout.println("Each section holds its own construct type")
Common mistakes
E09010 — Using a type name like 'Point' directly as a value expression is inappropriate. Types are not values. See ek9 -h E09010 for details.
Incorrect:
stdout.println(Point)
Correct:
stdout.println(`p1: ${p1}`)
Other ways to ask this
- What triggers E09010 CONSTRUCT_IN_WRONG_CONTEXT?
- Why can't I define a class inside a function?
- Where can I place different construct types?
Coming from another language?
Java: class inside method is allowed (local class). Python: class inside function allowed. Rust: impl blocks must be at module level. Go: type definitions at package level. EK9: strict section-based structure, each section contains only its declared construct type.
Keywords: E09010, class, construct, context, function, module, placement, record, section, structure