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