Documentation
¶
Overview ¶
Package match implements the core pattern matcher.
Index ¶
- Variables
- type Bindings
- type Matcher
- func (m *Matcher) IsAnonymousVariable(s string) bool
- func (m *Matcher) IsConstant(s string) bool
- func (m *Matcher) IsOptionalVariable(x interface{}) bool
- func (m *Matcher) IsVariable(s string) bool
- func (m *Matcher) Match(pattern interface{}, fact interface{}, bindings Bindings) ([]Bindings, error)
- func (m *Matcher) Matches(pattern interface{}, fact interface{}) ([]Bindings, error)
- type UnknownPatternType
Constants ¶
This section is empty.
Variables ¶
var DefaultMatcher = &Matcher{ AllowPropertyVariables: true, CheckForBadPropertyVariables: true, Inequalities: true, }
DefaultMatcher is just that.
Change it if you want.
The Match() function uses this value.
Functions ¶
This section is empty.
Types ¶
type Bindings ¶
type Bindings map[string]interface{}
Bindings is a map from variables (strings starting with a '?') to their values.
func (Bindings) DeleteExcept ¶
DeleteExcept removes all but the given properties.
Does not copy.
This method is handy in some actions.
func (Bindings) Extend ¶
Extends adds the property; modifies and returns the Bindings.
The Bindings are modified.
type Matcher ¶
type Matcher struct {
// AllowPropertyVariables enables the experimental support for
// a single property variable in a map pattern that has no
// other properties.
AllowPropertyVariables bool
// CheckForBadPropertyVariables runs a test to verify that a
// pattern does not contain a property variable along with
// other properties.
//
// This check might not be necessary because the other code
// will report an error if a bad property variable is actually
// enountered during matching. The interesting twist is that
// if a match fails before encountering the bad property
// variable, then that code will not report the problem. In
// order to report the problem consistently, turn on this
// switch. Performance will suffer, but any bad property
// variable will be caught.
CheckForBadPropertyVariables bool
// Inequalities is a switch to turn on experimental binding
// inequality support.
//
// With this feature, pattern matching supports numeric
// inequalities in addition to the standard equality
// predicate. The input bindings should include a binding for
// a variable with a name that contains either "<", ">", "<=",
// ">=", or "!=" immediately after the leading "?". The input
// pattern can then use that variable. When matching, a value
// X will match that variable only if the binding Y for that
// variable satisfies the inequality with X and Y (in that
// order). In this case, the output bindings will include a
// new binding for a variable with the same name as the
// inequality variable but without the actual inequality.
//
// For example, given input bindings {"?<n":10}, pattern
// {"n":"?<n"}, and message {"n":3}, the match will succeed
// with bindings {"?<n":10,"?n":3}.
//
// See match_test.json for several examples. (Search for
// "inequality".)
//
// For now at least, the inequalities only work for numeric
// values. We might support strings later.
//
// Yes, such a feature makes us stare down a slippery slope.
// However, we are brave, and we do not shy away from even
// grave danger.
//
// "[In Sheens] we live exactly as we please, and yet are
// just as ready to encounter every legitimate danger."
//
// --Pericles
//
// The immediate motivation for this feature was to support
// timer fallbacks. For example, using the Goja interpreter,
// an action could establish a binding with a value that's a
// number representing a future time in UNIX milliseconds.
// Then a branch pattern can check for a message containing
// the current time which is greater than that number. When a
// machine is loaded, a system could send the machine a
// "current time" message, which could advance the machine
// according to such a branch. Using this technique, a
// machine that creates a timer that somehow gets lots could
// regain at least some sense of what's going on. Similarly,
// a system that doesn't have asynchronous, timer-driven
// messaging support could simply send messages every second
// (or at whatever internal) to provide timer-like
// functionality (albeit with inefficiencies and without the
// message-oriented timer protocol that's been offered
// elsewhere).
Inequalities bool
}
func (*Matcher) IsAnonymousVariable ¶
IsAnonymousVariable detects a variable of the form '?'. An binding for an anonymous variable shouldn't ever make it into bindins.
func (*Matcher) IsConstant ¶
IsConstant reports if the string represents a constant (and not a pattern variable).
func (*Matcher) IsOptionalVariable ¶
IsOptionalVariable reports whether the value is a variable that starts with two "?" instead of a single "?". Example: "??x".
func (*Matcher) IsVariable ¶
IsVariable reports if the string represents a pattern variable.
All pattern variables start with a '?".
func (*Matcher) Match ¶
func (m *Matcher) Match(pattern interface{}, fact interface{}, bindings Bindings) ([]Bindings, error)
Match is a verion of 'Matches' that takes initial bindings.
Those initial bindings are not modified.
func (*Matcher) Matches ¶
Matches attempts to match the given fact with the given pattern. Returns an array of 'Bindings'. Each Bindings is just a map from variables to their values.
Note that this function returns multiple (sets of) bindings. This possibility is introduced when a pattern contains an array that contains a variable.
type UnknownPatternType ¶
type UnknownPatternType struct {
Pattern interface{}
}
UnknownPatternType is an error that includes the thing that's causing the trouble.
func (*UnknownPatternType) Error ¶
func (e *UnknownPatternType) Error() string