Don't you just wish that some ex-Sierra employee somewhere still has the SCI source code somewhere? Maybe even the source for a game or two...
I doubt that an ex-Sierra employee would release the original source code in a way that would end up making it public. I've been discussing the original syntax with two ex-Sierra employees over the past week and even though they worked very closely with the system, they can't recall the exact syntax anymore. But they've given me a rough idea.
For starters, when I showed one of them a snippet of code from SCI Companion, he said that is definitely NOT the original syntax. He also told me that it was definitely not similar to C in anyway. This means that the method invocation mechanism that SCI Companion uses is wrong (i.e. using () as an invocation mechanism). Instead the method invocation used Smalltalk syntax, in fact it would seem that the language was more a cross between LISP and Smalltalk, but has its own set of keywords (by which I mean that those keywords in SCI don't appear to come from LISP or Smalltalk). Here is an example of syntax that is apparently closer to the original syntax. This is a snippet from SCI Companion that has been modified to use Smalltalk message sending syntax (no guarantees here that it is an exact match to the original but is closer to the original):
(method (delete)
(if (& signal $8000)
(if (& signal $20)
(gAddToPics add:
((PV new:)
view: view
loop: loop
cel: cel
x: x
y: y
z: z
priority: priority
signal: signal
yourself:
)
)
)
(= signal (& signal $7FFF))
(gCast delete: self)
(if underBits
(UnLoad rsMEMORY underBits)
(= underBits NULL)
)
(super dispose:)
)
)
Smalltalk uses a message sending mechanism of the format:
object method: param
Smalltalk obviously doesn't have all of the LISP parentheses in there, but if we were to add those, then in the SCI language it becomes:
(object method: param)
You'll notice that kernel functions (such as Unload shown above) also do not have the ( ) around the parameters. In think this is where the LISP side of the syntax comes into it. Everything is just a list. The first item in the list is one of the following:
keyword e.g. (if underBits (do-something-here))
kernel function e.g. (Unload rsMemory underBits)
operator e.g. (= underBits NULL)
object e.g. (gCast delete: self)
If parentheses exist within other parentheses then I think it is more a grouping mechanism rather than a way to pass parameters to a method. So that Unload example above is just (name-of-function param1 param2 etc).