LINUX.ORG.RU

[common lisp] Binding with C/C++

 


0

0

Lua этим и отличается от Lisp'а, что в первом есть великолепная система связывания кода между ним и C/C++. Существует ли такая же вещь для Common Lisp'а?

// FFI и все такое не нужно, ибо оно связывает лисп с С, а мне надо наоборот.

★★

> // FFI и все такое не нужно, ибо оно связывает лисп с С, а мне надо наоборот.

cffi связывает лисп с си и наоборот.

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

ecls, я так понял, выдает бинарники. Не хочу ставить его, может Вы знаете, там можно указывать функции для внешнего использования? Потому что если нельзя, то с таким же успехом я могу делать

sbcl --script script.lisp

gcl же, если я не ошибаюсь, так же выдает бинарные файлы, но делает это не сам, а с помощью внешнего gcc?

Короче, смысл моих вопросов в том, что можно ли там указывать extern функции?

Кстати, на кроссплатформенность можно забить болт?

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

Если есть, дайте пожалуйста ссылку на ман, ибо быстрое гугление не помогло.

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

>ecls, я так понял, выдает бинарники

Не обязательно. Он компилируется через C, и к фазе трансляции в бинарный код можно не переходить.

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

Имеется в виду механизм callback'ов?

Только имей в виду, что в SBCL коллбэк из треда, созданного не в SBCL, не прокатит.

mv ★★★★★
()

ecl может создавать so'шки, и встраиваемый в си-программу рантайм может их подключать. Так что ecl очень легко встраивается.

Из остальных лиспов только Allegro, вроде, встраивается в C.

А вообще во всех лиспах есть FFI, который как раз и связывает код в обе стороны (позволяет вызывать сишные функции и позволяет создавать коллбэки, которые можно передавать в сишный код).

Пример коллбэка: http://common-lisp.net/project/cffi/manual/html_node/defcallback.html

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

>Только имей в виду, что в SBCL коллбэк из треда, созданного не в SBCL, не прокатит.

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

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

О, спасибо. Как вызывать С из Лиспа понятно. Единственно, мне не ясен момент, как для cffi вызывать функции Lisp'а из С?

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

Вот по ссылке как раз конкретный пример - как из сишной функции qsort вызывается лисповая функция.

С помощью defcallback определяется функция, которая вызывается из C - берется указатель с помощью callback или get-callback и передается в C, а дальше уже сишный код вызывает его. Сигнатура и правила преобразования аргументов и возвращаемого значения задаются в defcallback

dmitry_vk ★★★
()

> Lua этим и отличается от Lisp'а

Вообще-то, не этим :) Если нужен Lua - то лучше юзать Lua, отличный, кстати, язык...

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


Только имей в виду, что в SBCL коллбэк из треда, созданного не в SBCL, не прокатит.


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


да, кстати, если бы работало, было намного легче, а так приходится огород городить. В Clozure CL работает.

CL-USER
()
Ответ на: комментарий от archimag

>Если нужен Lua - то лучше юзать Lua, отличный, кстати, язык...

ИМХО топорный он какой-то. Как VB прямо. Питон в разы лучше.

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

Скорость говно у него. Хотя для простейших случаев потянет. Но для простейших случаев потянет и луа:)

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

>Вот это толстота.

Имел ввиду, что высокоуровневых фишек, таких как for i in spisok или генераторы там нет.

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

> for i in spisok или генераторы там нет.
for key,value in pairs(spisok) do ... end

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