Recently, I’ve been looking to send email from erlang. Despite all the cool things it does, its INets library doesn’t have an SMTP client in it. Trapexit happened to be down this week, so I ended up hunting around on the web (next time, I should just ask on newsgroups).
I found ErlMail as part of an Erlang Software Framework suite, and it had a simple SMTP client in it. I was glad I didn’t have to write one myself, but I found it didn’t do authentication. it was written cleanly enough that I was able to patch in authentication without much of a problem, and submitted it to the maintainer.
The short experience made me pretty thankful that SMTP protocol is in plain text, rather than bit-packed. Since much of our general purpose languages are pretty good at manipulating text, it’s comparatively easy to interface with it and write a wrapper for it.
However, it’s a pity that for every new language that comes out, a new wrapper must be written for an SMTP client. Same goes for REST/SOAP interfaces for any number of APIs that we see out there, from Google maps to facebook apps.
Part of the problem is the mismatch in syntax of the protocol/interface and the language the programmer is working in. Simply looking at REST interfaces, there’s no programming language that makes native method calls like /post?title=32?body=f1rst%20post. Not that would make sense to do so since there are other RPC (remote procedure call) protocols too.
The only way I can see out of it is for a language(or library) dynamically generate code that maps a native call syntax to a RPC syntax. For every new type of RPC interface (REST, SOAP, JSON, etc.), we’d have a single file that describes the mapping. Then, when a new service or platform comes out with a REST interface, you don’t need to write a new wrapper for that interface.
However, lots of languages have different method invocation capabilities. Some need types to arguments, others can take first class functions or blocks, and still others can take an unknown number of arguments. I don’t think it would be easy, but it’d be nice to have so we stop wasting our time writing interface wrappers. Maybe Lisp was on to something when it said code is data and data is code.