(load "ghelper") (load "discovery") (define inverse (make-generic-operator 1 #f 'inverse)) (define plus (make-generic-operator 2 #f 'plus)) (define minus (make-generic-operator 2 #f 'minus)) (assign-operation inverse (lambda (x) (/ 1 x)) (lambda (x) (and (number? x) (not (integer? x))))) ; actually a transpose, but meh (assign-operation inverse (lambda (x) (apply zip x)) (lambda (x) (and (list? x) (for-all? x list?)))) (define any? (lambda (x) #t)) (assign-operation minus - any? any?) (assign-operation plus + any? any?) (plus 1 2) ; 3 ;(minus 3) ; ERROR (inverse 6.5) ;Value: .15384615384615385 (discover:opers-for 6.5) ;Value 57: (#[compound-procedure 38 operator] thingaling) (discover:named-opers-for 6.5) ;Value 58: (thingaling) (discover:named-opers-for 1 2) ;Value 81: (plus minus) ;;; this stuff is just play crap (car (hash-table->alist *generic-operator-table*)) (caadr (hash-table/get *generic-operator-table* inverse #f)) (environment-bound-names (the-environment)) (environment-lookup (the-environment) 'inverse) (inverse '( (1 2 3) (0 1 2) (0 0 1))) (hash-table/get *generic-operator-table* inverse #f) (hash-table/get *generic-operator-table* minus #f) (hash-table-size *generic-operator-table*) ;Value: 92 ;this is for mechanics ;this prints all keys line by line (for-each (lambda (x) (newline) (display x)) (hash-table/key-list *generic-operator-table*)) (define add1 (make-generic-operator 1 #f 'add1)) (define sub1 (make-generic-operator 1 #f 'sub1)) (define double (make-generic-operator 1 #f 'double)) (define square (make-generic-operator 1 #f 'square)) (define inverse (make-generic-operator 1 #f 'inverse)) (defhandler add1 (lambda (x) (+ x 1)) number?) (defhandler sub1 (lambda (x) (- x 1)) number?) (defhandler double (lambda (x) (* 2 x)) number?) (defhandler square (lambda (x) (* x x)) number?) (defhandler inverse (lambda (x) (/ 1 x)) (lambda (n) (and (number? n) (not (zero? n))))) (add1 4) ;(sub1 'b) (discover:apply-all 3) (discover:satisfy (lambda (x) (eq? x 9)) (/ 1 2)) (discover:satisfy-sequence (lambda (x) (eq? x 9)) (/ 1 2)) (discover:satisfy-sequence (lambda (x) (eq? x 49)) (/ 5 6)) (square (sqrt 2)) (sqrt 2) (square 3)