[PEAK] Logix, macros, and PEAK

John Landahl john at landahl.org
Wed Jul 20 05:47:42 EDT 2005


I've been working quite a bit lately with Logix[1], which is something
like a language construction kit built on Python, and have been
thinking about how its macro capabilities could simplify some aspects
of PEAK.  So I took a stab at a "defmethod"[2] command for simplifying
generic function definitions, and came up with the following working
example:

  limport peak
  setlang peak.peak

  defmethod foo(a, b) default:
      print "default"

  defmethod foo(a, b) around { a > 0 }:
      print "before"
      next_method(a, b)
      print "after"

  defmethod foo(a, b) when { a == 1 and b == 2 }:
      print "hi there"

  foo(0, 1); print
  foo(1, 1); print
  foo(1, 2); print

...with the expected output:

  default

  before
  default
  after

  before
  hi there
  after

If anyone is interested in this, I'd be happy to share the 'peak.lx'
module which has the definition and macro.  (Not for the faint of
heart, however; Logix syntax can get rather, um, complex).

Another candidate for simplification might be peak.model definitions.
Maybe something like:

  model class Foo:
      attribute x (type: String,  default: None)
      sequence  y (type: Integer, default: [])
      attribute z (type: "Bar",   default: None, ref: "foos")

...to replace:

  class Foo(model.Element):
    class x(model.Attribute):
      referencedType = model.String
      defaultValue = None

    class y(model.Sequence):
      referencedType = model.Integer
      defaultValue = []

    class z(model.Attribute):
      referencedType = "Bar"
      defaultValue = None
      referencedEnd = "foos"

The syntax could use more thought, but the potential is there for a
pretty substantial reduction of code and complexity.

- John

[1] http://www.livelogix.net/logix/

[2] A Lispism; could just as easily be 'pddef', 'define generic',
    'dispatch def', etc.  (Logix allows spaces in its "operators").



More information about the PEAK mailing list