【问题标题】:trying to implement my own stack object in DrRacket试图在 DrRacket 中实现我自己的堆栈对象
【发布时间】:2017-12-06 05:33:04
【问题描述】:

这是我到目前为止所拥有的,但是由于出现错误所以我无法运行它,所以我不知道它是否有效,我正在尝试使用 DrRacket 中的面向对象编程创建自己的堆栈对象,我如果它们被正确调用,我正在使用调度方法来调用我拥有的不同过程。 例如,首先我会创建一个堆栈,然后我会推送和弹出堆栈,并且还能够打印它。

(define (make-stack)
  (define my-stack '())

(define (pop)
 (define (pop-helper my-stack)
  (let ((result (car  my-stack))))
   (set!  my-stack (cdr  my-stack))
  result)
 (pop-helper  my-stack))

(define (push)
(define (push-helper x  my-stack)
  (set!  my-stack (cons x  my-stack)))
(push-helper x  my-stack))
(define (empty?)
 (define (empty-helper  my-stack)
   (if (null?  my-stack) #t
      #f))
  (empty-helper my-stack))
(define (print)
(define (print-helper  my-stack)
  (if (empty?) '()
      (print (cdr  my-stack))))
  (print-helper  my-stack))

(define (dispatch method)
(cond 
  ((eq? method 'pop) pop)
  ((eq? method 'push) push)
  ((eq? method 'print) print)
  (else (lambda() (display "Unknown Request: ")(display method)(newline)))))
    dispatch)

提前致谢!

【问题讨论】:

  • 您遇到的错误是什么?

标签: scheme racket r5rs


【解决方案1】:

您在两个过程中有几个语法错误,并且您不能将堆栈作为参数传递,它会影响my-stack 全局变量。这是修复:

(define (pop)
  (let ((result (car my-stack))) ; `let` brackets were off
    (set! my-stack (cdr my-stack))
    result))

(define (push x) ; `x` parameter was missing
  (set! my-stack (cons x my-stack)))

【讨论】:

  • 这确实解决了我遇到的错误,但似乎有些东西不起作用,因为为了测试它,我做了一个堆栈并将项目推送到它,当我打印时,它会打印一个空列表,我的打印程序有问题吗?
  • @ScrappyMontana 是的,它坏了。 empty? 需要一个参数,尽管您在堆栈的 cdr 部分重复出现,但实际上您并没有显示 cdr。别担心,你的堆栈是一个列表,所以只需 (display my-stack)
  • @Óscar López 我在哪里(显示我的堆栈)?
  • 那就是print的全部内容
  • 修复了它,我很傻,因为这里也很晚了,所以我想得很好。非常感谢,祝您晚安!
猜你喜欢
  • 2023-01-28
  • 2021-08-07
  • 2020-09-02
  • 1970-01-01
  • 1970-01-01
  • 2015-05-25
  • 2015-10-22
  • 1970-01-01
  • 2012-06-06
相关资源
最近更新 更多