Programming Language for Old Timers


by David A. Moon
February 2006 .. September 2008

Comments and criticisms to dave underscore moon atsign alum dot mit dot edu.


Previous page   Table of Contents   Next page


Definition Statements

This is a summary of the standard definition statements in PLOT. Their detailed syntax is given in later sections.

def defines a value or a method. A value definition specifies a name, optionally a type, an = or := sign, and an expression. The name becomes defined to the value of the expression. Using = creates a fixed definition. Using := creates an assignable definition. All definitions other than assignable value definitions are fixed. Multiple names separated by commas can be listed on the left-hand side; they are defined to multiple values returned by the right-hand side.

A method definition specifies a function name, a parameter list in parentheses, and a body. A method with the specified parameters and body is added to the function that is the definition of the name. If a definition of the name does not already exist in the current scope (not inherited from an enclosing scope), a new function definition is created. The parenthesized parameter list can be followed by := and one more parameter to define a setter function. A call to a prefix or infix operator or operator macro can be used in place of the function name and parameter list.

When re-executing a method definition after editing it to change its parameter list, it is the responsibility of the development environment to distinguish between adding a new method and replacing a method while changing its parameters.

defmacro defines a macro, which is a syntax extension. It specifies a name, one or more syntax patterns, and for each pattern an expression that returns the expansion of the macro.
defsyntax defines a syntactic type, with one or more patterns for parsing it. This can be invoked from other syntax patterns.
defparser defines one or more syntax patterns that can be invoked as a kind of subroutine from other syntax patterns.
defoperator defines an operator, which can be invoked with prefix or infix syntax. It specifies the name of the operator, some attributes such as its precedence, and optionally macros to parse the prefix and/or infix forms of invocations of the operator.
defmodule defines a module, specifying its name, exports, and from which other modules it imports definitions.
defclass defines a class of objects. It specifies a constructor and initializer parameter list, inheritance from another class and from zero or more protocols, and a set of slots which have values in each instance of the class.
defprotocol defines a protocol type and a set of related method requirements. A method requirement asserts that the function will always have a method for a specific set of argument types. A protocol is a type whose semantics come from the methods and method requirements that have parameters of that type.
require specifies a method requirement. This does not define any name.

All definition statements work in the global scope or in a local scope. If the name being defined is a name-in-context whose context is a module, the definition statement must be in the global scope and defines a global definition in the specified module. Otherwise, a definition statement in the global scope defines a global definition in the current module, while a definition statement in a local scope defines a local definition in that scope. Local defmacro and defoperator work because a known definition is recorded immediately before parsing the rest of the block. Local defmodule, defclass, and defprotocol are permitted but are probably useless.

Examples:

def pi = 3.14159

def x1, y1 = transform(x, y)

def state := #Alabama

def factorial(n) if n < 2 then 1 else n * factorial(n - 1)

defmacro exch(?a, ?b) =>
  `block
     def temp = ?a
     ?b := ?a
     ?a := temp`

defclass point(x, y)
  x = x
  y = y

;; The above can be abbreviated to
defclass point
  x
  y


Previous page   Table of Contents   Next page