whats the difference? pasted by anandamide on Thu Apr 14 21:27:57 2016

(define (if-proc-apply it var)
  (if (procedure? it)
      (if (eq? var '())
	  (it '())
	  (apply it var))
      it))

(define-syntax class
  (syntax-rules (public private)
    ((class (?var0 ?val0) ...)       
     (let* ((?var0 ?val0) ...)
       (lambda (p . args)
         (cond ((eq? p '?var0) (if-proc-apply ?var0 args))
	       ...
               (else (error "input not found"))))))
    
    ((class private (?var0 ?val0) ... public (?var1 ?val1) ...)
     (let* ((?var0 ?val0) ...)
       (let* ((?var1 ?val1 )...)
	 (lambda (p . args)
	   (cond ((eq? p '?var1) (if-proc-apply ?var1 args))
		 ...
		 (else (error "input not found")))))))))

;this works
(define g (class private (a 10) (b 20) public (get-a (lambda (x) a)) (set-a! (lambda (x) (set! a x))))) 

;this does not

(define ob2
  (class private
	 (a 10) (b 20)
	 public
	 (c '())
	 (get-a (lambda (x) a))
	 (get-b (lambda (x) b))
	 (set-a! (lambda (x) (set! a x)))
	 (set-b! (lambda (x) (set! b x)))
	 (push-c! (lambda (x)
		    (set! c (cons x c))))
	 (pop-c! (lambda (x)
		   (if (not (eq? c '()))
		       (set! c (cdr c))
		       (error "stack empty!"))))))

with error message added by anandamide on Thu Apr 14 21:50:28 2016

(define ob2
  (class private
 (a 10) (b 20)
 public
 (c '())
 (get-a (lambda (x) a))
 (get-b (lambda (x) b))
 (set-a! (lambda (x) (set! a x)))
 (set-b! (lambda (x) (set! b x)))
 (push-c! (lambda (x)
    (set! c (cons x c))))
 (pop-c! (lambda (x)
   (if (not (eq? c '()))
       (set! c (cdr c))
       (error "stack empty!"))))))

Error: during expansion of (class ...) - no rule matches form: (class private (a 10) (b 20) public (c (quote ())) (get-a (lambda (x) a)) (get-b (lambda (x) b)) (set-a! (lambda (x) (set! a x))) (set-b! (lambda (x) (set! b x))) (push-c! (lambda (x) (set! c (cons x c)))) (pop-c! (lambda (x) (if (not (eq? c (quote ()))) (set! c (cdr c)) (error "stack empty!")))))

        Call history:

        <eval>    (##sys#cdr l190)
        <eval>    (##sys#+ len191 -1)
        <eval>    (##sys#= len191 3)
        <eval>    (##sys#car l190)
        <eval>    (##sys#pair? temp200)
        <eval>    (##sys#cdr temp200)
        <eval>    (##sys#pair? temp200)
        <eval>    (##sys#eq? (##sys#cdr temp200) (quote ()))
        <eval>    (##sys#cdr temp200)
        <eval>    (loop195 (##sys#cdr l190) (##sys#+ len191 -1))
        <eval>    (##sys#cdr l190)
        <eval>    (##sys#+ len191 -1)
        <eval>    (##sys#= len191 3)
        <eval>    (##sys#car l190)
        <eval>    (##sys#pair? temp200)
        <eval>    (##sys#syntax-rules-mismatch input189)        <--