Книга Франческо Чезарини "Программирование на Erlang" предоставляет хороший и простой для начала пример подключения Erlang к Ruby (реализован через порты):
module(test.erl).
compile(export_all).
test() ->
Cmd = "ruby echoFac.rb",
Port = open_port({spawn, Cmd}, [{packet, 4}, use_stdio, exit_status, binary]),
Payload = term_to_binary({fac, list_to_binary(integer_to_list(23))}),
port_command(Port, Payload),
receive
{Port, {data, Data}} ->
{result, Text} = binary_to_term(Data),
Blah = binary_to_list(Text),
io:format("~p~n", [Blah])
end.
Однако код Ruby, используемый в этомВ примере используется библиотека Erlictricity, которая выполняет все низкоуровневые действия для программиста:
require 'rubygems'
require 'erlectricity'
require 'stringio'
def fac n
if (n<=0) then 1 else n*(fac (n-1)) end
end
receive do |f|
f.when(:fac, String) do |text|
n = text.to_i
f.send!(:result, "#{n}!=#{(fac n)}")
f.receive_loop
end
end
Я попытался использовать этот слегка измененный код test.erl:
test(Param) ->
Cmd = "./add",
Port = open_port({spawn, Cmd}, [{packet, 4}, use_stdio, exit_status, binary]),
Payload = term_to_binary({main, list_to_binary(integer_to_list(Param))}),
...
дляговорить с очень простым C-файлом:
/* add.c */
#include <stdio.h>
int main(int x) {
// return x+1;
printf("%i\n",x+1);
}
Но, к сожалению, цикл приема в test.erl получает сообщение {#Port<0.2028>,{exit_status,2}}
Мой вопрос: возможно ли реализовать что-то подобное вC / C ++? Существуют ли готовые библиотеки для Erlang для общения с C / C ++ через порты, аналогичные Erlictricity для Ruby?