Ruby, Python, and Typescript use metaprogramming rather heavily. They lack the homoiconic property of lisps, but they can do both higher-order functions and monkey-patching.
Meta-heavy code usually offers a nice DSL, but is proportionally harder to drill down through.