0

我正在使用 Racket 中的 DFS 实现骑士之旅。

我查看了如何让 define 在 cond 中工作,并看到在 let 中包装 define 会使其工作。但现在我得到这个错误:

begin(可能是隐含的):在一系列内部定义之后没有表达式:(begin (define nxn (cons n n)) (define array (for/vector ((x (car nxn))) (for/vector ((y (cdr nxn))) 0))))

知道这是为什么吗?

4

1 回答 1

1

define顶层的外部称为内部定义。内部定义不创建顶级/模块级绑定;相反,它们是等效letrec*表达式的语法糖。这意味着由内部定义创建的绑定仅在内部定义所在的 lambda/范围内可见;在您的情况下,这意味着它们仅在(let () ...).

特别是,这意味着您不能像在cond. #f请记住(因为您已经在使用命令式编程风格)您可以创建最初设置为(或其他一些空白值,尽管是习惯的)的顶级绑定#f,然后有条件set!地将它们设置为您想要的值。

除此之外,您的代码还有许多其他问题。例如:

  1. 不要使用 比较数字eq?,使用=.
  2. 不要在else;周围使用括号 那是无效的。
  3. else分支内部,您有许多define无效的表格。请记住,您不能有条件地定义新变量。
  4. genSuccessors的表达方式太多了cond。您希望拥有一个cond包含许多分支的单个表达式。此外,您需要将分支条件分成多行以便于阅读。
于 2014-02-02T05:35:25.167 回答