[OpenSCAD] Openscad Indirect Functions

nop head nop.head at gmail.com
Mon Oct 10 05:44:13 EDT 2016


So @xsq becomes both a name mangled function and a variable holding its
name? That seems like a bit of a kludge to me.

Defining functions normally and passing them with @name would allow the
compiler to check it was a valid function name without having to have
specially decorated functions. They could be passed as string equal to
their name and then calling @func() could work with any string that equals
a function name. Seems less kludgey to me. You only have one type of
function rather than ones that have to be called normally and ones that
need to be called with @.

On 10 October 2016 at 10:19, otto <otto at 123phase.com> wrote:

> On Mon, 10 Oct 2016 10:06:50 +0100
> nop head <nop.head at gmail.com> wrote:
>
> The goal was to get what I wanted easily.  The changes are small and
> the code seems quite stable.
>
> In declaring a function with the @ decoration.
>
> As in function @xsq(x) = x*x
> xsq is an ID token and the variable xsq is given a unique function name
> as its contents.  The name is a digit followed by a period.  You can
> see it by echoing xsq.
>
> You can then pass xsq around and then dereference it with @.  Because we
> use openscads well designed and consistent parsing/compiling environment
> to do all the work, this is fast.  As designed I hadn't really
> anticipated the side effect that any function can be passed as its token
> name, and dereferenced later.  The great thing about this is that the
> compiler resolves functions by there string name and all I needed to do
> was detect the decorator in the parser and then do one level of
> indirection.  The nice thing is it is safe, it doesn't break other code
> and it requires only small changes to the source code and it works
> now.  Please test the code in the repository if you are inclined or
> have the time.
>
>
> Regards
> Otto
>
>
> > You don't seem to use the @ sign in the places I would expect. I
> > don't see a need for them in the function definition as any function
> > should be passable as an argument. I would expect them to be needed
> > where a function is called from a string, so:
> >
> > function xsq(x) = x*x;
> > function recip(x)=1/x;
> > vec1=[1,2,3];
> > vec2=[.1,.7];
> >
> > function map(func,vec) = [for (i=vec) @func(i)];
> > echo(map("xsq",vec1));
> > echo(map"("xsq",vec2));
> > echo(map("recip",vec1));
> > echo(map("recip",vec2));
> >
> > The @ sign could also be used to make a function literal instead of
> > passing string but that is a bigger change to the language. Simply
> > adding @ to take a string and look up function seems like a simple
> > mod. Creating a new variable type that is a function would have much
> > bigger implications because it could be used in any expression.
> > Keeping the name as a string allows all sorts of tricks by
> > concatenating suffixes, etc.
> >
> >
> >
> > On 10 October 2016 at 09:53, otto <otto at 123phase.com> wrote:
> >
> > > I have hacked the openscad source code to support function
> > > indirection.
> > >
> > > Here is a sample of how it works.  Function is decorated with the
> > > "@" character when it is created and when it is used, but not when
> > > it is passed to another function.
> > >
> > > //Preferred usage//
> > > function @xsq(x) = x*x;
> > > function @recip(x)=1/x;
> > > vec1=[1,2,3];
> > > vec2=[.1,.7];
> > >
> > > function map(func,vec) = [for (i=vec) @func(i)];
> > > echo(map(xsq,vec1));
> > > echo(map(xsq,vec2));
> > > echo(map(recip,vec1));
> > > echo(map(recip,vec2));
> > >
> > > //Other crazy usage//
> > > function div3(x)=x/3;
> > > indirect = "div3";
> > > echo(map(indirect,vec2));
> > >
> > > Output is:
> > >
> > > ECHO: [1, 4, 9]
> > > ECHO: [0.01, 0.49]
> > > ECHO: [1, 0.5, 0.333333]
> > > ECHO: [10, 1.42857]
> > > ECHO: [0.0333333, 0.233333]
> > >
> > >
> > > Everything is contained in the github repositor:
> > > https://github.com/ottojas/openscad-affine
> > >
> > > There is a pdf file there with some sample 3D and 2D output.  In
> > > order to get this capability you need to add about 30 lines of code
> > > in changes to five files in the source directory.  These are
> > > relatively stable files and you may get away with simply copying
> > > them from the ojasSources directory.
> > >
> > > This is very much a work in progress.  Comments, questions, flames,
> > > laughter, mockery etc. all welcome.  If anyone tests this please
> > > let me know what your experience is.  Everything is gnu public
> > > license as is the source code for openscad.
> > >
> > > Regards
> > > Otto
> > >
> > >
> > >
> > >
> > >
> > > _______________________________________________
> > > OpenSCAD mailing list
> > > Discuss at lists.openscad.org
> > > http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org
> > >
>
>
> _______________________________________________
> OpenSCAD mailing list
> Discuss at lists.openscad.org
> http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.openscad.org/pipermail/discuss_lists.openscad.org/attachments/20161010/d2637aad/attachment-0002.html>


More information about the Discuss mailing list