2012-05-06 7 views
0

multiple-value-bindを使用して(ql:system-apropos "regex")の出力を変数に保存しようとしていますが、nilのみを使用しています。しかし、このコマンドはREPLにテキストを出力するだけで、どんな変数も返さないので、動作しないようです。その場合は、ql:system-aproposの出力をリストまたは配列として取得する手段があります。特に、それによって返されるパッケージ名があります。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パッケージ名を部分名または正規表現を入力として使用する他の方法も、現在のパッケージの完全なリストを取得することも有効です。これを実行するための実行可能なソリューションはありますか?

答えて

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は出力ストリームを使用します。出力ストリームを保持する変数をリバインドするだけです。

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

+0

ありがとうございます。これはうまくいきます: '(defparameter * lispbuilder-packages-list *(出力先の文字列(*標準出力*)(ql:system-apropos" lispbuilder ")))' – nrz

関連する問題