E01084: prefix operator used in suffix position - place BEFORE expression
What went wrong
You're using a PREFIX operator in SUFFIX position. PREFIX operators must come BEFORE the expression they operate on.
EK9 has several prefix operators that extract values or transform expressions:
- #< (first/prefix) - extracts first element: #< list
- #> (last/suffix) - extracts last element: #> list
- $ (string) - converts to string: $value
- $$ (JSON) - converts to JSON: $$value
- #? (hashcode) - gets the hash code: #? value (the length is 'length')
- #^ (promote) - type promotion: #^ value
- ~ (negate/reverse) - negates or reverses: ~ list
- not (boolean negate) - negates boolean: not condition
- abs (absolute) - absolute value: abs number
- sqrt (square root) - square root: sqrt number
- empty (empty check) - checks if empty: empty collection
- length (length) - gets length: length collection
Worked examples
Compilable examples demonstrating this error and the correct fix:
- ek9 -q 794 (Why does EK9 care about operator placement (prefix vs suf...)
Common causes
- Coming from languages where such operators are postfix (Ruby's .first, .last)
- Confusing '#<' (prefix/first) naming with its syntactic position
- Muscle memory from other operator positions
How to fix it
Move the operator to BEFORE the expression:
- list#< --> #< list
- value$ --> $value
- collection#? --> #? collection
Or use the equivalent method call if available.
See also
- E01085: Suffix operator used in prefix position
- https://ek9.io/operators.html
Examples
Every example is compiled by the EK9 compiler: the first fails exactly as captioned, the others fix it.
Fails with E01084: prefix operator used in suffix position - place BEFORE expression
#!ek9 defines module error.e01084.bad defines function firstLetter() -> name as String <- rtn as Character: name #<
Fixed: Put the prefix operator before the expression: #< name
#!ek9 defines module error.e01084.good defines function firstLetter() -> name as String <- rtn as Character: #< name
Questions and answers
These Q&A entries show E01084 and its fix: