LINUX.ORG.RU

Вернуть сложный lisp-объект из сишной функции

 ,


1

3

Допустим, у нас есть сложная структура данных, которая представима в виде s-expressions, внутри которых встречаются самые разнообразные атомы, в том числе keywords и symbols. Вопрос: позволяет ли какая-либо из реализаций CL провернуть подобное?

Уверен, что ecl может, но относительно интересующих меня clozurecl и clisp никак не могу накопать в хидерах что-то похожее.

Конечно же, можно взять cffi, через defcstruct/defcunion «открыть скобочному миру» сишные структуры, и в самом лиспе преобразовать это в нужный вид, но выглядит

  • костыльно (int => keyword/symbol)
  • небыстро
  • двойная работа: генерируем списки в сишечке, чтобы пройтись по ним лиспом и сделать нормальные cons-ы
Ответ на: комментарий от kawaii_neko

не найдется чего-то «более правильного»

Переносимого не найдётся. Если «какая-либо из реализаций CL», то в ecl: списки, символы и т д.

monk ★★★★★
()

а может вернуть какой-нибудь json-xml, где каждый атом это типа

{"type":"symbol", "value": "qwe"}

Универсально!

// мимо-ещё-не-проснулся

Debasher ★★★★★
()
Последнее исправление: Debasher (всего исправлений: 1)
Ответ на: комментарий от A1

Угу, только парсер s-expressions в любом лиспе уже есть.

А транслятор в него в си? не, я уверен что есть, но тогда я не понимаю проблему. Видимо туплю.

Debasher ★★★★★
()
Ответ на: комментарий от Debasher

Если ffi позволяет, то теоретически можно пробросить в сишку колбэки cons/make-symbol/make-keyword/etc, и в самом алгоритме собирать все уже в нужном виде. Хз насколько это будет быстрее, чем спарсить текст, т.к. обычно в языках ffi-call в любую сторону — удовольствие не из дешевых.

Возможно ты вообще не тот уровень выбрал, где сишку от лиспа отрезать. Чего она там у тебя конкретно делает?

arturpub ★★
()
Последнее исправление: arturpub (всего исправлений: 1)
Ответ на: комментарий от arturpub

Сишка предоставляет интерфейсы для разбора сложных сериализованных данных. А lisp тут при том, что иногда эти данные нужно обрабатывать пакетно. Костыли с sed/grep/awk над выводом сишных утилит себя изжили, писать на каждый чих крестопрограммы тоже не выход, а вот обернуть минимальными усилиями в скриптовый язык — самое то.

lisp в данном случае хорошо тем, что используя keywords + cons можно сэмулировать структуры любой сложности без необходимости поддерживать актуальные определения структур в двух местах. Про swig знаю, но иногда нужно возвращать списки из структур, и как-то я сомневаюсь, что с такими данными будет удобно работать через ffi.

kawaii_neko ★★★★
() автор топика
Ответ на: комментарий от kawaii_neko

используя keywords + cons можно сэмулировать структуры любой сложности без необходимости поддерживать актуальные определения структур в двух местах

Мде. Ну, для одноразовых программ класса «замена костылей на grep/awk» должно подойти.

tailgunner ★★★★★
()
Ответ на: комментарий от kawaii_neko

используя keywords + cons можно сэмулировать структуры любой сложности

Во всём мире для этого давно уже используется json. Просто, человекочитаемо, библиотеки есть для абсолютно любых языков.

Gvidon ★★★★
()
Ответ на: комментарий от Gvidon

Во всём мире для этого давно уже используется json.

Я было хотел облить тебя говном с головы до пят, но потом заленился. Просто знай: ты вообще не в тему написал.

kawaii_neko ★★★★
() автор топика
Ответ на: комментарий от kawaii_neko

Ты хочешь сказать, что можешь записать в виде s-выражения что-то, что в принципе не выразимо через json? Интересно взглянуть.

Gvidon ★★★★
()

ИМХО правильней всего - не писать на C, а писать исключительно на CL.

Так что только костыли остаются.

... и ecl

ados ★★★★★
()
Ответ на: комментарий от Gvidon

Нравится json/js — на здоровье, используй их. Мне это говно просто не надо. Будь ласка, не оффтопь ITT.

kawaii_neko ★★★★
() автор топика
Ответ на: комментарий от Gvidon

Ты хочешь сказать, что можешь записать в виде s-выражения что-то, что в принципе не выразимо через json? Интересно взглянуть.

Ты хочешь сказать, что S-выражения придумали после JSON? :-) Или ты хочешь сказать, что можешь записать в виде JSON то, чего нельзя выразить S-выражениями? :-) Лол.

anonymous
()
Ответ на: комментарий от kawaii_neko

Нравится json/js — на здоровье, используй их. Мне это говно просто не надо.

Да ладно тебе :-) Есть хорошая либа cl-json - конвертит в обе стороны :-) Нормальная такая либа :-)

anonymous
()
Ответ на: комментарий от tailgunner

Мде. Ну, для одноразовых программ класса «замена костылей на grep/awk» должно подойти.

А слабо на Питоне Web-сервер, который быстрее Hunchentoot написать? Там же быстрый IO, прямо как в Си... Лол :-)

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.