2010-11-18 17 views
3

は、私は関数に起因するQUOTEに、VAR1とVAR2が解決されていないか、解決のシンボル

CL-USER> (defun trimmer (seq) "This trims seq and returns a list" 
     (cdr 
     (butlast seq))) 
TRIMMER 
CL-USER> (trimmer '(1 2 3 VAR1 VAR2)) 
(2 3 VAR1) 
CL-USER> 

お知らせがあるとします。 VAR1とVAR2のシンボルをその値に変換したいとします。これを行う標準的な関数はありますか?

+3

'' quote'の代わりに 'list'を使うことで何が問題になりますか? – ffriend

+0

Lispの文脈で「解決」とは何を意味しますか?値を計算するためのLispの基本的な操作を評価といいます。 –

答えて

4

Backquoteは、引用符で囲まれたリストに値を補間する通常の方法である:

追加する編集
> (setq var1 4 var2 5) 
5 
> `(1 2 3 ,var1 ,var2) 
(1 2 3 4 5) 

:あなたは、シンボルは、そのsymbol-valueに置き換えられるようにリストを処理する場合は、機能の何かが必要このように:

(defun interpolate-symbol-values (list) 
    "Return a copy of LIST with symbols replaced by their symbol-value." 
    (loop for x in list 
     collect (if (symbolp x) (symbol-value x) x))) 

> (interpolate-variables '(1 2 3 var1 var2)) 
(1 2 3 4 5) 

しかしこれは、やりたいために奇妙なことのように思えます。あなたが達成しようとしていることについてもっと言えますか?ほぼ確実にこれよりも良い方法があります。

+0

リストに未解決の変数がいくつあるのかわかりません。 –

+0

どうしてですか?あなたの問題記述では、 'QUOTE'を使って言及します。 'QUOTE'を使うことができれば、あなたはバッククォートを使うことができますか? (たぶんあなたの問題をもう少し明示的に記述する必要があるかもしれません) –

+0

@Gareth:最初の引数が関数として評価されていないことを確認するために引用符を使用していました。 –

6

quoteを使用して変数を含むリストを作成しないでください。代わりlistを使用:

CL-USER> (trimmer (list 1 2 3 var1 var2)) 
(2 3 value-of-var1) 

value-of-var1var1の値です)。

Quoteは、その引数が何であっても評価できません。その引数がリストリテラルである場合、それが返されます。ただし、リテラルだけではないリストを作成するには、listを使用します。 でバッククォートの構文を使用していますが、そのような場合はむしろ難読化されています。

関連する問題