我无法理解为什么这个解析函数名的代码会导致分段错误。 (fdefinition'realname) - >输出我的函数没有错误
(eval (setf (fdefinition name) `(lambda (this ,@args) ,@body)))
但如果我这样做(realname param)我会收到此错误 错误:分段违规(11)[代码0],位于8B238080
我的错误在哪里? 感谢
答案 0 :(得分:0)
代码中的错误是您将列表指定为fdefinition
而不是函数。我认为这是你的实现中的一个错误,虽然这会导致段错误。 (我不确定它是否真的是一个违反标准的错误,但如果实现会捕获并报告此错误,那肯定会更好。)
要将以lambda
开头的列表转换为函数,您需要对其进行评估。另一方面,eval
周围的setf
似乎根本没有必要。因此,可能的解决方案是切换eval
和setf
:
(setf (fdefinition name) (eval `(lambda (this ,@args) ,@body)))
答案 1 :(得分:0)
尝试
(eval `(setf (fdefinition ',name) #'(lambda (this ,@args) ,@body)))
或更好仍然使用宏而不是函数,并避免使用EVAL
:
(defmacro mymacro (name args &body body)
`(setf (fdefinition ',name) #'(lambda (this ,@args) ,@body)))