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) <--