<pre class="coursera-course-heading" data-msg="coursera-course-about"><span style="font-size: medium;"><em>About the Subject</em></span></pre>
<div class="coursera-course-detail" data-user-generated="data-user-generated">Learn many of the concepts that underlie all programming languages. Develop a programming style known as functional programming and contrast it with object-oriented programming. Through experience writing programs and studying three different languages, learn the key issues in designing and using programming languages, such as modularity and the complementary benefits of static and dynamic typing. This course is neither particularly theoretical nor just about programming specifics &ndash; it will give you a framework for understanding how to use language constructs effectively and how to design correct and elegant programs. By using different languages, you learn to think more deeply than in terms of the particular syntax of one language. The emphasis on functional programming is essential for learning how to write robust, reusable, composable, and elegant programs &ndash; in any language.</div>
<h2 class="coursera-course-detail" data-user-generated="data-user-generated">&nbsp;</h2>
<pre class="coursera-course-detail" data-user-generated="data-user-generated"><span style="font-size: medium;"><em>&nbsp;Course Syllabus</em></span></pre>
<div class="coursera-course-detail" data-user-generated="data-user-generated">
<ul>
<li>Syntax vs. semantics vs. idioms vs. libraries vs. tools</li>
<li>ML basics (bindings, conditionals, records, functions)</li>
<li>Recursive functions and recursive types</li>
<li>Benefits of no mutation</li>
<li>Algebraic datatypes, pattern matching</li>
<li>Tail recursion</li>
<li>First-class functions and function closures</li>
<li>Lexical scope</li>
<li>Equivalence and effects</li>
<li>Parametric polymorphism and container types</li>
<li>Type inference</li>
<li>Abstract types and modules</li>
<li>Racket basics</li>
<li>Dynamic vs. static typing</li>
<li>Implementing languages, especially higher-order functions</li>
<li>Macro</li>
<li>Ruby basics</li>
<li>Object-oriented programming</li>
<li>Pure object-orientation</li>
<li>Implementing dynamic dispatch</li>
<li>Multiple inheritance, interfaces, and mixins</li>
<li>OOP vs. functional decomposition and extensibility</li>
<li>Subtyping for records, functions, and objects</li>
<li>Subtyping</li>
<li>Class-based subtyping</li>
<li>Subtyping vs. parametric polymorphism; bounded polymorphism</li>
</ul>
</div>