Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
Re: Sick macros (was: Action, not words (Re: bug (?) in 3.0-pre1))
- X-seq: zsh-workers 1510
- From: Zefram <A.Main@xxxxxxxxxxxxxxxxx>
- To: schaefer@xxxxxxx
- Subject: Re: Sick macros (was: Action, not words (Re: bug (?) in 3.0-pre1))
- Date: Tue, 2 Jul 1996 19:24:26 +0100 (BST)
- Cc: A.Main@xxxxxxxxxxxxxxxxx, hzoli@xxxxxxxxxx, zsh-workers@xxxxxxxxxxxxxxx
- In-reply-to: <960702105235.ZM4305@xxxxxxxxxxxxxxxxxxxxxxx> from "Bart Schaefer" at Jul 2, 96 10:52:32 am
>And then I'd write:
>
> HEAPALLOC {
> /* ... stuff ... */
> } LASTALLOC;
>
>That makes the block context obvious. The macros are upper-case because
>I don't like introducing new "keywords".
Yes, I think this is preferable. As we are introducing a new block,
there should be a new indentation level for it, and the braces make it
clearer. And there's a bonus with this syntax:
PERMALLOC
some_function();
LASTALLOC;
is legal, matching other bits of C syntax. I think the size of the
resulting patch should not be a consideration.
>} #define lastalloc_return \
>} if( (nonlocal_useheap ? global_heapalloc() : global_permalloc()) , 0 ) \
>} ; \
>} else \
>} return
>
>Hmm ... I seem to recall that some compilers don't like having void
>expressions (e.g. (?:) where both branches are void functions) used
>anywhere in a comma-expression. In particular, I think AIX either
>rejects this or compiles it wrong. However, I could be confusing that
>with something else ... I know for a fact that AIX could not handle
>an `if (x,y)' construct we used in zmail, forcing us to rewrite it
>as `if (x?0:y)' -- which doesn't work in general, it just happened
>that for us x was always 0 to begin with.
Curious. It's a perfectly legal expression, so any compiler that can't
grok it is broken. However, if a common compiler barfs on that, maybe
we could have global_{heap,perm}alloc() return 0, so the comma operator
is unnecessary and there are no void subexpressions.
>If I'm confused and the comma-expression above turns out to be OK, I'd
>change ALLOC_RESTORE and add LASTALLOC_RETURN:
>
>#define ALLOC_RESTORE \
> ((nonlocal_useheap ? global_heapalloc() : global_permalloc()), 0)
>#define LASTALLOC_RETURN if (ALLOC_RESTORE); else return
Cleaner, I think, to have
#define ALLOC_RESTORE \
( nonlocal_useheap ? global_heapalloc() : global_permalloc() )
#define LASTALLOC_RETURN if(ALLOC_RESTORE, 0) ; else return
but the semantics of these two are identical. ("ALLOC_RESTORE;" is a
legal statement in both cases.)
> if (getmeoutofhere()) {
> ALLOC_RESTORE;
> return(-1);
> }
I'd rather have the convenience of LASTALLOC_RETURN -- at least, if
this is often required.
-zefram
Messages sorted by:
Reverse Date,
Date,
Thread,
Author