Tom asked for a &quot;layman&#39;s&quot; explanation of the &quot;expression&quot; problem.<br><br>In a nutshell:<br><br>You can think of a large program as being comprised of new datatypes, and functions that operate on those datatypes.&nbsp; As a programmer, maintaining and extending an existing program, you typically want to do one of two things:<br>
1.&nbsp; Add a new function that applies to the datatypes in your program.<br>2.&nbsp; Add a new datatype that can be manipulated by the functions in your program.<br><br>The goal is to add these new elements without having to rewrite your well-tested programming components that have already been developed.<br>
<br>At the risk of oversimplifiying, functional programming makes it relatively easy to add new functions without modifying the other components of your program (but if you add a new datatype, you have to modify existing code by adding a new &quot;cond&quot; branch to all your functions that need to operate on this datatype).<br>
<br>On the other hand, object-oriented programming makes it relatively easy to add new datatypes (aka objects) without modifying the other components of your program (but to add a new function, you have to edit the source of your existing objects to add a new &quot;method&quot; to those objects that will need to be able to handle this new functionality).<br>
<br>One of the grand challenges of programming language design is to create a programming language that makes it equally easy to do both.&nbsp; This is called the expression problem.<br><br>In my view, this problem has been most satisfactorily solved by &quot;multiple-dispatch&quot; (aka multimethod) object-oriented languages (like Dylan, inspired by CLOS), but for various reasons, this solution hasn&#39;t really caught on.&nbsp; But the quest to solve this problem is why many OO languages are being stretched to incorporate elements of functional programming, and vice versa.<br>
<br>The PLT folks have used the expression problem as a springboard for thinking about big issues like, what does it mean to be a software component, and what are appropriate ways for reusing and extending a software component.<br>
<br>--Mark<br>