球拍中宏的递归扩展?

时间:2018-08-17 06:23:41

标签: 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 (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)))

嵌套的大小写没有扩展。我在做错什么吗?

1 个答案:

答案 0 :(得分:2)

当您删除#'(您可能将其放入调试中)时,似乎工作正常:

#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)