<div dir="auto">While I appreciate the style, I think it's harder to debug and edit from a human point of view.   I am not compromising to make it easier for the java compiler.   I like to make it easier for humans.   What this style lacks is tag names, which are vital for debugging.  That is, what type do I need to add this method to if the compiler fails.  Since the SAI can support both styles, I suggest we keep yours as an optimization in some serializer somewhere.   Let's discuss.   In otherwords, having distinct variable names gives you a handle to work with debugging.   If the was a programming language which supported both styles, it would be ideal.</div><div class="gmail_extra"><br><div class="gmail_quote">On Jan 19, 2017 9:19 AM, "Don Brutzman" <<a href="mailto:brutzman@nps.edu">brutzman@nps.edu</a>> wrote:<br type="attribution"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">I read a very interesting book on the flight to Korea.  This cleared up several mysteries for me... highly recommended.<br>
<br>
*Functional Programming in Java: Harnessing the Power of Java 8 Lambda Expressions, Venkat Subramaniam, Pragmatic Bookshelf, Dallas Texas, 2014.<br>
  <a href="https://pragprog.com/book/vsjava8/functional-programming-in-java" rel="noreferrer" target="_blank">https://pragprog.com/book/vsja<wbr>va8/functional-programming-in-<wbr>java</a><br>
