[Baypiggies] puzzle: binding invocation context for a function call during a class declaration

Bill Janssen janssen at parc.com
Fri Dec 31 21:09:55 CET 2010


I'm puzzling out how one would ape a declarative language in Python.
For instance, take a language that has declarations like

  concept Foo {
    is-a A;
    is-a B;
    part-of X;

    public int counter;
    public analogue bar;
  }

  expression Bletch {

    expresses Foo;

    counter = 3;
  }

where "concept", "public", "is-a", "part-of", "int", "analogue",
"expression", and "expresses" are all keywords.

Since it's largely declarative, I'd naturally express it in Python as a
set of class declarations:

  from mylang import is_a, part_of, Concept, Expression, attribute, public, analogue, expresses

  class Foo (Concept):

    is_a(A);
    is_a(B);
    part_of(X);

    counter = attribute(public, int)
    bar = attribute(public, analogue)

  class Bletch (Expression):

    expresses(Foo)
    counter = 3

Now, my question is, how can I capture the invocation context of a
function, so that I can know that "is_a(A)" is being called as part of
the definition of class "Foo"?  Do functions called during the
evaluation of a class leave their return result somewhere, for instance,
so that I could define a metaclass to do something with that result?

Right now, I'm using the fragile workaround of

  _relationships = []
  def _store_relationship (x, rel):
      primary = inspect.stack()[2][0].f_code.co_name
      _relationships.append((primary, rel, x))
  is_a = lambda x: _store_relationship(x, "is-a")

If I was willing to use Python 3, I could use class decorators instead,
I suppose.  But I'd like to nest these declarations inside the class
definition if I can.

Any ideas would be appreciated.

Bill


More information about the Baypiggies mailing list