nanopass-framework-racket
nanopass-framework-racket copied to clipboard
feat: clarify default parameters for passes
I think we can use default values for extra formal parameters in the define-pass form:
(define-pass name : lang-specifier (formal ...) -> lang-specifier (extra-return-val ...)
definitions-clause
processor ...
body-expr)
And the following code works:
(define-language L
(entry Expr)
(terminals
(number (n)))
(Expr (e)
n
(someop e)))
(define-parser parse-L L)
(define-pass as-bin : L (ir global-ctx) -> L ()
( as-binary : Expr (ir [ctx global-ctx]) -> Expr ()
[,n (modulo n 2)]
[(someop ,[e? 'val-b -> e]) `(someop ,e)]))
; usage:
; (as-bin (parse-L '(someop 4)) 'val-default)
; or
; ((compose (curryr as-bin 'val-default) parse-L) '(someop 4))
But only the processor as-binary
can have the default value, and I think It would be cool to be able to also write default values as the define
statement does:
; ⬐---------here---------⬎
(define-pass as-bin : L (ir [global-ctx 'val-default]) -> L ()
( as-binary : Expr (ir [ctx global-ctx]) -> Expr ()
[,n (modulo n 2)]
[(someop ,[e? 'val-b -> e]) `(someop ,e)]))
; suggested usage:
; (as-bin (parse-L '(someop 4)))
; or
; ((compose as-bin parse-L) '(someop 4))
Note
The documentation does not say anything about default parameters:
formal is an identifier representing a formal argument.