Hi! I attach a template which you could build on. Please post your class when you're done. :)
Best regards, Mikael On Fri, Apr 30, 2021 at 1:11 AM Damien Mattei <damien.mat...@gmail.com> wrote: > hi, > i want to create a growable vector class in Guile, > such as std::vector or python list, > first i do not know if it exist already? seems not > > i want to use GOOPS but i do not understand how the superclass could be > accessed,used, instanciate... > for example in the doc there is: > (define-class <my-complex> (<number>) r i #:name "Complex") > > seems <number> superclass is of no use > > for my growable vector i would like to use array as superclass? > but perhaps should it be just a slot as array are a subset of growable > array ,so a subclass > > anyway if i write something ike that: > (define-class <gvector> (<array>) ..... > how can i use the <array> object? > > i think perhaps i should not define a superclass or <object> as super > class.... > any advice welcome... > > Damien >
(define-module (oop gvector) #:use-module (oop goops) #:use-module ((guile) #:select (vector-length vector-ref vector-set!) #:prefix orig:) #:export (<gvector>) #:replace (vector-length vector-ref vector-set!)) ;;; Constants (define *initial-allocated-size* 8) ;;; Capture original bindings of vector getters and setters (define-generic vector-length) (define-method (vector-length (v <vector>)) (orig:vector-length v)) (define-generic vector-set!) (define-method (vector-set! (gv <vector>) (i <integer>) obj) (orig:vector-set! gv i obj)) (define-generic vector-ref) (define-method (vector-ref (gv <vector>) (i <integer>)) (orig:vector-ref gv i)) ;;; The <gvector> class (define-class <gvector> (<vector>) (v #:init-value (make-vector *initial-allocated-size*) #:getter v) (length #:init-value 0 #:getter vector-length)) (define (assert-size! gv i) (if (>= i (length gv)) *unspecified*)) ; do nothing for now (define-method (vector-set! (gv <gvector>) (i <integer>) obj) (assert-size! gv i) (vector-set! (v gv) i obj)) (define-method (vector-ref (gv <gvector>) (i <integer>)) (assert-size! gv i) (vector-ref (v gv) i))