【发布时间】:2013-11-27 22:27:18
【问题描述】:
我在 Scheme 中练习递归。我下面的代码用于获取模式子句和语句,然后如果语句匹配模式则返回绑定列表,如果不匹配则返回 false:
(define remove-question-mark
(lambda (s1)
(if (memq #\? (string->list (symbol->string s1)))
(cdr (string->list (symbol->string s1)))
'())))
(define check-two-symbol
(lambda (symbol1 symbol2)
(if (and (regexp-match #rx#"\\?attrs" (symbol->string symbol1)) (list? symbol2))
(cons symbol1 (list symbol2))
(if (equal? symbol1 symbol2)
'()
(if (equal? (remove-question-mark symbol1) (string->list (symbol->string symbol2)))
(cons symbol1 symbol2)
#f)))))
(define clause
(lambda (state1 state2)
(if (and (null? (car state1)) (null? (car state2)))
'()
(list (check-two-symbol (car state1) (car state2)) (clause (cdr state1) (cdr state2))))))
这是我的输入:
(clause '(wasDerivedFrom ?der ?e1 ?e2 . ?attrs_derv) '(wasDerivedFrom der e1 e2 (prov:type "Revision")))
我的代码出现了这个错误:
car: contract violation
expected: pair?
given: '()
预期输出:
((?der . der)
(?e1 . e1)
(?e2 . e2)
(?attrs_derv (prov:type "Revision")))
调试后发现(car state1)为?attrs_derv时出错
如果我单独运行函数check-two-symbol,比如(check-two-symbol '?attrs-derv '(prov:type "Revision")),它会很好地打印出来:
(?attrs_derv (prov:type "Revision"))
但是使用 main 函数时,我得到了错误。那么有人可以帮我展示如何解决这个错误吗?我不太熟悉递归......
提前致谢!
【问题讨论】:
-
查看Using scheme/racket to return specific items from a list,用户遇到相同的错误消息。
-
在
clause中,(and … (car (null? state2)))不应该是(and … (null? (car state2)))吗? -
应该是
(and (null? state1) (null? state2))吧?? -
我不知道 supposed 是什么让您的代码正常工作,但
(car (null? ...))最终会导致错误(and是短路的,所以你还没有看到它们)因为null?返回#t或#f而你不能接受其中的car。 -
糟糕,
(car (null?....))打错了。我真的很抱歉!