[plt-scheme] macro expension order
Chongkai Zhu skrev:
> Hi all,
>
> I have the following program;
>
> (define-syntax NONE (syntax-id-rules () (NONE 'NONE)))
> (define-syntax SOME (syntax-rules () ((SOME g57951) (list 'SOME g57951))))
> (define expt
> (match-lambda*
> ((list NONE n) (expt (SOME 2) n))
> ((list (list 'SOME b) 0) 1)
> ((list (list 'SOME b) n) (if (= (mod n 2) 0) (expt (SOME (* b b))
> (/ n 2)) (* b (expt (SOME b) (- n 1)))))))
>
> It is automatically translated from the following SML program:
>
> datatype 'a option = NONE | SOME of 'a
>
> fun expt (NONE, n) = expt (SOME 2, n)
> | expt (SOME b, 0) = 1
> | expt (SOME b, n) =
> if n mod 2 = 0 then
> expt (SOME (b*b), n div 2)
> else
> b * expt (SOME b, n-1)
Why not represent NONE and SOME as structures?
(define-struct NONE ())
(define-struct SOME (b))
(require (lib "plt-match.ss"))
(define expt
(match-lambda*
[(list (struct NONE ()))
(expt (make-SOME 2) n)]
[(list (struct SOME (b)) 0)
1]
[(list (struct SOME (b)) n)
(if (= (modulo n 2) 0)
(expt (make-SOME (* b b)) (quotient n 2))
(* b (expt (make-SOME b) (- n 1))))]))
(expt (make-SOME 2) 0) ; => 1
(expt (make-SOME 2) 1) ; => 2
(expt (make-SOME 2) 2) ; => 4
(expt (make-SOME 2) 3) ; => 8
--
Jens Axel Søgaard