堆栈弹出不返回

时间:2012-09-13 04:04:04

标签: lisp stack

我正在尝试分支并学习口齿不清。其中一个基础是实现一个简单的堆栈。一切都有效但我的pop功能。

;Returns and removes the first element of the stack
(defun my-pop ()
    (let (temp (car *stack*))
    (setq *stack* (cdr *stack*))
    temp))

这会正确删除堆栈的“顶部”,但不会返回它。早些时候,我有这个:

;Returns and removes the first element of the stack
(defun my-pop ()
    (print (car *stack*)
    (setq *stack* (cdr *stack*)))

但我宁愿回到顶端。

我做错了什么? (我认为这与范围有关...)

1 个答案:

答案 0 :(得分:3)

与范围无关,这是一个语法问题。 LET的语法是:

(let ((var1 val1)
      (var2 val2)
      ...)
  body)

此外,(varN valN)可能缩写为varN,相当于(varN nil)。所以你写的内容相当于:

(let ((temp nil)     ; bind TEMP to NIL
      (car *stack*)) ; bind CAR to value of *STACK*
  (setq *stack* (cdr *stack*))
  temp)

您的LET绑定中需要一组额外的括号:

(let ((temp (car *stack*)))
  (setq *stack* (cdr *stack*))
  temp)

您也可以使用内置运算符PROG1:

(prog1 
  (car *stack*)
  (setq *stack* (cdr *stack)))