Scheme 在函数中定义队列
我正试图在我的一个函数中创建一个新队列,但我遇到了一个错误 定义:找到一个不在顶级的定义 我如何解决这个问题?我需要在内部某处创建此队列。我不能仅仅在它之外创建辅助变量Scheme 在函数中定义队列,scheme,racket,Scheme,Racket,我正试图在我的一个函数中创建一个新队列,但我遇到了一个错误 定义:找到一个不在顶级的定义 我如何解决这个问题?我需要在内部某处创建此队列。我不能仅仅在它之外创建辅助变量 (define (bfs-graph X G) (define q (make-queue)) (enqueue! q X) ... some work with queue ) (define (reachable? X Y G) (cond [(empty? (graph-edges G)) #
(define (bfs-graph X G)
(define q (make-queue))
(enqueue! q X)
... some work with queue
)
(define (reachable? X Y G)
(cond
[(empty? (graph-edges G)) #f]
[else (bfs-graph X G)]
)
)
编辑:
好的,这似乎有效。我将尝试更多地使用代码。谢谢
(define (reachable? X Y G)
(let ((q (make-queue)))
(cond
[(empty? (graph-edges G)) #f]
[else (bfs-graph X G q)]
)
)
)
(define (bfs-graph X G q)
(enqueue! q X)
)
您发布的代码应该可以工作,请尝试更改语言-将其设置为“从源代码确定语言”,并在文件开头添加以下行:
#lang racket
如果出于某种原因,您不能使用其他语言,这相当于您所写的内容:
(define (bfs-graph X G)
(let ((q (make-queue)))
(enqueue! q X)
; ... some work with queue
))
您发布的代码应该可以工作,请尝试更改语言-将其设置为“从源代码确定语言”,并在文件开头添加以下行:
#lang racket
如果出于某种原因,您不能使用其他语言,这相当于您所写的内容:
(define (bfs-graph X G)
(let ((q (make-queue)))
(enqueue! q X)
; ... some work with queue
))
您想在每次调用
bfs-graph
时创建一个新的、不同的队列,还是在不同的`bfs-graph'调用之间重用同一个队列?现在我想起来了,我将递归地重用bfs-graph。正如你可能猜到的那样,我试图找到给定顶点的所有邻域,并将它们放入一个队列中,因此我希望拥有可以附加新值的相同队列。然后最好在过程外部创建队列,并将其作为启动计算的过程的参数传递。是的,我想那就足够了。并确保在递归调用中传递队列。是否拼写错误enqueue代码>作为!enqueue
?您想在每次调用bfs graph
时创建一个新的、不同的队列,还是在不同的'bfs graph'调用之间重用同一个队列?现在我想起来了,我要递归地重用bfs graph。正如你可能猜到的那样,我试图找到给定顶点的所有邻域,并将它们放入一个队列中,因此我希望拥有可以附加新值的相同队列。然后最好在过程外部创建队列,并将其作为启动计算的过程的参数传递。是的,我想那就足够了。并确保在递归调用中传递队列。是否拼写错误enqueue代码>作为!排队
?我应该说我在DrRacket中使用了“高级学生”。你的解决方案现在起作用了,但我有个问题。我发现我也可以用local()代替let。有什么区别?另外,当我依次输入更多“(enqueue!q 5)”时,它会调用此错误:let:在绑定后只需要一个表达式,但发现了一个额外的部分
,它们或多或少是相同的,有关本地
的更多信息,请参见此。我宁愿使用let
,这是标准方案。您收到的错误肯定是由于某些括号放错了位置造成的,请查看以确保您正确使用了语法。您可以使用(local[(define q(make queue))](begin(enqueue!q X)…一些与q有关的工作…)
。在高级学生语言中,我建议使用local
,不让
。在教学语言中,你应该使用local
,因为你可以重复使用define
的现有语法。我明白了,但是如果我想像我最初的问题一样跨多个方法使用队列,如果它是local,它还能工作吗?我认为local中的变量只能从local访问。我应该说我在DrRacket中使用了“Advanced Student”。你的解决方案现在起作用了,但我有个问题。我发现我也可以用local()代替let。有什么区别?另外,当我依次输入更多“(enqueue!q 5)”时,它会调用此错误:let:在绑定后只需要一个表达式,但发现了一个额外的部分
,它们或多或少是相同的,有关本地
的更多信息,请参见此。我宁愿使用let
,这是标准方案。您收到的错误肯定是由于某些括号放错了位置造成的,请查看以确保您正确使用了语法。您可以使用(local[(define q(make queue))](begin(enqueue!q X)…一些与q有关的工作…)
。在高级学生语言中,我建议使用local
,不让
。在教学语言中,你应该使用local
,因为你可以重复使用define
的现有语法。我明白了,但是如果我想像我最初的问题一样跨多个方法使用队列,如果它是local,它还能工作吗?我认为local中的变量只能从local访问。