Как правильно использовать библиотеку cxml / klacks с quicklisp (и sbcl)? - PullRequest
0 голосов
/ 14 июля 2020

Обзор Я пытаюсь запустить упрощенную версию этого кода , которому нужны cxml и klacks библиотека для парсинга XML. (Конкретный код - это глава 47 книги «Искусство 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)

Ответы [ 2 ]

1 голос
/ 19 июля 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 в .sbclr c. Добавьте его в любой файл конфигурации используемой вами реализации, например, для clisp и в ~/.clisp, который вы создаете, если его нет.

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

Установите / импортируйте klacks:

(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!
1 голос
/ 14 июля 2020

Поскольку вы можете загружать другие системы, я предполагаю, что вы выполнили настройку 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, что может быть именно тем пакетом, который вам нужен.

...