I'd like to explore specific esoteric programming language features, so I wouldn't mind if the next language I learn has some of them. Specific things I consider a plus:
| Javascript | Lua | Perl 5 | Perl 6 | PHP | Python | Ruby | Java | JVM | C# | CLR | Scheme | Haskell | OCaml | Clojure | Scala | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| I'm leaning towards (out of 5) | 5 | 4 | 5 | 4 | 3 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| threshold for consideration | ** | ** | ** | ** | ** ** | ** | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Other bits | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| dynamic or static typing? | D | D | D | D | D | D | D | S | - | S | - | D | S | S | D | S | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| purely functional language | N | N | N | N | N | N | N | N | - | N | - | Y | Y | N, N | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| code-as-data, e.g. Lisp-like syntax | N | N | N | N | N | N | N | - | N | - | Y | N | N | Y | N | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| lazy evaluation | Y | sorta | N? | N? | Y | Y | Y? | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Functional programming bits | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| closures | Y | Y | Y | Y | v5.3 | Y | Y | not yet | WkAr | Y | Y | Y | Y | Y | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| serializable closures | module | Y | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Lisp-style macros | Y | N | Y | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| other metaprogramming | patch | barely sorta | Y | sorta | - | N | - | Y, Y | WkAr | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| first-class functions | Y | Y | N | Y | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| anonymous functions | Y | sorta | N | Y | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| higher-order functions | Y | Y | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| formally recognizes pure functions | N? | N | v4.0? | Y | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| tail call optimization | N | Y | N | N | N | Y | N | N | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Coroutines/generators/continuations | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| first-class continuations | N | N | N | Y | patch | v1.9 | N | N | Y | Y | patch | N | v2.8 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| coroutines (send) (controllable fibers) | N | Y | N | Y | Y, more | v1.9 | N | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| generators (receive) | v1.7 | Y | v2.5 | Y | N | Y | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Multithreading | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| usable threads? | N | Y | Y | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| true concurrency | N | Y | Y | Y | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - | not applicable |
| WkAr | a (possibly imperfect) workaround exists |
| a VM (that could support many different languages), not just one specific language |