删除列表中的最后一个元素而不破坏括号格式(球拍)

时间:2014-02-10 07:10:22

标签: list scheme racket

我正在使用此代码来确保将列表放在一起,以便它可以与我正在编写的另一个函数一起使用。

#lang racket
(define path_from_start null)
(define path_stack null)
(define input1 '(0 0))
(define input2 '(1 2))
(define input3 '(3 1))

(define (test xy)
  (set! path_from_start (append path_from_start (list xy)))
  (display "path from start:") (display path_from_start)
  (display "\n")
  (set! path_stack (list path_from_start path_stack))
  (display "path_stack")(display path_stack)
  (display "\n")
  ;(set! path_stack (cdr path_stack))
  ;(display path_stack)
  ;(display "\n")
)

(test input1)
(test input2)
(test input3)

但是我得到了这个输出:

path from start:((0 0))
path_stack(((0 0)) ())
path from start:((0 0) (1 2))
path_stack(((0 0) (1 2)) (((0 0)) ()))
path from start:((0 0) (1 2) (3 1))
path_stack(((0 0) (1 2) (3 1)) (((0 0) (1 2)) (((0 0)) ())))
1st item on path_stack: '((0 0) (1 2) (3 1))

我不想在path_stack结束时使用空列表。它没有显示在path_from_start中。这可能是因为我正在形成path_stack。但我希望保留现在的括号格式。是否有另一个变量我可以将path_stack初始化为?

我已经查找了其他方法,但它们都打破了括号格式。我应该在第一步使用其中一种方法吗?把它扼杀在榜单中只有一个其他元素,所以我可以很容易地改革它?

感谢。

1 个答案:

答案 0 :(得分:1)

在第二个set!使用list*而不是list中尝试此操作:

(set! path_stack (list* path_from_start path_stack))

这是结果,我相信这解决了方括号的问题 - 问题中的示例输出似乎不正确:

path from start: ((0 0))
path_stack:      (((0 0)))
path from start: ((0 0) (1 2))
path_stack:      (((0 0) (1 2)) ((0 0)))
path from start: ((0 0) (1 2) (3 1))
path_stack:      (((0 0) (1 2) (3 1)) ((0 0) (1 2)) ((0 0)))

现在我们可以回溯路径中的每一步,如下所示:

(first path_stack)
=> '((0 0) (1 2) (3 1))
(second path_stack)
=> '((0 0) (1 2))
(third path_stack)
=> '((0 0))