discuss@lists.openscad.org

OpenSCAD general discussion Mailing-list

View all threads

Syntax suggestion

T
Troberg
Tue, Feb 26, 2019 1:29 PM

It would be nice if we could take modules as arguments to other modules, a
little bit like children(). Something like this:

module stamp(handleshape,stampshape,faceshape){
union(){
handleshape();
difference(){
stampshape();
faceshape();
}
}
}

module myhandleshape(length){
//Define handle here
}

module mylefthandedhandleshape(length){
//Define handle here
}

module mystampshape(){
//Define the shape of the rubber stamp outline here
}

module myfaceshape(){
//Define the shape of the stamp cutouts here
}

module mylogofaceshape(){
//Define the shape of the stamp cutouts here
}

stamp(myhandleshape(100),mystampshape,myfaceshape);
stamp(mylefthandledhandleshape(100),mystampshape,mylogofaceshape);

This is just a simple example, and I know this example could have been done
differently, in just a little more awkward ways. But, as things get more
complicated, it can really make the code much neater and more modular and
flexible.

--
Sent from: http://forum.openscad.org/

It would be nice if we could take modules as arguments to other modules, a little bit like children(). Something like this: module stamp(handleshape,stampshape,faceshape){ union(){ handleshape(); difference(){ stampshape(); faceshape(); } } } module myhandleshape(length){ //Define handle here } module mylefthandedhandleshape(length){ //Define handle here } module mystampshape(){ //Define the shape of the rubber stamp outline here } module myfaceshape(){ //Define the shape of the stamp cutouts here } module mylogofaceshape(){ //Define the shape of the stamp cutouts here } stamp(myhandleshape(100),mystampshape,myfaceshape); stamp(mylefthandledhandleshape(100),mystampshape,mylogofaceshape); This is just a simple example, and I know this example could have been done differently, in just a little more awkward ways. But, as things get more complicated, it can really make the code much neater and more modular and flexible. -- Sent from: http://forum.openscad.org/
NH
nop head
Tue, Feb 26, 2019 2:09 PM

The problem is there may also be a function called handleshape() and
because functions and variables have separate namespaces  handleshape()
means call that function, not interpret a variable with the same name as a
function reference,

On Tue, 26 Feb 2019 at 13:34, Troberg troberg.anders@gmail.com wrote:

It would be nice if we could take modules as arguments to other modules, a
little bit like children(). Something like this:

module stamp(handleshape,stampshape,faceshape){
union(){
handleshape();
difference(){
stampshape();
faceshape();
}
}
}

module myhandleshape(length){
//Define handle here
}

module mylefthandedhandleshape(length){
//Define handle here
}

module mystampshape(){
//Define the shape of the rubber stamp outline here
}

module myfaceshape(){
//Define the shape of the stamp cutouts here
}

module mylogofaceshape(){
//Define the shape of the stamp cutouts here
}

stamp(myhandleshape(100),mystampshape,myfaceshape);
stamp(mylefthandledhandleshape(100),mystampshape,mylogofaceshape);

This is just a simple example, and I know this example could have been done
differently, in just a little more awkward ways. But, as things get more
complicated, it can really make the code much neater and more modular and
flexible.

--
Sent from: http://forum.openscad.org/


OpenSCAD mailing list
Discuss@lists.openscad.org
http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org

The problem is there may also be a function called handleshape() and because functions and variables have separate namespaces handleshape() means call that function, not interpret a variable with the same name as a function reference, On Tue, 26 Feb 2019 at 13:34, Troberg <troberg.anders@gmail.com> wrote: > It would be nice if we could take modules as arguments to other modules, a > little bit like children(). Something like this: > > module stamp(handleshape,stampshape,faceshape){ > union(){ > handleshape(); > difference(){ > stampshape(); > faceshape(); > } > } > } > > module myhandleshape(length){ > //Define handle here > } > > module mylefthandedhandleshape(length){ > //Define handle here > } > > module mystampshape(){ > //Define the shape of the rubber stamp outline here > } > > module myfaceshape(){ > //Define the shape of the stamp cutouts here > } > > module mylogofaceshape(){ > //Define the shape of the stamp cutouts here > } > > stamp(myhandleshape(100),mystampshape,myfaceshape); > stamp(mylefthandledhandleshape(100),mystampshape,mylogofaceshape); > > This is just a simple example, and I know this example could have been done > differently, in just a little more awkward ways. But, as things get more > complicated, it can really make the code much neater and more modular and > flexible. > > > > -- > Sent from: http://forum.openscad.org/ > > _______________________________________________ > OpenSCAD mailing list > Discuss@lists.openscad.org > http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org >
T
Troberg
Tue, Feb 26, 2019 2:23 PM

nophead wrote

The problem is there may also be a function called handleshape() and
because functions and variables have separate namespaces  handleshape()
means call that function, not interpret a variable with the same name as a
function reference,

Well, that goes for children() as well.

But, that could probably be cleared with some variation of the syntax. It's
just an example. The point is to be able to send objects in as arguments.

--
Sent from: http://forum.openscad.org/

nophead wrote > The problem is there may also be a function called handleshape() and > because functions and variables have separate namespaces handleshape() > means call that function, not interpret a variable with the same name as a > function reference, Well, that goes for children() as well. But, that could probably be cleared with some variation of the syntax. It's just an example. The point is to be able to send objects in as arguments. -- Sent from: http://forum.openscad.org/
NH
nop head
Tue, Feb 26, 2019 4:40 PM

Not sure what you mean because children() only takes modules and they have
their own namespace as well.

It's unusual to have different name spaces but it like it as I don't have
to think up three names. I have screw() as a module and often screw as a
variable and possibly a function.

People have suggested being able to pass functions before, even some pull
requests IIRC but they haven't been merged. It gets more complex when you
consider scope. Possible it needs a new variable type to hold a function
reference. A new syntax to assign a function to that variable and a new
syntax to call it.

On Tue, 26 Feb 2019 at 14:29, Troberg troberg.anders@gmail.com wrote:

nophead wrote

The problem is there may also be a function called handleshape() and
because functions and variables have separate namespaces  handleshape()
means call that function, not interpret a variable with the same name as

a

function reference,

Well, that goes for children() as well.

But, that could probably be cleared with some variation of the syntax. It's
just an example. The point is to be able to send objects in as arguments.

--
Sent from: http://forum.openscad.org/


OpenSCAD mailing list
Discuss@lists.openscad.org
http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org

Not sure what you mean because children() only takes modules and they have their own namespace as well. It's unusual to have different name spaces but it like it as I don't have to think up three names. I have screw() as a module and often screw as a variable and possibly a function. People have suggested being able to pass functions before, even some pull requests IIRC but they haven't been merged. It gets more complex when you consider scope. Possible it needs a new variable type to hold a function reference. A new syntax to assign a function to that variable and a new syntax to call it. On Tue, 26 Feb 2019 at 14:29, Troberg <troberg.anders@gmail.com> wrote: > nophead wrote > > The problem is there may also be a function called handleshape() and > > because functions and variables have separate namespaces handleshape() > > means call that function, not interpret a variable with the same name as > a > > function reference, > > Well, that goes for children() as well. > > But, that could probably be cleared with some variation of the syntax. It's > just an example. The point is to be able to send objects in as arguments. > > > > -- > Sent from: http://forum.openscad.org/ > > _______________________________________________ > OpenSCAD mailing list > Discuss@lists.openscad.org > http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org >
JB
Jordan Brown
Tue, Feb 26, 2019 4:54 PM

On 2/26/2019 5:29 AM, Troberg wrote:

It would be nice if we could take modules as arguments to other modules, a
little bit like children(). Something like this:

module stamp(handleshape,stampshape,faceshape){
union(){
handleshape();
difference(){
stampshape();
faceshape();
}
}
}

module myhandleshape(length){
//Define handle here
}

module mylefthandedhandleshape(length){
//Define handle here
}

module mystampshape(){
//Define the shape of the rubber stamp outline here
}

module myfaceshape(){
//Define the shape of the stamp cutouts here
}

module mylogofaceshape(){
//Define the shape of the stamp cutouts here
}

stamp(myhandleshape(100),mystampshape,myfaceshape);
stamp(mylefthandledhandleshape(100),mystampshape,mylogofaceshape);

If I understand what you're asking for, you can do this with children( )
today.

module stamp(){
// Children:
handle = 0;
stamp = 1;
face = 2;

union(){
	children(handle);
	difference(){
		children(stamp);
		children(face);
	}
}

}

module myhandleshape(length){
//Define handle here
}

module mylefthandedhandleshape(length){
//Define handle here
}

module mystampshape(){
//Define the shape of the rubber stamp outline here
}

module myfaceshape(){
//Define the shape of the stamp cutouts here
}

module mylogofaceshape(){
//Define the shape of the stamp cutouts here
}

stamp() {
myhandleshape(100);
mystampshape();
myfaceshape();
}
 stamp() {
mylefthandledhandleshape(100);
mystampshape();
mylogofaceshape();
}

One thing you can't do is pass arguments from the parent to the
children, because what you're passing to the parent are objects, not
function references.

On 2/26/2019 5:29 AM, Troberg wrote: > It would be nice if we could take modules as arguments to other modules, a > little bit like children(). Something like this: > > module stamp(handleshape,stampshape,faceshape){ > union(){ > handleshape(); > difference(){ > stampshape(); > faceshape(); > } > } > } > > module myhandleshape(length){ > //Define handle here > } > > module mylefthandedhandleshape(length){ > //Define handle here > } > > module mystampshape(){ > //Define the shape of the rubber stamp outline here > } > > module myfaceshape(){ > //Define the shape of the stamp cutouts here > } > > module mylogofaceshape(){ > //Define the shape of the stamp cutouts here > } > > stamp(myhandleshape(100),mystampshape,myfaceshape); > stamp(mylefthandledhandleshape(100),mystampshape,mylogofaceshape); > If I understand what you're asking for, you can do this with children( ) today. module stamp(){ // Children: handle = 0; stamp = 1; face = 2; union(){ children(handle); difference(){ children(stamp); children(face); } } } module myhandleshape(length){ //Define handle here } module mylefthandedhandleshape(length){ //Define handle here } module mystampshape(){ //Define the shape of the rubber stamp outline here } module myfaceshape(){ //Define the shape of the stamp cutouts here } module mylogofaceshape(){ //Define the shape of the stamp cutouts here } stamp() { myhandleshape(100); mystampshape(); myfaceshape(); }  stamp() { mylefthandledhandleshape(100); mystampshape(); mylogofaceshape(); } One thing you can't do is pass arguments from the parent to the children, because what you're passing to the parent are objects, not function references.
NH
nop head
Tue, Feb 26, 2019 7:56 PM

You can pass arguments to children with $variables.

module stamp($handle_size){
// Children:
handle = 0;
stamp = 1;
face = 2;

union(){
	children(handle);
	difference(){
		children(stamp);
		children(face);
	}
}

}

stamp(100) {
mylefthandledhandleshape($handle_size);
mystampshape();
mylogofaceshape();
}

On Tue, 26 Feb 2019 at 19:49, Jordan Brown openscad@jordan.maileater.net
wrote:

On 2/26/2019 5:29 AM, Troberg wrote:

It would be nice if we could take modules as arguments to other modules, a
little bit like children(). Something like this:

module stamp(handleshape,stampshape,faceshape){
union(){
handleshape();
difference(){
stampshape();
faceshape();
}
}
}

module myhandleshape(length){
//Define handle here
}

module mylefthandedhandleshape(length){
//Define handle here
}

module mystampshape(){
//Define the shape of the rubber stamp outline here
}

module myfaceshape(){
//Define the shape of the stamp cutouts here
}

module mylogofaceshape(){
//Define the shape of the stamp cutouts here
}

stamp(myhandleshape(100),mystampshape,myfaceshape);
stamp(mylefthandledhandleshape(100),mystampshape,mylogofaceshape);

If I understand what you're asking for, you can do this with children( )
today.

module stamp(){
// Children:
handle = 0;
stamp = 1;
face = 2;

union(){
	children(handle);
	difference(){
		children(stamp);
		children(face);
	}
}

}

module myhandleshape(length){
//Define handle here
}

module mylefthandedhandleshape(length){
//Define handle here
}

module mystampshape(){
//Define the shape of the rubber stamp outline here
}

module myfaceshape(){
//Define the shape of the stamp cutouts here
}

module mylogofaceshape(){
//Define the shape of the stamp cutouts here
}

stamp() {
myhandleshape(100);
mystampshape();
myfaceshape();
}
stamp() {
mylefthandledhandleshape(100);
mystampshape();
mylogofaceshape();
}

One thing you can't do is pass arguments from the parent to the children,
because what you're passing to the parent are objects, not function
references.


OpenSCAD mailing list
Discuss@lists.openscad.org
http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org

You can pass arguments to children with $variables. module stamp($handle_size){ // Children: handle = 0; stamp = 1; face = 2; union(){ children(handle); difference(){ children(stamp); children(face); } } } stamp(100) { mylefthandledhandleshape($handle_size); mystampshape(); mylogofaceshape(); } On Tue, 26 Feb 2019 at 19:49, Jordan Brown <openscad@jordan.maileater.net> wrote: > On 2/26/2019 5:29 AM, Troberg wrote: > > It would be nice if we could take modules as arguments to other modules, a > little bit like children(). Something like this: > > module stamp(handleshape,stampshape,faceshape){ > union(){ > handleshape(); > difference(){ > stampshape(); > faceshape(); > } > } > } > > module myhandleshape(length){ > //Define handle here > } > > module mylefthandedhandleshape(length){ > //Define handle here > } > > module mystampshape(){ > //Define the shape of the rubber stamp outline here > } > > module myfaceshape(){ > //Define the shape of the stamp cutouts here > } > > module mylogofaceshape(){ > //Define the shape of the stamp cutouts here > } > > stamp(myhandleshape(100),mystampshape,myfaceshape); > stamp(mylefthandledhandleshape(100),mystampshape,mylogofaceshape); > > > > If I understand what you're asking for, you can do this with children( ) > today. > > module stamp(){ > // Children: > handle = 0; > stamp = 1; > face = 2; > > union(){ > children(handle); > difference(){ > children(stamp); > children(face); > } > } > } > > module myhandleshape(length){ > //Define handle here > } > > module mylefthandedhandleshape(length){ > //Define handle here > } > > module mystampshape(){ > //Define the shape of the rubber stamp outline here > } > > module myfaceshape(){ > //Define the shape of the stamp cutouts here > } > > module mylogofaceshape(){ > //Define the shape of the stamp cutouts here > } > > stamp() { > myhandleshape(100); > mystampshape(); > myfaceshape(); > } > stamp() { > mylefthandledhandleshape(100); > mystampshape(); > mylogofaceshape(); > } > > One thing you can't do is pass arguments from the parent to the children, > because what you're passing to the parent are objects, not function > references. > _______________________________________________ > OpenSCAD mailing list > Discuss@lists.openscad.org > http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org >
JB
Jordan Brown
Tue, Feb 26, 2019 8:15 PM

On 2/26/2019 11:56 AM, nop head wrote:

You can pass arguments to children with $variables.

Just when I thought I understood OpenSCAD... now my head has exploded. 
Who's going to clean up the mess?

Thanks.  I don't know if I have any application for this mechanism, but
it's always good when my mental model gets adjusted to be closer to reality.

So it sounds like we're awfully close to being able to do what Troberg
asks, albeit in a way that's ... different ... from how it would be done
in a more conventional language.

On 2/26/2019 11:56 AM, nop head wrote: > You can pass arguments to children with $variables. Just when I thought I understood OpenSCAD... now my head has exploded.  Who's going to clean up the mess? Thanks.  I don't know if I have any application for this mechanism, but it's always good when my mental model gets adjusted to be closer to reality. So it sounds like we're awfully close to being able to do what Troberg asks, albeit in a way that's ... different ... from how it would be done in a more conventional language.
T
Troberg
Wed, Feb 27, 2019 6:42 AM

Ooh, that's very neat, and takes care of the problem nicely. Thank you!

--
Sent from: http://forum.openscad.org/

Ooh, that's very neat, and takes care of the problem nicely. Thank you! -- Sent from: http://forum.openscad.org/