http://code.google.com/r/srborlongan-picolisp/source/detail?r=cf63aa6f28cfead28c5a02ee3de4c322b5a3c9d7
I've changed the InvocationHandler in interface to return the correct Java
object when used with interface with returning values.
Example Java classes:
@FunctionalInterface
public interface Field<FIELD extends Enum<?>, VALUE> {
public VALUE field(FIELD field);
}
@FunctionalInterface
public interface User extends Field<User.Fields, String> {
public enum Fields {
firstName,
lastName
}
public default String firstName() {
return field(Fields.firstName);
}
public default String lastName() {
return field(Fields.lastName);
}
}
Example Ersatz PicoLisp code:
(javaImport User)
(de user (@FirstName @LastName)
(User.new # (interface "User" "field"
(curry (@FirstName @LastName) (Field)
(cond
((= Field User.Fields.firstName) @FirstName)
((= Field User.Fields.lastName) @LastName) ) ) ) )
# Before
(.field> (user "Albert" "Wily") User.Fields.firstName)
# => $PicoLisp$Symbol (might not be useful for Java interoperability)
# After
(.field> (user "Albert" "Wily") User.Fields.firstName)
# => $String (might be useful for Java interoperability)
(.field>
(user
(.field> (user "Albert" "Wily") User.Fields.firstName)
"Einstein")
User.Fields.firstName)
# => $String (still useful)
As always, the srborlongan-picolisp repository is always in sync with
mainline.
Have fun!
P.S. Next plan is to refactor the heck out of my old Java code into Java 8
code, which would then make it easy to translate them to Ersatz PicoLisp,
which may eventually result in Plan Super-Omega Plus: rewrite Ersatz
PicoLisp in Java 8, then rewrite resulting Java 8 code into (Java-6
compatible) Ersatz PicoLisp; Ersatz in Ersatz, for radical
(slow-as-fossilized-carbonite-mollases) self-hosting capabilities.
P.P.S. I have no idea how to call Java 8 default methods from objects
created using Ersatz PicoLisp's interface method. Any suggestions?
Samuel Dennis R. Borlongan