JRR
JRR

Reputation: 6152

recursive expansion of macros in racket?

I'm wondering if there is a way to do recursive expansion of macros?

(define-syntax my-define
  (syntax-rules ()
   [(my-define (fn v ...) body) #'(define (fn v ...) body)]))


(define-syntax my-let
  (syntax-rules ()
    [(my-let ([v e] ...) body) #'(let ([v e] ...) body)]))

;(my-define (f1 a) a)
; this returns (define (f1 a) a)

;(my-let ([x 10]) x)
; this returns (let ([x 10]) x)

(my-define (f1 a) (my-let ([x 10]) x))
; but this returns (define (f1 a) (my-let [x 10] x)))

The nested case is somehow not expanded. Am I doing something wrong?

Upvotes: 1

Views: 546

Answers (1)

soegaard
soegaard

Reputation: 31145

Seems to work fine, when you remove the #' (which you probably put it in to debug):

#lang racket

(define-syntax my-define
  (syntax-rules ()
    [(my-define (fn v ...) body) 
        (define (fn v ...) body)]))


(define-syntax my-let
  (syntax-rules ()
    [(my-let ([v e] ...) body)
        (let ([v e] ...) body)]))

(my-define (fact n)
  (my-let ([k (- n 1)])
    (if (zero? n) 1 (* n (fact k)))))

(fact 5)

Upvotes: 2

Related Questions