I was in touch with him recently, partly to find out why a professor of computer science at St Andrews University would suddenly drop out of computing entirely, and move to writing about space exploration...
I was in touch with him recently, partly to find out why a professor of computer science at St Andrews University would suddenly drop out of computing entirely, and move to writing about space exploration...
Space exploration looks like an interesting endeavor.
"Realising that calculus has actually got nothing at all to do with either differentiation or integration, but is actually a set of rules for lexicographical transformations, with differential calculus and integral calculus being two examples, I came to the conclusion that there is a fundamental principle for the design of a programming language based on an interpretation of the process of abstraction in terms of a calculus of semantics-preserving transformations reflexive over the domain of syntactic clauses."
He went on:
"The problem for most languages, of course, is that not all the clauses in the grammar are abstractable over, and for many that are the semantics are not strictly preserved when abstraction is performed, which sort of ruins the point."
It is summarized thusly in one line:
Abstraction is a calculus of semantics-preserving transformations reflexive over the domain of syntactic clauses.
I'm working my way through his book, 'Concurrency & Programming Languages', so I can try to better understand this statement...
I came across one interesting paragraph on page 151: "There is no need for a macro facility if a language permits the meaning of application to be defined differently for different types of applicable value, and if its parameterisation mechanism can be defined differently for different types of data (such as for the functions and operations above), or for values of the same type but with different characteristics (such as for functions with eager/lazy attributes)."
Hah! So could it be that Lisp has deficiencies at a fundamental level...?
Harland replied to my query: "The first thing of significance that I did was to make types manipulable... Then I made the environments manipulable so that I could abstract over declarations. This comes from having access to the 'current environment' whose meaning is defined dynamically, so that it can be passed as a parameter. Next came access to 'current process' so that it networks of processes can be dynamically established. Long after that, when I fully appreciated the simplicity of abstraction as being over the clauses of the grammar, I made the grammar a data structure that the program can modify in real time, to add new grammatical forms (i.e. abstractions) and expand the means of expression..."
There are interesting ideas here that should be pondered further...