This adds support for public fields in C++ classes. *Woefully* untested.

IE:
echo "class foo { public: float a, b; };" | chicken-bind - -o -

Produces:
;;; GENERATED BY CHICKEN-BIND FROM -

(begin
  (begin (declare (hide g0)) (define-class <foo> (<c++-object>) ()))
  (begin
    (define g0 (foreign-lambda void "delete " (c-pointer "foo")))
    (define-method (destructor (this <foo>)) (g0 (slot-value this 'this))))
  (define foo-a
    (getter-with-setter
      (foreign-lambda* float (((c-pointer "foo") s)) "return(s->a);")
      (foreign-lambda*
        float
        (((c-pointer "foo") s) (float x))
        "return(s->a = x);")))
  (define foo-b
    (getter-with-setter
      (foreign-lambda* float (((c-pointer "foo") s)) "return(s->b);")
      (foreign-lambda*
        float
        (((c-pointer "foo") s) (float x))
        "return(s->b = x);")))
  (begin
    (declare (hide g1))
    (define g1 (foreign-lambda (c-pointer "foo") "new foo"))
    (define-method
      (constructor (this <foo>) initargs)
      (set! (slot-value this 'this) (##sys#apply g1 initargs)))))

;;; END OF FILE

Patch follows:

diff bind-translator.scm ../t/bind/bind-translator.scm
720,729c720,721
<        [(('id str) . more)
<         (process-member-field-def name rtype (string->symbol str) cb)
<         (let field-loop ([more more])
<           (match more
<              [(('id str) . more)
<               (process-member-field-def name rtype (string->symbol str)
cb)
<               (field-loop more)]
<              [('comma . more) (field-loop more)]
<              [_ (parse-member-body more)])
<           )]
---
>        [(('id str) . (or (('op "=") . _) ()))
>         #f]                ; member variables are ignored
732,744d723
< (define (process-member-field-def name rtype sym cb)
<   (let ([getter (fix-name (string-append (->string name) "-" (->string
sym)))])
<     (let ((g (foreign-transformer
<           `(,(rename (if cb 'foreign-safe-lambda* 'foreign-lambda*))
<         ,rtype (((c-pointer ,name) s))
<         (-> s ,sym)) rename))
<       (s (foreign-transformer
<           `(,(rename (if cb 'foreign-safe-lambda* 'foreign-lambda*))
<         ,rtype (((c-pointer ,name) s) (,rtype x))
<         (= (-> s ,sym) x)) rename)))
<       (emit
<        `(,(rename 'define) ,getter (,(rename 'getter-with-setter) ,g
,s))))))
<


-Dan
_______________________________________________
Chicken-users mailing list
Chicken-users@nongnu.org
https://lists.nongnu.org/mailman/listinfo/chicken-users

Reply via email to