Да, это должно быть достаточно просто. Это всего лишь частный случай общей проблемы «открыть процесс и связать его с stdin и stdout», и это не сложно.
Небольшой поиск в Google обнаружил, что IO.popen()
является правильным вариантом Ruby для этого, и есть немного больше деталей в ответах здесь: http://groups.google.com/group/ruby-talk-google/browse_thread/thread/0bbf0a3f1668184c. Надеюсь, этого достаточно, чтобы начать!
Обновление: Похоже, вы уже почти со своей оберткой. Что вам нужно, чтобы закончить, так это распознать, когда Matlab запрашивает ввод, и только тогда запрашивать ввод у пользователя. Я бы предложил попробовать этот псевдокод:
while input_line = Readline.readline('>> ', true)
io.puts input_line
while ((output_line = io.gets) != '>> ') // Loop until we get a prompt.
puts io.gets
end
end
Это не совсем верно, так как вам нужно выполнить внутренний цикл один раз, прежде чем запрашивать первую строку ввода, но она должна дать вам идею. Возможно, вам также придется изменить текст приглашения, который он ищет.
Обновление 2: Хорошо, поэтому нам также необходимо учитывать тот факт, что EOL не появляется после запроса, и поэтому io.gets будет зависать. Вот пересмотренная версия, в которой используется тот факт, что вы можете дать пустую строку приглашению Matlab, и оно просто даст вам другое приглашение, ничего не делая. Я изменил цикл, чтобы сделать вещи немного понятнее, хотя теперь это означает, что теперь вам нужно добавить логику, чтобы понять, когда вы закончите.
while [not done] // figure this out somehow
io.puts blank_line // This will answer the first
// prompt we get.
while ((output_line = io.gets) != '>> ') // Loop until we get a prompt.
puts io.gets // This won't hang, since the
end // prompt will get the blank
// line we just sent.
input_line = Readline.readline('>> ', true) // Get something, feed it
io.puts input_line // to the next prompt.
output_line = io.gets // This will eat the prompt that corresponds to
// the line we just fed in.
end