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访问。