We first try to redefine define as set!, as if it were a symbol:
(define define set!)
(define x 1)
x => ?
The idea is to try to set it to another macro, not just to another value.
Now we try again, but properly as a macro:
(define-syntax define
(syntax-rules ()
((define a b)
(set! a b))))
(define x 1)
x => ?
Since x was unbound, if define is changed to mean set! then (define x 1)
should complain about x not being bound.
| system | redefine define | (define x 1) | define-macro define | (define x 1) |
|---|---|---|---|---|
| Bigloo | set! unbound | warning | x unbound | |
| Biwa | error | ok | ignores macro and DEFINEs x | |
| Chibi | error | ok | x unbound | |
| Chicken | error | ok | ignores macro and DEFINEs x | |
| Chez | error | ok | ignores macro and DEFINEs x | |
| Cyclone | set! unbound | ok | ignores macro and DEFINEs x | |
| Gambit | error | ok | x unbound | |
| Gauche | ok | x unbound | ok | x unbound |
| Guile | error | ok | x unbound | |
| Kawa | ok | x unbound | ok | x unbound |
| LIPS | ok | x unbound | ok | x unbound |
| Loko | error | ok | ignores macro and DEFINEs x | |
| MIT | error | ok | x unbound | |
| Peroxide | set! unbound | ok | x unbound | |
| Racket | error | ok | x unbound | |
| Sagittarius | set! unbound | ok | x unbound | |
| Scheme 48 | set! unbound | error | ||
| Scheme 9 | set! unbound | ok | ignores macro and DEFINEs x | |
| STklos | set! unbound | ok | x unbound | |
| Unsyntax | error | ok | ignores macro and DEFINEs x |
Biwa doesn't have syntax-rules, so define-macro was used.
Interestingly, only some Common Lisp implementations allow
redefining the function value of the symbol DEFUN.
For example, this is Clisp:
[9]> (setf (fdefinition 'defun) #'+)
#<SYSTEM-FUNCTION +>
[10]> (defun 2 3)
5
| system | result |
|---|---|
| ABCL | allows |
| CLASP | allows |
| Clisp | allows |
| CCL | allows (asks to ignore lock) |
| ECL | allows (asks to ignore lock) |
| GCL | no |
| SBCL | asks to ignore lock, says everything went OK, but doesn't do it |
Emacs Lisp allows it:
ELTR version 0.0.3.
Emacs version 29.0.50 -- c9cb59bc4f68d6050451bc0a619fd3eb6a6ed554,
built 2021-12-10 13:14:21 on socrates.
It will be a nice day. I can feel it!
1> (fset 'defun #'+)
;; (fset 'defun #'+)
1=> +
( symbol )
2> (defun 2 3)
;; (defun 2 3)
2=> 5
( ?\C-e #x5 #b101 #o5 )
( integer )