2013-04-12 34 views
2

我学习球拍和新的函数式编程,写了下面的代码堆栈:在拍子中我的堆栈实现有什么问题?

(define stack '(0)) 

(define (push x stack) 
    (set! stack (cons x stack))) 

(define (pop stack) 
    (let ((result (car stack))) 
    (set! stack (cdr stack)) 
    result)) 

当我做

(push 2 stack) 

没有错误。 当我做(pop stack)我回来0. 我做错了什么。

+0

顺便说一句,如果您使用的DrRacket,使用语法检查你的车码。代码将以有助于查看变量范围的方式着色。将鼠标悬停在'set!'中使用'stack'将显示一个箭头指向,而不是全局变量,而是局部变量,以帮助您了解受影响的事件。 – dyoo

回答

1

您有一个全局st变量,但您拨打set!pushpop的局部变量。您需要从您的函数中删除st参数。如果您将st参数重命名为其他内容(如stack),问题可能会更加明显。

(define (push x stack) 
    (set! stack (cons x stack))) ; stack is mutated, but st remains unchanged 
+0

问题是我需要一个全局堆栈,并且我想要做push和pop,你会推荐做什么来解决它? – gizgok

+0

我明白了,谢谢! – gizgok

0

您正在使用的全局状态即st并传递st作为参数来推动,以及和才造成推动当地st进行更新和全球st仍然'(0)

您可以摆脱全球st,如下所示解决此问题:

(define (push x st) 
     (cons x st)) 

    (define (pop st) 
     (values (car st) (cdr st))) 

用法:

(let ((stack '(0))) 
     (define-values (v s) (pop (push 2 stack))) 
     v) 
+0

如果我这样做(推2 st)然后做(pop stack)它不起作用。 – gizgok

+0

你需要使用push作为参数来返回栈 – Ankur