球拍功能传递空列表而不是实际列表

时间:2017-12-04 00:27:10

标签: scheme racket dr.racket

我是一个很新的球拍,我正在尝试为一个项目制作一个有限状态机。这是我到目前为止所拥有的。

#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))

由于我无法弄清楚的原因,我明白了 this error on the next function.它就好像规则是一个空列表,我很确定它不是。无论如何,如果有人能告诉我它为什么这样做会真的有帮助。

谢谢!

EDIT1

非常感谢帮助人员。这真的很有帮助。代码完全一直工作到最后,但现在如果我用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函数的递归。当列表为空时,它打印完成,但接着继续下一部分,好像列表仍然有元素,抛出this error.如果有人知道它为什么抛出这个错误请告诉我。 谢谢!

1 个答案:

答案 0 :(得分:0)

您忘记了begin

(define (testmany rules cs pass lst) (if (eq? (length lst) 0)
                                         (write 'done)     
        (begin
       ; ^^^^^ here
         (test rules cs pass (car lst))                         
         (testmany rules cs pass (cdr lst)))))

没有它,尝试将(test rules cs pass (car lst))的返回值用作函数;但它是#<void>(write ....)形式的结果,是test函数评估(更像是,执行)的最后一个。

顺便说一下,#<void>不是空列表;它更像是一种非价值。

编辑:它确实递归到最后的原因(没有begin)是将foo中的函数(foo val)应用于值{首先评估{1}},两个表达式。

只有在val的评估之后,即val,才会完全发现错误被发现(testmany ...)的值,即foo表达式< em> not 实际上是一个函数,并且可以应用。