[M3devel] "target specific pragmas"?
Darko
darko at darko.org
Sat Feb 16 08:30:29 CET 2008
I'm not sure what you're getting at or if I'm missing something witty.
I've said the form of the keywords makes little or no difference in my
opinion. In my mail you quote I say there should be a C like syntax
for M3 as well as the existing one. I wasn't being sarcastic. It's a
matter of taste. I write in both all the time and it doesn't have any
impact on me, I go almost entirely by indentation, which I think is
very important. The indentation is pretty awful in code you posted but
it could me my mailer.
On 16/02/2008, at 10:51 AM, Mika Nystrom wrote:
> Darko writes:
>> I'm sticking to my view about lexical arbitrariness, but on that
>> basis, I'd really like to see an alternate syntax for M3, one that
>> looks almost exactly like C, but roughly keeps the existing statement
>> form. I think it would make the language much more palatable to C
>> programmers and the like and would remove what is a silly barrier to
>> broader adaption. We could call the syntax 'Modula-C'.
>
> This is getting a bit silly, and I apologize to everyone reading this
> about wasting their time, but I just have to show you the following
> file. It is a header file from the original sources of "sh"
> (this copy is from 4.3 TAHOE UNIX, but of course the code is much
> older than that).
>
> After that, blok.c, an example of "Bournegol" in use.
>
> So, you want the opposite, huh?
>
> Mika
>
>
> /* mac.h 4.3 87/10/26 */
>
> #
> /*
> * UNIX shell
> *
> * S. R. Bourne
> * Bell Telephone Laboratories
> *
> */
>
> #define LOCAL static
> #define PROC extern
> #define TYPE typedef
> #define STRUCT TYPE struct
> #define UNION TYPE union
> #define REG register
>
> #define IF if(
> #define THEN ){
> #define ELSE } else {
> #define ELIF } else if (
> #define FI ;}
>
> #define BEGIN {
> #define END }
> #define SWITCH switch(
> #define IN ){
> #define ENDSW }
> #define FOR for(
> #define WHILE while(
> #define DO ){
> #define OD ;}
> #define REP do{
> #define PER }while(
> #undef DONE
> #define DONE );
> #define LOOP for(;;){
> #define POOL }
>
>
> #define SKIP ;
> #define DIV /
> #define REM %
> #define NEQ ^
> #define ANDF &&
> #define ORF ||
>
> #define TRUE (-1)
> #define FALSE 0
> #define LOBYTE 0377
> #define STRIP 0177
> #define QUOTE 0200
>
> #define EOF 0
> #define NL '\n'
> #define SP ' '
> #define LQ '`'
> #define RQ '\''
> #define MINUS '-'
> #define COLON ':'
>
>
>
> #ifndef lint
> static char sccsid[] = "@(#)blok.c 4.2 8/11/83";
> #endif
>
> #
> /*
> * UNIX shell
> *
> * S. R. Bourne
> * Bell Telephone Laboratories
> *
> */
>
> #include "defs.h"
>
>
> /*
> * storage allocator
> * (circular first fit strategy)
> */
>
> #define BUSY 01
> #define busy(x) (Rcheat((x)->word)&BUSY)
>
> POS brkincr=BRKINCR;
> BLKPTR blokp; /*current search pointer*/
> BLKPTR bloktop=BLK(end); /*top of arena (last blok)*/
>
>
>
> ADDRESS alloc(nbytes)
> POS nbytes;
> {
> REG POS rbytes = round(nbytes+BYTESPERWORD,BYTESPERWORD);
>
> LOOP INT c=0;
> REG BLKPTR p = blokp;
> REG BLKPTR q;
> REP IF !busy(p)
> THEN WHILE !busy(q = p->word) DO p->word = q->word OD
> IF ADR(q)-ADR(p) >= rbytes
> THEN blokp = BLK(ADR(p)+rbytes);
> IF q > blokp
> THEN blokp->word = p->word;
> FI
> p->word=BLK(Rcheat(blokp)|BUSY);
> return(ADR(p+1));
> FI
> FI
> q = p; p = BLK(Rcheat(p->word)&~BUSY);
> PER p>q ORF (c++)==0 DONE
> addblok(rbytes);
> POOL
> }
>
> VOID addblok(reqd)
> POS reqd;
> {
> IF stakbas!=staktop
> THEN REG STKPTR rndstak;
> REG BLKPTR blokstak;
>
> pushstak(0);
> rndstak=round(staktop,BYTESPERWORD);
> blokstak=BLK(stakbas)-1;
> blokstak->word=stakbsy; stakbsy=blokstak;
> bloktop->word=BLK(Rcheat(rndstak)|BUSY);
> bloktop=BLK(rndstak);
> FI
> reqd += brkincr; reqd &= ~(brkincr-1);
> blokp=bloktop;
> bloktop=bloktop->word=BLK(Rcheat(bloktop)+reqd);
> bloktop->word=BLK(ADR(end)+1);
> BEGIN
> REG STKPTR stakadr=STK(bloktop+2);
> staktop=movstr(stakbot,stakadr);
> stakbas=stakbot=stakadr;
> END
> }
>
> VOID free(ap)
> BLKPTR ap;
> {
> REG BLKPTR p;
>
> IF (p=ap) ANDF p<bloktop
> THEN Lcheat((--p)->word) &= ~BUSY;
> FI
> }
>
> #ifdef DEBUG
> chkbptr(ptr)
> BLKPTR ptr;
> {
> INT exf=0;
> REG BLKPTR p = end;
> REG BLKPTR q;
> INT us=0, un=0;
>
> LOOP
> q = Rcheat(p->word)&~BUSY;
> IF p==ptr THEN exf++ FI
> IF q<end ORF q>bloktop THEN abort(3) FI
> IF p==bloktop THEN break FI
> IF busy(p)
> THEN us += q-p;
> ELSE un += q-p;
> FI
> IF p>=q THEN abort(4) FI
> p=q;
> POOL
> IF exf==0 THEN abort(1) FI
> prn(un); prc(SP); prn(us); prc(NL);
> }
> #endif
More information about the M3devel
mailing list