Postfix Syntax
Postfix Syntax¶
Some languages are SOV — subject-object-verb — meaning the condition naturally comes before the keyword rather than after it. ForeignThon supports this with the @@ operator.
The problem¶
In English-order Python, the keyword always comes first:
In many languages, the natural order is the opposite — the condition is stated first, then the action. Forcing English word order on these languages makes the code feel unnatural.
The solution¶
The @@ operator lets you put any keyword after its expression:
This is equivalent to:
Both produce identical compiled Python. @@ is purely a source-level syntax — it is processed before tokenization and never appears in the output.
Rules¶
@@rewrites only the line it appears on — nothing else changes- Indentation follows standard Python rules, unchanged
- Prefix and postfix can be mixed freely in the same file
- Works for any keyword in any language pack
@@is not valid Python syntax, so it never conflicts with existing code
Supported constructs¶
| Construct | Prefix | Postfix |
|---|---|---|
| if | keyword condition: |
condition @@keyword: |
| elif | keyword condition: |
condition @@keyword: |
| while | keyword condition: |
condition @@keyword: |
| def | keyword name(args): |
name(args) @@keyword: |
| class | keyword Name: |
Name @@keyword: |
| for | keyword var in iter: |
var @@in_kw iter @@for_kw: |
Note
for loops with postfix require two @@ operators and can be complex. Most users keep for in prefix style.
Decompile with postfix¶
When converting Python back to a foreign language, pass --postfix:
Which keywords get rewritten is controlled by the postfix_keywords list in the language pack JSON. A language that uses SVO order sets this to [] — postfix output is never forced on languages that don't need it.
Input vs output¶
| Direction | Mechanism | Controlled by |
|---|---|---|
Input (writing .xx.py) |
@@ in source |
Always available for any keyword |
Output (fpy decompile --postfix) |
Pack's postfix_keywords |
Language pack author |