2012-01-12 6 views
2

関数名を定義していないこのコードがセグメンテーションフォルトを引き起こす理由を理解できません。 (fdefinition「本名) - エラーなしLispの異常なセグメンテーションフォールトおそらく評価エラー

(eval (setf (fdefinition name) `(lambda (this ,@args) ,@body))) 

と私の関数の>出力が、私は(本名のPARAM)を行う場合、私は、このエラー エラーを取得:8B238080

でセグメンテーション違反(11)[コード0]

私のエラーはどこですか? ありがとう

+0

どのようなlisp実装/システムですか? –

+0

私はLispWorksを使用しています – marchetto91

答えて

0

あなたのコードのエラーは、機能の代わりにfdefinitionとしてリストを割り当てていることです。私はそれがsegfaultを引き起こしているが、あなたの実装ではバグだと思うだろう。 (実際には標準に違反しているという意味で実際にはバグかどうかはわかりませんが、実装がこのエラーをキャッチして報告するのは間違いなく良いでしょう)

lambdaを関数に変換するには、関数を評価する必要があります。一方、setfのまわりのevalは、まったく必要ではないようです。だから、可能な解決策はevalsetfの位置を切り替えることである。

(setf (fdefinition name) (eval `(lambda (this ,@args) ,@body))) 
+0

ありがとうございました!今分かります!!そして、私のコードは動作します! – marchetto91

+0

あなたはお嬢さん! :) – marchetto91

0

まだ代わりに、関数のマクロを使用してEVALを避ける

(eval `(setf (fdefinition ',name) #'(lambda (this ,@args) ,@body))) 

以上を試してみてください:

(defmacro mymacro (name args &body body) 
    `(setf (fdefinition ',name) #'(lambda (this ,@args) ,@body))) 
関連する問題