# PostScript

This is a minimal implementation of the PostScript language supporting all operators defined in the PDF Spec for "Operators in Type 4 Functions".

It's not useful for much more than evaluating Type4 functions, but perhaps it will be some fun to play around with -- PostScript is a rather interesting language!

It includes a very simple parser (see PostScript::Parser), and a runtime (see PostScript::Runtime).

## About PostScript

PostScript is a stack-based language, and this library supports (nearly) all of its stack, arithmetic, boolean, and conditional operators.

You can refer to the PostScript Language Reference for more details.

## Usage

The runtime can be driven manually (through ruby) or by evaluating a snippet of PostScript.

Here's some trivial examples, first driven manually:

```
ps = PostScript::Runtime.new
ps.stack # => []
ps.push 2 # => [2]
ps.push 2 # => [2, 2]
ps.mul # => [4]
ps.push 2 # => [4, 2]
ps.div # => [2]
ps.stack # => [2]
```

And then as a bit of PostScript code:

```
ps = PostScript::Runtime.new
ps.stack # => []
ps.eval "{ 2 2 mul 2 div }"
ps.stack # => [2]
```

Of course, the manual stack manipulation can be combined with PostScript code:

```
ps = PostScript::Runtime.new
# Set up the initial state
ps.push -4.0, 2.0
# Execute the "Rhomboid" spot function as defined in the PDF Spec.
ps.eval "{ abs exch abs 0.9 mul add 2 div }" # => [2.8]
```