Using children with let

classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

Using children with let

jegsav

I would like to be able to write a single let() statement and use it on multiple modules. A simple example is

 

module leta(){

   let(a=23)

      children();

}

 

leta() cylinder(h=a, d=a); // Doesn't work, a is unknown here.

 

However this does work:

 

module move(x){

   translate([x,0,0])

      children();

}

 

module cone_rod(){

   cylinder(h=10,d=5);

   cylinder(h=5,d1=15,d2=0);

}

 

move(0) cone_rod();      // Works as expected

move(20) cone_rod();     // Works as expected

 

What’s the difference and why doesn’t the first example work?

Thanks,

John


_______________________________________________
OpenSCAD mailing list
[hidden email]
http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org
Reply | Threaded
Open this post in threaded view
|

Re: Using children with let

nophead
OpenSCAD variables have lexical scope by default, so they can only be seen in the block they are defined in. So you could do children(a) to access the 23rd child but a is not visible outside leta() and more specifically only under the let().

However, if you use $a it will have dynamic scope and be accessible in all the modules and functions called from the block it is defined in.

On 12 September 2018 at 15:06, John Savage <[hidden email]> wrote:

I would like to be able to write a single let() statement and use it on multiple modules. A simple example is

 

module leta(){

   let(a=23)

      children();

}

 

leta() cylinder(h=a, d=a); // Doesn't work, a is unknown here.

 

However this does work:

 

module move(x){

   translate([x,0,0])

      children();

}

 

module cone_rod(){

   cylinder(h=10,d=5);

   cylinder(h=5,d1=15,d2=0);

}

 

move(0) cone_rod();      // Works as expected

move(20) cone_rod();     // Works as expected

 

What’s the difference and why doesn’t the first example work?

Thanks,

John


_______________________________________________
OpenSCAD mailing list
[hidden email]
http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org



_______________________________________________
OpenSCAD mailing list
[hidden email]
http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org
Reply | Threaded
Open this post in threaded view
|

Re: Using children with let

jegsav

Hi Nop Head(?) Thanks for your reply. I get it now. John

 

From: nop head [mailto:[hidden email]]
Sent: 12 Sep 2018 04:05
To: [hidden email]; OpenSCAD general discussion
Subject: Re: [OpenSCAD] Using children with let

 

OpenSCAD variables have lexical scope by default, so they can only be seen in the block they are defined in. So you could do children(a) to access the 23rd child but a is not visible outside leta() and more specifically only under the let().

However, if you use $a it will have dynamic scope and be accessible in all the modules and functions called from the block it is defined in.

 

On 12 September 2018 at 15:06, John Savage <[hidden email]> wrote:

I would like to be able to write a single let() statement and use it on multiple modules. A simple example is

 

module leta(){

   let(a=23)

      children();

}

 

leta() cylinder(h=a, d=a); // Doesn't work, a is unknown here.

 

However this does work:

 

module move(x){

   translate([x,0,0])

      children();

}

 

module cone_rod(){

   cylinder(h=10,d=5);

   cylinder(h=5,d1=15,d2=0);

}

 

move(0) cone_rod();      // Works as expected

move(20) cone_rod();     // Works as expected

 

What’s the difference and why doesn’t the first example work?

Thanks,

John

Image removed by sender.


_______________________________________________
OpenSCAD mailing list
[hidden email]
http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org

 


_______________________________________________
OpenSCAD mailing list
[hidden email]
http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org