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 <[email protected]>
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))