Здравствуйте, Gaperton, Вы писали:
G>Здравствуйте, DJ KARIES, Вы писали:
G>
!!!!
G>У меня ряд вопросов.
G>1) Его легко встроить в плюсовую программу?
Да, хоть в delphi, хоть в асме, хоть в самом же форте.
Юзай retroforth.dll.
Там есть функция rfEval для интепретации переданной строки.
Вообще, достаточно передать через rfEval адрес одной своей сишной функции, а через которую биндить все остальные.
Т.е. типа GetProcAddress, как в винде организовать.
G>2) Он генерит машинный код на лету и выполняет его, не создавая нового процесса?
Да.
G>Если все — "да", то это похоже идеальная штука для реализации своих скриптовых языков. Надо брать.
Я с августа 2004, как узнал о Retroforth 7.2 просто без ума от него.
В той версии не было циклов. Так вот, я сваял слово "until" и циклы появились в v7.3.
Т.е. можно определить любую конструкцию, т.к. Forth — МЕТАКОМПИЛЯТОР.
DK>>---
DK>>Жаль, что с плавающей точкой траблы.
DK>>Но ничего, пишешь на дельфях dll-ку на 10 к-байт, цепляешь её и юзаешь себе плавающую точку.
DK>>Это для винды.
DK>>Под линухом, юнихом и беосом на дельяфях не попишешь уже. Только ся. Или на том же асме набить. Тока хрен наёдёшь корректные float to string и vice versa сырцы.
G>Странно это как-то... А нельзя просто определить несколько новых слов, которые будут использовать сопроцессор? Это же элементарно должно быть.
Без проблем.
Там, вроде, даже уже есть в Code Library.
Можно хоть в asm-файлике приаттачить float-арифметику, хоть машкодами на самом форте.
Траблик в переводе строки в float и наоборот.
Мне б алгоритм таких переводов, я б оформил это на форте.
Приходится юзать свою dll-ку на дельфях refmath.dll в 20кб для этого.
Раньше пробовал реализовать перевод строки во float на дельфях, чтоб потом алгоритм перенести на форт или асм, но вышло криво и я забил.
Кстати, вот интерфейс на дельфях к retroforth.dll, который я наваял:
unit rf;
interface
const
rfdll = 'rf.dll';
procedure rfAttach; stdcall external rfdll name 'retroforth_attach';
procedure rfInit; stdcall external rfdll name 'retroforth_init';
procedure rfEval; assembler; external rfdll name 'retroforth_eval';
procedure rfInterpreter; stdcall external rfdll name 'retroforth_interpreter';
procedure dup;
procedure drop;
procedure upsh(a: Integer); stdcall;
function upop: Integer;
procedure Eval(const Value: string);
implementation
procedure dup;
asm
sub esi,4
mov [esi],eax
end;
procedure drop;
asm
lodsd
end;
procedure upsh(a: Integer);
begin
asm
sub esi,4
mov [esi],eax
mov eax, a
end;
end;
function upop: Integer;
asm
lodsd
end;
procedure Eval(const Value: string);
var
i, n: Integer;
begin
upsh(Integer(PChar(Value)));
dup;
Length(Value);
rfEval;
end;
end.
Ещё есть версия Reva (Tetraforth)
http://retroforth.org/board/index.php?board=6.0
В ней слова все на асме.
Но гибкость при этом несколько ниже, хотя скорость может быть выше.