diff --git a/primitives.scad b/primitives.scad
index d1382b9..7a24aaf 100644
--- a/primitives.scad
+++ b/primitives.scad
@@ -12,11 +12,12 @@
 // Section: 2D Primitives
 
 
-// Module: square()
+// Function&Module: square()
 // Usage:
 //   square(size, [center], [anchor])
 // Description:
-//   Creates a 2D square of the given size.
+//   When called as a module, creates a 2D square of the given size.
+//   When called as a function, returns a 2D path/list of points for a square/rectangle of the given size.
 // Arguments:
 //   size = The size of the square to create.  If given as a scalar, both X and Y will be the same size.
 //   center = If given and true, overrides `anchor` to be `CENTER`.  If given and false, overrides `anchor` to be `FRONT+LEFT`.
@@ -38,12 +39,19 @@ module square(size, center=undef, anchor=FRONT+LEFT, spin=0) {
 	}
 }
 
+function square(size, center=undef, anchor=FRONT+LEFT, spin=0) =
+	let(
+		size = is_num(size)? [size,size] : point2d(size),
+		s=size/2
+	) rot(spin, p=move(-vmul(anchor,s), p=[[-s.x,-s.y], [-s.x,s.y], [s.x,s.y], [s.x,-s.y]]));
 
-// Module: circle()
+
+// Function&Module: circle()
 // Usage:
 //   circle(r|d, [anchor])
 // Description:
-//   Creates a 2D circle of the given size.
+//   When called as a module, creates a 2D circle of the given size.
+//   When called as a function, returns a 2D path/list of points for a circle of the given size.
 // Arguments:
 //   r = The radius of the circle to create.
 //   d = The diameter of the circle to create.
@@ -66,6 +74,14 @@ module circle(r=undef, d=undef, anchor=CENTER, spin=0) {
 }
 
 
+function circle(r=undef, d=undef, anchor=CENTER, spin=0) =
+	let(
+		r = get_radius(r=r, d=d, dflt=1),
+		sides = segs(r),
+		pts = [for (i=[0:1:sides-1]) let(a=360-i*360/sides) r*[cos(a),sin(a)]]
+	) rot(spin, p=move(-vmul(anchor,s), p=pts));
+
+
 
 // Section: Primitive Shapes