[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