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*)))

但我宁愿返回顶部。

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

4

1 回答 1

3

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

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

此外,a(varN valN)可以缩写为 just 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)))
于 2012-09-13T04:38:01.333 回答