From my mastodon feed: @millihertz@oldbytes.space: so i just saw this example given as a reason why concatenative languages tend to be called "write-only": f x y z = y¬≤ + x¬- |y| : f drop dup dup * swap abs rot3 dup * swap - + ; ... snipped ... He ends up writing the following: lastly, nobody would ever write Forth like that anyway! : ¬≤+ dup * swap dup * + ; : y¬≤+x¬≤-|y| ( y x -- result ) tuck ¬≤+ swap abs - ; Given a dislike of stack shufflers, a Retro implementation could be: :f [ [ n:square ] bi@ + ] sip n:abs - ; Assuming one knows the combinators, this is pretty straightforward, but doesn't really resemble the original formula. I decided to write a quick set of words to let me convert the original formula into something more recognizable while still being RPN. :f /xyz x: n:square y: n:square + y: n:abs - ; This adds a / sigil that maps stack values to an internal set of variables, whose values are returned by words with the variable names followed by a colon. The code follows. ~~~ 'Vars d:create #256 allot 'abcdefghijklmnopqrstuvwxyz s:keep [ dup ':%c:_&Vars_$%c_+_fetch_; s:format s:evaluate ] s:for-each :sigil:/ s:reverse [ 'liliadst i , &Vars , ] s:for-each ; immediate ~~~ And the test case: ``` :f /xyz x: n:square y: n:square + y: n:abs - ; #33 #12 #301 f n:put ```