- Concurrency, interactivity, and mutability are three desirable features in programming, but it is impossible to have all three simultaneously without trade-offs.
- Dropping interactivity (as in C, Rust, Go) ensures safety and performance but removes the ability to inspect or modify programs at runtime.
- Dropping concurrency via a Global Interpreter Lock (GIL) in languages like Python and Ruby allows safe interactivity and mutability but introduces performance overhead from locking all data accesses.
- Dropping mutability (as in Erlang) uses message passing with copied values for safe concurrency and interactivity, but copying data is slow and incurs performance costs.
- Common Lisp allows all three but requires careful management to avoid data corruption when interacting with concurrent threads via the REPL.