我是 Common Lisp 的新手,作为第一个项目,我一直在研究一个简单的模式匹配器。我在使用星号 (*) 运算符表示列表中任何元素的 0 个或多个时遇到问题。因此模式 (x * z) 和匹配器 (xyyyz) 将返回 true,但模式 (x * z) 和匹配器 (xy) 将返回 false。
我的第一个想法:
(loop for x in pattern-list
(eq x '*)
;if x is *, pause iterating through this list
(loop for y in matcher-list
;somehow iterate one more value in the pattern list
(eq x y) ;does the value just after the * in the pattern list equal the value in y?
;if they aren't the same symbol, just iterate matcher until they match, then resume incrementing though the pattern list
))
对不起,如果我的语法和括号有点不对劲。
这是我正在研究的较大模式匹配器的较小部分。这是我到目前为止所拥有的(在这种情况下,list1 是模式列表,而 list2 是匹配器列表):
此代码的大部分来自此 SO 帖子:
(defun comp-q (list1 list2) ;defun
(if (and (not (null list1)) ;if list1 is not null AND
(not (null list2))) ;if list2 is not null
(let ((a (car list1)) (b (car list2))) ;a is the car (front) of list1 and b is the car of list 2
(cond ((and (listp a) (listp b)) ;cond, evaluate the first thing in the list - are a and b lists?
(and (comp-q a b) ;recursive call on a and b
(comp-q (cdr list1) (cdr list2)))) ;recursive call on the cdr (tail) of a and b
(t ;like an else for cond
(and (or (eq a b) (eq a '?)) ;are a and b equal OR is a a '?'
(comp-q (cdr list1) (cdr list2)))))) ;recursive call on the cdr of a and b
(= (length list1) (length list2)))) ;are the lists equal? only triggered if the null test fails (are they both not null)
使用loop
宏是我最好的选择吗?是否可以“暂停”或跟踪列表上的迭代(我知道这是数组式的)?或者我应该尝试通过调用comp-q 中正在实现的每个列表的car
and来继续递归工作?cdr
defun
谢谢。