2011-12-03 12 views
1

私は以下のコードを動作させたいと思っていました。 1レベルの変数を展開するにはどうすればよいですか?LISPでリスト内の変数を展開する

(let* ((data1 10) 
     (data2 '(data1 20))) 
    (progn data2)) 

私は(10 20)を期待したが、実際に私が(data1 20)ました。また、私は次から(10 20 (data2))を取得したいのですが:

(let* ((data1 10) 
     (data2 30) 
     (data3 '(data 10 20 '(data2))) 
    (progn data3)) 
+0

PROGNはどのような用途に使用されていますか? –

+0

Lispの基礎を学びたいなら、この本をお勧めしたいと思います:[Common Lisp:記号計算の穏やかな紹介](http://www.cs.cmu.edu/~dst/LispBook/)。 PDF版をそこからダウンロードできます。 –

答えて

2

変数は展開されません。その理由は、あなたが'を使用してリスト全体を引用していることです。 'は、リストをどのように作成するのではなく、あなたがそれらを引用する方法です(評価されないようにします)。

data1と番号20の内容を含むリストを作成するには、(list data1 20)を使用してください。

1

sepp2kによると、実行時にリストを作成する通常の方法は、list関数です。引用符付きリストは、リテラル値のリストリテラルです。

しかし、実行時にクォートリスト、バッククォートに似ているリストを作成する別の方法があります。あなたがそこにprogn秒を必要としません:あなたは、あなたの例について

`(,data1 20) 

もう一つで欲しいものを達成できます。 prognは、複数の式をシーケンシングしてから最後の値を返すためのものです。単なる値式であれば、ラップなしで使用することができます。しかし、たとえ複数の式があったとしても、let*prognを暗黙的に本体に入れているので、この場合はprognを使用する必要はありません。

関連する問題