‮Сдвиг по фазе (kincajou) wrote,
‮Сдвиг по фазе
kincajou

Practical LISP

Я не лиспер, но использовать этот замечательный язык всё равно буду. Накропал ещё одну программку, тестирующую реализацию интернет-сокетов в одном встраиваемом WiFi-модуле. Программка рулит модулем через UART, попутно принимая/отправляя данные через интернет - т.е. проверяет, как пакеты проходят сквозь модуль.

Правда, лисповая реализация сокетов мне не по нраву. Но не беда, я же использую 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 лаконичнее (нет особой нужды, впрочем).
Subscribe
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 2 comments