Автор |
Сообщение |
|
|
Заголовок сообщения: |
|
|
|
вопрос писал(а): Ну, сумейте прото не полениться записать на Форте if((a==(c+b)*d-e&&d<e) || (c<a * d - (b * e) * 1.5)) function1(); else if ... else ...
вне темы конечно, но ...
Код: a c b + d * e d AND e < - = c a < d * b e 1.5 * * - OR IF word1 ELSE word2 IF ... THEN THEN
[quote="вопрос"]Ну, сумейте прото не полениться записать на Форте if((a==(c+b)*d-e&&d<e) || (c<a * d - (b * e) * 1.5)) function1(); else if ... else ...[/quote]
вне темы конечно, но ...
[code]a c b + d * e d AND e < - = c a < d * b e 1.5 * * - OR IF word1 ELSE word2 IF ... THEN THEN[/code]
:)
|
|
|
|
Добавлено: Ср июн 06, 2007 11:45 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
По-русски
если
или d меньше e и а равно разности произведения d на сумму c+b и е
или с меньше разности произведения а и d и полутора произведения b и е
вызвать функцию
иначе если иначе
Форт позволяет реализовать любой синтаксис, где это видано, чтобы не пользовались преиму-вами?
По-русски
[u]если [/u]
или [b]d[/b] меньше [b]e[/b] и а равно разности произведения [b]d[/b] на сумму [b]c+b[/b] и [b]е[/b]
или [b]с[/b] меньше разности произведения [b]а[/b] и [b]d[/b] и полутора произведения [b]b[/b] и [b]е[/b]
[u]вызвать функцию[/u]
[u]иначе если иначе[/u]
Форт позволяет реализовать любой синтаксис, где это видано, чтобы не пользовались преиму-вами?
|
|
|
|
Добавлено: Ср июн 06, 2007 10:14 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
я это даже прочесть не могу
я это даже прочесть не могу :)
|
|
|
|
Добавлено: Ср июн 06, 2007 10:05 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
по поводу С-синтаксиса добро пожаловать в тему "Как бы фортеры восприняли такой синтаксис", а эту часть темы, как не соответствующую теме, модератора прошу удалить
по поводу С-синтаксиса добро пожаловать в тему "Как бы фортеры восприняли такой синтаксис", а эту часть темы, как не соответствующую теме, модератора прошу удалить
|
|
|
|
Добавлено: Ср июн 06, 2007 09:44 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
diver писал(а): вопрос писал(а): Но С-синтаксис имеет хорошие качества Хоть одно ?
Это массовый продукт:)
Но по моему это уже флейм.
[quote="diver"][quote="вопрос"]Но С-синтаксис имеет хорошие качества[/quote]
Хоть одно :) ?[/quote]
Это массовый продукт:)
Но по моему это уже флейм.
|
|
|
|
Добавлено: Ср июн 06, 2007 06:45 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
вопрос писал(а): Но С-синтаксис имеет хорошие качества
Хоть одно ?
[quote="вопрос"]Но С-синтаксис имеет хорошие качества[/quote]
Хоть одно :) ?
|
|
|
|
Добавлено: Ср июн 06, 2007 06:34 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
diver писал(а): in4 писал(а): mrack писал(а): еще раз скажу, в истоках форт меня заинтересовал своей простотой и НЕ_СИ_СИНТАКСИСОМ не испытываю лично не капли восторга от внедрения си подобных конструкций Абсолютно поддерживаю. Форт все-таки самодостаточная система.
Никто не спорит о самодостаточности Форта. Но С-синтаксис имеет хорошие качества
[quote="diver"][quote="in4"]mrack писал(а): еще раз скажу, в истоках форт меня заинтересовал своей простотой и НЕ_СИ_СИНТАКСИСОМ не испытываю лично не капли восторга от внедрения си подобных конструкций[/quote] Абсолютно поддерживаю. Форт все-таки самодостаточная система.[/quote]
Никто не спорит о самодостаточности Форта. Но С-синтаксис имеет хорошие качества
|
|
|
|
Добавлено: Вт июн 05, 2007 19:42 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
in4 писал(а): mrack писал(а): еще раз скажу, в истоках форт меня заинтересовал своей простотой и НЕ_СИ_СИНТАКСИСОМ не испытываю лично не капли восторга от внедрения си подобных конструкций
Абсолютно поддерживаю. Форт все-таки самодостаточная система.
[quote="in4"]mrack писал(а): еще раз скажу, в истоках форт меня заинтересовал своей простотой и НЕ_СИ_СИНТАКСИСОМ не испытываю лично не капли восторга от внедрения си подобных конструкций[/quote]
Абсолютно поддерживаю. Форт все-таки самодостаточная система.
|
|
|
|
Добавлено: Вт июн 05, 2007 12:57 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
mrack писал(а): еще раз скажу, в истоках форт меня заинтересовал своей простотой и НЕ_СИ_СИНТАКСИСОМ не испытываю лично не капли восторга от внедрения си подобных конструкций
Конечно, в Форте С-шные костыли не нужны!
Предложение было для Сшных исходников!
И макросы, IMHO, могут хоть как-то приблизить С к Форту в данном конкретном случае - при написании ВМ на С.
[quote="mrack"]еще раз скажу, в истоках форт меня заинтересовал своей простотой и НЕ_СИ_СИНТАКСИСОМ не испытываю лично не капли восторга от внедрения си подобных конструкций[/quote]
Конечно, в Форте С-шные костыли не нужны! ;)
Предложение было для Сшных исходников! ;)
И макросы, IMHO, могут хоть как-то приблизить С к Форту в [b]данном конкретном [/b]случае - при написании ВМ на С.
|
|
|
|
Добавлено: Вт июн 05, 2007 12:09 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
еще раз скажу, в истоках форт меня заинтересовал своей простотой и НЕ_СИ_СИНТАКСИСОМ
не испытываю лично не капли восторга от внедрения си подобных конструкций
еще раз скажу, в истоках форт меня заинтересовал своей простотой и НЕ_СИ_СИНТАКСИСОМ
не испытываю лично не капли восторга от внедрения си подобных конструкций
|
|
|
|
Добавлено: Пн июн 04, 2007 06:16 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
Я еще раз предложу использовать макросы С для упрощения (и повышения читабельности) исходников...
Я еще раз предложу использовать макросы С для упрощения (и повышения читабельности) исходников... ;)
|
|
|
|
Добавлено: Пн июн 04, 2007 00:26 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
отладка
Код: void sdot() { printf("\n[ "); for (uint i=0;i<Dp;i++) printf("%i ",D[i]); printf("]\n"); } void dump() { assert(Dp>=1); uint len=D[--Dp],addr=D[--Dp]; assert(addr+len<Msz); printf("\n[ "); for (uint i=addr;i<addr+len;i++) printf("%.2X ",M[i]); printf("]\n"); } void hdot() { assert(Dp>=1); #ifdef MODE16 printf("%.4X ",D[--Dp]); #else printf("%.8X ",D[--Dp]); #endif } void dot() { assert(Dp>=1); printf("%i ",D[--Dp]); } Код: void step() { switch(op) { case 0x80: sdot(); break; case 0x81: dump(); break; case 0x82: hdot(); break; case 0x83: dot(); break; те же замечания -- работать ли через классическую консоль, или использовать гуйню с окошками дампа стеков и памяти с выводом туда отладочными слвоами, и т.п., добавить еще команды останова, дампа состояния форт-машины при аварийном останове чтобы юзер мог послать разработчику для разбора проблемы, заменить ассерты на открытие отладочного интерфейса по всему тексту движка итд Код: 0x80 0op s. 0x81 0op dump 0x82 0op h. 0x83 0op .
еще -- слова типа h. . перенести в консольный ввод/вывод как часто используемые, или оставить в отладке, а консольный вывод чисел реализовать в байт-коде специально
отладка
[code]void sdot() { printf("\n[ "); for (uint i=0;i<Dp;i++) printf("%i ",D[i]); printf("]\n"); } void dump() { assert(Dp>=1); uint len=D[--Dp],addr=D[--Dp]; assert(addr+len<Msz); printf("\n[ "); for (uint i=addr;i<addr+len;i++) printf("%.2X ",M[i]); printf("]\n"); } void hdot() { assert(Dp>=1); #ifdef MODE16 printf("%.4X ",D[--Dp]); #else printf("%.8X ",D[--Dp]); #endif } void dot() { assert(Dp>=1); printf("%i ",D[--Dp]); }[/code]
[code]void step() { switch(op) { case 0x80: sdot(); break; case 0x81: dump(); break; case 0x82: hdot(); break; case 0x83: dot(); break;[/code]
те же замечания -- работать ли через классическую консоль, или использовать гуйню с окошками дампа стеков и памяти с выводом туда отладочными слвоами, и т.п., добавить еще команды останова, дампа состояния форт-машины при аварийном останове чтобы юзер мог послать разработчику для разбора проблемы, заменить ассерты на открытие отладочного интерфейса по всему тексту движка итд
[code]0x80 0op s. 0x81 0op dump 0x82 0op h. 0x83 0op .[/code]
еще -- слова типа h. . перенести в консольный ввод/вывод как часто используемые, или оставить в отладке, а консольный вывод чисел реализовать в байт-коде специально
|
|
|
|
Добавлено: Вс июн 03, 2007 12:53 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
консольный ввод/вывод
Код: void qkey() { assert(Dp<Dsz); D[Dp++]=-1; } void key() { assert(Dp<Dsz); D[Dp++]=getchar(); } void qemit() { assert(Dp<Dsz); D[Dp++]=-1; } void emit() { assert(Dp>=1); if (D[Dp-1]==0x0A) putchar(0x0D); putchar(D[--Dp]); } Код: void step() { switch(op) { case 0x70: qkey(); break; case 0x71: key(); break; case 0x72: qemit(); break; case 0x73: emit(); break; вообще тут нужна проработка -- давать ли прямой доступ к консоли, работать через stdio/stdout, делать ли какие-то потоки ввода/вывода с созданием/переключением/итп, короче нужна проработка Код: \ консольный ввод/вывод (фактически расширение -- может просто не поддерживатся железом)
0x70 0op ?key 0x71 0op key 0x72 0op ?emit 0x73 0op emit
консольный ввод/вывод
[code]void qkey() { assert(Dp<Dsz); D[Dp++]=-1; } void key() { assert(Dp<Dsz); D[Dp++]=getchar(); } void qemit() { assert(Dp<Dsz); D[Dp++]=-1; } void emit() { assert(Dp>=1); if (D[Dp-1]==0x0A) putchar(0x0D); putchar(D[--Dp]); }[/code]
[code]void step() { switch(op) { case 0x70: qkey(); break; case 0x71: key(); break; case 0x72: qemit(); break; case 0x73: emit(); break;[/code]
вообще тут нужна проработка -- давать ли прямой доступ к консоли, работать через stdio/stdout, делать ли какие-то потоки ввода/вывода с созданием/переключением/итп, короче нужна проработка
[code]\ консольный ввод/вывод (фактически расширение -- может просто не поддерживатся железом)
0x70 0op ?key 0x71 0op key 0x72 0op ?emit 0x73 0op emit[/code]
|
|
|
|
Добавлено: Вс июн 03, 2007 12:45 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
логика и битовые операции
Код: void eq() { assert(Dp>=2); int n2=D[--Dp],n1=D[--Dp]; if (n1==n2) D[Dp++]=-1; else D[Dp++]=0; } void noteq() { assert(Dp>=2); int n2=D[--Dp],n1=D[--Dp]; if (n1!=n2) D[Dp++]=-1; else D[Dp++]=0; } void less() { assert(Dp>=2); int n2=D[--Dp],n1=D[--Dp]; if (n1<n2) D[Dp++]=-1; else D[Dp++]=0; } void great() { assert(Dp>=2); int n2=D[--Dp],n1=D[--Dp]; if (n1>n2) D[Dp++]=-1; else D[Dp++]=0; } void leq() { assert(Dp>=2); int n2=D[--Dp],n1=D[--Dp]; if (n1<=n2) D[Dp++]=-1; else D[Dp++]=0; } void geq() { assert(Dp>=2); int n2=D[--Dp],n1=D[--Dp]; if (n1>=n2) D[Dp++]=-1; else D[Dp++]=0; }
void not() { assert(Dp>=1); D[Dp-1]=~D[Dp-1]; } void or() { assert(Dp>=2); uint n2=D[--Dp],n1=D[--Dp]; D[Dp++]=n1|n2; } void and() { assert(Dp>=2); uint n2=D[--Dp],n1=D[--Dp]; D[Dp++]=n1&n2; } void xor() { assert(Dp>=2); uint n2=D[--Dp],n1=D[--Dp]; D[Dp++]=n1^n2; } void lshift() { assert(Dp>=2); uint n2=D[--Dp],n1=D[--Dp]; D[Dp++]=n1<<n2; } void rshift() { assert(Dp>=2); uint n2=D[--Dp],n1=D[--Dp]; D[Dp++]=n1>>n2; } Код: void step() { switch(op) { case 0x40: eq(); break; case 0x41: noteq(); break; case 0x42: less(); break; case 0x43: great(); break; case 0x44: leq(); break; case 0x45: geq(); break;
case 0x48: not(); break; case 0x49: or(); break; case 0x4A: and(); break; case 0x4B: xor(); break; case 0x4C: lshift(); break; case 0x4D: rshift(); break; Код: 0x40 0op = 0x41 0op != : <> != ; 0x42 0op < 0x43 0op > 0x44 0op <= 0x45 0op >=
0x48 0op not 0x49 0op or 0x4A 0op and 0x4B 0op xor 0x4C 0op << 0x4D 0op >>
логика и битовые операции
[code]void eq() { assert(Dp>=2); int n2=D[--Dp],n1=D[--Dp]; if (n1==n2) D[Dp++]=-1; else D[Dp++]=0; } void noteq() { assert(Dp>=2); int n2=D[--Dp],n1=D[--Dp]; if (n1!=n2) D[Dp++]=-1; else D[Dp++]=0; } void less() { assert(Dp>=2); int n2=D[--Dp],n1=D[--Dp]; if (n1<n2) D[Dp++]=-1; else D[Dp++]=0; } void great() { assert(Dp>=2); int n2=D[--Dp],n1=D[--Dp]; if (n1>n2) D[Dp++]=-1; else D[Dp++]=0; } void leq() { assert(Dp>=2); int n2=D[--Dp],n1=D[--Dp]; if (n1<=n2) D[Dp++]=-1; else D[Dp++]=0; } void geq() { assert(Dp>=2); int n2=D[--Dp],n1=D[--Dp]; if (n1>=n2) D[Dp++]=-1; else D[Dp++]=0; }
void not() { assert(Dp>=1); D[Dp-1]=~D[Dp-1]; } void or() { assert(Dp>=2); uint n2=D[--Dp],n1=D[--Dp]; D[Dp++]=n1|n2; } void and() { assert(Dp>=2); uint n2=D[--Dp],n1=D[--Dp]; D[Dp++]=n1&n2; } void xor() { assert(Dp>=2); uint n2=D[--Dp],n1=D[--Dp]; D[Dp++]=n1^n2; } void lshift() { assert(Dp>=2); uint n2=D[--Dp],n1=D[--Dp]; D[Dp++]=n1<<n2; } void rshift() { assert(Dp>=2); uint n2=D[--Dp],n1=D[--Dp]; D[Dp++]=n1>>n2; }[/code]
[code]void step() { switch(op) { case 0x40: eq(); break; case 0x41: noteq(); break; case 0x42: less(); break; case 0x43: great(); break; case 0x44: leq(); break; case 0x45: geq(); break;
case 0x48: not(); break; case 0x49: or(); break; case 0x4A: and(); break; case 0x4B: xor(); break; case 0x4C: lshift(); break; case 0x4D: rshift(); break;[/code]
[code]0x40 0op = 0x41 0op != : <> != ; 0x42 0op < 0x43 0op > 0x44 0op <= 0x45 0op >=
0x48 0op not 0x49 0op or 0x4A 0op and 0x4B 0op xor 0x4C 0op << 0x4D 0op >>[/code]
|
|
|
|
Добавлено: Вс июн 03, 2007 12:37 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
целочисленная арифметика
Код: void add() { assert(Dp>=2); int n2=D[--Dp],n1=D[--Dp]; D[Dp++]=n1+n2; } void sub() { assert(Dp>=2); int n2=D[--Dp],n1=D[--Dp]; D[Dp++]=n1-n2; } void mul() { assert(Dp>=2); int n2=D[--Dp],n1=D[--Dp]; D[Dp++]=n1*n2; } void div() { assert(Dp>=2); int n2=D[--Dp],n1=D[--Dp]; D[Dp++]=n1/n2; } void mod() { assert(Dp>=2); int n2=D[--Dp],n1=D[--Dp]; D[Dp++]=n1%n2; } void zmin() { assert(Dp>=2); int n2=D[--Dp],n1=D[--Dp]; if (n1<n2) D[Dp++]=n1; else D[Dp++]=n2; } void zmax() { assert(Dp>=2); int n2=D[--Dp],n1=D[--Dp]; if (n1<n2) D[Dp++]=n2; else D[Dp++]=n1; }
#ifdef DOS16 void rnd() { assert(Dp>=1); D[Dp-1]=random(D[Dp-1]+1); } #endif Код: void step() { switch(op) { case 0x30: add(); break; case 0x31: sub(); break; case 0x32: mul(); break; case 0x33: div(); break; case 0x34: mod(); break; case 0x35: zmin(); break; case 0x36: zmax(); break; #ifdef DOS16 case 0x37: rnd(); break; #endif генерацию случайный чисел пока нашел как делать только под DOS Код: 0x30 0op + 0x31 0op - 0x32 0op * 0x33 0op / 0x34 0op mod 0x35 0op min 0x36 0op max 0x37 0op rnd
целочисленная арифметика
[code]void add() { assert(Dp>=2); int n2=D[--Dp],n1=D[--Dp]; D[Dp++]=n1+n2; } void sub() { assert(Dp>=2); int n2=D[--Dp],n1=D[--Dp]; D[Dp++]=n1-n2; } void mul() { assert(Dp>=2); int n2=D[--Dp],n1=D[--Dp]; D[Dp++]=n1*n2; } void div() { assert(Dp>=2); int n2=D[--Dp],n1=D[--Dp]; D[Dp++]=n1/n2; } void mod() { assert(Dp>=2); int n2=D[--Dp],n1=D[--Dp]; D[Dp++]=n1%n2; } void zmin() { assert(Dp>=2); int n2=D[--Dp],n1=D[--Dp]; if (n1<n2) D[Dp++]=n1; else D[Dp++]=n2; } void zmax() { assert(Dp>=2); int n2=D[--Dp],n1=D[--Dp]; if (n1<n2) D[Dp++]=n2; else D[Dp++]=n1; }
#ifdef DOS16 void rnd() { assert(Dp>=1); D[Dp-1]=random(D[Dp-1]+1); } #endif[/code]
[code]void step() { switch(op) { case 0x30: add(); break; case 0x31: sub(); break; case 0x32: mul(); break; case 0x33: div(); break; case 0x34: mod(); break; case 0x35: zmin(); break; case 0x36: zmax(); break; #ifdef DOS16 case 0x37: rnd(); break; #endif[/code]
генерацию случайный чисел пока нашел как делать только под DOS
[code]0x30 0op + 0x31 0op - 0x32 0op * 0x33 0op / 0x34 0op mod 0x35 0op min 0x36 0op max 0x37 0op rnd[/code]
|
|
|
|
Добавлено: Вс июн 03, 2007 12:32 |
|
|
|
|