-
Notifications
You must be signed in to change notification settings - Fork 0
/
matching.lisp
37 lines (32 loc) · 1.24 KB
/
matching.lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
(in-package :conformist)
(defun does-a-matches-b (a b)
(format t "~a ~a~%" a b)
(if (placeholderp a)
(does-placeholder-matches-data a b)
(equal a b)))
(defun matchp-unsafe (pattern data)
(let ((pattern-index 0)
(data-index 0)
(pattern-len (length pattern))
(data-len (length data)))
(loop while (and (< pattern-index pattern-len)
(< data-index data-len))
do
(let ((pattern-elm (elt pattern pattern-index))
(data-elm (elt data data-index)))
(if (listp pattern-elm)
(unless (matchp-unsafe pattern-elm data-elm)
(return-from matchp-unsafe nil))
(unless (does-a-matches-b pattern-elm data-elm)
(return-from matchp-unsafe nil)))
(if (placeholderp pattern-elm)
(setf data-index (funcall (get-shift-function pattern-elm)
data
data-index))
(incf data-index))
(incf pattern-index)))
t))
(defun matchp (pattern data)
(if (and (listp pattern)
(listp data))
(matchp-unsafe pattern data)))