| ΠΏΠΎΠΊΠ° ΡΡΠ» ΠΎΠΏΠ΅Ρ Π²ΡΠ΅ {
($1)[1] = (Inst) $3 /* ΡΠ΅Π»ΠΎ ΡΠΈΠΊΠ»Π° */
($1)[2] = (Inst) $4 /* Π²ΡΠ΅, Π΅ΡΠ»ΠΈ ΡΡΠ»ΠΎΠ²ΠΈΠ΅ Π½Π΅Π²Π΅ΡΠ½ΠΎ */
}
ΠΠ΄Π΅ΡΡ $1 ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ Π°Π΄ΡΠ΅Ρ ΠΊΠΎΠΌΠ°Π½Π΄Ρ whilecode, ΡΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ($1)[1] ΠΈ ($1)[2] ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ°ΡΡ Π΄Π²Π° ΡΠ»Π΅Π΄ΡΡΡΠΈΡ ΡΠ»ΠΎΠ²Π°.
Π ΠΈΡΡΠ½ΠΎΠΊ, ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΡΠΉ Π½ΠΈΠΆΠ΅, ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΎΡΡΠ½ΠΈΡΡ ΡΠΈΡΡΠ°ΡΠΈΡ:
Π‘ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΎΠΌ if Π΄Π΅Π»ΠΎ ΠΎΠ±ΡΡΠΎΠΈΡ Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎ, Π½ΠΎ ΡΠ΅Π·Π΅ΡΠ²ΠΈΡΡΡΡΡΡ ΡΡΠΈ ΡΠ»ΠΎΠ²Π°: Π΄Π»Ρ ΡΠ°ΡΡΠ΅ΠΉ then ΠΈ else, Π° ΡΠ°ΠΊΠΆΠ΅ Π΄Π»Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ°, ΡΠ»Π΅Π΄ΡΡΡΠ΅Π³ΠΎ Π·Π° if. ΠΡ Π²ΡΠΊΠΎΡΠ΅ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ ΡΡΠΎΡ ΡΠ»ΡΡΠ°ΠΉ.
ΠΠ΅ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠΉ Π°Π½Π°Π»ΠΈΠ· ΡΠ΅ΠΏΠ΅ΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ΄Π»ΠΈΠ½ΡΠ΅ΡΡΡ Π² ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΌ ΠΈΠ·-Π·Π° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ ΡΠ°ΡΠΏΠΎΠ·Π½Π°Π²Π°Π½ΠΈΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ:
yylex() /* hoc5 */
{
...
switch (Ρ) {
case '>': return follow('=', GE, GT);
case '<': return follow('=', LE, LT);
case '=': return follow('=', EQ, '=');
case '!': return follow('=', NE, NOT);
case '|': return follow('|', OR, '|');
case '&': return follow('&', AND, '&');
case '\n': lineno++; return '\n';
default: return c;
}
}
Π€ΡΠ½ΠΊΡΠΈΡ follow "ΡΠΌΠΎΡΡΠΈΡ" Π½Π° ΠΎΠ΄ΠΈΠ½ ΡΠΈΠΌΠ²ΠΎΠ» Π²ΠΏΠ΅ΡΠ΅Π΄ ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠΈΠΌΠ²ΠΎΠ» Π½Π°Π·Π°Π΄ Π²ΠΎ Π²Ρ ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠΎΡΠΎΠΊ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ungetc, Π΅ΡΠ»ΠΈ ΠΎΠ½ ΠΎΠΊΠ°Π·Π°Π»ΡΡ Π½Π΅ ΡΠ΅ΠΌ, ΠΊΠΎΡΠΎΡΡΠΉ ΡΡΠ΅Π±ΠΎΠ²Π°Π»ΡΡ:
follow(expect, ifyes, ifno) /* look ahead for >=, etc. */
{
int Ρ = getchar();
if (c == expect)
return ifyes;
ungetc(c, stdin);
return ifno;
}
Π ΡΠ°ΠΉΠ»Π΅ hoc.h ΡΡΠ°Π»ΠΎ Π±ΠΎΠ»ΡΡΠ΅ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠΉ ΡΡΠ½ΠΊΡΠΈΠΉ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ Π²ΡΠ΅Ρ ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΠΉ, Π½ΠΎ Π² ΠΎΠ±ΡΠ΅ΠΌ Π΅Π³ΠΎ ΡΡΡΡΠΊΡΡΡΠ° ΡΠ°ΠΊΠ°Ρ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ Π² hoc4. ΠΠΈΠΆΠ΅ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ΠΎ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΡ ΡΡΡΠΎΠΊ Π³ΡΠ°ΠΌΠΌΠ°ΡΠΈΠΊΠΈ:
$ cat hoc.h
...
typedef int (*Inst)(); /* machine instruction */
#define STOP (Inst)0
extern Inst prog[], *progp, *code();
extern eval(), add(), sub(), mul(), div(), negate(), power();
extern assign(), bltin(), varpush(), constpush(), print();
extern prexpr();
extern gt(), lt(), eq(), ge(), le(), ne(), and(), or(), not();
extern ifcode(), whilecode();
$
ΠΠΎΠ»ΡΡΠ°Ρ ΡΠ°ΡΡΡ ΡΠ°ΠΉΠ»Π° code.c ΡΠ°ΠΊΠΆΠ΅ Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»Π°ΡΡ, Ρ ΠΎΡΡ, ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΠΎ, Π·Π΄Π΅ΡΡ ΠΏΠΎΡΠ²ΠΈΠ»ΠΎΡΡ ΠΌΠ½ΠΎΠ³ΠΎ Π½ΠΎΠ²ΡΡ ΠΏΡΠΎΡΠ΅Π΄ΡΡ Π΄Π»Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΠΉ. Π’ΠΈΠΏΠΈΡΠ½ΡΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠΎΠΌ ΠΌΠΎΠΆΠ΅Ρ ΡΠ»ΡΠΆΠΈΡΡ ΡΡΠ½ΠΊΡΠΈΡ le ("less than equal to" ΠΌΠ΅Π½ΡΡΠ΅ ΠΈΠ»ΠΈ ΡΠ°Π²Π½ΠΎ).
le() {
Datum d1, d2;
d2 = pop();
d1 = pop();
d1.val = (double)(d1.val <= d2.val);
push(d1);
}
He ΡΠΎΠ²ΡΠ΅ΠΌ ΡΡΠΈΠ²ΠΈΠ°Π»ΡΠ½ΡΠΌΠΈ ΡΠ²Π»ΡΡΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ whilecode ΠΈ ifcode. Π§ΡΠΎΠ±Ρ ΠΏΠΎΠ½ΡΡΡ ΠΈΡ , Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΡΡΠ½ΠΈΡΡ, ΡΡΠΎ ΡΡΠ½ΠΊΡΠΈΡ execute ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ ΠΊΠΎΠΌΠ°Π½Π΄Ρ Π΄ΠΎ ΡΠ΅Ρ ΠΏΠΎΡ, ΠΏΠΎΠΊΠ° Π½Π΅ Π±ΡΠ΄Π΅Ρ Π½Π°ΠΉΠ΄Π΅Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° STOP, ΠΏΠΎΡΠ»Π΅ ΡΠ΅Π³ΠΎ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ Π²ΠΎΠ·Π²ΡΠ°Ρ ΠΈΠ· execute. ΠΡΠΎΡΠ΅ΡΡ ΡΠ°Π·Π±ΠΎΡΠ° ΠΏΠΎΡΡΡΠΎΠ΅Π½ ΡΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΡΡΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π° STOP Π·Π°Π²Π΅ΡΡΠ°Π΅Ρ ΠΊΠ°ΠΆΠ΄ΡΡ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ ΠΊΠΎΠΌΠ°Π½Π΄, ΠΊΠΎΡΠΎΡΡΡ Π½ΡΠΆΠ½ΠΎ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°ΡΡ Π·Π° ΠΎΠ΄Π½ΠΎ ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΠ΅ ΠΊ execute. Π’Π΅Π»ΠΎ ΡΠΈΠΊΠ»Π° while, Π° ΡΠ°ΠΊΠΆΠ΅ ΡΡΠ»ΠΎΠ²ΠΈΠ΅ ΠΈ ΡΡΠ°Π³ΠΌΠ΅Π½ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ° if ΠΏΠΎΡΠ»Π΅ then ΠΈ else ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½ΡΡ ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΠΉ ΠΊ execute, Π²ΠΎΠ·Π²ΡΠ°Ρ ΠΈΠ· ΠΊΠΎΡΠΎΡΡΡ ΠΏΠΎ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅ΡΡΡ Π² ΡΡΠ½ΠΊΡΠΈΡ execute Π½Π° ΠΎΠ΄ΠΈΠ½ ΡΡΠΎΠ²Π΅Π½Ρ Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΡΡΠΈ Π²ΡΡΠ΅. Π£ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΡΡΠΈΠΌΠΈ ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½ΡΠΌΠΈ ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΡΠΌΠΈ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅ΡΡΡ Π² whilecode ΠΈ ifcode. ΠΠΎΡΠ»Π΅Π΄Π½ΠΈΠ΅ ΠΈ ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½Ρ Π΄Π»Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΎΠ².
whilecode() {
Datum d;
Inst *savepc = pc; /* loop body */
execute(savepc+2); /* condition */
d = pop();
while (d.val) {
execute(*((Inst **)(savepc))); /* body */
execute(savepc+2);
d = pop();
}
pc = *((Inst **)(savepc+1)); /* next statement */
}
ΠΠ°ΠΊ ΡΠΆΠ΅ ΠΎΡΠΌΠ΅ΡΠ°Π»ΠΎΡΡ ΡΠ°Π½Π΅Π΅, ΠΏΠΎΡΠ»Π΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ whilecode ΡΠ°Π·ΠΌΠ΅ΡΠ°Π΅ΡΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΡΠ΅Π»ΠΎ ΡΠΈΠΊΠ»Π°, Π·Π°ΡΠ΅ΠΌ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ, Π° Π·Π° Π½ΠΈΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΡΡΠ»ΠΎΠ²ΠΈΡ. ΠΠΎΠ³Π΄Π° Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ whilecode, Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ pc ΡΠΆΠ΅ ΡΠ²Π΅Π»ΠΈΡΠ΅Π½ΠΎ, ΡΠ°ΠΊ ΡΡΠΎ ΠΎΠ½ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΡΠ΅Π»ΠΎ ΡΠΈΠΊΠ»Π°. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, pc+1 Π½Π°ΡΡΡΠΎΠ΅Π½ Π½Π° ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ, Π° pc+2 Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΡΡΠ»ΠΎΠ²ΠΈΡ.
Π€ΡΠ½ΠΊΡΠΈΡ ifcode Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½Π° ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΉ: ΠΏΡΠΈ Π²Ρ ΠΎΠ΄Π΅ Π² Π½Π΅Π΅ pc ΡΡΡΠ»Π°Π΅ΡΡΡ Π½Π° ΡΡΠ°Π³ΠΌΠ΅Π½Ρ ΠΏΠΎΡΡΠ΅ then, pc+1 Π½Π° ΡΡΠ°Π³ΠΌΠ΅Π½Ρ ΠΏΠΎΡΡΠ΅ else, pc+2 Π½Π° ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ, Π° pc+3 Π½Π° ΡΡΠ»ΠΎΠ²ΠΈΠ΅.
ifcode()
{
Datum d;
Inst *savepc = pc; /* then part */
execute(savepc+3); /* condition */
d = pop();
if (d.val)
execute(*((Inst **)(savepc)));
else if (*((Inst **)(savepc+1))) /* else part? */
execute(*((Inst **)(savepc+1)));
pc = *((Inst**)(savepc+2)); /* next stmt */
}
ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π² ΡΠ°ΠΉΠ»Π΅ init.c ΡΠ°ΠΊΠΆΠ΅ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ²Π΅Π»ΠΈΡΠΈΡΡΡ Π·Π° ΡΡΠ΅Ρ Π²Π²Π΅Π΄Π΅Π½ΠΈΡ Π² Π½Π΅Π΅ ΡΠ°Π±Π»ΠΈΡΡ ΠΊΠ»ΡΡΠ΅Π²ΡΡ ΡΠ»ΠΎΠ², Ρ ΡΠ°Π½ΠΈΠΌΡΡ Π² ΡΠ°Π±Π»ΠΈΡΠ΅ ΠΈΠΌΠ΅Π½ Π²ΠΌΠ΅ΡΡΠ΅ Ρ ΠΎΡΡΠ°Π»ΡΠ½ΠΎΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠ΅ΠΉ:
$ cat init.Ρ
...
static struct { /* Keywords */
char *name;
int kval;
} keywords [] = {
"if", IF,
"else", ELSE,
"while", WHILE,
"print", PRINT,
0, 0,
};
...
ΠΠ»Ρ Π·Π°Π½Π΅ΡΠ΅Π½ΠΈΡ Π² ΡΠ°Π±Π»ΠΈΡΡ ΠΈΠΌΠ΅Π½ ΠΊΠ»ΡΡΠ΅Π²ΡΡ ΡΠ»ΠΎΠ² Π½ΡΠΆΠ½ΠΎ ΠΎΡΠ³Π°Π½ΠΈΠ·ΠΎΠ²Π°ΡΡ Π΅ΡΠ΅ ΠΎΠ΄ΠΈΠ½ ΡΠΈΠΊΠ» Π² ΡΡΠ½ΠΊΡΠΈΠΈ init:
...
for (i = 0; keywords[i].name; i++)
install(keywords[i].name, keywords[i].kval, 0.0);
...
ΠΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π² ΡΡΠ½ΠΊΡΠΈΡΡ , ΡΠΏΡΠ°Π²Π»ΡΡΡΠΈΡ ΡΠ°Π±Π»ΠΈΡΠ΅ΠΉ ΠΈΠΌΠ΅Π½, Π½Π΅ ΡΡΠ΅Π±ΡΡΡΡΡ; Π² ΡΠ°ΠΉΠ»Π΅ code.c Π΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ prexpr, ΠΊΠΎΡΠΎΡΠ°Ρ Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΠΏΡΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ° Π²ΠΈΠ΄Π° print Π²ΡΡΠ°ΠΆ.
prexpr() /* print numeric value */
{
Datum d;
d = pop();
printf ('"%.8g\n", d.val);
}
ΠΡΠΎ Π½Π΅ ΡΠ° ΡΡΠ½ΠΊΡΠΈΡ ΠΏΠ΅ΡΠ°ΡΠΈ, ΠΊΠΎΡΠΎΡΠ°Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ Π΄Π»Ρ Π²ΡΠ²ΠΎΠ΄Π° ΠΎΠΊΠΎΠ½ΡΠ°ΡΠ΅Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ° Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠΉ. ΠΠ΄Π΅ΡΡ Π²ΡΠ±ΠΈΡΠ°Π΅ΡΡΡ ΡΠΈΡΠ»ΠΎ ΠΈΠ· ΡΡΠ΅ΠΊΠ° ΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΡΡΡ ΡΠΈΠΌΠ²ΠΎΠ» ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄Π° ΡΡΡΠΎΠΊΠΈ ΠΊ Π²ΡΡ ΠΎΠ΄Π½ΠΎΠΌΡ ΠΏΠΎΡΠΎΠΊΡ.
Π’Π΅ΠΏΠ΅ΡΡ hoc5 ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΠΎΠΉ Π²ΠΏΠΎΠ»Π½Π΅ ΠΏΠΎΠ»Π΅Π·Π½ΡΠΉ ΠΊΠ°Π»ΡΠΊΡΠ»ΡΡΠΎΡ, Ρ ΠΎΡΡ Π΄Π»Ρ ΡΠ΅ΡΡΠ΅Π·Π½ΠΎΠ³ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΡΡΠ΅Π΄ΡΡΠ²Π°. Π ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΡΡ Π½ΠΈΠΆΠ΅ ΡΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΡΡ ΠΏΡΠ΅Π΄Π»Π°Π³Π°ΡΡΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΡ.
Π£ΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΠ΅ 8.12ΠΠΎΠ±Π°Π²ΡΡΠ΅ Π΄Π»Ρ ΠΎΡΠ»Π°Π΄ΠΊΠΈ ΠΊ hoc5 ΡΡΠ΅Π΄ΡΡΠ²ΠΎ ΠΏΠ΅ΡΠ°ΡΠΈ ΡΠΎΠ·Π΄Π°Π²Π°Π΅ΠΌΡΡ ΠΌΠ°ΡΠΈΠ½Π½ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄ Π² ΠΏΠΎΠ½ΡΡΠ½ΠΎΠΉ ΡΠΎΡΠΌΠ΅.
Π£ΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΠ΅ 8.13ΠΠ²Π΅Π΄ΠΈΡΠ΅ Π² ΡΠ²ΠΎΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΡ ΠΈΠ· ΡΠ·ΡΠΊΠ° Π‘ΠΈ Π²ΠΈΠ΄Π° +=, *= ΠΈ Ρ.ΠΏ., Π° ΡΠ°ΠΊΠΆΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΈΠ½ΠΊΡΠ΅ΠΌΠ΅Π½ΡΠ° ΠΈ Π΄Π΅ΠΊΡΠ΅ΠΌΠ΅Π½ΡΠ° ++ ΠΈ --. ΠΠ·ΠΌΠ΅Π½ΠΈΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ && ΠΈ || ΡΠ°ΠΊ, ΡΡΠΎΠ±Ρ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΡΡ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠ΅ ΡΠ»Π΅Π²Π° Π½Π°ΠΏΡΠ°Π²ΠΎ ΠΈ ΡΡΠ»ΠΎΠ²Π½ΠΎΠ΅ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠ΅, ΠΊΠ°ΠΊ Π² Π‘ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°Ρ .
Π£ΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΠ΅ 8.14ΠΠ²Π΅Π΄ΠΈΡΠ΅ Π² hoc5 ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ for, ΠΊΠ°ΠΊ Π² Π‘ΠΈ-ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°Ρ . ΠΠΎΠ±Π°Π²ΡΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΡ break ΠΈ continue.
Π£ΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΠ΅ 8.15ΠΠ°ΠΊ Π±Ρ Π²Ρ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»ΠΈ Π³ΡΠ°ΠΌΠΌΠ°ΡΠΈΠΊΡ ΠΈΠ»ΠΈ Π»Π΅ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠΉ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡ hoc5 (ΠΈΠ»ΠΈ ΠΈ ΡΠΎ, ΠΈ Π΄ΡΡΠ³ΠΎΠ΅), ΡΡΠΎΠ±Ρ ΡΠ΄Π΅Π»Π°ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π±ΠΎΠ»Π΅Π΅ "ΡΠ΅ΡΠΏΠΈΠΌΠΎΠΉ" ΠΊ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄Π° ΡΡΡΠΎΠΊΠΈ? ΠΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π²Π²Π΅ΡΡΠΈ ΡΠΈΠΌΠ²ΠΎΠ» Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΡΠΈΠ½ΠΎΠ½ΠΈΠΌΠ° ΡΠΈΠΌΠ²ΠΎΠ»Π° ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄Π° ΡΡΡΠΎΠΊΠΈ? ΠΠ°ΠΊ Π²Π²Π΅ΡΡΠΈ Π² ΡΠ·ΡΠΊ ΠΏΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΡ? ΠΠ°ΠΊΠΎΠΉ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ, ΠΏΠΎ Π²Π°ΡΠ΅ΠΌΡ ΠΌΠ½Π΅Π½ΠΈΡ, Π½ΡΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ?
Π£ΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΠ΅ 8.16ΠΠΎΠ±Π°Π²ΡΡΠ΅ ΠΊ hoc5 ΡΡΠ΅Π΄ΡΡΠ²Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΏΡΠ΅ΡΡΠ²Π°Π½ΠΈΠΉ, ΡΡΠΎΠ±Ρ Π½Π΅ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΡΠ΅ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ ΠΎΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ Π±Π΅Π· ΠΏΠΎΡΠ΅ΡΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ ΡΠΆΠ΅ Π²ΡΡΠΈΡΠ»Π΅Π½Π½ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ .
Π£ΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΠ΅ 8.17ΠΠ΅ΡΠ΄ΠΎΠ±Π½ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΡΠΉ ΡΠ°ΠΉΠ», Π·Π°ΠΏΡΡΠΊΠ°ΡΡ Π΅Π³ΠΎ Π½Π° Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅, Π° Π·Π°ΡΠ΅ΠΌ ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°ΡΡ Ρ ΡΠ΅Π»ΡΡ Π²Π½Π΅ΡΠ΅Π½ΠΈΡ Π½Π΅Π±ΠΎΠ»ΡΡΠΈΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ. ΠΠ°ΠΊ Π±Ρ Π²Ρ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»ΠΈ hoc5, ΡΡΠΎΠ±Ρ ΡΠΎΠ·Π΄Π°ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ Π²ΡΠ·ΡΠ²Π°Π»Π° Π±Ρ ΡΠ΅Π΄Π°ΠΊΡΠΎΡ Ρ ΡΠΆΠ΅ ΡΡΠΈΡΠ°Π½Π½ΠΎΠΉ ΠΊΠΎΠΏΠΈΠ΅ΠΉ Π²Π°ΡΠ΅ΠΉ hoc-ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ? ΠΠΎΠ΄ΡΠΊΠ°Π·ΠΊΠ°: ΠΈΠ·ΡΡΠΈΡΠ΅ ΡΠ΅ΠΊΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ.
8.6 ΠΡΠ°ΠΏ 6: ΡΡΠ½ΠΊΡΠΈΠΈ ΠΈ ΠΏΡΠΎΡΠ΅Π΄ΡΡΡ; Π²Π²ΠΎΠ΄-Π²ΡΠ²ΠΎΠ΄
ΠΠ° ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅ΠΌ ΠΈΠ· ΠΎΠΏΠΈΡΡΠ²Π°Π΅ΠΌΡΡ Π·Π΄Π΅ΡΡ ΡΡΠ°ΠΏΠ΅ ΡΠ°Π·Π²ΠΈΡΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΠ°Π·ΡΠ°ΡΡΠ°Π΅ΡΡΡ: Π² Π½Π΅Π΅ Π΄ΠΎΠ±Π°Π²Π»ΡΡΡΡΡ ΠΏΡΠΎΡΠ΅Π΄ΡΡΡ ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ, ΡΡΠ΅Π΄ΡΡΠ²Π° ΠΏΠ΅ΡΠ°ΡΠΈ ΡΡΡΠΎΠΊ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² Π½Π°ΡΡΠ΄Ρ Ρ ΡΠΈΡΠ»Π°ΠΌΠΈ ΠΈ ΡΡΠ΅Π½ΠΈΡ ΡΠΈΡΠ΅Π» ΠΈΠ· ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠ³ΠΎ Π²Ρ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠ°. ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, Π² ΡΠ·ΡΠΊ hoc6 Π²Π²ΠΎΠ΄ΡΡΡΡ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ ΠΈΠΌΠ΅Π½ ΡΠ°ΠΉΠ»ΠΎΠ², Π²ΠΊΠ»ΡΡΠ°Ρ ΠΈΠΌΡ "-", ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ°ΡΡΠ΅Π΅ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΉ Π²Ρ ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠΎΡΠΎΠΊ. ΠΡΠ΅ ΡΡΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π½Π° 235 ΡΡΡΠΎΠΊ, Π΄ΠΎΠ²ΠΎΠ΄Ρ Π΅Π΅ ΠΎΠ±ΡΠΈΠΉ ΡΠ°Π·ΠΌΠ΅Ρ Π΄ΠΎ 810 ΡΡΡΠΎΠΊ. Π ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ hoc ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ΅ΡΡΡ ΠΈΠ· ΠΊΠ°Π»ΡΠΊΡΠ»ΡΡΠΎΡΠ° Π² ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΎΡ ΡΠ·ΡΠΊΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ. ΠΠΎΠ»Π½ΠΎΡΡΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡΡΡ Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ 3.
Π Π³ΡΠ°ΠΌΠΌΠ°ΡΠΈΠΊΠ΅ Π²ΡΠ·ΠΎΠ²Ρ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡΡΡ ΠΊΠ°ΠΊ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ, Π° Π²ΡΠ·ΠΎΠ²Ρ ΠΏΡΠΎΡΠ΅Π΄ΡΡ ΠΊΠ°ΠΊ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΡ. Π ΡΠΎ, ΠΈ Π΄ΡΡΠ³ΠΎΠ΅ Π΄Π΅ΡΠ°Π»ΡΠ½ΠΎ ΠΏΠΎΡΡΠ½ΡΠ΅ΡΡΡ Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ 2, Π³Π΄Π΅ Π΄Π°Π΅ΡΡΡ Π΅ΡΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠΎΠ². Π’Π°ΠΊ, ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡΠΎΡΠ΅Π΄ΡΡΡ ΠΏΠ΅ΡΠ°ΡΠΈ Π²ΡΠ΅Ρ ΡΠΈΡΠ΅Π» Π€ΠΈΠ±ΠΎΠ½Π°ΡΡΠΈ, ΠΌΠ΅Π½ΡΡΠΈΡ Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°, ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
$ cat fib
proc fib() {
a = 0
b = 1
while (b < $1) {
print b
Ρ = b
b = a+b
a = Ρ
}
print "\n"
}
$ hoc6 fib -
fib(1000)
1 1 2 3 5 8 13 21 34.55 89 144 233 377 610 987
...
ΠΠ΄Π΅ΡΡ ΡΠ°ΠΊΠΆΠ΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²: ΠΈΠΌΡ ΡΠ°ΠΉΠ»Π° "-" Π·Π°Π΄Π°Π΅Ρ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΉ Π²Ρ ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠΎΡΠΎΠΊ.