[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
Re: [ease-dev] EASE could support "require" for loading core modules
|
On 21.11.2014 19:01, Paul D. Fernhout wrote:
https://bugs.eclipse.org/bugs/show_bug.cgi?id=452689
This reply is related to a discussion on the bugtracker. Paul raised
some interesting questions which I like to share on this list as the bug
might remain unnoticed. For interested parties to get the full context,
please read the according bug.
First I'd like to explain a little more, why EASE has a loadModule()
command, what it does and how to potentially get rid of it.
-------------------------------------------------------------------------
Rhino, as we have implemented it in EASE allows to access all classes
from the Java Class Library, along with all classes that are exported by
loaded bundles of your running IDE. Thus people could write java-like
code to be executed by Rhino. The problem is, people willing to write
java-like code (with all the learning of APIs it requires) will write
java code at the end. They will write a plugin, pack it into a feature
and ship it with their product. They will typically not write scripts,
maybe except for rapid prototyping.
The EASE modules encapsulate "complicated" stuff into simple functions.
The userbase it was initially created for typically has no understanding
of object oriented design, classes, instances or even inheritance.
Simple functions for simple tasks. No need to know about full qualified
names and awkward script code, it would result in.
Still we did not want to provide a static DOM for our script languages,
like lots of other scripting approaches for eclipse do. For one you
could not extend it without touching basic EASE plugins. Second it would
pollute your namespace with lots of classes preloaded in your engine.
And finally: how would you define a useful set of common functions? Some
do care about UI, others need scripting for git tasks, modeling, report
creation, C++ compilation, name it. I guess you could never find a
common base that satisfies everyone.
That's where modules come in place. Helper classes that encapsulate most
common tasks. The idea is to bring EASE to the release train some day.
Then other projects could start to build on it and provide their own
modules. Personally I do not want to write modules for every task users
can think of. I want the git guys to provide a git module, sirius people
to add modeling modules and so on. They work on their code base all the
time, they should be the best choice for such modules.
Admittedly to use modules you would have to learn yet another library
mechanism and API. Yet to my knowledge nodeJS, requireJS and all the
others will not help you anyway when you want to interact with eclipse -
and that's what EASE is meant for in the end. Without interaction there
is little use for loadModule() as there are better ways to work with
libraries.
-------------------------------------------------------------------------
So lets see what loadModule() does looking at a simple example:
Pretend we have a java class:
class Calc {
@WrapToScript
public int sum(int a, int b) { return a+b; }
}
On loadModule() we first create an instance of Calc which we inject into
the script engine using a dedicated variable name: __MOD_class_whatever.
Now we generate script code
function sum(a, b) {
// preExecution
__result = __MOD_class_whatever.sum(a, b);
// postExecution
return __result;
}
Nothing special so far. Now other modules might add hooks into the
generation of the function above. They may add arbitrary code on
preExecution and postExecution.
Some ideas what we currently do with it:
* We also build UIs, which use script code below to accomplish some
tasks. We add a module, that simply logs every call to a dedicated
logger like this
some.singleton.Logger.log("sum(3, 5);");
What you get is a way to monitor what you do to the user. Users also
learn the according script commands bound to a toolbar button or other
UI element. This allows to learn the EASE API by simply playing with an UI.
* We've built a test framework that adds postHooks
if ((__result instanceOf some.special.Assertion) &&
(__result.isError())
// create some markers in the workspace, trigger alarms, ...
-------------------------------------------------------------------------
How do we introduce loadModule() to the engine:
Script engines accept extensions points for bootstrapping, things to do
when a new engine is created. One of these extensions loads the basic
Environment module by injecting something like this:
new o.e.ease.EnvironmentModule().loadModule("Environment");
This is an optional extension to the basic script framework and we could
think of ways to disable it, so you could get a "raw" engine without any
additions. If needed, raise a feature request for that.
-------------------------------------------------------------------------
Finally I would like to address your example from
https://bugs.eclipse.org/bugs/show_bug.cgi?id=452689#c4
Using the plain java code would not work, as you would have to run it in
the UI thread - which you would not have access to. With Java 8 you
could inject a function, to Display.syncExec() which would be wrapped to
the required Runnable, but THAT code would look really complicated, yet
doable. Still I prefer
loadModule("UI")
setClipboard("Hello, World and: " + getClipboard());
We see that helping users to learn about EASE, its functionality and API
is crucial. For now we have the Modules Explorer View - an invaluable
little helper, there is help available for all the modules in
"Help/Scripting/Loadable modules" and we started (along with you, Paul)
to provide first script samples in the script repository. I also started
to blog about EASE (http://codeandme.blogspot.com) a little more. Code
completion (editor and shell) was added as a proof of concept, but is
really rough so far.
The balancing act for us is to provide a simple environment for
beginners, while still providing full access to almost everything for
power users. Developers should be able to extend the framework without
the need to touch core EASE bundles. And finally it should support that
very special script language you never heard of but your users love.
Love to hear your ideas on this
--
Christian