我正在尝试分支并学习口齿不清。其中一个基础是实现一个简单的堆栈。一切都有效但我的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 :(得分: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)))