我对球拍很陌生,我正在尝试为一个项目制作一个有限状态机。这是我到目前为止所拥有的。
#lang racket
(define (test rules cs pass lst)
(if (eq? (length lst) 0)
(if (member cs pass)
(write 'passed)
(write 'failed))
(test rules (next rules cs (car lst)) (cdr lst))))
(define (next rules cs input)
(if (eq? cs (car (car rules)))
(if (eq? input (car(cdr(car rules))))
(car(cdr(cdr(car rules))))
((next (cdr rules) cs input)))
(next (cdr rules) cs input)))
然后我输入
(define rules '('(0 a 0) '(0 b 1) '(1 a 0) '(1 b 1)))
(define pass '(1))
(test rules 0 pass '(a b a b))
由于我无法弄清楚的原因,我 在下一个函数中收到此错误。它的作用就好像规则是一个空列表,我很确定它不是。无论如何,如果有人能告诉我它为什么这样做,那真的会有所帮助。
谢谢!
编辑1
非常感谢你们的帮助。这真的很有帮助。该代码一直工作到最后,但现在如果我使用 testmany 测试多个列表,它会在我的代码末尾抛出一个错误。
(define (testmany rules cs pass lst)(if (eq? (length lst) 0)
(write 'done)
((test rules cs pass (car lst))
(testmany rules cs pass (cdr lst)))))
(define (test rules cs pass lst) (if (eq? (length lst) 0)
(if (member cs pass)
(write 'accepted.....)
(write 'rejected.....))
(test rules (next rules cs (car lst)) pass (cdr lst))))
(define (next rules cs input) (if (eq? cs (car (car rules)))
(if (eq? input (car(cdr(car rules))))
(car(cdr(cdr(car rules))))
(next (cdr rules) cs input))
(next (cdr rules) cs input)))
代码似乎不知道何时停止 testmany 函数的递归。当列表为空时,它会打印完成,然后继续下一部分,就好像列表仍然有元素一样,抛出此错误。 如果有人知道为什么会引发此错误,请告诉我。谢谢!