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))

Reply via email to