This is the mail archive of the kawa@sourceware.org mailing list for the Kawa project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Questions regarding modules


I've read and re-read the module explanations from Per many times, but
I still run into trouble, so I will ask here. My testing is done on
Android, using gradle. If you do not know gradle, what you might need
to know is that a project (by default) is laid out in a certain way.
For instance for a kawa source file for the class
net.kjeldahl.kawa.MyClass will exist in
src/main/kawa/net/kjeldahl/kawa/MyClass.scm . Similarily, the output
of the class files will go into the path
build/classes/debug/net/kjeldahl/kawa/MyClass.class . To the best of
my abilities I've also verified that the class files get put where
they are supposed to be and that the stuff in them is correct (proper
class names, using javap to check the contents).

Anyway, I have my Android activity defined in it's own
KawaActivity.scm file more or less like follows:

(module-name net.kjeldahl.kawatest.app.KawaActivity)
...
(require net.kjeldahl.kawatest.app.HelloKawa "HelloKawa.scm")

(define-simple-class KawaActivity (Activity)
  ((onCreate (savedInstanceState::Bundle)) (@Override)
   (invoke-special Activity (this) 'onCreate savedInstanceState)
   (define tv::TextView (TextView (this) text: "Kawa hello."))
   (define my-view::View (LinearLayout (this)
                                       orientation: LinearLayout:VERTICAL
                                       view: tv))
   ((this):setContentView my-view)
   (define str (string-append "Retval: " (HelloKawa:hello)))
   (tv:setText str)
   ))

The HelloKawa.scm source file is located in the same "namespace" and
directory as the file above, and simply contains:

(module-name net.kjeldahl.kawatest.app.HelloKawa)

(define-simple-class HelloKawa ()
  ((hello) allocation: 'static
   "Hello from HelloKawa!"))

;; (define (hello)
;;    "Hello from Kawa!")

The code shown above works just fine. What I am having trouble with is
figuring out why certain things are needed and not.

Question 1 - The line that does require HelloKawa; Unless I list the
filename "HelloKawa.scm" as the second parameter, I will get a kawa
compiler error; invalid specifier for 'require'. I have no idea why.
I've experienced with setting the working dir prior to calling the
kawa compiler, but it does not seem to matter much. It looks like kawa
has it's own idea about the proper path for start searching for the
source file for the module.

Question 2 - When invoking (HelloKawa:hello), how come kawa knows
about my HelloKawa class without the full class name? I haven't done
any define-alias on it, so it's a bit unexpected.

Question 3 - The file defining HelloKawa uses define-simple-class, but
I've also tried it with a straight up define instead (you'll see that
commented out in the source file above). If I do that, I get two
errors from kawa; no known slot hello in java.lang.Object, and no
declaration seen for HelloKawa. Based on what I've read, this second
method of defining a module should work as long as we stay within the
kawa domain, but I may have interpreted that wrong.

And just to reiterate; I realize there are better ways to write this
kind of code on Android. The trouble is there is a lot more code out
there than Android, and I need to get comfortable with the mappings
before I dare to try and do real stuff with this. If I'm still
struggling at these basic things I can assure you when/if others try
to follow they will have similar issues. So I'm hoping to have some
answers ready!

Thanks,

Marius K.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]