Ответ 1
Да, это должно быть легко. Это просто частный случай общего "открыть процесс и связать его с 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