2017-02-03 14 views
2

私の関数に変数aにパラメータ(リスト)を代入しようとしています。私は変数Lを取得し続ける値がない、どのように関数内の変数をリストパラメータに割り当てることができますか?Lisp変数に変数を代入する

(defun pali(list) 
    (defvar a nil) 
    (defvar b nil) 
    (setq a (list)) 
    (setq b (reverse list)) 
    ) 
+0

あなたは何を伝えていますか?これは私が試してみるとコンパイルされているようだ。この問題はあなたが与えているものである可能性があります – Sandles

+0

エラーメッセージを評価し、コピー/貼り付けする正確なフォームを指定する必要があります。 '(setq a(list))'の ' – sds

+0

'では、まず 'list'を評価して(関数'(list) 'を実行して)返された値を' a'に代入します。それは設計によるものですか? – rsm

答えて

1

私が何をしたいことは、あなたがAのような名前でDEFVARを使用する場合には、関数内DEFVARを置くことをほぼ確実に間違っている、とひどくあなたを傷つける可能性が

(defun pali (list) 
    (let ((a list)) 
     ((b (reverse list))) 
    ...)) 

で、正しく理解していた場合B.DEFVARはグローバル変数を作成し、それを "特別な"名前のシンボルにします。将来どこで使用しても、レキシカル変数の代わりにシンボル値が得られます。あなたがそれを期待していないとき、変なことが起こります。そのため、DEFVAR変数は通常、Aの代わりにAなどの名前になります。LETを使用して通常の字句変数を作成します。そして、最初にそれをNILに設定し、それを変更するためにSETQを使用する点はあまりありませんが、好きな場合はそれを行うことができます。たとえばただ

(let (a b) 
    (setq a list 
     b (reverse list)) 
    ...) 

あなたがしたいと思っているならば、[1つのSETQを使って多くの変数を設定できます。もちろんありません]