Re[6]: Ссылки по Форту
От: DJ KARIES Россия  
Дата: 05.03.05 17:10
Оценка:
Здравствуйте, 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
В ней слова все на асме.
Но гибкость при этом несколько ниже, хотя скорость может быть выше.
ntr soft: www.dkdens.narod.ru :: giref: www.retroforth.org/board/index.php?topic=177.0
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.