public inbox for kawa@sourceware.org
 help / color / mirror / Atom feed
From: Per Bothner <per@bothner.com>
To: Sonny To <son.c.to@gmail.com>, Kawa mailing list <kawa@sourceware.org>
Subject: Re: how to define/put into Environment with type hints?
Date: Wed, 20 Sep 2017 13:17:00 -0000	[thread overview]
Message-ID: <02189604-299a-6c2f-5819-e921244d79fb@bothner.com> (raw)
In-Reply-To: <CAJxjsJtD7+mqb6LtfpofpNcRqvGFbrYDEQvmZhJQ_Nv-LADeow@mail.gmail.com>

On 09/20/2017 05:36 AM, Sonny To wrote:
> I tried something like this
> 
> env.put(Symbol.valueOf("application"), Symbol.makeUninterned("::
> android.app.Application"),application)
> 
> the result I want is
> (define application :: android.app.Application application)
> 
> 
> if I do, env.put(Symbol.valueOf("application"),application) accessing
> application from the repl will
> give warnings about missing symbols because its treated as an
> java.lang.Object. I don't want to explicitly cast every time i want to
> invoke a method or property of application

It is common for people new to Kawa to want to play around with
environments and/or eval.  My general advise to minimize doing either.
Scheme is built around lexical binding, and modern Schemes take that
further using modules/libraries. Kawa's strength is compilation including
compile-time analysis.

So if you can possibly avoid using environment objects or eval, do so.

There is no way to directly specify types with an environment binding.
However, it is possible to do it indirectly:

To get the effect of:
   (define application :: android.app.Application app)
you need to evaluate or compile that.

The resulting class can be imported (using import/require),
and the resulting bindings will have the type specifier.

The last piece of the puzzle is loadClass, which loads all
the public bindings in a class into an environment.

You can use either: kawa.standard.Scheme.loadClass
or the lower-level: gnu.language.LoadClass
or the still lower-level: gnu.kawa.reflect.ClassMemberLocation.defineAll

It might be reasonable to define a helper procedure:
   (environment-import clas [environment])
This would be a simple wrapper around ClassMemberLocation.defineAll.
-- 
	--Per Bothner
per@bothner.com   http://per.bothner.com/

      reply	other threads:[~2017-09-20 13:17 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-09-20 12:36 Sonny To
2017-09-20 13:17 ` Per Bothner [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=02189604-299a-6c2f-5819-e921244d79fb@bothner.com \
    --to=per@bothner.com \
    --cc=kawa@sourceware.org \
    --cc=son.c.to@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).