LINUX.ORG.RU

ECL + ASDF


0

2

Помогите, пожалуйста, освоиться с Embedded Common Lisp.

Хочу распарсить XML с помощью одного из множества парсеров для CL.

Проблема в том, что у меня не получается подключить пакет ASDF. Делаю так:

(require 'asdf)

(push «/путь/к/xmls/» asdf:*central-registry*)

(require 'xmls)

Получаю

Internal error:
;;; ** (SYSTEM «i486-linux-gnu-gcc и т.д.


erred while invoking #<ASDF:COMPILE-OP NIL 155795840> on #<ASDF:CL-SOURCE-FILE „xmls“ 155710184>

Available restarts:

1. (TRY-RECOMPILING) Try recompiling xmls
2. (RETRY) Retry performing #<ASDF:COMPILE-OP NIL 155795840> on #<ASDF:CL-SOURCE-FILE „xmls“ 155710184>.
3. (ACCEPT) Continue, treating #<ASDF:COMPILE-OP NIL 155795840> on #<ASDF:CL-SOURCE-FILE „xmls“ 155710184> as having been successful.
4. (RESTART-TOPLEVEL) Go back to Top-Level REPL.

Broken at ASDF:PERFORM. In: #<process SI:TOP-LEVEL 0826afc0>.

Очевидно, что ECL пытается запустить gcc, но такого нет есть i686-linux-gnu-gcc.

В связи с этим два вопроса:

1. Если я не хочу, чтобы файлы компилировались в нативный код (хочу байткод)?

2. Если хочу, как мне указать правильную версию GCC?

Пробовал переменную среды CC, но не помогло.

★★

Ответ на: комментарий от olegk

С вашим файлом у меня такая же проблема (Stack overflow. Jumping to the outermost toplevel prompt или Detected access to an invalid or protected memory address).

Есть вот такой пост — http://avodonosov.blogspot.com/2007/12/ecl-multi-threaded-free-lisp-supporting.html:

Also ECL may be build with Unicode support. Although it doesn't support external formats in streams, strings and characters are represented as 24-bit values. It should be sufficient to have support for various external formats in IO using flexi-streams.

Т.е. когда дело доходит до нестандартных character-ов в файловом потоке (просто русские буквы в UTF-8) получается такая ерунда.

Можно обойти это так:

(with-open-file (s "Test.xml")
  (let ((s (flexi-streams:make-flexi-stream s :external-format '(:utf-8 :eol-style :lf))))
    (xmls:parse s)))

с правильно указанной кодировкой и значением end-of-line-style (уйдёт пара секунд на перекодировку). Drakma использует flexi-streams, поэтому работает.

Или так:

(xmls:parse (alexandria:read-file-into-string "Test.xml"))

В этом случае перекодировки нет, получается быстрее.

quasimoto ★★★★
()

> 1. Если я не хочу, чтобы файлы компилировались в нативный код (хочу байткод)?

тогда тебе нужен не ECLS, а что-то другое. ECL компилирует, транслируя лисп код в Си, и собирая его си компилятором.

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

так, а простой хелловорд типа

 (defun hello-world ()
   (print "hello world!"))
 (compile #'hello-world)
 (hello-world)

работает? ЕСL собирался правильно ? Какой ECL, из CVS/git или последний стабильный релиз?

Запусти у себя пример из мануала

Пример запускается? Работает? Что говорит на (c:build-program «myecl» :lisp-files '(«hello.o»)) ?

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

> Как раз меня и заинтересовала возможность компилировать в С и встраивать. Сам по себе Lisp не столь важен для меня. Т.е. именно идея ECL меня заинтересовала.

когда простой хелловорд заработает, посмотри примеры

http://ecls.wikispaces.com/Success+stories — простое GUI приложение с REPL; и/или, разбери из мануала встраивание в Си приложение: http://ecls.sourceforge.net/new-manual/ch23.html

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

попробуй вместо (setq C:*LD* «gcc») (setq C:*LD* «i686-linux-gnu-ld») (или просто ld)

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

ECLS какой версии? собери из исходников последний стабильный релиз из тарболла

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

пути к asdf библиотекам указаны? где он их ищет?

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

> Может, надо ECL собрать самому. Тут я могу сказать только RTFM, т.к. с ECL почти не работал (поставил один раз под офтопиком, быстро добился первого краха и на этом решил, что клиент ещё не созрел).

Если прорваться через сборку и настройку путей и прочее, можно собрать вот такой симпатичный GUI хелловорд со встроенным REPL-ом: http://password-taxi.at/EQL или http://ecls.wikispaces.com/Success+stories

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

LibXML сам по себе не очень быстрый. Интересно вот что, по результатам [url=http://xmlbench.sourceforge.net/results/benchmark200910/index.html]бенчма... портировать что-то топовое, ASMXML, RapidXML, Tango/D парсер.
Как варианты:
1. написать обёртки для ecls/sbcl для такого парсера
2. портировать ASMXML на ассемблер SBCL :)

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

Ты смог загрузить cl-libxml2 в ECL?

Да, оно как-то само загрузилось (обычно - emerge с одной строны, asdf с другой) и дальше работает как положено.

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

> Debugger received error: Detected access to an invalid or protected memory address. Error flushed. (И так много раз...)

УМВР:

(793) darkman@sl500:--/cloudcity/build> ecl
;;; Loading #P"/usr/lib64/ecl-10.4.1/asdf.fas"
;;; Loading #P"/usr/lib64/ecl-10.4.1/cmp.fas"
;;; Loading #P"/usr/lib64/ecl-10.4.1/sysfun.lsp"
ECL (Embeddable Common-Lisp) 10.4.1
Copyright (C) 1984 Taiichi Yuasa and Masami Hagiya
Copyright (C) 1993 Giuseppe Attardi
Copyright (C) 2000 Juan J. Garcia-Ripoll
ECL is free software, and you are welcome to redistribute it
under certain conditions; see file 'Copyright' for details.
Type :h for Help.  
Top level in: #<process SI:TOP-LEVEL 0000000000643f60>.
> (require 'xmls)

;;; Loading "/usr/share/common-lisp/systems/xmls.asd"
;;; Loading "/home/darkman/.cache/common-lisp/ecl-10.4.1-linux-x86-64/usr/share/common-lisp/source/xmls/xmls.fas"
NIL
> (with-open-file (stream "/opt/sources/java/QtJambi/qtjambi-src-lgpl-4.5.2_01/build.xml") (xmls:parse stream))

("project" (("basedir" ".") ("default" "all"))
 ("property" (("environment" "env"))) ("tstamp" NIL)
 ("property" (("value" ".") ("name" "sourceDir")))
 ("property" (("value" ".") ("name" "outputDir")))
....

ЧЯДНТ ?

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

> Если у Вас есть возможность проверить на реальном XML посмотрите, пожалуйста.

Нормально работает на вот этом XML:

(792) darkman@sl500:~> ll -h /opt/sources/java/QtJambi/qtjambi-src-lgpl-4.5.2_01/build.xml
-rw-r--r-- 1 darkman darkman 33K Июл  6 17:16 /opt/sources/java/QtJambi/qtjambi-src-lgpl-4.5.2_01/build.xml

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

> Ещё - вы собираете ecl из git?

IMHO лучше брать последний стабильный - из git часто просто не собирается.

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

> Ты смог загрузить cl-libxml2 в ECL?

А в чём проблема ?

(794) darkman@sl500:--/cloudcity/build> ecl
;;; Loading #P"/usr/lib64/ecl-10.4.1/asdf.fas"
;;; Loading #P"/usr/lib64/ecl-10.4.1/cmp.fas"
;;; Loading #P"/usr/lib64/ecl-10.4.1/sysfun.lsp"
ECL (Embeddable Common-Lisp) 10.4.1
Copyright (C) 1984 Taiichi Yuasa and Masami Hagiya
Copyright (C) 1993 Giuseppe Attardi
Copyright (C) 2000 Juan J. Garcia-Ripoll
ECL is free software, and you are welcome to redistribute it
under certain conditions; see file 'Copyright' for details.
Type :h for Help.  
Top level in: #<process SI:TOP-LEVEL 0000000000643f60>.
> (require 'cl-libxml2)

;;; Loading "/usr/share/common-lisp/systems/cl-libxml2.asd"
; loading system definition from
; /usr/share/common-lisp/systems/metabang-bind.asd into #<ASDF0 package>
.....
("ITERATE" "URI")
> 

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

> А в чём проблема ?

Да, просто удивительно )) Я не тестировал под ECL.

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

> ух ты. Нашел интересную встраиваемую реализацию ISLISP : OpenLisp

* It will cost you 6000 € for OpenLisp non-GPL source code that allows you to bind Lisp code inside a C/C++ application or to use OpenLisp as part of a commercial application. You'll have access to the source code, support for both OpenLisp and its source code, quick bug fix. Runtime licences depend if user have access or not to the OpenLisp interpreter. This price is for a single platform. A platform is defined by the following 3 components: processor architecture, operation system and compiler. Linux x86 and x86_64 are for example two different platforms.


Лучше уж потратиться на LispWorks - стандартный Common Lisp + можно собрать DLL и заимбедить в ЦЕПЕПЕ аппликуху.

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

Вообще интересно, что случилось с этими более другими лиспами окромя общелиспа, да. Вот тут есть полный список, вот тут — интересные цитаты про общелисп :

«Most of the work [designing Common Lisp] was carried out by E-mail discussion. These dicussions were captured in file archives. One research at the Sloan School at MIT has used these archives to study computer-mail-based decision-making and interaction. [Steele and Gabriel 1993]

„CLtL1 was the output of a hastily united group of MacLisp successors, who felt InterLisp group was stronger than they were. They did not dream of international matters or even of commercial interests. Most of them thought it is just a US academic research matter: most of them did not know how to make international standards, or even American national standards.“

спецификация ISLISP интересная, да: в 10х раз меньше, чем общелисп (стандарт ISO ISLISP ~148 страниц, ANSI CL ~1100 стр.)

При этом, судя по весьма нездоровым ценникам коммерческой реализации ISLISP-а (дяденька, Вы там совсем упоролись? 6к евро за исходники? нет пути) — ситуация с реализациями выглядит не здорово.

OpenLisp: коммерческая реализация, в комплекте батарейки, компилятор в байткод и С; за денюжку хочет выдавать исходники. Вкупе с батарейками, небольшим размером (800к) и конпеляцией в си смотрится весьма достойно. Конпеляция правда идёт в свой байткод, генерируя нечто похожее на пример встраивания ECL, точно так же собирается си компилятором. Байткод особо не оптимизированый (например, из bench/fib20.lsp (time (fib 40)) в OpenLisp отрабатывает в 10(!) раз медленнее sbcl). Впрочем, для этой реализации это не очень критично: можно написать фибоначчу на Си, подключить FFI через defextern и заметно ускориться.

Остальные реализации ISLISP: TISL, OKI islisp, Prime-Lisp, daylisp, G-Lisp. На Java daylisp, на Java Applet G-lisp , OKI islisp — интерпретатор, TISL компилятор и интерпретатор на Си, PrimeLisp — компилятор и интерпретатор на C# (ынтерпрайзно, но без исходников). Исходники есть на daylisp, Glisp, TISL.

Из того, что запустилось, фибоначча в интерпретаторах считается медленнее; TISL под виндой падал (надо что-то подбирать с размером хипа), под гентой пока не пробовал.

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

Ещё есть интересный стандарт лиспа EuLisp, современная версия этого дела с исходниками и исторический экскурс лежит на гитхабе.

Идеи были схожии с ISLISP, а развивался он ещё до него, в начале 90х (стандарт ISO ISLISP являся объединением EuLisp, Le_Lisp и прочих реализаций, так же, как общелисп ANSI CL являлся объединением MacLisp, InterLisp и прочих).

Основная идея что ISLISP, что EuLisp — выдать язык больше схемы, но меньше полноценного, толстого и громоздкого общелиспа CL. Для этого используется небольшое ядро лиспа по стандарту, и обёртки вокруг этого ядра. Упор сделан на то, чтобы такой лисп эффективно компилировался через Си компилятор и встраивался в приложения. В стандартах есть ООП, являющийся подмножеством CLOS (ILOS в ISLISP и что-то похожее в EuLisp) — есть обобщённые функции, мультидиспетчеризация, call-next-method и полноценная интеграция с остальным языком, нет чего-то другого (в ILOS — множественного наследования, в EuLisp — хз).

При этом ISLISP ближе к CL (полноценного loop и много чего нет в стандарте, но легко реализуется макросами, см. примеры; модулей нет в стандарте, но в ISLISP есть что-то среднее между пакетами и модулями из схемы Guile; Lisp-2, хотя на самом деле Lisp-5); EuLisp ближе к схеме (модули, нити, Lisp-1 и т.п.). У EuLisp вроде как получше с исходниками, см. на гитхабе

Оба лиспа позволяют компилировать Лисп в Си, прозрачно интегрироваться /линковаться с Си, получая при этом минимальное ядро, ближе по размерам к реализациям схемы (Gambit, Gauche, Ikarus и т.п.).

ECL произошёл из Kyoto Common Lisp, в нём сохранились некоторые общие идеи, но рантайм получился не самый минимальный из-за общелиспа. Если заниматься минимализмом дальше, можно взять ISLISP, EuLisp или какой-то минимальный компилятор схемы через LLVM и ещё подсократить размерчик, пожертвовав совместимостью с общелиспом, asdf и общелисповыми библиотеками в угоду своих батареек.

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

> Лучше уж потратиться на LispWorks - стандартный Common Lisp + можно собрать DLL и заимбедить в ЦЕПЕПЕ аппликуху.

заимбедить и собрать DLL можно и в этом.
Но лиспворкс лучше, да — более общелисп, дешевле, и более распространён. Плюс, он оптимизирует лучше.

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

ЧЯДНТ ?

Не читаете тред :) Файл автора (http://depositfiles.com/files/7te1z9v1p) в UTF-8 содержит «широкие» character-ы (русские буквы те же). С ним так просто не работается — нужно использовать flexi-streams, alexandria, или вообще cl-libxml2 сразу (примеры).

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

> а схеме аналогичный пример есть для Gauche: c-wrapper и dyncomp
Да такие вещи в рамках любого уважающего себя ffi есть, не понятно с чего такие охи-ахи из-за такой банальной фичи.

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