-
Notifications
You must be signed in to change notification settings - Fork 22
Special Patterns
This section contains patterns that has specific roles in itself.
- Syntax
- place variable
Just the same as using variable as a variable pattern, except
the variable is accessed by symbol-macrolet
instead of let
. This allows the use of setf
to modify the matched object.
Example:
(defvar *x* (list 0 1))
(match *x*
((list (place x) y)
(setf x :success)
(setf y :fail)))
(print *x*)
;; --> (:SUCCESS 1)
- Syntax
- <> pattern value &optional var
The current matching value is bound to var
.
The result of evaluating value
using var
is then matched against pattern
.
var
is optional and can be omitted when value
is a constant and does not need the current matching value.
This is important when you write a defpattern
that has a default
value. Consider writing a derived pattern that matches against both of a form (quote string)
and a form (quote (string *))
. It has a subpattern length
, which should be bound to a symbol *
even when the input is (quote string)
. With <>
pattern, it can be implemented as below.
(defpattern string-type-specifier (length)
`(or (list 'string ,length)
(and 'string (<> ,length '*))))
Just want to access an element? It’s time to use access
pattern:
- Syntax
- access #’accessor subpattern
- Syntax
- access ‘accessor subpattern
- accessor
- a function name.
The object is not checked. The value of funcall
ing the current object is
matched against subpattern.
Example:
(match '((1 2 (3 4)) 5 (6))
((access #'flatten (list* _ _ 3 _))))
For a quickstart, go to the Basics section. Below is for the people already familiar with Optima.