Skip to content

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:

if condition:
    ...

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:

condition @@keyword:
    body

This is equivalent to:

keyword condition:
    body

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:

fpy decompile script.py --lang <code> --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.

"postfix_keywords": ["if", "elif", "while", "def", "class"]

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