2012-03-08 27 views
2

初期化されていない変数を関数の引数として使用できますか?割り当てのために、私は、意味ネットワークシステムを書くためにCLOSを使用する必要があり、私の教授は、私たちの出力をテストするためのテスト機能が含まれ、そのうちの一つを指定:引数を渡す意味Common Lisp Unbound変数

(print (def-concept Human))

ヒューマンファンクションdefコンセプト。このテスト機能を実行しているとき、私は離れて、エラーから(アレグロCLで)取得することはできません。

Error: Attempt to take the value of the unbound variable HUMAN'.`

を、これはテストの最初の関数であるように、任意の変数のない初期化する前にはありませんこの。関数の引数として初期化されていない変数を渡す方法はありますか?

ありがとうございます。

+0

あなたの教授に助けを求めるのが有益かもしれません。 –

+1

残念ながら、正直言って、そうではありません。 – TNC

+0

シンボルはバインドされていなくても、渡すことができ、関数内のバインディングを取得しようとします。それは、あなたが最初に初期化することができますか? – Marcin

答えて

4

通常のCommon Lisp関数呼び出しでは、関数の引数としてユニット化された値を使用することはできません。 Common Lispは熱心な評価を使用しています。引数式は、関数呼び出しが行われる前にその値に縮小されます。

宿題の構造を正確に理解していない可能性があります。

def-conceptが値を期待する関数で、humanが定義されていない場合、その関数をテストすることはできません。

おそらく、変数humanを定義し、次に(print (def-concept human))を含むファイルをロードすることが予想されます。

同じファイルの前にそのフォームの前に何もないので、事前の評価ができないというわけではありません。そのファイルの前に他のファイルをロードしたり、リスナーで評価されたフォームをロードすることができます。

+0

ありがとうございます。私は課題の構造を理解していない可能性があります。私は現在、これに関して教員からの回答を待っています。私はそれが引数として初期化されていない値を使用することはできないことに同意しているので、それはテスト関数でエラーになる可能性があります。残りのテストコマンドには引数の前に「ヒューマン」のような引用符が含まれていますので、おそらくこれも意味します。それ以外の場合は、テストケースを評価する前に何もロードしてはいけないと確信しています。 – TNC

+1

誤植かもしれません。クラスの誰もが同じことに走ります。あなたは他の人と話しましたか?:) – Kaz

+0

うんうん、それはマクロであるはずだったので、 'def-concept'の定義を' defmacro'の代わりに 'defmacro'に変更しました。今私は間違った出力を得ている。 – TNC

関連する問題