This sounds like a lot of fun.
I have a version that passes the recursion, equality and mutual
recursion test but fails on this one:
(let ()
(define-integrable (fact n)
(let ((residual-fact (lambda (x) (error 'fact "captured residual-
fact"))))
(if (< n 2)
1
(* n (fact (- n 1))))))
(display (fact 5))) ;;; => 120 but displays the error message
instead
The tspl version also breaks on this, but can easily be repaired (and
shortened) by removing make-residual-name:
(define-syntax define-integrable
(lambda (x)
(syntax-case x (lambda)
((_ (name . formals) . forms)
#'(define-integrable name (lambda formals . forms)))
((_ name (lambda formals form1 form2 ...))
(identifier? #'name)
#'(begin
(define-syntax name
(lambda (x)
(syntax-case x ()
(_ (identifier? x) #'xname)
((_ arg (... ...))
#'((fluid-let-syntax ((name (identifier-syntax
xname)))
(lambda formals form1 form2 ...))
arg (... ...))))))
(define xname
(fluid-let-syntax ((name (identifier-syntax xname)))
(lambda formals form1 form2 ...))))))))
Btw, the tspl version doesn't work in Ikarus, it gives the following
error message (for the first test):
juer...@nix:~$ ik t4.ss
Ikarus Scheme version 0.0.4-rc1+, 64-bit (revision 1861, build
2009-10-16)
Copyright (c) 2006-2009 Abdulaziz Ghuloum
Unhandled exception:
Condition components:
1. &who: fluid-let-syntax
2. &message: "not a fluid identifier"
3. &syntax:
form: (fluid-let-syntax ((fact (identifier-syntax xname)))
(lambda (n) (if (zero? n) 1 (* n (fact (- n 1))))))
subform: fact
4. &trace: #<syntax (fluid-let-syntax ((fact (identifier-syntax
xname))) (lambda (n) (if (zero? n) 1 (* n (fact (- n 1))))))>
5. &trace: #<syntax (fact 5) [char 2073 of t4.ss]>
6. &trace: #<syntax (define-integrable fact (lambda (n) (if (zero?
n) 1 (* n (fact (- n 1))))))>
7. &trace: #<syntax (define-integrable (fact n) (if (zero? n) 1 (*
n (fact (- n 1))))) [char 1975 of t4.ss]>
Is this supposed to happen?
Greetings,
Juergen