APL is truly different from other languages; nearly every language uses lexical scoping to express composition. Both GHC Haskell and GCC/Clang use a stack for variables across procedures because it models how variables become available (FIFO). Putatively different languages are constrained by the same fundamentals.

However, J (and APL) allow tacit programming via forks and trains; manipulating functions (verbs) as first-class citizens via adverbs. One can think of tacit programming as analogous to co├Ârdinate-free treatments of geometry/physics.

This works in practice: Roger Hui gives the following for a histogram:

histogram=: <: @ (#/.~) @ (i.@#@[ , I.)


Joy (and its descendants, concatenative languages) allow programming without need for lexical scoping; atoms are procedures which manipulate a stack. Composition no longer depends on application (as in applicative languages such as Haskell, C) and concatenation is the fundamental operation.

However, concatenative languages are less mainstream and relatively newer than array languages.