сохранение имен пакетов, возвращаемых ql:system-apropos, в переменную

Я пытаюсь сохранить вывод (ql:system-apropos "regex") в переменную, используя multiple-value-bind, но у меня только nil. Однако кажется, что эта команда только печатает текст в REPL и не возвращает никаких переменных, поэтому не работает. В этом случае есть ли способ получить вывод ql:system-apropos в виде списка или массива, особенно имена пакетов, возвращаемые им.

Этот базовый код multiple-value-bind работает:

* (multiple-value-bind (first-var second-var) (floor 5 3) (defparameter *first-var* first-var) (defparameter *second-var* second-var))

*SECOND-VAR*
* *first-var*

1
* *second-var*

2
*

Но это не так (если нечего биндить для multiple-value-bind ?):

* (multiple-value-bind (first-var second-var) (ql:system-apropos "regex") (defparameter *first-var* first-var) (defparameter *second-var* second-var))
#<SYSTEM com.informatimago.common-lisp.regexp / com.informatimago-20120407-git / quicklisp 2012-04-07>
#<SYSTEM lispbuilder-regex / lispbuilder-20110619-svn / quicklisp 2012-04-07>
#<SYSTEM recursive-regex / recursive-regex-20120407-git / quicklisp 2012-04-07>
#<SYSTEM recursive-regex-test / recursive-regex-20120407-git / quicklisp 2012-04-07>
#<SYSTEM regex / regex-1 / quicklisp 2012-04-07>
*SECOND-VAR*
* *first-var*

NIL
* *second-var*

NIL
*

Итак, кажется, что ql:system-apropos печатает текст на экране только с помощью format или какой-либо другой команды печати?

Целью этого будет извлечение имен пакетов вывода с помощью некоторых команд обработки строк (возможно, некоторых регулярных выражений) и автоматизация установки или переустановки всех пакетов, возвращаемых ql:system-apropos, например:

(defparameter *package-name-string* "lispbuilder")
(multiple-value-bind (lispbuilder-packages-list) (ql:system-apropos *package-name-string*) (defparameter *lispbuilder-packages-list* lispbuilder-packages-list))

Любой другой способ получить quicklisp имен пакетов, используя частичные имена или некоторые регулярные выражения в качестве входных данных, также будет рабочим решением (было бы полезно даже получить текущий полный список пакетов). Есть ли какое-либо жизнеспособное решение для этого?


person nrz    schedule 06.05.2012    source источник


Ответы (1)


Ваше взаимодействие с Common Lisp выглядит слишком сложным.

Вы спрашиваете: сохранение имен пакетов, возвращаемых ql:system-apropos, в переменной.

Он действительно что-то возвращает? Или он только что-то печатает?

Вы можете легко узнать. Я использую в своем примере CL:APROPOS:

CL-USER 141 > (apropos "plist" "CL")
SYMBOL-PLIST (defined)
MAPLIST (defined)

Просто опишите возвращаемое значение:

CL-USER 142 > (describe (apropos "plist" "CL"))
SYMBOL-PLIST (defined)
MAPLIST (defined)
NIL is a NULL
NAME          "NIL"
VALUE         NIL
FUNCTION      #<unbound function>
PLIST         (TYPE::DIRECT-TYPE-PREDICATE TYPE::RETURN-FALSE)
PACKAGE       #<The COMMON-LISP package, 2/4 internal, 978/1024 external>

Ничего нет. APROPOS просто что-то печатает.

Common Lisp использует выходные потоки. Просто перепривяжите переменную, которая содержит выходной поток:

CL-USER 143 > (with-output-to-string (*standard-output*)
                (apropos "plist" "CL"))
"SYMBOL-PLIST (defined)
MAPLIST (defined)"

Теперь у вас есть строка, которую вы можете разобрать.

person Rainer Joswig    schedule 06.05.2012
comment
Спасибо. Это работает: (defparameter *lispbuilder-packages-list* (with-output-to-string (*standard-output*) (ql:system-apropos "lispbuilder"))) - person nrz; 07.05.2012