2012-09-13 131 views
1

我想分支并学习lisp。其中一个基本要素就是实现一个简单的堆栈。一切正常,但我的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*))) 

但我宁愿返回顶部。

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

+0

需要注意的是,标准中已经定义了'pop'和'push'。 – Svante

+0

@Svante还应该注意的是,问题始于“我试图分支并学习lisp。其中一个基本原理就是实现一个简单的堆栈。” (这就是为什么它被命名为'我的流行') – SomeKittens

+0

这就是为什么我说“应该注意”,而不是“阅读精美的手册”。我不希望人们搜索“stack common lisp”,然后认为他们必须自己实现它。 – Svante

回答

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

太棒了。你有'prog1'的细节链接吗? (我很难找到一个好的文档来源) – SomeKittens

+0

Common Lisp Hyperspec:http://www.lispworks.com/documentation/HyperSpec/Front/index.htm – Barmar

+0

谢谢!当我回到宿舍时,我会检查一下,然后接受它。 – SomeKittens