mike@hcradm.UUCP (Mike Tilson) (08/15/85)
Recently there has been a lot of talk about side-effects and expressions in C. Several people have commented that a full expression language is a good thing. Others have compared C to LISP and APL. The following program shows what you can really do with C if you try. :-) Note that everything is done as expression evaluation, and there are enough parentheses to satisfy the LISP lover. :-) There are 38 lines of actual executable code, in the form of *one* C expression which computes a sequence of prime numbers. (Note: an earlier version of this was submitted to the Obfuscated C contest. I was going to let it die, but it seemed very apropos to the recent C discussion.) / Michael Tilson / {utzoo,decvax}!hcr!hcradm!mike =============== cut here ================= /* * Functional programming in C. :-) * * Compute prime numbers using a version of the famous benchmark. * The primes are computed multiple times, with the numbers being * printed. Finally, the count of primes is printed and returned * as the exit value of main. * * There are no semicolons in this program except for declarations * and the one return statement. It is all done by expression * evaluation. :-) * * This program has been tested on Vax UNIX System V.2. It passes lint * with no messages, using the default options. This usage of setjmp * conforms to the UNIX documentation, and is more powerful than * that supported by the draft ANSI C standard. * * Michael Tilson */ /* set up the control structure, and also fool lint into being happy */ #include <setjmp.h> jmp_buf label0, label1, label2; int (*jump)() = (int (*)()) longjmp; void (*label)() = (void (*)()) setjmp; extern int printf(); void (*print)() = (void (*)()) printf; #define TRUE 1 #define FALSE 0 #define SIZE 100 #define N 5 char flags[SIZE + 1]; main() { int i, prime, k, count, iter; return( (*print)("%d iterations\n", N), iter=1, (((*label)(label0),iter<=N) ?( count = 0, i = 0, (((*label)(label1),i<=SIZE) ? flags[i]=TRUE, i++, (*jump)(label1,0) :empty()), i = 0, (((*label)(label1),i<=SIZE) ?( (flags[i] ?( prime = i+i+3, (*print)("\n%d",prime), k = i + prime, (((*label)(label2),k<=SIZE) ?( flags[k]=FALSE, k += prime, (*jump)(label2,0) ) :empty()), count++ ):empty()), i++, (*jump)(label1,0) ):empty()), iter++, (*jump)(label0,0) ):empty()), (*print)("\n%d primes.\n", count), count ); } empty() { }