[gambit-list] A discrepancy between DEFINE-SYNTAX and DEFINE-MACRO

Joo ChurlSoo initerm at gmail.com
Tue Jul 26 01:21:25 EDT 2011


I happened to find out the following discrepancy between DEFINE-SYNTAX and
DEFINE-MACRO.

1.
(define-syntax adbmal
  (syntax-rules ()
    ((adbmal a ...) (lambda (f) (f a ...)))
    ((adbmal a ... . b) (lambda (f) (apply f a ... b)))))
2.
(define-syntax adbmal
  (syntax-rules ()
    ((adbmal "" (a ...) b . c) (adbmal "" (a ... b) . c))
    ((adbmal "" (a ...)) (lambda (f) (f a ...)))
    ((adbmal "" (a ...) . b) (lambda (f) (apply f a ... b)))
    ((adbmal . a) (adbmal "" () . a))))
3.
(define (split-at-dot pair)		;(a b . c) => (c a b)
  (let loop ((tail pair)		;(a b c)   => (() a b c)
	     (head '()))
    (if (pair? tail)
	(loop (cdr tail) (cons (car tail) head))
	(cons tail (reverse head)))))
(define-macro (adbmal . rest)
  (let ((f (gensym))
	(ls (split-at-dot rest)))
    (if (null? (car ls))
	`(lambda (,f) (,f , at rest))
	`(lambda (,f) (apply ,f ,@(cdr ls) ,(car ls))))))


1,2: DEFINE-SYNTAX
> (define a (list 10 20))
> ((adbmal 1 2 a) list)		=> (1 2 (10 20))
> ((adbmal 1 2 . a) list)	=> (1 2 10 20)

3:   DEFINE-MACRO
> (define a (list 10 20))
> ((adbmal 1 2 a) list)		=> (1 2 (10 20))
> ((adbmal 1 2 . a) list)	=> error -- Ill-formed special form: adbmal


PS:
(a) I've not seen DEFINE-MACRO perform the above well in most implementations
    except BIGLOO & CL.
(b) Even 2nd DEFINE-SYNTAX didn't work in some implementations.
(c) I'd like to know whether the above DEFINE-SYNTAXs are illegal from a R5RS
    or R6RS point of view.

Thanks in advance.
-- 
Joo ChurlSoo




More information about the Gambit-list mailing list