Article View: comp.lang.modula2
Article #4368Re: C vs. M2
From: Paul Vixie
Date: Mon, 15 Aug 1988 18:46
Date: Mon, 15 Aug 1988 18:46
80 lines
3142 bytes
3142 bytes
# > Pre and post increment/decrement operators (++, --);
# INC, DEC are a hack in M2 to satisfy people who think they can out-code
# a compiler. (With most M2 compilers, this is understandable...).
It's a question of appearance. I can say
while (*p++ = *q++)
;
But then, does M2 have arithmetic for pointers? Also, INC and DEC are not
functions which return the new value -- why not?
# > The ? : operator, eg, x = (y < 2 ? 10 : 20) + y; is the same as
# > if (y<2) x = 10 + y; else x = 20 + y;
# Pardon me, but did you ever program in APL?
Another question of appearance. I like:
printf("%d block%s\n", i, (i=1)?"":"s");
# > Large assortment of assignment operators (+=, -=, *=, /=, &=, |=, etc)
# > eg, x *= 2; is equivalent to x = x * 2;
# M2 doesn't go into that sort of thing. Seems like even the most
# rudimentary expression optimizer could take care of this problem
# lickety-split.
Yes, it's true, a good compiler will find the best way no matter how you
say it. But again, appearance gets my vote:
foo[i]->bar.size += newsize;
vs.
foo[i]^.bar.count = foo[i]^.bar.count + newsize;
I get to say what I mean. Yes, I know about INCR, but this is only one case.
# You can't really compare M2 and C. They are two different beasts.
I agree. M2 ends up being more elegant, or at least I end up being more
elegant when I use it. :-). C lets you do some things more clearly, but
the code ends up being a lot more dense per square inch of EMACS windows,
and C has things that I sometimes can't help taking advantage of, in spite
of the pain I experience later trying to understand what I did.
Both languages have their place.
# PS. Riddle of the day. How do you do the following in C?
# TYPE
# RealPtr = POINTER TO REAL;
# X = PROCEDURE (
# CARDINAL
# ) : RealPtr;
# A = ARRAY [ 0 .. 5 ] OF X;
# VAR
# x : POINTER TO A;
#
# Ok, skip the CARDINAL parameter, but I'd like to see the rest.
Sigh. You're going to love this. Let's skip the CARDINAL parameter, as you
suggest, since non-ANSI C doesn't let you specify parameters when you declare
a function.
typedef real *RealPtr;
typedef RealPtr (X)();
typedef X A[6];
/*var*/ A *x;
M2 is _much_ clearer. Anybody got an example of something like this that
C does more clearly? Something useful would be nice...
Calling one of A's functions is fun:
(*((*A)[i]))(param1, param2);
(I may have too many parens. I always puzzle over this part of C.)
--
Paul Vixie
Digital Equipment Corporation Work: vixie@dec.com Play: paul@vixie.UUCP
Western Research Laboratory uunet!decwrl!vixie uunet!vixie!paul
Palo Alto, California, USA +1 415 853 6600 +1 415 864 7013
Technical Details
Message-ID:
<49@volition.dec.com>Path:
arc1-ca.pugleaf.net!utzoo!utgpu!attcan!uunet!husc6!purdue!decwrl!vixieReferences:
<8808150855.AA04539@klaus.olsen.uucp>Show Full Headers
Complete Article Headers
Path: arc1-ca.pugleaf.net!utzoo!utgpu!attcan!uunet!husc6!purdue!decwrl!vixie From: vixie@decwrl.dec.com (Paul Vixie) Newsgroups: comp.lang.modula2 Subject: Re: C vs. M2 Message-ID: <49@volition.dec.com> Date: 15 Aug 88 18:46:54 GMT References: <8808150855.AA04539@klaus.olsen.uucp> Organization: DEC Western Research Lab Lines: 80