我正在使用 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))))
知道这是为什么吗?
我正在使用 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))))
知道这是为什么吗?
define
顶层的外部称为内部定义。内部定义不创建顶级/模块级绑定;相反,它们是等效letrec*
表达式的语法糖。这意味着由内部定义创建的绑定仅在内部定义所在的 lambda/范围内可见;在您的情况下,这意味着它们仅在(let () ...)
.
特别是,这意味着您不能像在cond
. #f
请记住(因为您已经在使用命令式编程风格)您可以创建最初设置为(或其他一些空白值,尽管是习惯的)的顶级绑定#f
,然后有条件set!
地将它们设置为您想要的值。
除此之外,您的代码还有许多其他问题。例如:
eq?
,使用=
.else
;周围使用括号 那是无效的。else
分支内部,您有许多define
无效的表格。请记住,您不能有条件地定义新变量。genSuccessors
的表达方式太多了cond
。您希望拥有一个cond
包含许多分支的单个表达式。此外,您需要将分支条件分成多行以便于阅读。