1

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

#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 函数的递归。当列表为空时,它会打印完成,然后继续下一部分,就好像列表仍然有元素一样,抛出此错误。 如果有人知道为什么会引发此错误,请告诉我。谢谢!

4

1 回答 1

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)value val,首先评估两个表达式。

只有在val, ie的求(testmany ...)值完全完成后,才发现错误foo,即(test ...)表达式的值实际上不是函数,不能应用。

于 2017-12-05T13:39:14.893 回答