Правда, лисповая реализация сокетов мне не по нраву. Но не беда, я же использую ECL - написал простенькую обёртку вокруг стандартного API POSIX. Теперь, например,
connect(бла-бла-бла)
выглядит как (connect sockfd "192.168.1.2" 5555)
и возвращает два значения - первое "по смыслу" совпадает с сишным (-1 если ошибка или 0, если всё в порядке) и вполне допускает аналогичное использование, а второе значение - код ошибки, старый добрый errno
. А, например, функцияrecv(sockfd, *buf, len, flags)
теперь выглядит как (recv sockfd)
в простейшем случае, и буфер она конструирует самостоятельно, возвращая уже нормальный лисповый vector. Лепота! Реально ведь удобнее стало.Ещё на Си осталась обёртка вокруг termios, так всё-таки быстрее работает. Для терминала, когда он должен получать и анализировать ответы от WiFi-модуля, очень удобно - сишная функция получила строку и передала её наружу, а лисповая сделала что-нибудь типа
(if (search "WiFi is Up" strbuffer) (mp:process-run-function socket-client))
и вот уже крутится отдельный поток, в котором работает клиентская часть программы.Ещё можно сделать из этих сокетов, например, CLOS-объекты. Может даже удастся сделать API лаконичнее (нет особой нужды, впрочем).