It only appears simple because the layers of complexity to achieve that effect are hidden under the language runtime, and you're exposed to just the top of the iceberg.
If you had to build the whole runtime yourself from first principles, functional behaviour would be way simpler to define.