Lisp奇怪的分段错误可能是eval错误



我不明白为什么这个取消函数名的代码会导致分段错误。(fdefinition'realname)-->我的函数输出无错误

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

但如果我这样做(realname param),我会得到这个错误错误:8B238080 处的分段违规(11)[代码0]

我的错误在哪里?感谢

代码中的错误是将列表指定为fdefinition而不是函数。我认为这是您实现中的一个错误,尽管这会导致segfault。(我不确定它是否真的是一个违反标准的错误,但如果实现能够捕捉并报告这个错误,那肯定会好得多。)

要将以lambda开头的列表变成一个函数,需要对其进行求值。另一方面,setf周围的eval似乎根本没有必要。因此,一个可能的解决方案是切换evalsetf:的位置

(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)))

相关内容

最新更新