Как правильно использовать библиотеку cxml/klacks с quicklisp (и sbcl)?

Обзор Я пытаюсь запустить упрощенную версию этот код, для которого нужны cxml и klacks библиотека для разбора XML. (Конкретный код приведен в главе 47 книги The Art of Postgresql.) Поскольку я очень мало знаю о (Common) Lisp/ASDF/Quicklisp, я не знаю, как правильно установить необходимую библиотеку cxml/klacks.

Система Если это имеет значение, я использую SBCL 1.5.5.debian под Ubuntu (для справки, я пробовал clisp ранее, но обнаружил, что он поставляется с очень устаревшей версией ASDF).

Шаги, которые я уже сделал

В bash:

sudo apt-get install cl-cxml

(Действительно, /usr/share/common-lisp/source/cxml/ и /usr/share/common-lisp/source/cxml/klacks/ теперь присутствуют в моей системе.)

В sbcl REPL:

(ql:quickload :cxml)

Результат: длинное сообщение об ошибке, суть которого, кажется, Component "cxml/dom" not found. (Хотя /usr/share/common-lisp/source/cxml/dom и существует, но я не уверен, что это имеет значение.) См. полное сообщение об ошибке в конце.

(ql:quickload :klacks)

Результат: еще одна длинная ошибка, суть которой System "klacks" not found (хотя, опять же, каталог присутствует в системе).

Примечание

Использование qucikload для других библиотек работает, например:

(ql:quickload :postmodern)
(ql:quickload :zip)
(ql:quickload :yason)

Вопросы

Вкратце: как правильно установить cxml и klacks в вышеуказанной системе?

Помимо решения этой конкретной проблемы, я хотел бы немного лучше понять, что происходит, в частности:

  • Можно ли установить все зависимости с помощью quicklisp, или некоторые из них поддерживают его, а некоторые нет? (И в этом случае является ли cxml зависимостью, которая не поддерживает quicklisp? Как я могу узнать, какие пакеты ее поддерживают?)

  • quciklisp вообще смотрит на локальную установку (т.е. /usr/share/common-lisp/source/cxml/) или работает только из онлайн-репозитория? (Другими словами: имеет ли значение, что я установил cl-xml через apt-get?)

  • Если он учитывает локальный путь, то почему он не находит cxml/dom и cxml/klacks?

  • Поскольку klacks является подпакетом cxml, мне нужно импортировать его отдельно или нет? Просмотрев указанный исходный код, особенно package.lisp и pubnames.asd, я не вижу его явно импортированного. Тем не менее он используется в коде, например. здесь. Итак, я предполагаю, что необходимо явно импортировать cxml, а затем все подпакеты (включая klacks) также импортируются с автоматическим префиксом с правильным пространством имен?

Подробные сообщения об ошибках

* (ql:quickload :cxml)
;;; Checking for wide character support... WARNING: Lisp implementation doesn't use UTF-16, but accepts surrogate code points.
 yes, using code points.
To load "cxml":
  Load 1 ASDF system:
    cxml
; Loading "cxml"
;;; Checking for wide character support... WARNING: Lisp implementation doesn't use UTF-16, but accepts surrogate code points.
 yes, using code points.
.
;;; Checking for wide character support... WARNING: Lisp implementation doesn't use UTF-16, but accepts surrogate code points.
 yes, using code points.
;;; Checking for wide character support... WARNING: Lisp implementation doesn't use UTF-16, but accepts surrogate code points.
 yes, using code points.
;;; Building Closure with CHARACTER RUNES
To load "cxml/dom":
  Load 3 ASDF systems:
    closure-common puri trivial-gray-streams
  Install 1 Quicklisp release:
    cxml
; Loading "cxml/dom"
;;; Checking for wide character support... WARNING: Lisp implementation doesn't use UTF-16, but accepts surrogate code points.
 yes, using code points.
.
debugger invoked on a ASDF/FIND-COMPONENT:MISSING-COMPONENT in thread
#<THREAD "main thread" RUNNING {10005504C3}>:
  Component "cxml/dom" not found

Type HELP for debugger help, or (SB-EXT:EXIT) to exit from SBCL.

restarts (invokable by number or by possibly-abbreviated name):
  0: [RETRY                        ] Retry ASDF operation.
  1: [CLEAR-CONFIGURATION-AND-RETRY] Retry ASDF operation after resetting the
                                     configuration.
  2:                                 Retry ASDF operation.
  3:                                 Retry ASDF operation after resetting the
                                     configuration.
  4: [ABORT                        ] Give up on "cxml/dom"
  5:                                 Give up on "cxml"
  6:                                 Exit debugger, returning to top level.

