0

(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部分的な名前または正規表現を入力として使用してパッケージ名を取得する他の方法も有効な解決策です (パッケージの現在の完全なリストを取得することも役立ちます)。これを行うための実行可能な解決策はありますか?

4

1 に答える 1

1

Common Lisp との対話は複雑すぎるように見えます。

ql :system-apropos によって返されたパッケージ名を variable に格納します

それは実際に何かを返しますか?それとも何かを印刷するだけですか?

簡単に見つけることができます。私は私の例で使用しています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)"

これで、解析できる文字列が得られました。

于 2012-05-06T22:39:10.030 に答える