Отладка макросов

Вот ситуация:

CL-USER> [bookid]
#<CLSQL-SYS:SQL-IDENT-ATTRIBUTE BOOKID>
CL-USER> (sql-expression :attribute 'bookid)
#<CLSQL-SYS:SQL-IDENT-ATTRIBUTE BOOKID>
CL-USER> [books.bookid]
#<CLSQL-SYS:SQL-IDENT-ATTRIBUTE BOOKS.BOOKID>
CL-USER> (sql-expression :attribute 'books.bookid)
#<CLSQL-SYS:SQL-IDENT-ATTRIBUTE "books.bookid">

Макрос читателя в [Clsql] ведет себя не так, как SQL-выражение. Я бы предпочел использовать sql-выражение внутри макросов, потому что макрос чтения может там работать странно. Я попробовал macroexpand-1, но, полагаю, расширение не успевает раскрыться достаточно рано. Как исследовать работу макроса читателя?

Изменить: нашел решение для моей проблемы clsql:

(sql-expression :table 'books :attribute 'bookid)

Я все еще хотел бы знать о прочитанном макросе.

2 ответа

Макросы читателя обрабатываются во время чтения, а не во время макроразложения, так что да: слишком поздно для того, что вы пытаетесь сделать. Но вы можете просто процитировать выражение. Например, с простым макросом чтения инфиксов, так как у меня не установлен clsql:

FOO> [1 + 2]
3
FOO> '[1 + 2]
(+ 1 2)

Я полагаю, это даст sql-expression вызов (или что-то подобное) в вашем случае.

Смотрите также: Цитировать вызов макроса читателя.

Чтобы увидеть расширение читателя макроса, вам нужно read что-то:

? (read-from-string "[books.bookid]")

Поскольку R в REPL означает READобычный REPL (read eval print loop) уже считывает ввод и, таким образом, запускает макросы считывателя. Чтобы помешать оценке, нужно процитировать это:

? '[books.bookid]
Другие вопросы по тегам