【问题标题】:storing the package names returned by ql:system-apropos into a variable将 ql:system-apropos 返回的包名称存储到变量中
【发布时间】:2012-05-06 22:28:50
【问题描述】:

我正在尝试使用multiple-value-bind(ql:system-apropos "regex") 的输出保存到一个变量中,但我只使用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 包名称的任何其他方法也是一种可行的解决方案(即使获取当前完整的包列表也会很有用)。有没有可行的解决方案来做到这一点?

【问题讨论】:

    标签: lisp common-lisp quicklisp


    【解决方案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)"
    

    现在你得到了一个可以解析的字符串。

    【讨论】:

    • 谢谢。这有效:(defparameter *lispbuilder-packages-list* (with-output-to-string (*standard-output*) (ql:system-apropos "lispbuilder")))
    猜你喜欢
    • 1970-01-01
    • 2015-06-11
    • 1970-01-01
    • 2013-04-24
    • 1970-01-01
    • 2021-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多