Typically with an information system there are two ways of writing systems - one is predominantly through mutating queries and the other is through manipulation of objects in memory such as references between objects. ORMs blur the lines a bit. What if we could silently transform one form to another
In big microservice based systems or systems with lots of protocols, you often need to make a change that ripples out through the entire system. If you have X services you send a message between them you have X message schemas. Let's manage the schemas centrally
With computers we often have different places to place data that determines how fast or how large the data is. For example, we have the stack, main memory, virtual memory, page files, disk files, buffers, heap, S3, SANs, NFS. Can we create an abstraction that captures the differences of each of these kinds of storage and allows efficient management of each of them and switching between them so that there is an illusion that memory is infinite but efficient. For example, you might want to load chunks from S3 efficiently into main memory and cached on disk.
Imagine you have a reference implementation of a btree and a reference implementation of a locking manager and a security manager and you want to tie them together. You could add code calls from one to the other but what if there is a better way? The better way for extensibility is to match stack function calldepths to code snippets that run whenever the pattern is matched. For example when a btree is split you might want to acquire locks or release locks in a certain order. We can do pattern matching around the callsite of a btree split and return values and do the right locking and security behaviours without needing to change the API of either. Essentially you have parallel multiple return values.