This is a high-level list of features. To see everything, you will need to browse the reference.

turtleSpaces is based around a full implementation of the Apple (LCSI) Logo environment. Logo has been called “the most powerful and user-friendly computer language ever implemented on a personal computer.” (David Thornburg)

Logo is a ‘functional’ language which is based on ‘primitives’ (commands) that return output to each other – they can be chained to retrieve, calculate and transform data in various ways before storing or actioning based on them.

Users can create ‘procedures’ which behave just like (and can replace) primitives. A procedure can take parameters and return output, just like a primitive. Take the primitive product, which multiplies two number:

to product :a :b
  make "result 0
  repeat :a [make "result sum :result :b]
  output :result

We’ve effectively replaced product with our own procedure.

Logo was originally intended to be a language playground for children. As a result, it has very powerful string and ‘list’ handling (an array of ‘items’), such as [pig duck cow] or [[Bob 53][Frank 22][Sue 34]]. There are various primitives to build, order and re-order lists and strings, called ‘words’ in Logo.

  • We have added ‘soft’ lists, which are ‘resolved’ (or evaluated) at runtime. These lists are surrounded by curly braces instead of square brackets: {xpos ypos zpos} {hours minutes seconds}
  • We have added more traditional arrays in the form of tables. Tables are predefined arrays of x y (z). The contents are read and set using cell and putcell.
  • There is also positional data storage available in the form of zones and sectors.
  • You can store and recall data from files.
  • You can display text in different fonts, sizes and colors.

The turtle was added to Logo later, but became its most recognisable feature. The turtle is a graphical ‘cursor’ which moves relative to itself, unlike other ‘absolute’ graphical systems (although you can operate absolutely in Logo as well). You tell the turtle to move and turn and it does so relative to its position and orientation.

In turtleSpaces we have added significant additional functionality to turtles:

  • The turtle can move in three dimensions. This means that in addition to forward, back, left and right, there is up, down, rollleft, rollright. For expediency we’ve also added raise, lower, slideleft and slideright.
  • position returns the turtle’s location using three co-ordinates, the traditional pos returning 2 (x, y)
  • Along with heading, setheading we’ve added pitch, setpitch and roll, setroll
  • orientation, setorientation sets all three, based on setorientationorder, which specifies the order in which the three orientation parameters (heading, pitch and roll) are applied (curse you, Euler!)
  • For more reliable orientation, one can use vectors, setvectors – we also have a variety of vector-related primitives.
  • You can set an orbit anchorpoint and then orbit around it in degrees. This is super-useful for cameras and for drawing interesting patterns.
  • You can create new turtles, either ‘persistent’ turtles using the newturtle primitive, or ephemeral turtles using hatch, whose output can be merged with its parent. You can determine where turtles are relative to each other using nearinside, facingp, location and others.
  • You can set a turtle’s ‘model’ to any Logo drawing code using tags, which allow you to ‘bracket’ sections of a turtle’s ‘track’ (its graphical output), using it for models or turning it on or off. Tracks can also be copied, loaded and saved. Models can have arbitrary commands inserted before them using setpremodel, allowing for the orientation of the model to be changed as needed.
  • You can undo the last thing a turtle did using backtrack, you can make a procedure out of a turtle’s track using assemble, allowing for model creation ‘on the fly’.

There are multiple spaces the turtle(s) can occupy, and turtles can be spread across spaces (newspace selectspace). Each space is an infinite three-dimensional canvas.

Any turtle can be a camera, selected using setview. You can change the camera’s position relative to its turtle using setviewpoint. Turtles also act as lights – they can be a spot light, a point light or no light at all.

Procedures and variables (containers) along with a number of settings are turtle-specific. You can share containers between turtles, and you can share procedures using the special libby (library) turtle.

Turtles are ‘driven’ by workers, which are process threads. One worker can drive multiple turtles (consecutively), or multiple workers can drive multiple turtles. Multiple workers can (attempt to) drive the same turtle! Workers and turtles are not the same. Think of turtles as cars, and workers as drivers.

You can telnet into turtleSpaces and control a worker using a terminal or another application (API).

Where traditional Logo turtles can only create lines or fill spaces, because turtleSpaces is based on OpenGL we have a number of other shapes that can be created, including:

  • shard
  • pinshard
  • voxel
  • voxeloid
  • ramp
  • tent
  • sphere
  • sphereslice
  • cutsphere
  • cutsphereslice
  • spheroid
  • spheroidslice
  • cutspheroid
  • cutspheroidslice
  • icosphere
  • icospheroid
  • amigaball
  • amigaballoid
  • cylinder
  • cylinderslice
  • cylinderarc
  • cylinderarcslice
  • cylindroid
  • cylindroidslice
  • cylindroidarc
  • cylindroidarcslice
  • duocylindrdoid
  • tube
  • tubearc
  • tubeslice
  • tubearcslice
  • tuboid
  • tuboidarc
  • tuboidslice
  • tuboidarcslice
  • duotuboid
  • cone
  • coneslice
  • cutcone
  • cutconeslice
  • conoid
  • conoidslice
  • cutconoid
  • cutconoidslice
  • duocutconoid
  • funnel
  • funnelslice
  • cutfunnel
  • cutfunnelslice
  • cutfunneloidslice
  • funneloid
  • funneloidslice
  • cutfunneloid
  • duocutfunneloid
  • pyramid
  • pyramoid
  • dome
  • domoid
  • torus
  • torusslice
  • toroid
  • toroidslice
  • tetrahedron
  • tetrahedroid
  • octahedron
  • octahedroid
  • dodecahedron
  • dodecahedroid
  • mark
  • inscribe
  • typeset

You can speckle (or pixelate a la Minecraft) voxels and quads. You can create pixel-based plots (both 2 and 3 dimensional) and use them as speck

Sound primitives include the traditional toot (tone) primitive, noise (which generates white noise), playnotes, and you can playmusic created using the built-in tracker. You can also use your operating system’s built-in speech synthesiser using say (macOS and Linux)

turtleSpace has users. You ‘log in’ as a user to use turtleSpaces.

User workspaces are saved as ‘turtleSpace’ (TSP) folders. These folders save every change you make to procedures, and allow you to revert to any stage of development (undo, redo). What you type at the interactive prompt is also saved.

Snapshots are created when you save or takesnapshot – the save point is the state that the workspace is restored to when it is loaded. But you can keep developing and restore to ‘current’ by using load autosave. You can create a persistent ‘cover’ (used in the catalog) using takecover

The interactive prompt has a history that can be programmatically read (historycount historyitem historylist).