Forth http://fforum.winglion.ru/ |
|
ForthEC http://fforum.winglion.ru/viewtopic.php?f=40&t=108 |
Страница 1 из 1 |
Автор: | Kamikaze [ Чт июл 13, 2006 17:10 ] |
Заголовок сообщения: | ForthEC |
ForthEC Таки не удержался... В связи с поднятыми тут вопросами "о наборах слов" - хотелось бы знать Ваше мнение о Words supported by ForthEC: ! ( n adr -- ) Store the value n at adr !r+ ( adr n -- adr ) Store n at adr, increment adr by 4 and push it on the stack ". ( adr -- ) Print the string pointed to by adr ' ( -- adr) name Push the address of a user-defined word ( ( -- ) Start a comment ) ( -- ) End a comment * ( n1 n2 -- n3) Multiply n1 by n2 + ( n1 n2 -- n3 ) Add n2 to n1 - ( n2 n2 -- n3 ) Subtract n2 from n1 . ( n -- ) Pop the value at the top of the stack and print it ." ( -- ) string Immediately print everything up to the next " / ( n1 n2 -- n3 ) Divide n1 by n2 /c ( -- n ) Push the size of a byte (1) /f ( -- n ) Push the size of a floating point number (8) /n ( -- n ) Push the size of a stack cell (4) 0< ( n -- f ) Compare n with 0 0= ( n -- f ) Compare n with 0 0> ( n -- f ) Compare n with 0 1+ ( n1 -- n2 ) Add one to n1 1- ( n1 -- n2 ) Subtract one from n1 2* ( n1 -- n2 ) Multiply n1 by two 2/ ( n2 -- n2 ) Divide n1 by two : ( -- ) name Start a word definition ; ( -- ) End a word definition ;@ ( n -- ) End a word definition and pop the top of the stack into register eax < ( n1 n2 -- f ) Compare n1 with n2 << ( n1 n2 -- n3 ) Shift n1 left n2 times <= ( n1 n2 -- f ) Compare n1 with n2 <> ( n1 n2 -- f ) Compare n1 with n2 = ( n1 n2 -- f ) Compare n1 with n2 > ( n1 n2 -- f ) Compare n1 with n2 >= ( n1 n2 -- f ) Compare n1 with n2 >> ( n1 n2 -- n3 ) Shift n1 right n2 times @ ( adr -- n ) Reads the value from adr and pushes it one the stack \ ( -- ) Treat the rest of the line as a comment a@ ( -- n ) Push the accumulator (eax) on the stack allot ( n -- ) Allocate n bytes of variable space and ( n1 n2 -- n3 ) Bitwise AND of n1 and n2 begin ( -- ) Start of begin...while...repeat bye ( -- ) Abort execution (calls ExitProcess) c! ( n adr -- ) Stores the low byte of n at adr c@ ( adr -- n ) Reads one byte from adr and pushes it on the stack as a zero-extended dword call ( -- ) name Call an external function (eg. Win32 API functions) calli ( adr -- ) Call the address on the stack case ( n -- ) Begin a case...endcase constant ( n -- ) name Declare a constant with the value of n cr ( -- ) Print the carriage return character default ( -- ) The default-case in a case...endcase do ( n1 n2 -- ) Start of do...loop, going from n2 to n1 drop ( n -- ) Drop the top of the stack dup ( n -- n n ) Duplicate the top of the stack else ( -- ) The alternative branch of an if...else...then emit ( n -- ) Print the top of the stack as a character emms ( -- ) Insert EMMS instruction and clear mmx stack endcase ( -- ) End of a case...endcase endof ( -- ) End of an of...endof erase ( adr n -- ) Set n byte at adr to zero exit ( -- ) Exit from the current word expect ( adr n -- ) Read max n bytes from the keyboard and store it at adr f! ( fp adr -- ) Store a floating point number (64-bit) f!s ( fp adr -- ) Store a floating point number (32-bit) f* ( f1 f2 -- f3 ) Floting point multiplication f+ ( f1 f2 -- f3 ) Floating point addition f- ( f1 f2 -- f3 ) Floating point subtraction f< ( f1 f2 -- f ) Floating point compare (less) f<> ( f1 f2 -- f ) Floating point compare (not equal) f= ( f2 f2 -- f ) Floating point compare (equal) f> ( f1 f2 -- f ) f/ ( f1 f2 -- f3 ) f0= ( fp -- f ) f0<> ( fp -- f ) f@ ( adr -- fp ) f@s ( adr -- fp ) false ( -- f ) Push false (0) fconstant ( fp -- ) name fcos ( f1 -- f2 ) Take the cosine of f1 fdrop ( fp -- ) fdup ( fp -- fp fp ) ffills ( adr n fp -- ) fill ( adr n1 n2 -- ) Fill n1 bytes at adr with n2 floor ( fp -- n ) Round fp towards zero and store it on the parameter stack fnegate ( f1 -- f2 ) Negate f1 fpop ( fp -- fp ) fpops ( fp -- fp ) fpush ( n1 n2 -- fp ) Store n1 and n2 on the floating point stack without doing any type conversion fpushs ( n -- fp ) Store n on the floating point stack without doing any type conversion fsin ( f1 -- f2 ) Take the sine of f1 fswap ( f1 f2 -- f2 f1 ) fvariable ( -- ) name Declare a floating point variable i ( -- n ) Push the top element of the loop control stack onto the parameter stack if ( f -- ) Start of a if...else...then include ( -- ) name Include a forth file j ( -- n ) Push the third element of the loop control stack onto the parameter stack loop ( -- ) End of a do...loop max ( n1 n2 -- n3 ) n3 is the maximum of n1 and n2 min ( n1 n2 -- n3 ) n3 is the minimum of n1 and n2 mod ( n1 n2 -- n3 ) n3 is n1 modulo n2 negate ( n1 -- n2 ) Negate n1 newline ( -- ) Print the newline character nip ( n1 n2 -- n2 ) not ( n1 -- n2 ) Bitwise NOT notouch ( -- ) Disable compilation null ( -- n ) Put NULL (zero) on the stack of ( n -- ) Start an of...endof off ( adr -- ) Stores false at adr on ( adr -- ) Stores true at adr or ( n1 n2 -- n3 ) Bitwise OR between n1 and n2 over ( n1 n2 -- n1 n2 n1) Duplicate the second element on the stack p! ( p adr -- ) Store an mmx register at adr (32-bit) p@ ( adr -- p ) Read the 32-bit value from adr and put it on the mmx stack pc+ ( p1 p2 -- p3 ) Add two packed groups of bytes pc2pw ( p -- p') Convert a group of 4 packed bytes to 4 packed words pdrop ( p -- ) pdup ( p -- p p ) pick ( n -- ) Duplicate the n:th element on the stack (0=first) pw* ( p1 p2 -- p3 ) repeat ( -- ) End of a begin...while...repeat rot ( n1 n2 n3 -- n2 n3 n1 )Rotate the top three elements of the parameter stack sp0 ( -- adr ) Push the stack base sp@ ( -- adr ) Push the stack pointer space ( -- ) Print the space character spaces ( n -- ) Print n space characters swap ( n1 n2 -- n2 n1 ) Swap the top two elements of the parameter stack then ( -- ) End of an if...else...then touch ( -- ) Enable compilation (used after a notouch) true ( -- f ) Push the value true (-1) tuck ( n1 n2 -- n2 n1 n2 ) until ( f -- ) End of a begin...until variable ( -- ) name Declare an integer variable w! ( n adr -- ) w@ ( adr -- n ) while ( f -- ) xor ( n1 n2 -- n3 ) z" ( -- adr ) string { ( -- ) parameters Specify parameters for a word (eg. : foo { param1 param2 }) } ( -- ) |
Автор: | Kamikaze [ Сб июл 15, 2006 02:05 ] |
Заголовок сообщения: | |
Не, ну я ща буду ругаться! Через пару дней у автора Фортека день рождения. Хотел его на форум пригласить. Но раз никому не интересно... Теоретические выкладки конечно здорово. Но на SUBJ при всей его "обрезанности" можно работать. Пол секунды на компиляцию - и полноценная DLL! А отсутствие либ как-то даже и лучше - меньше путанницы. |
Автор: | Hishnik [ Сб июл 15, 2006 10:58 ] |
Заголовок сообщения: | |
Да нормальный набор. Непонятно с { }, но имеет право на существование. |
Автор: | Kamikaze [ Сб июл 15, 2006 12:09 ] |
Заголовок сообщения: | |
Хищник писал(а): Да нормальный набор. Непонятно с { }, но имеет право на существование.
Ну это как раз просто - локальные переменные. А вот с вариациями на тему floating point - мраки. И шо цэ такэ? Отсутствие стека возвратов конечно сильно затрудняет жизнь, но потом привыкаешь... |
Автор: | вопрос [ Сб июл 15, 2006 12:20 ] |
Заголовок сообщения: | |
Цитата: touch ( -- ) Enable compilation (used after a notouch)
А вот это чего? (как работает?) touch создаёт файл в консоли UNIX? а тут? |
Автор: | вопрос [ Сб июл 15, 2006 12:22 ] |
Заголовок сообщения: | |
Цитата: Отсутствие стека возвратов конечно сильно затрудняет жизнь, но потом привыкаешь...
Так это ж вроде компилятор, стек возвратов - удел интерпретаторов (или я неправильно понял? |
Автор: | Hishnik [ Сб июл 15, 2006 13:01 ] |
Заголовок сообщения: | |
Kamikaze писал(а): Ну это как раз просто - локальные переменные. Я так понял, что это спецификация параметров. Или имеются в виду таки локальные переменные? Kamikaze писал(а): А вот с вариациями на тему floating point - мраки. И шо цэ такэ?
Вроде бы там просто наборы для short и double. Это нормальный вариант, в '94 загрузка на вещественный стек из памяти будет F@ и SF@. |
Автор: | Kamikaze [ Сб июл 15, 2006 15:13 ] |
Заголовок сообщения: | |
вопрос писал(а): Цитата: touch ( -- ) Enable compilation (used after a notouch) А вот это чего? (как работает?) touch создаёт файл в консоли UNIX? а тут? О, это изюминка!!! Пара слов notouch/touch - это переход к ассемблеру (MASM32) в процессе компиляции или внутри слов: Цитата: \ Random number generator (borrowed from Paul Dixon)
: random ( -- n ) rngh rng notouch pop esi pop edi mov edx,[edi] shr edx,1 mov eax,[esi] mov ecx,eax rcr ecx,1 rcl edx,1 mov [edi],edx shl eax,12 xor ecx,eax mov eax,ecx shr eax,20 xor ecx,eax mov [esi],ecx and ecx,191 mov eax,ecx touch a@ ; При создании готовых EXE/DLL даже временные .asm файлы создаются. Аналогично и для всяких "ARM, Blackfin, M68000 and SuperH"... Вообщем асм здесь сплошь и рядом - без него с Фортеком не сработаешься! |
Автор: | Kamikaze [ Сб июл 15, 2006 15:28 ] |
Заголовок сообщения: | |
Хищник писал(а): Или имеются в виду таки локальные переменные? Проще показать (на примере из "\examples" - вызов DLL): 1й файл - test.exe: Цитата: variable lib variable fptr \ Load the dll z" test.dll" call LoadLibrary a@ lib ! lib @ 0= if bye then \ Get the address of say_it z" say_it" lib @ call GetProcAddress a@ fptr ! \ Call it indirectly z" Hello from test.dll !" fptr @ calli \ Close the dll and exit the program lib @ call FreeLibrary bye 2й файл - test.dll: Цитата: include ..\..\include\windef.f : LibMain { hInstDLL reason reserved } reason DLL_PROCESS_ATTACH = if 1 else 0 then \ Pop the arguments of the stack, leaving the return-value swap drop swap drop swap drop ;@ : say_it { message } MB_OK z" Message" message NULL call MessageBox drop ; ^ Здесь - вход reason и message. Нюанс: как бы это прояснить... наверно внешние переменные с поведением констант, т.е @ и ! для них не работают. Ну не знаю я точной терминологии! К тому же особой разницы и нет,- адрес или значение на стеке: с тем же асмом любая константа - переменная. Хищник писал(а): Вроде бы там просто наборы для short и double. Это нормальный вариант, в '94 загрузка на вещественный стек из памяти будет F@ и SF@.
Спасибо! Будем ковыряться дальше... |
Автор: | вопрос [ Сб июл 15, 2006 19:33 ] |
Заголовок сообщения: | |
Отсутствует CREATE. |
Автор: | WingLion [ Сб июл 15, 2006 19:40 ] |
Заголовок сообщения: | |
вопрос писал(а): Отсутствует CREATE.
И DOES> к нему нет. |
Автор: | Kamikaze [ Вс июл 16, 2006 00:21 ] |
Заголовок сообщения: | |
Ну это что-то вроде более низкоуровневой реализации форта. Лишних звезд с неба не собираем, зато на нем можно писать программы! Кое-где сыро - некоторые глюки с памятью, встроеных функций для строк - всего ничего... Однако - такая "расширенная дружба" с ассемблером, это не тормоз, как с java. И, главное,- сам компилятор сделан на Эйфории. В принципе-то какая разница на чем компилятор, если бы не идея с единым типом данных - эйфорийными "рядами". Мы это обсуждали: http://fforum.winglion.ru/viewtopic.php?t=82 Только в Фортеке ряды не реализованы. Зато исходники к нему имеются. И эйфория, для знающих С - семечки. Плюс еще добавить лисповские списки... Жаль только что форум - место где можно потрепаться, а не поработать коллективно... |
Автор: | вопрос [ Вс июл 16, 2006 00:28 ] |
Заголовок сообщения: | |
Цитата: There is no real dictionary. You've got 128 kB of static variable space, leaving
no room for large arrays. Кто нибудь обьяснит, что значит это место из readme к Фортек? |
Автор: | KPG [ Вс апр 24, 2016 14:49 ] |
Заголовок сообщения: | Re: ForthEC |
ForthEC для Kolibri OS в теме FFire Demo Эффект огня Колибри ОС форума. |
Автор: | KPG [ Вт апр 26, 2016 17:01 ] |
Заголовок сообщения: | Re: ForthEC |
Автор ForthEC разместил последнюю версию на Github |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |