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

Планы, идеология, архитектура и т.п.

Модератор: Модераторы

Аватара пользователя
Иван Шихалев
энтузиаст
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург
Контактная информация:

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

Сообщение Иван Шихалев »

Собственно, моя обертка для использования в качестве внутреннего скриптового движка 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 пользовался/пользуется — напишите, что в них хорошего/плохого.
Последний раз редактировалось Иван Шихалев 18.12.2010 05:42:08, всего редактировалось 1 раз.
Причина: Сменил адрес на более актуальный, удалил пример, поскольку теперь он нерабочий.
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

Пользуюсь LUA.
  • Удобный и понятный интерфейс доступа к библиотеке LUA(dll,so,dynlib);
  • Простая реализация доступа к классам FPC из кода LUA;
  • Просто приятный для восприятия синтаксис LUA (мне очень нравится :oops: );
  • Скрипты работают довольно быстро.
Аватара пользователя
Иван Шихалев
энтузиаст
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург
Контактная информация:

Сообщение Иван Шихалев »

Mr.Smart
Ссылочку можно, чтоб я мог посмотреть, что там есть?
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

http://www.lua.org/
http://www.lua.ru/
И на нашем форуме были посты о LUA.
Аватара пользователя
Иван Шихалев
энтузиаст
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург
Контактная информация:

Сообщение Иван Шихалев »

А как она к FPC-то цепляется?
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

Есть уже готовые интерфейсные модули в fpc/packages/lua. Есть ещё враппер pLua.
Аватара пользователя
Иван Шихалев
энтузиаст
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург
Контактная информация:

Сообщение Иван Шихалев »

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

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

Добавлено спустя 42 секунды:
PS. Особенно интересно тестирование на системах, отличных от Linux x64...
MageSlayer
постоялец
Сообщения: 216
Зарегистрирован: 07.09.2006 12:30:44

Сообщение MageSlayer »

Mr.Smart писал(а):Есть ещё враппер pLua.


pLua в этой реализации ужасно глючный. Утечки памяти просто мрачные.
Мне удалось за несколько месяцев добиться более или менее стабильной работы, попатчив кучу багов.
Автор патчи не принимает, или на письма не отвечает.
Так что, могу выложить куда-нибудь на github, если кому-нибудь интересно.
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

MageSlayer можете выложить, может кому нибудь пригодится.
Я лично врапперами не пользуюсь.
Аватара пользователя
Иван Шихалев
энтузиаст
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург
Контактная информация:

Сообщение Иван Шихалев »

В настоящее время обертка сама определяет установленную версию Ruby... Под Win пока не тестировал, но вроде должно работать. Ссылка в первом посте, демка в комплекте.

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

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

Обработчики событий не знаю, нужно ли делать — механизм хитрый получится, а полезность сомнительна.
Аватара пользователя
Иван Шихалев
энтузиаст
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург
Контактная информация:

Сообщение Иван Шихалев »

Published-свойства теперь не только обрабатываются, но и определяются автоматом. Добавлена обработка типов-множеств и Char c Wide/UnicodeChar'ом.
kipar
новенький
Сообщения: 78
Зарегистрирован: 04.03.2010 11:15:54

Сообщение 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 демо-программа работает.
Аватара пользователя
Иван Шихалев
энтузиаст
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург
Контактная информация:

Сообщение Иван Шихалев »

Я использую 2.5.1
По идее, под 2.4.2 надо именно что поменять explicit на :=
А вот с constref на const не все так однозначно... Возможно потому пример и не работает. Можно попробовать заменить на var.
kipar
новенький
Сообщения: 78
Зарегистрирован: 04.03.2010 11:15:54

Сообщение 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") не пройдет по числу параметров.
Аватара пользователя
Иван Шихалев
энтузиаст
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург
Контактная информация:

Сообщение Иван Шихалев »

Спасибо за информацию. Постараюсь сегодня же проверить и поправить. Если успею...

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