Geometry Language Assignment

From CSE425S Wiki
Jump to navigation Jump to search

Mac SML Bug

Mac users may experience problems with real numbers in SML if they have a version prior to v110.98.1:

Error: Compiler bug: PPObj: ppFields in ppval.sml

bug report

You can determine your version by typing

sml --version

at the command line.

You can get a more up to date version of SML on the Mac by entering:

brew reinstall smlnj

at the command line.

Credit

All credit for this assignment goes to Prof. Grossman and his team at UW.

Instructions

Set-up

For this assignment, you will complete and extend two implementations of an interpreter for a small “language” for two-dimensional geometry objects. An implementation in SML is mostly completed for you. An implementation in Ruby is mostly not completed. The SML implementation is structured with functions and pattern-matching. The Ruby implemented is structured with subclasses and methods, including some mind-bending double dispatch and other dynamic dispatch to stick with an OOP style even where your instructor thinks the functional style is easier to understand.

Language Semantics

Our “language” has five kinds of values and four other kinds of expressions. The representation of expressions depends on the metalanguage (SML or Ruby), with this same semantics:

  • A NoPoints represents the empty set of two-dimensional points.
  • A Point represents a two-dimensional point with an x-coordinate and a y-coordinate. Both coordinates are floating-point numbers.
  • A Line is a non-vertical infinite line in the plane, represented by a slope and an intercept (as in y = mx + b where m is the slope and b is the intercept), both floating-point numbers.
  • A VerticalLine is an infinite vertical line in the plane, represented by its x-coordinate.
  • A LineSegment is a (finite) line segment, represented by the x- and y-coordinates of its endpoints (so

four total floating-point numbers).

  • An Intersect expression is not a value. It has two subexpressions. The semantics is to evaluate the

subexpressions (in the same environment) and then return the value that is the intersection (in the geometric sense) of the two subresults. For example, the intersection of two lines could be one of:

    • NoPoints, if the lines are parallel
    • a Point, if the lines intersect
    • a Line, if the lines have the same slope and intercept (see the note below about what “the same”

means for floating-point numbers)

  • A Let expression is not a value. It is like let-expressions in other languages we have studied: The first

subexpression is evaluated and the result bound to a variable that is added to the environment for evaluating the second subexpression.

  • A Var expression is not a value. It is for using variables in the environment: We look up a string in

the environment to get a geometric value.

  • A Shift expression is not a value. It has a deltaX (a floating-point number), a deltaY (a floating-point

number), and a subexpression. The semantics is to evaluate the subexpression and then shift the result by deltaX (in the x-direction; positive is “to the right”) and deltaY (in the y-direction; positive is “up”). More specifically, shifting for each form of value is as follows:

    • NoPoints remains NoPoints.
    • A Point representing (x, y) becomes a Point representing (x + deltaX , y + deltaY ).
    • A Line with slope m and intercept b becomes a Line with slope m and an intercept of

b + deltaY − m · deltaX .

    • A VerticalLine becomes a VerticalLine shifted by deltaX ; the deltaY is irrelevant.
    • A LineSegment has its endpoints shift by deltaX and deltaY

Note on Floating-Point Numbers