[net.lang.c] C-mantics

vdb@hou2g.UUCP (R.VANDERBEI) (04/15/85)

C is perhaps the nicest language I've seen (except APL) however I
do have some criticisms:

(1) Operators, functions and procedures should not have "side effects".

   (a) For operators, this means that no operator should ever be 
       allowed to change the value of its operands.  This eliminates
       the possibility of "slangy" type operators like the increment
       operator  ++   in C among others.  Also the assignment operator
       is in fact not an operator but is a "copy statement".
   (b) For functions, this means that a function should only be allowed 
       to alter the values of locally defined variables (one of which
       is returned to the calling statement).  It is a terrible bastard-
       ization of the meaning of a function to allow it to change the
       values of any of its arguments or any variables which are defined
       at a higher level.
       You may respond that C already doesn't allow the programmer to 
       change the value of parameters passed to the function.  But, as we
       all know, C  allows one to pass a pointer to a variable and then
       allows one to change the value at that memory location.  This is
       a perfect example of a side effect where a variable defined at a higher
       level is changed.  Most people consider this to be an asset but in my 
       opinion it is a serious liability which encourages a programmer
       to write code which is harder to debug than the much maligned spaghetti
       code of yore.  I think that all variables should be, by definition,
       pointers to locations in memory - see point (2).
       To make this restriction easy to use, it is neccessary that the 
       language allow the programmer to define elaborate structures which can
       be returned as the result of a function.  For example, if one wishes to
       write a "print on line printer" function "print", then the function
       should know how many lines are on a page and what the current line 
       number is.  One should define a structure which has fields for all 
       the relevant printer information and then initialize a variable say
       prn which contains the starting values for these parameters.  Then a
       function call would look like this:
   
               prn = print(prn, ... ).

       prn  goes in as input containing the current state, print  returns
       a variable of the same structure which contains the updated information
       and the  =  copies the information into  prn.  This is only an example
       I think a language should supply such functions as print and, where 
       appropriate, take advantage of mare streamlined semantics and more effic- 
       ient implementations.
(2) All variable names should represent memory locations and not the value at 
   the location.  Then operators have to be defined appropriately.  For 
   instance, the plus operator  +  would be defined so that x+y would mean:
   "add the value stored at location x to the value stored at location y
   and return a pointer to the location where the result is stored".
   Pointer arithmetic can be accomplished by the notation  x[j]  which
   would represent the memory location x plus j times the length of
   the structure to which x points.
3. The assignment statement  =  should be the only way of actually copying
   one area of memory into another.  If x and y are (perhaps structured)
   variables then  y=x  should copy the structure to which  x  points
   into the location to which y points.  When one defines a structure there
   should be included the facility to indicate which other structured types
   can be assigned into the type being defined and how to perform any 
   neccessary conversions.  This would allow, for example, one to define a
   complex variable structure and if z is a complex variable and x is a 
   real variable (double say) then the assignment
                            z=x
   should work and be defined in the definition of the complex variable
   structure.  This is one of the nice features of C++.
4. In the definition of a stucture, one should be able to specify how 
   operators act on newly defined structures.  For example, this would allow
   one to define a matrix  A  and a vector  x  and hove  A*x  make sense
   and agree with the usual mathematical definition.
Final Remarks. C++ addresses criticisms (3) and (4) but fails (I think) in
   regard to (1) and (2).
   Since I am a mathematician and not a computer scientist, my terminology
   may not be standard, but I hope that my above criticisms are clear
   enough that readers will understand my points.  If anyone knows of
   of a language which does things as I have suggested, please let me 
   know  -  especially if it runs on a Tandy 2000 and offers a nice
   programming environment (I program in Turbo pascal because the compiler
   is fast, the code is fast, and it comes with an editor which can 
   be configured as you like - a truly nice operating environment).  If
   there is anyone who would like to implement a language such as I have 
   described, I would be happy to take an active part in the language design.

brooks@lll-crg.ARPA (Eugene D. Brooks III) (04/17/85)

I was going to respond to this, but then whats the use.
We are talking about someones religion here aren't we?

kjm@ut-ngp.UUCP (Ken Montgomery) (04/21/85)

From: vdb@hou2g.UUCP (R.VANDERBEI)
>C is perhaps the nicest language I've seen (except APL) however I
>do have some criticisms:
>
>(1) Operators, functions and procedures should not have "side effects".
>
>   (a) For operators, this means that no operator should ever be 
>       allowed to change the value of its operands.  This eliminates
>       the possibility of "slangy" type operators like the increment
>       operator  ++   in C among others.

Where's the beef?  Side effects are bad only if misused.  Anything is
bad if misused.  Ever seen a 6-layer deep "structured" construction?

>                                          Also the assignment operator
>       is in fact not an operator but is a "copy statement".

Read K&R.  Assignment *is* an operator.

>   (b) For functions, this means that a function should only be allowed 
>       to alter the values of locally defined variables (one of which
>       is returned to the calling statement).  It is a terrible bastard-
>       ization of the meaning of a function to allow it to change the
>       values of any of its arguments or any variables which are defined
>       at a higher level.
> [...]
>                   One should define a structure which has fields for all 
>       the relevant printer information and then initialize a variable say
>       prn which contains the starting values for these parameters.  Then a
>       function call would look like this:
>   
>               prn = print(prn, ... ).
>
>       prn  goes in as input containing the current state, print  returns
>       a variable of the same structure which contains the updated information
>       and the  =  copies the information into  prn.

I fail to see the essential difference between this example and simply
passing &prn to the function.

>                                                      This is only an example
>       I think a language should supply such functions as print and, where 
>      appropriate, take advantage of mare streamlined semantics and more effic-
>       ient implementations.

The language should supply functions such as 'print'?!  Bogus.  This idea
violates the very soul of modularity.

>(2) All variable names should represent memory locations and not the value at 
>   the location.  Then operators have to be defined appropriately.

Try BLISS.

>   For 
>   instance, the plus operator  +  would be defined so that x+y would mean:
>   "add the value stored at location x to the value stored at location y
>   and return a pointer to the location where the result is stored".

You want this kind of magic to go on underneath a language used to write
operating systems?

>   Pointer arithmetic can be accomplished by the notation  x[j]  which
>   would represent the memory location x plus j times the length of
>   the structure to which x points.

This is a *very* confusing syntax.

>3. The assignment statement  =  should be the only way of actually copying
>   one area of memory into another.

No '+='?  Oh, sorry, that's changing one of your arguments.  But doesn't
your definition of '=' have that same problem?

> [..]
>4. In the definition of a stucture, one should be able to specify how 
>   operators act on newly defined structures.

You maybe really want an object-oriented language?

--
The above viewpoints are mine.  They are unrelated to
those of anyone else, including my cats and my employer.

Ken Montgomery  "Shredder-of-hapless-smurfs"
...!{ihnp4,allegra,seismo!ut-sally}!ut-ngp!kjm  [Usenet, when working]
kjm@ut-ngp.ARPA  [for Arpanauts only]