#!/usr/local/bin/guile-oops \ -e main -s !# (use-modules (oop goops)) (define-method (print-bool (b <boolean>)) (display (if b "true\n" "false\n"))) (define-class <toggle> () (state #:getter value? #:init-keyword #:state)) (define-class <nth-toggle> (<toggle>) (count-max #:init-keyword #:count-max) (counter #:init-value 0)) (define-method (value? (t <toggle>)) (slot-ref t 'state)) (define-method (activate! (t <toggle>)) (slot-set! t 'state (not (slot-ref t 'state))) t) (define-method (activate! (n-t <nth-toggle>)) (let ((counter (+ 1 (slot-ref n-t 'counter)))) (slot-set! n-t 'counter counter) (if (>= counter (slot-ref n-t 'count-max)) (begin (slot-set! n-t 'state (not (slot-ref n-t 'state))) (slot-set! n-t 'counter 0))) n-t)) (define-method (main (args <list>)) (let ((n (or (and (= (length args) 2) (string->number (cadr args))) 1))) (let ((tog (make <toggle> #:state #t))) (do ((i 0 (+ i 1))) ((= i 5)) (print-bool (value? (activate! tog))))) (do ((i 0 (+ i 1))) ((= i n)) (make <toggle> #:state #t)) (newline) (let ((ntog (make <nth-toggle> #:state #t #:count-max 3))) (do ((i 0 (+ i 1))) ((= i 8)) (print-bool (value? (activate! ntog))))) (do ((i 0 (+ i 1))) ((= i n)) (make <nth-toggle> #:state #t #:count-max 3))))