To jest bardziej teoretyczne pytanie dotyczące makr (jak sądzę). Wiem, że makra pobierają kod źródłowy i generują kod obiektowy bez jego oceny, umożliwiając programistom tworzenie bardziej wszechstronnych struktur składniowych. Gdybym musiał sklasyfikować te dwa makropolecenia, powiedziałbym, że było makro "C" i makro "stylu Lispa".W jaki sposób język z obsługą makr monitoruje kod źródłowy do debugowania?
Wygląda na to, że debugowanie makr może być nieco trudne, ponieważ w czasie wykonywania kod, który faktycznie działa, różni się od źródła.
W jaki sposób debugger śledzi wykonanie programu pod kątem wstępnie przetworzonego kodu źródłowego? Czy istnieje specjalny "tryb debugowania", który należy ustawić, aby przechwytywać dodatkowe dane o makrze?
W języku C mogę zrozumieć, że ustawiłeś przełącznik czasu kompilacji do debugowania, ale jak zrobiłby to język interpretowany, na przykład niektóre formy Lisp?
Przepraszam, że nie wypróbowywano tego, ale program narzędziowy LISP wymaga więcej czasu, niż muszę wydać, aby dowiedzieć się.
Ale odwzorowanie skompilowanego kodu z powrotem do makra nie rozwiązuje następującego problemu: gdy makro generuje kod na podstawie deklaracji deklaratywnej (np. Makro, które generuje parser z gramatyki bezkontekstowej) byłoby bardzo przydatne podczas debugowania, aby móc znaleźć jaka część danych wejściowych jest "aktywna" (np. jaka reguła gramatyki jest dopasowywana, jeśli jest to możliwe). To wymagałoby od programu piszącego makro wyraźnego określenia, które części generowanej mapy kodu odpowiadają częściom wejściowym makra. Czy makra Racket mają taką zdolność? W przeciwnym razie jest to odpowiednik debugowania (częściowo) rozszerzonego kodu. –
"W przeciwnym razie jest to odpowiednik debugowania (częściowo) rozszerzonego kodu." Nie myślę, że się mylę w tym zdaniu. Zignoruj to. –
dmity-vk: Right - specjalna formuła 'syntax' w Racket w zasadzie dba o połączenie fragmentów kodu od użytkownika makra z fragmentami kodu z samego makra i upewnienie się, że lokalizacja źródła na wynikowych formularzach jest poprawne we wszystkich formach. –