Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«UNIX β€” ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Π°Ρ срСда программирования». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 71

Автор Π‘Ρ€Π°ΠΉΠ°Π½ ΠšΠ΅Ρ€Π½ΠΈΠ³Π°Π½

| ΠΏΠΎΠΊΠ° усл ΠΎΠΏΠ΅Ρ€ всС {

 ($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

...

Π—Π΄Π΅ΡΡŒ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ использованиС Ρ„Π°ΠΉΠ»ΠΎΠ²: имя Ρ„Π°ΠΉΠ»Π° "-" Π·Π°Π΄Π°Π΅Ρ‚ стандартный Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ.