Self-referential macro

This is not the same as a recursive macro.

Define this:

(define-syntax f
  (syntax-rules () 
    ((f) f)))

Now what is the result of (f)? There are three possible results:

When syntax-rules is implemented on top of syntax-case, the result is likely to be (3).

system result
Bigloo 1 ("f unbound")
Biwa 2 ("a macro")
Chibi 3 ("syntax error")
Chicken 1 ("f unbound")
Chez 3 ("syntax error")
Cyclone 2 ("a macro")
Gambit 3 ("syntax error")
Gauche 2 ("a macro")
Guile 3 ("syntax error")
Kawa 2 ("a macro")
LIPS 2 ("a macro")
Loko 3 ("syntax error")
MIT 3 ("syntax error")
Peroxide 3 ("syntax error")
Sagittarius 3 ("syntax error")
Scheme 48 1 ("f unbound")
Scheme 9 see below
STklos 1 ("f unbound")
Unsyntax 3 ("syntax error")

For Scheme 9 From Empty Space, we get:

> (define-syntax f
    (syntax-rules () 
      ((f) f)))
> (f)
*** error: undefined symbol: _
*** trace: alpha-conv form conv subst expand

It isn't useful to compare this to Common Lisp and Emacs Lisp (because they are Lisp-2, and there is no way to reference the macro itself in its expansion). But we can do that in Clojure:

Clojure 1.10.2
user=> (defmacro f [] f)
#'user/f
user=> (f)
#object[user$f 0x3ff57625 "user$f@3ff57625"]

It seems that it does return the macro, but checking its type doesn't tell much:

user=> (type (f))
user$f

Back to Scheme Surveys

Page source (GitHub)