[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

  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:



  hi there

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