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

Reply via email to