I haven’t done a lot with RapCAD recently, and its time for my monthly post. What I thought I would write about is my reaction to posts on the OpenSCAD mailing list regarding turning it into a Python language library. First and foremost I think the idea is a great way to provide extensibility.
As Tony Buser says:
Access to such features would be potentially very powerful to do unforeseen things… then there’s string processing – that could be very handy with parametric scripts (look at what I had to do to handle strings in my bitmap text module) Filesystem access would be really nice for loading external data. Interesting things could be done in terms of dynamic objects if the script could call webservices…
For the power user these sorts of things are great. However I wonder if the desire to have Python support is driven by the lack of some features in OpenSCAD, such as:
- True variables.
- Functions with bodies.
- Working scope blocks.
- Statements allowed inside For and If
- Determine how many elements are in an array or characters in a string.
- Get the nth character of a string, and get it’s ASCII code.
- Vector operations.
(Credit to Leemon Baird who suggested some of these)
My reaction is that we can have both a domain specific language, which is nice for the end user, and a set of language bindings to allow the power user to do advanced things, with their general purpose language of choice. I am currently trying to work out how this could be done in RapCAD, and making the RapCAD scripting language itself just one of the bindings.
With respect to the RapCAD scripting language itself, I also want to add support for the features as described above. RapCAD is not just a GUI thing. I have actually been writing an improved grammar, which I turned into a bison parser. I have also applied some Design Patterns such as Builder and Visitor to my code which may allow easier integration with external languages. Finally as mentioned before I have implemented True Variables, Functions with bodies, and some support for Vector operations.
On the face of it RapCAD just looks like a GUI front end to OpenSCAD, but that’s not actually what it is please feel free to look at the code and post any comments.
You’re right that there is a lack of power user features in OpenSCAD. I don’t think that’s a problem at all, though.
When I first started following the OpenSCAD list a couple months ago, somebody asked for some extra features, and someone (you or Marius, I think) said something along the lines of “Well, we’re trying to just be a declarative geometry language, and to do that well.”
I thought that was a great answer; it shaped what I’ve done since. People who just want to make a box and have never written code can do it in one line, without any other complications. And for the rest of us who want more capabilities, making bindings seems great.
Thanks for the grammar, too, BTW. It should make writing an inter-language translator much much easier.
Thanks, I could create a RapCAD/OpenSCAD to SolidPython conversion program quite easily if you could provide the grammar. Assuming you have finalised the grammar design.