In graphics and CAD software, users occasionally have to enter 2D or 3D coordinates.
One such application is CoCreate's
OneSpace Modeling
on which I work day to day to help me fill my fridge.
To make coordinate entry as simple as possible, the implementation of Lisp which is embedded in the
product understands the following vector syntax:
(line :two_points 100,100 0,0)
Common Lisp connoisseurs will notice that this is decidedly non-standard behavior.
Those commas aren't supposed to be there; instead, commas serve their purpose in
list quoting, particularly in macro definitions. (For a refresher, check out
The Common Lisp Cookbook - Macros and Backquote.)
And in any other implementation of Lisp, this code would indeed result in an error message
such as "comma is illegal outside of backquote".
OneSpace Modeling's embedded Lisp, however, will notice a pair of literal
numbers and assume that what the user really meant to specify is a structure
of type
gpnt2d
, which holds
x
and
y
slots for the coordinates. And so
what is really evaluated is more like this:
(line :two_points (oli:make-gpnt2d :x 100 :y 100) (oli:make-gpnt2d :x 0 :y 0))
oli
is the Lisp package which exports the
gpnt2d
structure as well as its accessor
and constructor functions.
This explicit syntax is actually
required whenever you need to specify coordinates
using non-literals, such as when the actual coordinates are the results of
mathematical calculations. For instance, vector syntax is
not recognized
in the following:
(line :two_points (+ 50 50),100 0,0)
Now you'll get the expected error message reporting that "a comma has appeared out of a backquote".
To make this work, you'd have to say:
(line :two_points (oli:make-gpnt2d :x (+ 50 50) :y 100) 0,0)
But despite this limitation, the vector syntax extension was tremendously important for us:
Coordinates can be entered in all kinds of places in the user interface where casual users
would never suspect that what they are entering is actually thrown into funny engines
which the propellerheads at CoCreate call "the Lisp reader" and "the Lisp evaluator".