Чтение онлайн

ЖАНРЫ

UNIX — универсальная среда программирования
Шрифт:

 d1.sym->type = VAR;

 push(d2);

}

print /* pop top value from stack, print it */

{

 Datum d;

 d = pop;

 printf("\t%.8g\n", d.val);

}

prexpr /* print numeric value */

{

 Datum d;

 d = pop;

 printf("%.8g ", d.val);

}

prstr /* print string value */

{

 printf(%s", (char*)*pc++);

}

varread /* read into variable */

{

 Datum d;

 extern FILE *fin;

 Symbol *var = (Symbol*)*pc++;

Again:

 switch (fscanf(fin, "%lf", &var->u.val)) {

 case EOF:

if (moreinput)

goto Again;

d.val = var->u.val = 0.0;

break;

 case 0:

execerror("non-number read into", var->name);

break;

 default:

d.val = 1.0;

break;

 }

 var->type = VAR;

 push(d);

}

Inst *code(f) /* install one instruction or operand */

 Inst f;

{

 Inst *oprogp = progp;

 if (progp >= &prog[NPROG])

execerror("program too big", (char*)0);

 *progp++ = f;

 return oprogp;

}

execute(p)

 Inst *p;

{

 for (pc = p; *pc != STOP && !returning; )

(*((++pc)[-1]));

}

3.7.4

double

proc double {

 if ($1 > 1) {

double($1/2)

 }

 print($1)

}

double(1024)

3.7.5

fac

func fac {

 if ($1 <= 0) return 1 else return $1 * fac($1-1)

}

3.7.6

fac1

func fac if ($1 <= 0) return 1 else return $1 * fac($1-1)

fac(0)

fac(7)

fac(10)

3.7.7

fac2

func fac {

 if ($1 <= 0) {

return 1

 }

 return $1 * fac($1-1)

}

i=0

while(i<=20){

 print "factorial of ", i, "is ", fac(i), "\n"

 i=i+1

}

3.7.8

fib

proc fib {

 a = 0

 b = 1

 while (b < $1) {

print b

c = b

b = a+b

a = c

 }

 print "\n"

}

3.7.9

fib2

{

 n=0

 a=0

 b=1

 while(b<10000000){

n=n+1

c=b

b=a+b

a=c

print(b)

 }

 print(n)

}

3.7.10

fibsum

proc fib{

 a=1

 b=1

 c=2

 d=3

 sum = a+b+c+d

 while(d<$1){

e=d+c

print(e)

a=b

b=c

c=d

d=e

sum=sum+e

 }

 print(sum)

}

fib(1000)

3.7.11

fibtest

proc fib {

 a = 0

 b = 1

 while (b < $1) {

c = b

b = a+b

a = c

 }

}

i = 1

while (i < 1000) {

 fib(1000)

 i = i + 1

}

3.7.12

hoc.h

typedef struct Symbol { /* symbol table entry */

 char *name;

 short type;

 union {

double val; /* VAR */

double (*ptr); /* BLTIN */

int (*defn); /* FUNCTION, PROCEDURE */

char *str; /* STRING */

 } u;

 struct Symbol *next; /* to link to another */

} Symbol;

Symbol *install, *lookup;

typedef union Datum { /* interpreter stack type */

 double val;

 Symbol *sym;

} Datum;

extern Datum pop;

extern eval, add, sub, mul, div, negate, power;

typedef int (*Inst);

#define STOP (Inst)0

extern Inst *progp, *progbase, prog[], *code;

Поделиться с друзьями: