Страница 1 из 2

Скриптовый движок на Ruby

СообщениеДобавлено: 16.12.2010 04:40:08
Иван Шихалев
Собственно, моя обертка для использования в качестве внутреннего скриптового движка Ruby 1.8 почти готова. Хотелось бы собрать пожелания по программному интерфейсу...

Что есть сейчас: преобразование объектов и классов в ruby-аналоги, при этом из Ruby можно обращаться к published-свойствам и отдельным, вручную обернутым, методам и свойствам. На данный момент это:
Код: Выделить всё
TClass.UnitName
TObject.ToString
TPersistent.Assign
TPersistent.NamePath
TComponent.Components/FindComponent
TComponent.Owner


Поскольку языковые средства различны, в некоторых случаях вызов из Ruby выглядит не совсем так, как из Pascal... Но это вопрос обсуждаемый.

Собственно, если есть вопросы/пожелания — все сюда.

Текущая сырая (но рабочая) версия: https://github.com/shikhalev/ppruby
К концу недели планирую упорядочить до вменяемого состояния.

Добавлено спустя 5 минут 2 секунды:
Если кто какими-то скриптовыми движками в Lazarus пользовался/пользуется — напишите, что в них хорошего/плохого.

Re: Скриптовый движок на Ruby

СообщениеДобавлено: 16.12.2010 12:02:28
Mr.Smart
Пользуюсь LUA.
  • Удобный и понятный интерфейс доступа к библиотеке LUA(dll,so,dynlib);
  • Простая реализация доступа к классам FPC из кода LUA;
  • Просто приятный для восприятия синтаксис LUA (мне очень нравится :oops: );
  • Скрипты работают довольно быстро.

Re: Скриптовый движок на Ruby

СообщениеДобавлено: 16.12.2010 17:59:05
Иван Шихалев
Mr.Smart
Ссылочку можно, чтоб я мог посмотреть, что там есть?

Re: Скриптовый движок на Ruby

СообщениеДобавлено: 16.12.2010 18:40:30
Mr.Smart
http://www.lua.org/
http://www.lua.ru/
И на нашем форуме были посты о LUA.

Re: Скриптовый движок на Ruby

СообщениеДобавлено: 16.12.2010 18:42:18
Иван Шихалев
А как она к FPC-то цепляется?

Re: Скриптовый движок на Ruby

СообщениеДобавлено: 16.12.2010 18:48:58
Mr.Smart
Есть уже готовые интерфейсные модули в fpc/packages/lua. Есть ещё враппер pLua.

Re: Скриптовый движок на Ruby

СообщениеДобавлено: 18.12.2010 06:30:46
Иван Шихалев
Добавил методы TCollection, TCollectionItem и TStrings, а также довольно наглядный пример.
Основная рабочая версия: https://github.com/shikhalev/ppruby

Буду рад замечаниям и пожеланиям.

Добавлено спустя 42 секунды:
PS. Особенно интересно тестирование на системах, отличных от Linux x64...

Re: Скриптовый движок на Ruby

СообщениеДобавлено: 17.01.2011 09:57:12
MageSlayer
Mr.Smart писал(а):Есть ещё враппер pLua.


pLua в этой реализации ужасно глючный. Утечки памяти просто мрачные.
Мне удалось за несколько месяцев добиться более или менее стабильной работы, попатчив кучу багов.
Автор патчи не принимает, или на письма не отвечает.
Так что, могу выложить куда-нибудь на github, если кому-нибудь интересно.

Re: Скриптовый движок на Ruby

СообщениеДобавлено: 17.01.2011 11:38:14
Mr.Smart
MageSlayer можете выложить, может кому нибудь пригодится.
Я лично врапперами не пользуюсь.

Re: Скриптовый движок на Ruby

СообщениеДобавлено: 18.01.2011 05:53:02
Иван Шихалев
В настоящее время обертка сама определяет установленную версию Ruby... Под Win пока не тестировал, но вроде должно работать. Ссылка в первом посте, демка в комплекте.

Добавлено спустя 3 минуты 31 секунду:
Потихоньку буду наращивать объявления public и published методов и свойств. Published подхватывается и автоматом, но все равно думаю прописать основные в явном виде, чтобы они отображались в средствах «самоисследования» Ruby.

В ближайших планах — обработка set-свойств.

Обработчики событий не знаю, нужно ли делать — механизм хитрый получится, а полезность сомнительна.

Re: Скриптовый движок на Ruby

СообщениеДобавлено: 26.01.2011 03:14:44
Иван Шихалев
Published-свойства теперь не только обрабатываются, но и определяются автоматом. Добавлена обработка типов-множеств и Char c Wide/UnicodeChar'ом.

Re: Скриптовый движок на Ruby

СообщениеДобавлено: 16.03.2011 18:46:36
kipar
Класс, как раз о подобном я мечтал (доступ из скриптов ruby к объектам через RTTI). Даже лицензия подходит (GPL). Сейчас проверю как он под виндой работает.
---

Хм, не компилится пакет RubyLCL.
Пишет:
Код: Выделить всё
Z:\Projects\ruby_pas\ppruby.pp(37,10) Error: It is not possible to overload this operator. Related overloadable operators (if any) are:

на строке
Код: Выделить всё
operator explicit (v : VALUE) : UTF8String;
(и на всех остальных строках с оператором explicit)

FPC 2.4.2, Lazarus 0.9.31(SVN 29700). Возможно, проблема в lazarus - попробую под 0.9.28.
----
Гм. под 0.9.28 явно не работает, буду пробовать под fpc 2.4.3.
Если заменить operator explicit на operator := , заменить constref на const, то компилируется но пример не работает, буду разбираться дальше.
---
собрал транк fpc 2.5.1, под Windows XP демо-программа работает.

Re: Скриптовый движок на Ruby

СообщениеДобавлено: 17.03.2011 19:55:11
Иван Шихалев
Я использую 2.5.1
По идее, под 2.4.2 надо именно что поменять explicit на :=
А вот с constref на const не все так однозначно... Возможно потому пример и не работает. Можно попробовать заменить на var.

Re: Скриптовый движок на Ruby

СообщениеДобавлено: 19.04.2011 21:30:17
kipar
Маленький баг: в функции вызываемые DefineFunction передается на один объект больше (первым передается main), поэтому во всех DefineFunction надо последний параметр увеличить на 1 (точнее объявление TRubyFunctionxxx надо сделать как TRubyMethodxxx ):

Пример:

Код: Выделить всё
{$MODE OBJFPC}
{$H+}
program zzz;
uses ppRuby;

function DoLog(a : VALUE) : VALUE; cdecl;
begin
  writeln(String(Inspect(a)));
  Result := Qnil;
end;

begin
  ppRuby.Load(rvRuby18);
  DefineFunction('log', @DoLog);
  ppRuby.EvalString('log("zzz")');
  ppRuby.Unload;
end.


у меня выводит main вместо "zzz" (WinXP, fpc 2.5.1, Ruby 1.8.7), а если объявить function DoLog(a : VALUE; b: VALUE) : VALUE; cdecl; то log("zzz") не пройдет по числу параметров.

Re: Скриптовый движок на Ruby

СообщениеДобавлено: 20.04.2011 02:52:39
Иван Шихалев
Спасибо за информацию. Постараюсь сегодня же проверить и поправить. Если успею...

Добавлено спустя 1 час 56 минут 45 секунд:
Fixed. Теперь во всех DefineXXX используется TRubyMethodNN.
Еще раз спасибо.