I've been reading through Code Complete, and I just got to the part about Design Patterns. I thought I'd see what questions were popular and tagged design-patterns. I was reading this question, and I agree with what seems to be the consensus there, that Design Patterns exist to address the limits of a paradigm (Functional, Object-Oriented, etc.) or even a language.
I'm a student in a University headed for a Computer Science degree and have been looking for different languages to learn in order to broaden my horizons, and learn something besides OO paradigm languages like Java, C++, etc. (On that list is Haskell, Assembly and/or getting back to C, Factor or Forth, Ocaml, Clojure, Python and/or Ruby, Prolog, Labview, SQL and/or noSQL, and some client-side web stuff like GWT or jquery.) Besides that I thought I could sort through the languages and find one, or a few that I would most like to program in/find a job in and learn those after / while broadening the horizons. (Using criteria in the same vein as these, my list at the moment is Clojure, Ocaml, Scala, Python)
After reading that question I wondered if there was another criterion to compare the power/utility/IWouldReallyPreferToProgramInThisLanguage-ness. If I'm not totally off-base, the smaller the amount of Design Patterns left unsolved or unimplemented by the language or paradigm, the more helpful it would be to programming productivity, readability, expressive power, etc. For example, apparently Scala implements a solution to the Singleton pattern:
In Scala, you have a top level construct called Object in addition to Class. It's lazily instantiated and there is only one. You don't have to use the Singleton pattern to get a Singleton. It's part of the language. --Dan Sickles
or see Ben James' post on the same feature.
I'm not talking strictly about GoF's design patterns here, but anything that can be codified into a useful design pattern.
So I guess I have two major questions.
Does a language or paradigm that requires you to use or implement, on your own, fewer Design Patterns provide noticeable benefits to ease of coding / readability / more or better abstractions / less troublesome to debug / more expressive power / less boilerplate etc.? If so, in which way(s)?
If this does provide benefits, which languages require you to use / implement the fewest design patterns? If not, what are the important things a high level language can do to make using good design practices (like Design patterns) easier? I think that this can be an objective question.
I do realize that this may be difficult to compare because of the difference between the core language and the myriad of libraries that surround it. I would personally eliminate libraries with many conflicting implementations that avoid the same problems / design patterns for 2 reasons.
I would think that more than one way to solve the same problem would (a) make it hard for a programmer in a team to understand what is going on when his preferred implementation is not used, and (b) make it more difficult in general to choose the most robust / supported solution among many options.
I guess in order for question two to be objective there would have to be some objective guidelines to decide whether to allow / forbid a library to be counted as solving / implementing a design pattern that the core language does not, but don't punish me for trying. :)
Related questions: Your criteria in using a new technology or programming language
Programming Languages and Design Patterns
Are design patterns really language weaknesses?
Language-integrated design patterns
Are Design patterns specific to Language or Technology?
Final Note: As this is my first question on Stack Overflow, please let me know If I need to change something, or, if you can, feel free to change it for me.