Word. Agree completely with your comments georgie.
Although there are high level abstract programming ideas that are beyond any particular language, the only true way to learn about them in any practical/actionable sense is to program in a language that can express those ideas.
It's very hard to understand recursion or closures without expressing them out through a language. I don't remember who said it 'but programming is understanding.' Likewise how do I know you understand object oriented programming unless you can program idiomatically in an object oriented language like Smalltalk, Self, or Ruby?
Or how do I know you can program functionally unless you can program idiomatically in a functional language like Scheme, Haskell, or Erlang and not in some hackish, crude way but idiomatically? But in order to program idiomatically and elegantly in the respective languages requires learning libraries, learn the constraints of the language, its quirks, its opinions,etc.
It's very hard to understand recursion or closures without expressing them out through a language. I don't remember who said it 'but programming is understanding.' Likewise how do I know you understand object oriented programming unless you can program idiomatically in an object oriented language like Smalltalk, Self, or Ruby?
Or how do I know you can program functionally unless you can program idiomatically in a functional language like Scheme, Haskell, or Erlang and not in some hackish, crude way but idiomatically? But in order to program idiomatically and elegantly in the respective languages requires learning libraries, learn the constraints of the language, its quirks, its opinions,etc.