gpt4 book ai didi

lisp - 堆栈溢出与 assoc 和函数测试

转载 作者:太空宇宙 更新时间:2023-11-03 18:53:45 24 4
gpt4 key购买 nike

我写了这个函数,如果给定的参数匹配则返回 t,否则返回 nil。

(defun match (input-form pattern)
(cond
((and (not input-form) (not pattern)) t)
((not pattern) nil)
((eq (car pattern) '*) (or (match input-form (cdr pattern)) (match (cdr input-form) pattern)))
((not input-form) nil)
((and (> (length (string (car pattern))) 1) (eq (char (string (car pattern)) 0) '#\?))
(match (cdr input-form) (cdr pattern)) )
((eql (car input-form) (car pattern)) (match (cdr input-form) (cdr pattern))) ) )

当我这样做时:

(setq patterns 
'(((bonjour *) bonjour) ((salut *) salut)) )

(assoc '(bonjour Eliza) patterns :test #'match)

它运行良好并返回:((bonjour *) bonjour)

and (assoc '(hello Eliza) patterns :test #'match)效果也很好,返回零。

但是当我像这样向变量模式添加模式时:

(setq patterns 
'(((bonjour *) bonjour) ((salut) salut) ((* mere * pere *) parlez-moi de vos parents) ((mere *) la mere de qui) ((* mere) parlez-moi de votre mere)) )

当我请求匹配的东西时,它会工作,但是当我请求不匹配的东西时,我会收到堆栈溢出错误消息。

我做错了什么?

最佳答案

如果你(trace match) ,您将立即得到答案(请记住足够快地按 Ctrl-C :-):

  0: (MATCH (BONJOUR2 ELIZA) (BONJOUR *))
0: MATCH returned NIL
0: (MATCH (BONJOUR2 ELIZA) (SALUT))
0: MATCH returned NIL
0: (MATCH (BONJOUR2 ELIZA) (* MERE * PERE *))
1: (MATCH (BONJOUR2 ELIZA) (MERE * PERE *))
1: MATCH returned NIL
1: (MATCH (ELIZA) (* MERE * PERE *))
2: (MATCH (ELIZA) (MERE * PERE *))
2: MATCH returned NIL
2: (MATCH NIL (* MERE * PERE *))
3: (MATCH NIL (MERE * PERE *))
3: MATCH returned NIL
3: (MATCH NIL (* MERE * PERE *))
4: (MATCH NIL (MERE * PERE *))
4: MATCH returned NIL
4: (MATCH NIL (* MERE * PERE *))
5: (MATCH NIL (MERE * PERE *))
5: MATCH returned NIL
5: (MATCH NIL (* MERE * PERE *))

即,您需要测试 (null input-form) before 单步执行模式:

(defun match (input-form pattern)
(cond
((and (null input-form) (null pattern)) t)
((or (null pattern) (null input-form)) nil)
((eq (car pattern) '*)
(or (match input-form (cdr pattern))
(match (cdr input-form) pattern)))
((and (> (length (string (car pattern))) 1)
(char= (char (string (car pattern)) 0) #\?))
(match (cdr input-form) (cdr pattern)))
((eql (car input-form) (car pattern))
(match (cdr input-form) (cdr pattern)))))

请注意我对您的代码所做的缩进和空格更改,以及使用 null而不是 not检查空列表时(也可以考虑 endp)。

关于lisp - 堆栈溢出与 assoc 和函数测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23917060/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com