Отладка макросов
Вот ситуация:
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]