[Petal] [IDEA] Hash with params
Evan Simpson
evan at 4-am.com
Mon Sep 8 15:35:55 BST 2003
Steve Purkis wrote:
> And I assume it would be possible to define prefixes that variables as
> arguments so that it would be possible to say "some/hash/key:somevar"
> and "some/list/item:someindex"?
Sure! The prefix implementation can do whatever it likes with the
argument, including treat it as a variable name, convert it to a number,
or ignore it entirely.
In ZPTs, prefixes are implemented by a pair of functions dubbed the
compiler and the handler. At least one of the two must be provided.
If a compiler is provided, the prefix and argument strings are passed to
it (a single compiler could be used for multiple prefixes) and its
return value replaces the argument string in further processing. This
allows for argument parsing, error checking, and other preprocessing
that doesn't depend on context.
If a handler is provided, then it is called during path traversal. The
prefix string, argument value, current traversal object, remaining
traversal path segments, and the execution context (variable namespaces)
are passed to it. The returned object is used for the next traversal step.
As an optimization the compiler is called lazily, the first time the
path is traversed, and the argument value is cached.
Here's the Python code that defines the builtin 'var' prefix:
# 'var:x' is replaced with the value of variable 'x'
def var_compiler(prefix, arg):
arg = arg.strip()
if not _valid_name(arg):
raise CompilerError, ('"%s" is not a valid variable name'
% arg)
return arg
def var_handler(prefix, arg, object, path, econtext):
path.append(econtext.vars[arg])
return object
builtins['var'] = PathPrefix(var_compiler, var_handler)
Cheers,
Evan @ 4-am
More information about the Petal
mailing list