Обычная отладка Lisp на уровне читателя - PullRequest
0 голосов
/ 01 марта 2019

Я не совсем уверен, как правильно сформулировать этот вопрос.Тем не менее, это происходит примерно так.

Предположим, что у нас есть некоторые макросы, которые работают подобно defun в Common Lisp и построены на этом.Я сделал объявление с одним из таких макросов, и оно скомпилировалось просто отлично.

Однако, когда я позвонил в REPL, я получил NIL в результате.Это казалось озадачивающим, поэтому я оценил оригинальную декларацию в REPL.Оценено до NIL.

Мне нужно отладить это.У меня вопрос, должен ли я смотреть на уровне читателя или где-то еще.То есть, если нет ошибки, где я могу найти, чтобы начать устранение неполадок этого?

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Вы можете использовать что-то, например, функцию macroexpand-1, и я объясню, почему это лучше, чем обычное расширение макроса:

CL-USER> (defmacro our-when(test &body body)
   `(if ,test
    (progn
      ,@body)))
OUR-WHEN
CL-USER> (macroexpand-1 '(our-when(> 2 1)(format t "Hello World")))
(IF (> 2 1) (PROGN ((FORMAT T "Hello World"))))
T
CL-USER> 

Здесь мы создаем макрос и видим, как макросрасширяет выражения внутри него.В некоторых случаях при отладке предпочтительнее использовать macroexpand-1, чем macroexpand, поскольку macroexpand также разбивает любой макрос, который у вас есть в макросе (например, встроенные макросы Common Lisp).Macroexpand-1 ограничит разбивку созданным вами макросом.

0 голосов
/ 01 марта 2019

Используйте функцию MACROEXPAND, чтобы увидеть, во что расширяется ваш вызов макроса.

(pprint (macroexpand '(my-defun ...)))
...