Встраивание tcl в ruby - PullRequest
       6

Встраивание tcl в ruby

1 голос
/ 15 апреля 2010

Есть ли способ сделать это? Кажется, единственный возможный способ сделать это - использовать ruby ​​/ tk и создать интерпретатор tcl через этот API. Тем не менее, я хотел бы использовать это в системе без графического интерфейса (х Windows). У меня нет выбора?

Спасибо

Ответы [ 3 ]

3 голосов
/ 15 апреля 2010

Если вы можете вызывать произвольные простые функции в C API Tcl, ключевые из них:

  • Tcl_FindExecutable - Сначала позвоните, чтобы инициализировать библиотеку
  • Tcl_CreateInterp - Возвращает дескриптор для нового контекста выполнения
  • Tcl_Eval - оценивает скрипт; возвращает константы TCL_OK (0) или TCL_ERROR (1) (или несколько других, которые редко встречаются в общем коде)
  • Tcl_GetResult - Возвращает значение результата (или сообщение об ошибке)
  • Tcl_ResetResult - очищает значение результата
  • Tcl_DeleteInterp - Может быть, вы можете догадаться, что это делает ...

Вы также можете получить доступ к «глобальным» переменным в контексте с Tcl_GetVar и Tcl_SetVar; это очень удобный способ передачи значений, которые могут быть недопустимыми сценариями.

0 голосов
/ 24 апреля 2019

Q. Встраивание tcl в ruby ​​[.] Есть ли способ сделать это?

я сталкивался этот пост от Мац Сам в 2005 году из ветки под названием «Запусти TCL в ruby».

Его пример программы (из поста) оценивает строки кода Tcl из Ruby без выделения:

require 'tcltklib'

def test
  ip1 = TclTkIp.new

  puts ip1._eval('button .lab -text exit -command "destroy ."').inspect
  puts ip1._eval('pack .lab').inspect

  puts ip1._eval(%q+puts [ruby {print "print by ruby\n"; 'puts by tcl/tk'}]+).inspect

  TclTkLib.mainloop
end

test

Его консольный вывод:

".lab"
""
print by ruby
puts by tcl/tk
""

Цитата из его поста:

Расширение tcltklib, которое поставляется со стандартным дистрибутивом, вызывает интерпретатор Tcl напрямую без какого-либо межпроцессного взаимодействия.

Чтобы это работало, мне нужно было продублировать следующие каталоги:

  1. /c/Ruby/lib/tcltk/tcl8.5 как /c/Ruby/lib/tcl8.5
  2. /c/Ruby/lib/tcltk/tk8.5 как /c/Ruby/lib/tk8.5

(Возможно, ваш Ruby установлен где-то еще.)

Q. Я хотел бы использовать это в системе без GUI (x windows).

В ответном сообщении, расположенном непосредственно под заголовком Матца, Хидетоши Нагаи говорит:

Если нет необходимости в Tk, можно создать IP без Tk. Чтобы сделать это, пожалуйста, позвоните TclTkIp.new(nil, false).

Итак, вот программа Матца, измененная для запуска без графического окна Tk:

require 'tcltklib'

def test
# nil, false means without Tk:
  ip1 = TclTkIp.new nil, false

  puts ip1._eval('list { aa bb cc }').inspect

  puts ip1._eval('set list { aa bb cc }; join $list ""').inspect

  TclTkLib.mainloop
end

test

Его консольный вывод:

"{ aa bb cc }"
"aabbcc"

Эти две программы работали для меня, используя Ruby 2.2.5 (с Tk 8.5.12) в Windows 7.

Для чего это стоит, вот руководство для tcltklib.

0 голосов
/ 15 апреля 2010

если вы находитесь в командной строке, вы можете выложить в tclsh. У tcl также есть C api, так что вы должны иметь возможность использовать это для встраивания tcl в ruby, если не существует ранее существовавшего способа?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...