(define-module (language python class) #:export (class_+ class_- class_* class_// class_% class_power class_<< class_>> class_ior class_xor class_band)) (define-syntax-rule (class-ref x) (struct-ref x 0)) (define-syntax-rule (class-num x) (struct-ref x 1)) (define-syntax-rule (class-log x) (struct-ref x 2)) (define-syntax-rule (class-map x) (struct-ref x 3)) (define-syntax-rule (mkref +-ref n) (define-syntax-rule (+-ref x) (vector-ref x n))) (mkref +-ref 0) (mkref --ref 1) (mkref *-ref 2) (mkref /-ref 3) (mkref //-ref 4) (mkref %-ref 5) (mkref **-ref 6) (mkref <<-ref 7) (mkref >>-ref 8) (mkref ior-ref 0) (mkref xor-ref 1) (mkref and-ref 2) (define-syntax-rule (class-lookup class key ) (hashq-ref (class-map class) key #f)) (define-syntax-rule (meta-mk mk-num class-num) (define-syntax-rule (mk-num class_+ __add__ __radd__ +-ref err) (define (class_+ x y) (let* ((cl (class-ref x)) (r (class-num cl))) (define (f) (let ((rrr (class-lookup cl '__add__))) (if rrr (rrr x y) (if (class? y) (let* ((cl (class-ref y)) (rrrr (class-lookup cl '__radd__))) (if rrrr (rrrr y x) (err))) (err))))) (if r (let ((rr (+-ref r))) (if rr (rr x y) (f))) (f)))))) (meta-mk mk-num class-num) (meta-mk mk-log class-log) (define (err) (error "could not do artithmetic ops")) (mk-num class_+ __add__ __radd__ +-ref err) (mk-num class_- __sub__ __rsub__ --ref err) (mk-num class_* __mul__ __rmul__ *-ref err) (mk-num class_/ __div__ __rdiv__ /-ref err) (mk-num class_// __floordiv__ __rfloordiv__ //-ref err) (mk-num class_% __divmod__ __rdivmod__ %-ref err) (mk-num class_power __pow__ __rpow__ **-ref err) (mk-num class_<< __lshift__ __rlshift__ <<-ref err) (mk-num class_>> __rshift__ __rrshift__ >>-ref err) (mk-log class_ior __or__ __ror__ ior-ref err) (mk-log class_xor __xor__ __rxor__ xor-ref err) (mk-log class_band __and__ __rand__ and-ref err)