2016-06-11 2 views
0

Я пытаюсь создать новую очередь в одном из своих функций, но я получаю ошибкуОпределение очереди в функции

Определяет нашел определение, которое не на самом высоком уровне

Как я могу это решить? Мне нужно создать эту очередь где-то внутри. Я не могу просто создавать вспомогательные переменные вне его.

(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)] 
    ) 
) 

EDIT:

Хорошо, это, кажется, как это работает. Я попытаюсь сыграть с кодом еще немного. Благодарю.

(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) 
) 
+0

хочет создать новую, другую очередь каждый раз, когда 'BFS-graph' называется, или повторно использовать ту же очередь между различные вызовы 'bfs -граф? –

+0

Теперь, когда я думаю об этом, я собираюсь повторно использовать bfs-graph рекурсивно. Я пытаюсь, как вы могли предположить, найти всех соседей данной вершины, и я помещаю их в очередь, поэтому я хотел бы иметь ту же самую очередь, которую я мог бы добавить с новыми значениями. – Arcane

+1

Тогда лучше создать очередь _outside_ процедуры и передать ее в качестве параметра из процедуры, которая запускает вычисление. –

ответ

3

код вы вывесили должны работать, попробуйте изменить язык - установить его на «Определить язык из источника» и добавьте эту строку в начале файла:

#lang racket 

Если по каким-то причинам вы не можете использовать другой язык, это равносильно тому, что вы написали:

(define (bfs-graph X G) 
    (let ((q (make-queue))) 
    (enqueue! q X) 
    ; ... some work with queue 
    )) 
+0

Возможно, я должен был сказать, что я использую «Advanced Student» в DrRacket. Теперь ваше решение работает, но у меня есть вопрос. Я узнал, что могу также использовать local() isntead let. Каковы различия? Кроме того, когда я вводил больше «(enqueue! Q 5)» друг за другом, он вызывает эту ошибку: 'let: ожидалось только одно выражение после привязок, но найдено 1 дополнительная часть' – Arcane

+1

Они более или менее одинаковы, см. этот [ответ] (http://stackoverflow.com/a/15236960/201359) для немного больше информации о 'local'. Я предпочел бы использовать 'let', это стандартная схема. Ошибка, которую вы получаете, безусловно, вызвана некоторыми неуместными круглыми скобками, пожалуйста, взгляните на [documentation] (https://docs.racket-lang.org/reference/let.html), чтобы убедиться, что вы используете синтаксис правильно. –

+0

Вы можете использовать '(local [(define q (make-queue))] (begin (enqueue! Q X) .... некоторые работают с q ....))'. –

Смежные вопросы