Hi Alex! Thanks for holding PilCon yesterday (and the reminder). I enjoyed it! I like Pil21 very much (it reminds me of using FORTH assemblers back in the day), but I still have a use case where only Java execution is suitable.
The PilCon discussion motivated me to take a look at the Ersatz Java 11 compilation issue. I am happy to report there was a simple fix, and after rebuilding it without warnings, it passed all of the tests relevant to Ersatz. I modified the standard test files with *(unless (member *CPU '("JVM"))* etc. Details follow. Thank you for all of your wonderful work that you have shared with us, I appreciate it! Regards, rcs +----------------------------------------------------------+ | *Ersatz Fix for Warning-Free Compilation Under Java 11+* | | * 22-Aug-2020, rcs * | +----------------------------------------------------------+ *PROBLEM-------* An attempt to rebuild Ersatz using mkJar.l under Java 11 or higher results in the warnings: Note: PicoLisp.java uses or overrides a deprecated API. Note: Recompile with -Xlint:deprecation for details. *DIAGNOSIS---------* Modify the second when clause of mkJar.l to reveal the deprecated features by adding the "-deprecation" flag (a synonym for -Xlint:deprecation): (when (call "javac" "-g:none" "-deprecation" "PicoLisp.java") ^^^^^^^^^^^^^^ On a system with Java 11 installed on it (package openjdk-11-jdk and its dependencies under Debian Linux), execute mkJal.l (e.g. ./pil mkJar.l under Linux). When executed, 9 warnings are displayed in the form: PicoLisp.java:3074: warning: [deprecation] Integer(int) in Integer has been deprecated arg[i] = new Integer(num.Cnt); Forgiving the editorial commentary, the Stack Overflow posting "The constructors Integer(int), Double(double), Long(long) and so on are deprecated" is enlightening ( https://stackoverflow.com/questions/47095474/the-constructors-integerint-doubledouble-longlong-and-so-on-are-deprecat#47095501). In short, it recommends replacing the form: new <WrapperType>(<primitiveType>) with <WrapperType>.valueOf(<primitiveType>) *CURE----* Make the changes in fun.src as follows (this example uses version 19.10.21): 153c153 < arg[i] = new Integer(num.Cnt); --- > arg[i] = Integer.valueOf(num.Cnt); 277c277 < return new Symbol(new Byte(x instanceof Number? (byte)((Number)x).Cnt : (byte)x.name().charAt(0))); --- > return new Symbol(Byte.valueOf(x instanceof Number? (byte)((Number)x).Cnt : (byte)x.name().charAt(0))); 282c282 < return new Symbol(new Character(x instanceof Number? (char)((Number)x).Cnt : x.name().charAt(0))); --- > return new Symbol(Character.valueOf(x instanceof Number? (char)((Number)x).Cnt : x.name().charAt(0))); 286c286 < return new Symbol(new Integer(evInt(ex.Cdr))); --- > return new Symbol(Integer.valueOf(evInt(ex.Cdr))); 290c290 < return new Symbol(new Long(evLong(ex.Cdr))); --- > return new Symbol(Long.valueOf(evLong(ex.Cdr))); 296,297c296,297 < return new Symbol(new Float(((Number)x).toString(evInt(ex.Cdr), '.', '\0'))); < return new Symbol(new Float(x.name())); --- > return new Symbol(Float.valueOf(((Number)x).toString(evInt(ex.Cdr), '.', '\0'))); > return new Symbol(Float.valueOf(x.name())); 303,304c303,304 < return new Symbol(new Double(((Number)x).toString(evInt(ex.Cdr), '.', '\0'))); < return new Symbol(new Double(x.name())); --- > return new Symbol(Double.valueOf(((Number)x).toString(evInt(ex.Cdr), '.', '\0'))); > return new Symbol(Double.valueOf(x.name())); Execution of the tests in the ~/picoLisp/test directory relevant to Ersatz confirms it is functional after these changes. -- *Níl aon tinteán mar do thinteán féin. *[Irish Gaelic] (There is no fireside like your own fireside.)