Hi Alex,

This looks very interesting. However, I have some problems building ersatz on my Intel Mac:

..:picoLisp jkleiser$ (cd ersatz; ./mkJar)
PicoLisp.java:15: cannot find symbol
symbol  : class Console
location: class PicoLisp
   final static Console Term = System.console();
                ^
PicoLisp.java:15: cannot find symbol
symbol  : method console()
location: class java.lang.System
   final static Console Term = System.console();
                                     ^
2 errors

/Jon

On 11/4/10 7:53 PM, Alexander Burger wrote:
Hi all,

here is an update.

Besides the basic I/O system and half-baked network functions (until now
only 'connect', 'accept' and a partial 'port'), we have now a set of
functions interfacing to the Java Reflection API.

I'd like to describe them shortly, and hear your opinions. You can try
it if you like if you download the current testing release.


The central function is called 'java'. It comes in three forms:

(java 'cls 'T 'any ..) -> obj
   This is a constructor call, returning a Java object. 'cls' is the
   name of a Java class, like "java.lang.StringBuilder".

(java 'cls 'msg 'any ..) -> obj
   This calls a static method 'msg' for a class 'cls'.

(java 'obj 'msg 'any ..) -> obj
   This calls a dynamic method 'msg' for an object 'obj'

Example:

   : (setq Sb (java "java.lang.StringBuilder" T "abc"))
   -> $StringBuilder
   : (java Sb "append" (char: 44))
   -> $StringBuilder
   : (java Sb "append" 123)
   -> $StringBuilder
   : (java Sb "toString")
   -> $String
   : (data @)
   -> "abc,123"

The function 'data' in the last line converts back from Java objects to
PicoLisp data.


Then we have 'public', it supports two forms:

   (public 'obj 'any) -> obj
      Returns the value of a public field 'any' in object 'obj'

   (public 'cls 'any) -> obj
      Returns the value of a public field 'any' in class 'cls'

Example:

   : (public "java.lang.System" "err")
   -> $PrintStream
   : (java @ "println" "Hello world")
   Hello world
   -> NIL


Finally, we have a set of type conversion functions, to produce Java
objects from Lisp data:

   (byte: 'num|sym) -> obj
   (char: 'num|sym) -> obj
   (int: 'num) -> obj
   (long: 'num) -> obj
   (big: 'num) -> obj

We saw the usage of 'char:' in the StringBuilder example above.


So the 'any' arguments to the 'java' function can either be
   - 'T' or 'NIL', then the type is boolean
   - A number, then it must fit in 32 bits and will be passed as 'int'
   - A normal symbol, then it will be passed as 'String'
   - A Java object, as returned by 'java' or one of the 'xxx:'
     conversion functions.
   - A list, then all elements must be of the same type and will be
     passed as 'Array'

I hope this reflection interface is a good compromise between simplicity
and usefulness.

Cheers,
- Alex

--
UNSUBSCRIBE: mailto:picol...@software-lab.de?subject=unsubscribe

Reply via email to