;; -*- Mode: Irken -*- (include "lib/core.scm") (include "lib/pair.scm") ;; ok, so the object needs to look like this: ;; {o=methods ivar0=ival0 ivar1=ival1 ...} ;; so what would a method call look like? ;; (x::add 12) ;; => (x.o.add x 12) ;; and the definition of add will take ;; a self arg... (define (set-class) (define (in self x) (let loop ((l self.list)) (match l with () -> #f (hd . tl) -> (if (eq? hd x) #t (loop tl))))) (define (add self x) (if (self::in x) #u (set! self.list (list:cons x self.list)))) (define (get self) self.list) (let ((methods {in=in add=add get=get})) (define (new l) {o=methods list=l}) new )) (define set-maker (set-class)) (let ((s0 (set-maker '())) (s1 (set-maker '())) ) (s0::add 12) (s0::add 12) (s1::add #t) (s0::add 10) (s0::add 8) (printn (s0::get)) (s1::add #f) (s1::add #t) (s1::add #f) (s1::add #t) (s1::add #f) (s1::add #t) (s1::add #f) (s1::add #t) (s1::add #f) (s1::add #t) (s1::add #f) (s1::add #t) (s1::add #f) (s1::add #t) (s1::add #f) (s1::add #t) (s1::add #f) (s1::add #t) (s1::add #f) (s1::add #t) (s1::add #f) (s1::add #t) (s1::add #f) (s1::add #t) (s1::add #f) (s1::add #t) (printn (s1::get)) )