let's i'm using s-expressions ir language i'm writing. might have ast looks like
'(add (times (3 : int) (add (4 : int) (5 : int))) (1 : int)) which can process recursively without trouble. example, erase type annotations do
(define (erase-types term) (match term [`(,val : ,type) val] [`(,binop ,arg1 ,arg2) `(,binop ,(erase-types arg1) ,(erase-types arg2))])) now suppose wanted same thing, instead @ compile time syntax object containing same datum ast @ top. tried use kind of pattern-based macro, seems can't use (define-syntax erase-types-or-whatever ...) in recursive way.
i tried putting normal match function in separate module (require (for-syntax ...)) , doing 1 big syntax->datum @ beginning, or doing like
(define (erase-types-or-whatever stx) (match (syntax-e stx) [...])) but have syntax->datum everywhere , have restructure again datum->syntax , don't know how use (do put #f first argument?) , feels absolute wrong way it.
what's correct way kind of syntax tree processing? docs aren't super enlightening either when comes macros , syntax.
#lang racket (require syntax/parse) (define-syntax : (λ (stx) (raise-syntax-error ': "used out of context" stx))) (define (erase-types term) (syntax-parse term #:literals (:) [(val : type) #'val] [(binop arg1 arg2) (with-syntax ([arg1 (erase-types #'arg1)] [arg2 (erase-types #'arg2)]) #'(binop arg1 arg2))])) (erase-types #'(add (times (3 : int) (add (4 : int) (5 : int))) (1 : int)))
Comments
Post a Comment