((:METHOD ASDF/OPERATE:OPERATE (SYMBOL T)) ASDF/LISP-ACTION:LOAD-OP "cxml/dom" :VERBOSE NIL) [fast-method]
   error finding frame source: Bogus form-number: the source file has probably
                               changed too much to cope with.
   source: NIL
0]

* (ql:quickload :klacks)

debugger invoked on a QUICKLISP-CLIENT:SYSTEM-NOT-FOUND in thread
#<THREAD "main thread" RUNNING {10005504C3}>:
  System "klacks" not found

Type HELP for debugger help, or (SB-EXT:EXIT) to exit from SBCL.

restarts (invokable by number or by possibly-abbreviated name):
  0: [CONTINUE] Try again
  1: [ABORT   ] Give up on "klacks"
  2:            Exit debugger, returning to top level.

((LABELS QUICKLISP-CLIENT::RECURSE :IN QUICKLISP-CLIENT::COMPUTE-LOAD-STRATEGY) "klacks")
   source: (CERROR "Try again" 'SYSTEM-NOT-FOUND :NAME NAME)

person Attilio    schedule 14.07.2020    source источник
comment
Я сильно подозреваю, что ваш SBCL слишком стар, и вам следует попробовать текущий.   -  person    schedule 16.07.2020


Ответы (2)


Поскольку вы можете загружать другие системы, я предполагаю, что вы выполнили настройку quicklisp в своей системе.

В quicklisp нет пакета с именем klacks.

Вы можете проверить это, запустив:

(ql:system-apropos "klacks")

Что выводит:

#<SYSTEM cxml-klacks / cxml-20181018-git / quicklisp 2019-03-07>
#<SYSTEM cxml/klacks / cxml-20181018-git / quicklisp 2019-03-07>
#<SYSTEM fxml/klacks / fxml-20181210-git / quicklisp 2019-03-07>

Итак, система, которую вы ищете, это cxml-klacks

Загрузите его, используя:

(ql:quickload "cxml-klacks")

Который загружается нормально. Вывод в моей системе:

To load "cxml-klacks":
  Load 1 ASDF system:
    cxml-klacks
; Loading "cxml-klacks"
;;; Checking for wide character support... yes, using code points.
;;; Checking for wide character support... yes, using code points.
;;; Building Closure with CHARACTER RUNES

("cxml-klacks")

Кроме того, cxml нормально загружается в моей системе, но я использую Clozure CL, я не уверен, что это за ошибка для вас. Попробуйте загрузить cxml-klacks и посмотрите, сработает ли это для вас.

Вы также можете попробовать загрузить cxml/klacks, возможно, это именно тот пакет, который вам нужен.

person Capstone    schedule 14.07.2020
comment
Спасибо за подсказку: (ql:system-apropos "klacks") возвращает те же результаты, что и ваши (хотя и с более новыми временными метками), но и (ql:quickload "cxml-klacks"), и (ql:quickload "cxml/klacks") терпят неудачу (причина, кажется, Component "cxml/klacks" not found). - person Attilio; 14.07.2020
comment
Я предполагаю, что вы выполнили настройку quicklisp в своей системе Да, и с некоторыми другими пакетами (такими как postmodern, zip, ...) он работает нормально. - person Attilio; 14.07.2020
comment
Думаю, вам нужно сначала закончить установку cxml. И это задыхается от cxml/dom. - person Capstone; 14.07.2020
comment
Можете ли вы попробовать работать с новейшей версией sbcl? С домашней страницы: самая последняя версия — SBCL 2.0.6, выпущенная 29 июня 2020 г. - person Capstone; 14.07.2020

Самое главное, что вы установили quicklisp в своей системе.

Для этого следуйте установкам в сером поле здесь.

Короче говоря, это:

# in mac:
$ curl -O https://beta.quicklisp.org/quicklisp.lisp
# or in linux do:
$ wget https://beta.quicklisp.org/quicklisp.lisp
# in windows download manually https://beta.quicklisp.org/quicklisp.lisp

# $ curl -O https://beta.quicklisp.org/quicklisp.lisp.asc # this I leave out
# $ gpg --verify quicklisp.lisp.asc quicklisp.lisp

# start SBCL
$ sbcl --load quicklisp.lisp # path to the downloaded quicklisp.lisp!

# in SBCL REPL install quicklisp by:
* (quicklisp-quickstart:install)

# it says:
#   ==== quicklisp installed ====
# 
#     To load a system, use: (ql:quickload "system-name")
# 
#     To find systems, use: (ql:system-apropos "term")# 
# 
#     To load Quicklisp every time you start Lisp, use: (ql:add-to-init-file)
# 
#     For more information, see http://www.quicklisp.org/beta/
# 

# test by installing vecto package:
* (ql:system-apropos "vecto")

; Fetching #<URL "http://beta.quicklisp.org/dist/quicklisp/2010-10-07/systems.txt">
; 45.30KB
==================================================
46,386 bytes in 0.50 seconds (89.70KB/sec)
; Fetching #<URL "http://beta.quicklisp.org/dist/quicklisp/2010-10-07/releases.txt">
; 83.49KB
==================================================
85,490 bytes in 0.53 seconds (157.22KB/sec)
#<SYSTEM cl-vectors / cl-vectors-20101006-git / quicklisp 2010-10-07>
#<SYSTEM lispbuilder-sdl-cl-vectors / lispbuilder-20101006-svn / quicklisp 2010-10-07>
#<SYSTEM lispbuilder-sdl-cl-vectors-examples / lispbuilder-20101006-svn / quicklisp 2010-10-07>
#<SYSTEM lispbuilder-sdl-vecto / lispbuilder-20101006-svn / quicklisp 2010-10-07>
#<SYSTEM lispbuilder-sdl-vecto-examples / lispbuilder-20101006-svn / quicklisp 2010-10-07>
#<SYSTEM static-vectors / static-vectors-20101006-git / quicklisp 2010-10-07>
#<SYSTEM vecto / vecto-1.4.3 / quicklisp 2010-10-07>
NIL

# load it:
* (ql:quickload "vecto")
To load "vecto":
  Install 5 Quicklisp releases:
    cl-vectors salza2 vecto zpb-ttf zpng
; Fetching #<URL "http://beta.quicklisp.org/archive/salza2/2010-10-06/salza2-2.0.7.tgz">
; 14.84KB
==================================================
15,197 bytes in 0.12 seconds (125.77KB/sec)
; Fetching #<URL "http://beta.quicklisp.org/archive/zpng/2010-10-06/zpng-1.2.tgz">
; 38.59KB
==================================================
39,521 bytes in 0.37 seconds (103.47KB/sec)
; Fetching #<URL "http://beta.quicklisp.org/archive/zpb-ttf/2010-10-06/zpb-ttf-1.0.tgz">
; 42.59KB
==================================================
43,611 bytes in 0.39 seconds (110.33KB/sec)
; Fetching #<URL "http://beta.quicklisp.org/archive/cl-vectors/2010-10-06/cl-vectors-20101006-git.tgz">
; 40.40KB
==================================================
41,374 bytes in 0.37 seconds (109.20KB/sec)
; Fetching #<URL "http://beta.quicklisp.org/archive/vecto/2010-10-06/vecto-1.4.3.tgz">
; 75.71KB
==================================================
77,526 bytes in 0.49 seconds (153.57KB/sec)
; Loading "vecto"
..................................................
[package zpb-ttf].................................
[package salza2]..................................
[package zpng]....................................
[package net.tuxee.paths].........................
[package net.tuxee.aa]............................
[package net.tuxee.aa-bin]........................
[package net.tuxee.vectors].......................
[package vecto]........
("vecto")

# highly recommended - do:
* (ql:add-to-init-file)

# this will give:

I will append the following lines to #P"/Users/quicklisp/.sbclrc":

  ;;; The following lines added by ql:add-to-init-file:
  #-quicklisp
  (let ((quicklisp-init (merge-pathnames "quicklisp/setup.lisp"
                                         (user-homedir-pathname))))
    (when (probe-file quicklisp-init)
      (load quicklisp-init)))

Press Enter to continue. # do that!


#P"/Users/quicklisp/.sbclrc"
* (quit)
$ 

Предпоследний шаг добавляет команду загрузки для setup.lisp quicklisp в .sbclrc . Добавьте его в любой файл конфигурации используемой вами реализации, например. для clisp добавьте его к ~/.clisp, который вы создаете, если его нет.

При установке позвольте ему установить в домашнюю папку (~/quicklisp). Итак, этот путь ~/quicklisp/setup.lisp. В sbcl вы можете запустить quicklisp с помощью (load "~/quicklisp/setup.lisp"). Если не добавить эту команду загрузки в ваш файл ~/.sbclrc.

Установить/импортировать клакс:

(ql:quickload :cxml)

;; then use it by:
(klacks:<klacks-function> <args>)

;; it is one of the few packages, where you install by another name
;; but then have several names available for sub-packages!
person Gwang-Jin Kim    schedule 19.07.2020