Мне нужно заменить все вхождения (g param) на (begin (display "g: ") (display 'param) param)
Причём в выражении произвольной вложенности, например в
(let [(x 1)] (g x))
Все остальные выражения должны остаться без изменений.
Сделал такой макрос:
(define-syntax g-processor
(syntax-rules (g)
[(_ (g x)) (begin (display "g: ") (display 'x) (newline) x)]
[(_ (x . y)) ((g-processor x) . (g-processor y))]
[(_ x) x]))
Но он не работает. Например:
(g-processor (+ 1)) -> ((g-processor +) . (g-processor (1)) -> (+ . (g-processor (1))) == (+ g-procesor (1)), и здесь, конечно, всё стопорится,
потому что g-processor не в позиции применения, и получается invalid syntax.
По идее должно быть просто — прогуляться по двоичному дереву и заменить все вхождения (g x) на нужное выражение, но не получается.
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.
Похожие темы
- Форум Снова макросы Racket (2013)
- Форум [scheme][haskell][oop][fp] Мысли вслух (2012)
- Форум [филология] Macro (2011)
- Форум nasm macro (2015)
- Форум mcedit, macros (2012)
- Форум OpenOffice macros (2009)
- Форум Lisp Macro (2007)
- Форум Scheme (2011)
- Форум Scheme (2006)
- Форум Scheme (2005)