at:tutorial:symbiosis
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
at:tutorial:symbiosis [2008/10/22 16:52] – updated tvcutsem | at:tutorial:symbiosis [2013/05/17 20:25] (current) – updated tvcutsem | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | |||
====== Symbiosis with Java ====== | ====== Symbiosis with Java ====== | ||
Line 8: | Line 7: | ||
This chapter explains how to program using this " | This chapter explains how to program using this " | ||
- | ===== Symbiosis Architecture | + | ===== Built-in Conversions |
- | AmbientTalk | + | When AmbientTalk |
- | {{:at:tutorial:wrapper-architecture.png? | + | ^ Java value : type ^ AmbientTalk value ^ |
+ | | null: Object | nil | | ||
+ | | n: int | a number n | | ||
+ | | d: double | a fraction d | | ||
+ | | b: boolean | a boolean b | | ||
+ | | s: String | a text s | | ||
+ | | array: T[] | a table (of converted values) | | ||
+ | | e: Exception | an exception e | | ||
+ | | c: Class | class wrapper( c ) | | ||
+ | | o: ATObject | o | | ||
+ | | o: Type | java wrapper(o : Type) | | ||
- | ===== Accessing Java from within | + | ^ AmbientTalk |
+ | | nil | null: Object | | ||
+ | | a number n | n: int | | ||
+ | | a fraction f | f: double | | ||
+ | | a boolean b | b: boolean | | ||
+ | | a text t | t: String | | ||
+ | | a table t | t: T[] | | ||
+ | | an exception exc | exc : Exception | | ||
+ | | a class wrapper( c ) | c : Class | | ||
+ | | a java wrapper(obj : Type) | obj : Type | | ||
+ | | any object o | AT wrapper (o) : I | | ||
+ | Note that non-native Java or AmbientTalk objects are represented in the other language by means of " | ||
+ | |||
+ | In the last conversion rule of the second table, '' | ||
+ | |||
+ | ===== Accessing Java from within AmbientTalk ===== | ||
==== Accessing Java classes ==== | ==== Accessing Java classes ==== | ||
- | The complete set of classes | + | |
+ | Any class that can be loaded from the class path of the JVM running the AmbientTalk interpreter is accessible from within an AmbientTalk | ||
< | < | ||
Line 24: | Line 49: | ||
>>< | >>< | ||
</ | </ | ||
+ | |||
+ | A class is represented as a normal AmbientTalk object. All '' | ||
+ | |||
+ | < | ||
+ | If you want to load your own Java class make sure that the .class file is in the classpath of the JVM running AmbientTalk. By default, the iat script adds the standard $CLASSPATH classpath. | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | Please do not name your own Java packages starting with a capital letter. Otherwise, AmbientTalk will confuse the package with a Java class. | ||
+ | </ | ||
==== Creating Java objects ==== | ==== Creating Java objects ==== | ||
- | Java classes can be instantiated in AmbientTalk similar to how AmbientTalk objects are instantiated, | + | |
- | the Java constructor. | + | Java classes can be instantiated in AmbientTalk similar to how AmbientTalk objects are instantiated, |
+ | the Java constructor. | ||
< | < | ||
Line 34: | Line 70: | ||
</ | </ | ||
- | All constructors defined in the corresponding | + | If the Java class defines multiple constructors, |
< | < | ||
Line 42: | Line 78: | ||
==== Invoking methods on Java objects ==== | ==== Invoking methods on Java objects ==== | ||
- | Java objects | + | |
+ | Java objects | ||
< | < | ||
Line 48: | Line 85: | ||
>>nil | >>nil | ||
>aVector | >aVector | ||
- | >>< | + | >>< |
</ | </ | ||
- | The AmbientTalk/Java symbiosis treats message | + | When an AmbientTalk |
+ | * if a message is sent to a wrapper | ||
+ | * If the message is sent to an **instance** wrapper, only non-static fields or methods of the Java class of the wrapped object are considered. | ||
+ | * If the AmbientTalk selector uniquely identifies a method (i.e. no overloading on the method name is performed in Java), the matching method is invoked. All AmbientTalk arguments are converted to Java objects. This is done by wrapping them into Java objects in the case of custom objects or by converting them to native Java values if possible (e.g. for the different number types and strings). The Java return value is mapped back to an AmbientTalk value. | ||
==== Overloading ==== | ==== Overloading ==== | ||
- | In Java methods can be overloaded based on the number of arguments and the types of the arguments. | ||
- | If the Java method is overloaded based on arity (i.e. each overloaded method takes a different number of arguments), the number of arguments in the AmbientTalk invocation can be used to identify a unique Java method. Hence, overloading based on arity does not require special attention. If the Java method is overloaded based solely on argument types, the interpreter may derive that the actual arguments can only be converted from AmbientTalk to the appropriate Java types for one of the matching overloaded signatures. Again, if only one match remains, the unique match is invoked. In the remaining case in which the actual AmbientTalk arguments satisfy more than one overloaded method signature, the symbiotic invocation fails. It is then the AmbientTalk programmer' | ||
- | Selection | + | In Java methods can be overloaded based on the number |
+ | |||
+ | If the Java method | ||
+ | |||
+ | Selection of the correct overloaded method is done using a special | ||
< | < | ||
Line 66: | Line 108: | ||
>aVector | >aVector | ||
>>< | >>< | ||
+ | </ | ||
+ | |||
+ | In the example above the expression '' | ||
+ | |||
+ | < | ||
> | > | ||
>> | >> | ||
Line 75: | Line 122: | ||
==== Invoking AmbientTalk methods in Java ==== | ==== Invoking AmbientTalk methods in Java ==== | ||
+ | |||
Besides calling Java methods from within AmbientTalk it is also possible to call AmbientTalk methods from within Java. To illustrate this consider the code snippet shown below. | Besides calling Java methods from within AmbientTalk it is also possible to call AmbientTalk methods from within Java. To illustrate this consider the code snippet shown below. | ||
Line 125: | Line 173: | ||
< | < | ||
- | >def test := / | + | >def test := / |
- | >>< | + | > |
- | > | + | |
ping! | ping! | ||
pong! | pong! | ||
>>42 | >>42 | ||
</ | </ | ||
+ | |||
==== Starting an AmbientTalk interpreter from Java ==== | ==== Starting an AmbientTalk interpreter from Java ==== | ||
+ | |||
So far, the examples have illustrated how to reuse Java code from within AmbientTalk. They have shown how to access Java classes, instantiate them and invoke methods on the resulting objects. Moreover, | So far, the examples have illustrated how to reuse Java code from within AmbientTalk. They have shown how to access Java classes, instantiate them and invoke methods on the resulting objects. Moreover, | ||
- | Embedding AmbientTalk in an application, | + | Embedding AmbientTalk in an application, |
+ | |||
+ | Once an instance of an EmbeddableAmbientTalk subclass is created, the AmbientTalk VM can be started by sending it the '' | ||
< | < | ||
- | EmbeddedAmbientTalk | + | EmbeddableAmbientTalk |
vm.initialize( | vm.initialize( | ||
NATParser.parse( | NATParser.parse( | ||
Line 152: | Line 203: | ||
The code excerpt also illustrates that the EmbeddableAmbientTalk class provides methods to create definitions for fields such as '' | The code excerpt also illustrates that the EmbeddableAmbientTalk class provides methods to create definitions for fields such as '' | ||
- | Once the virtual machine is properly initialized, | + | Once the virtual machine is properly initialized, |
< | < | ||
Line 170: | Line 221: | ||
< | < | ||
- | When starting an AmbientTalk virtual machine from a Java application, | + | When starting an AmbientTalk virtual machine from a Java application, |
</ | </ |
at/tutorial/symbiosis.1224687129.txt.gz · Last modified: 2008/10/22 18:31 (external edit)