<br>
John, here is a new style of coding that mostly eliminates the need for declaring each and every object.<br>
<br>
Benefits include more concise, no side effects, no need to keep track of names for object instances, automatically parallelizable by compiler.  Syntax looks a lot like node.js style.<br>
<br>
I picked a scene that shows ProtoDeclare, Script, fields, IS/connect and CDATA source code to get a good workout.  The only object member is "scene", everything else is local.<br>
<br>
New code block in HelloWorldProgram.java:<br>
==============================<wbr>===============<br>
<br>
        /** Test declarative style, prototype fields and scripting */<br>
        private void addMaterialModulatorModulator ()<br>
        {<br>
                ProtoDeclareObject materialModulatorPrototype = new ProtoDeclareObject ("MaterialModulator");<br>
                materialModulatorPrototype<br>
                        .setAppinfo("mimic a Material node and modulate fields as an animation effect")<br>
                        .setDocumentation("<a href="http://x3dgraphics.com/examples/X3dForWebAuthors/Chapter14-Prototypes/MaterialModulatorIndex.html" rel="noreferrer" target="_blank">http://x3dg<wbr>raphics.com/examples/X3dForWeb<wbr>Authors/Chapter14-Prototypes/M<wbr>aterialModulatorIndex.html</a>")<br>
                        .setProtoInterface(<br>
                                new ProtoInterfaceObject()<br>
                                        .addField(new fieldObject ()<br>
                                                .setName("enabled")<br>
                                                .setType(fieldObject.TYPE_SFBO<wbr>OL)<br>
                                                .setAccessType( fieldObject.ACCESSTYPE_INPUTOU<wbr>TPUT)<br>
                                                .setValue(SFBoolObject.TRUE))<br>
                                        .addField(new fieldObject (<br>
                                                "diffuseColor", fieldObject.TYPE_SFCOLOR,field<wbr>Object.ACCESSTYPE_INPUTOUTPUT,<br>
                                                        (SFColorObject.toString(SFColo<wbr>rObject.DEFAULT_VALUE))))<br>
                                        .addField(new fieldObject (<br>
                                                "emissiveColor",fieldObject.TY<wbr>PE_SFCOLOR,fieldObject.ACCESST<wbr>YPE_INPUTOUTPUT,<br>
                                                        Integer.toString(0x000080)))<br>
//                                                      SFColorObject.toString(0x00008<wbr>0))) // TODO fix<br>
                                                        // TODO major side effect follows that affects all MaterialObject specularColor values, why?<br>
                                                        // design change needed to make things work?  how to prevent user from provoking it?<br>
//                                                      (new SFColorObject(0.05f, 0.05f, 0.85f)).toString()))<br>
                                        .addField(new fieldObject (<br>
                                                "specularColor",fieldObject.TY<wbr>PE_SFCOLOR,fieldObject.ACCESST<wbr>YPE_INPUTOUTPUT,<br>
                                                        (SFColorObject.toString(SFColo<wbr>rObject.BLACK))))<br>
                                        .addField(new fieldObject (<br>
                                                "transparency", fieldObject.TYPE_SFFLOAT,field<wbr>Object.ACCESSTYPE_INPUTOUTPUT,<br>
                                                        "0.0"))<br>
                                        .addField(new fieldObject (<br>
                                                "shininess",    fieldObject.TYPE_SFFLOAT,field<wbr>Object.ACCESSTYPE_INPUTOUTPUT,<br>
                                                        Float.toString(0.0f)))<br>
                                        .addField(new fieldObject (<br>
                                                "ambientIntensity",fieldObject<wbr>.TYPE_SFFLOAT,fieldObject.<wbr>ACCESSTYPE_INPUTOUTPUT,<br>
                                                        SFFloatObject.toString(0.0f)))<br>
//                                              .setChildren((MaterialObject newMaterial = new MaterialObject ("MaterialNode"))))<br>
                                                // TODO fix syntax or add utility methods<br>
                );<br>
                ProtoBodyObject materialModulatorProtoBody = new ProtoBodyObject();<br>
                materialModulatorPrototype.set<wbr>ProtoBody(materialModulatorPro<wbr>toBody);<br>
                materialModulatorProtoBody.add<wbr>Children(<br>
                        new MaterialObject("MaterialNode")<br>
                                .setIS(new ISObject()<br>
                                        .addConnect(new connectObject().setNodeField("<wbr>diffuseColor"    ).setProtoField("diffuseColor"<wbr>))<br>
                                        .addConnect(new connectObject().setNodeField("<wbr>emissiveColor"   ).setProtoField("emissiveColo<wbr>r"))<br>
                                        .addConnect(new connectObject().setNodeField("<wbr>specularColor"   ).setProtoField("specularColo<wbr>r"))<br>
                                        .addConnect(new connectObject().setNodeField("<wbr>transparency"    ).setProtoField("transparency"<wbr>))<br>
                                        .addConnect(new connectObject().setNodeField("<wbr>shininess"       ).setProtoField("shininess"))<br>
                                        .addConnect(new connectObject().setNodeField("<wbr>ambientIntensity").setProtoFie<wbr>ld("ambientIntensity"))<br>
                        ));<br>
                materialModulatorProtoBody.add<wbr>Children(<br>
                        new CommentsBlock ("Only first node (the node type) is renderable, others are along for the ride"));<br>
                materialModulatorProtoBody.add<wbr>Children(<br>
                        new ScriptObject ("MaterialModulatorScript")<br>
                                .addField(new fieldObject().setName("enabled<wbr>").setType(fieldObject.TYPE_<wbr>SFBOOL)<br>
                                        .setAccessType(fieldObject.ACC<wbr>ESSTYPE_INPUTOUTPUT))<br>
                                .addField(new fieldObject().setName("diffuse<wbr>Color").setType(fieldObject.<wbr>TYPE_SFCOLOR)<br>
                                        .setAccessType(fieldObject.ACC<wbr>ESSTYPE_INPUTOUTPUT))<br>
                                .addField(new fieldObject().setName("newColo<wbr>r").setType(fieldObject.TYPE_<wbr>SFCOLOR)<br>
                                        .setAccessType(fieldObject.ACC<wbr>ESSTYPE_OUTPUTONLY))<br>
                                .addField(new fieldObject().setName("clockTr<wbr>igger").setType(fieldObject.<wbr>TYPE_SFTIME)<br>
                                        .setAccessType(fieldObject.ACC<wbr>ESSTYPE_INPUTONLY))<br>
                                .setIS(new ISObject()<br>
                                        .addConnect(new connectObject().setNodeField("<wbr>enabled"     ).setProtoField("enabled"))<br>
                                        .addConnect(new connectObject().setNodeField("<wbr>diffuseColor").setProtoField("<wbr>diffuseColor")))<br>
                                .setSourceCode(new String("ecmascript:\n" +<br>
"function initialize ()\n" +<br>
"{\n" +<br>
"    newColor = diffuseColor; // start with correct color\n" +<br>
"}\n" +<br>
"function set_enabled (newValue)\n" +<br>
"{\n" +<br>
"       enabled = newValue;\n" +<br>
"}\n" +<br>
"function clockTrigger (timeValue)\n" +<br>
"{\n" +<br>
"    if (!enabled) return;\n" +<br>
"    red   = newColor.r;\n" +<br>
"    green = newColor.g;\n" +<br>
"    blue  = newColor.b;\n" +<br>
"    \n" +<br>
"    // note different modulation rates for each color component, % is modulus operator\n" +<br>
"    newColor = new SFColor ((red + 0.02) % 1, (green + 0.03) % 1, (blue + 0.04) % 1);\n" +<br>
"       if (enabled)\n" +<br>
"       {\n" +<br>
"               Browser.print ('diffuseColor=(' + red +',' + green + ',' + blue + ') newColor=' + newColor.toString() + '\\n');\n" +<br>
"       }\n" +<br>
"}")));<br>
                scene.addChildren(materialModu<wbr>latorPrototype);<br>
        }<br>
<br>
==============================<wbr>===============<br>
<br>
Pretty darn cool.  Some more work to follow on my part to tighten up need to repeat addChildren calls for every individual child and source text, but this is a big step.<br>
<br>
When ready I recommend you shift to declarative style to avoid need to generate individual objects with unique suffixes.<br>
<br>
all the best, Don<br>
-- <br>
Don Brutzman  Naval Postgraduate School, Code USW/Br       <a href="mailto:brutzman@nps.edu" target="_blank">brutzman@nps.edu</a><br>
Watkins 270,  MOVES Institute, Monterey CA 93943-5000 USA   <a href="tel:%2B1.831.656.2149" value="+18316562149" target="_blank">+1.831.656.2149</a><br>
X3D graphics, virtual worlds, navy robotics <a href="http://faculty.nps.edu/brutzman" rel="noreferrer" target="_blank">http://faculty.nps.edu/brutzma<wbr>n</a><br>
</blockquote></div></div>