|
1 |
| -(in-package "ACL2") |
2 |
| - |
3 |
| -; ds = list of delimiters (no constraints on what a delimiter is) |
4 |
| -; xs = list of values (no constraints on values) |
5 |
| -; (split-at-delimiter ds xs) = list of two elements |
6 |
| -; 1 longest prefix of xs containing no elements from ds |
7 |
| -; 2 rest of xs |
8 |
| -(defun split-at-delimiter (ds xs) |
9 |
| - (if (or (endp xs) (member-equal (car xs) ds)) |
10 |
| - (list nil xs) |
11 |
| - (let* ((cdr-split (split-at-delimiter ds (cdr xs)))) |
12 |
| - (list (cons (car xs) (car cdr-split)) |
13 |
| - (cadr cdr-split))))) |
14 |
| - |
15 |
| -; ps = list of signals to pass by (no constraints on signals) |
16 |
| -; xs = list of signals (no constraints on signals) |
17 |
| -; (span ps xs) = list of two elements |
18 |
| -; 1 longest prefix of xs containing only signals from ps |
19 |
| -; 2 rest of xs |
20 |
| -(defun span (ps xs) |
21 |
| - (if (or (endp xs) (not (member-equal (car xs) ps))) |
22 |
| - (list nil xs) |
23 |
| - (let* ((cdr-span (span ps (cdr xs)))) |
24 |
| - (list (cons (car xs) (car cdr-span)) |
25 |
| - (cadr cdr-span))))) |
26 |
| - |
27 |
| -; ps = list of values (no constraints on values) |
28 |
| -; xs = list of values (no constraints on values) |
29 |
| -; (splitoff-prefix ps xs) = list of three elements |
30 |
| -; 1 longest prefix of ps that is also a prefix of xs |
31 |
| -; 2 rest of ps |
32 |
| -; 3 rest of xs beyond prefix that matches element 1 |
33 |
| -(defun splitoff-prefix (ps xs) |
34 |
| - (if (or (endp ps) |
35 |
| - (endp xs) |
36 |
| - (not (equal (car xs) (car ps)))) |
37 |
| - (list nil ps xs) |
38 |
| - (let* ((3way (splitoff-prefix (cdr ps) (cdr xs)))) |
39 |
| - (list (cons (car ps) (car 3way)) |
40 |
| - (cadr 3way) |
41 |
| - (caddr 3way))))) |
42 |
| - |
43 |
| -; tok = token (list of values, no constraints on values) |
44 |
| -; xs = list of values (no constraints on values) |
45 |
| -; (split-on-token tok xs) = list of three elements |
46 |
| -; 1 prefix of xs: portion before 1st contiguous sublist matching tok |
47 |
| -; (or xs, if there is no match for tok in xs) |
48 |
| -; 2 tok if tok matches a contiguous sublist of xs, otherwise nil |
49 |
| -; 3 suffix of xs: portion after 1st contiguous sublist matching tok |
50 |
| -; (or nil, if there is no match for tok in xs) |
51 |
| -(defun split-on-token (tok xs) |
52 |
| - (if (endp xs) |
53 |
| - (list nil nil nil) |
54 |
| - (let* ((3way (splitoff-prefix tok xs))) |
55 |
| - (if (endp (cadr 3way)) |
56 |
| - (list nil tok (caddr 3way)) |
57 |
| - (let* ((cdr-split (split-on-token tok (cdr xs)))) |
58 |
| - (list (cons (car xs) (car cdr-split)) |
59 |
| - (cadr cdr-split) |
60 |
| - (caddr cdr-split))))))) |
| 1 | +(in-package "ACL2") |
| 2 | + |
| 3 | +; ds = list of delimiters (no constraints on what a delimiter is) |
| 4 | +; xs = list of values (no constraints on values) |
| 5 | +; (split-at-delimiter ds xs) = list of two elements |
| 6 | +; 1 longest prefix of xs containing no elements from ds |
| 7 | +; 2 rest of xs |
| 8 | +(defun split-at-delimiter (ds xs) |
| 9 | + (if (or (endp xs) (member-equal (car xs) ds)) |
| 10 | + (list nil xs) |
| 11 | + (let* ((cdr-split (split-at-delimiter ds (cdr xs)))) |
| 12 | + (list (cons (car xs) (car cdr-split)) |
| 13 | + (cadr cdr-split))))) |
| 14 | + |
| 15 | +; ps = list of signals to pass by (no constraints on signals) |
| 16 | +; xs = list of signals (no constraints on signals) |
| 17 | +; (span ps xs) = list of two elements |
| 18 | +; 1 longest prefix of xs containing only signals from ps |
| 19 | +; 2 rest of xs |
| 20 | +(defun span (ps xs) |
| 21 | + (if (or (endp xs) (not (member-equal (car xs) ps))) |
| 22 | + (list nil xs) |
| 23 | + (let* ((cdr-span (span ps (cdr xs)))) |
| 24 | + (list (cons (car xs) (car cdr-span)) |
| 25 | + (cadr cdr-span))))) |
| 26 | + |
| 27 | +; ps = list of values (no constraints on values) |
| 28 | +; xs = list of values (no constraints on values) |
| 29 | +; (splitoff-prefix ps xs) = list of three elements |
| 30 | +; 1 longest prefix of ps that is also a prefix of xs |
| 31 | +; 2 rest of ps |
| 32 | +; 3 rest of xs beyond prefix that matches element 1 |
| 33 | +(defun splitoff-prefix (ps xs) |
| 34 | + (if (or (endp ps) |
| 35 | + (endp xs) |
| 36 | + (not (equal (car xs) (car ps)))) |
| 37 | + (list nil ps xs) |
| 38 | + (let* ((3way (splitoff-prefix (cdr ps) (cdr xs)))) |
| 39 | + (list (cons (car ps) (car 3way)) |
| 40 | + (cadr 3way) |
| 41 | + (caddr 3way))))) |
| 42 | + |
| 43 | +; tok = token (list of values, no constraints on values) |
| 44 | +; xs = list of values (no constraints on values) |
| 45 | +; (split-on-token tok xs) = list of three elements |
| 46 | +; 1 prefix of xs: portion before 1st contiguous sublist matching tok |
| 47 | +; (or xs, if there is no match for tok in xs) |
| 48 | +; 2 tok if tok matches a contiguous sublist of xs, otherwise nil |
| 49 | +; 3 suffix of xs: portion after 1st contiguous sublist matching tok |
| 50 | +; (or nil, if there is no match for tok in xs) |
| 51 | +(defun split-on-token (tok xs) |
| 52 | + (if (endp xs) |
| 53 | + (list nil nil nil) |
| 54 | + (let* ((3way (splitoff-prefix tok xs))) |
| 55 | + (if (endp (cadr 3way)) |
| 56 | + (list nil tok (caddr 3way)) |
| 57 | + (let* ((cdr-split (split-on-token tok (cdr xs)))) |
| 58 | + (list (cons (car xs) (car cdr-split)) |
| 59 | + (cadr cdr-split) |
| 60 | + (caddr cdr-split))))))) |
0 commit comments