Lisp странная ошибка сегментации, вероятно, ошибка eval - PullRequest
2 голосов
/ 13 января 2012

Я не могу понять, почему этот код, определяющий имя функции, вызывает ошибку сегментации. (fdefinition 'realname) -> Вывод моей функции без ошибок

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

но если я это сделаю (realname param), я получу эту ошибку Ошибка: нарушение сегментации (11) [код 0] в 8B238080

где моя ошибка? Спасибо

Ответы [ 2 ]

0 голосов
/ 14 января 2012

Попробуйте

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

или, что еще лучше, используйте макрос вместо функции и избегайте EVAL:

(defmacro mymacro (name args &body body)
  `(setf (fdefinition ',name) #'(lambda (this ,@args) ,@body)))
0 голосов
/ 13 января 2012

Ошибка в вашем коде в том, что вы назначаете список как fdefinition вместо функции.Я бы посчитал это ошибкой в ​​вашей реализации, хотя это вызывает ошибку.(Я не уверен, что это на самом деле ошибка в том смысле, что она нарушает стандарт, но было бы гораздо приятнее, если бы реализация ловила и сообщала об этой ошибке сама.)

Чтобы перевернуть списокначиная с lambda в функцию, вам нужно оценить ее.С другой стороны, eval вокруг setf не кажется необходимым вообще.Таким образом, возможное решение заключается в переключении позиций eval и setf:

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