You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

XLISP栈模拟程序报错:undefined function NIL问题求助

问题分析与修复方案

错误原因

  1. 初始化语句错误:你写的(setq myStack(nil))是把nil当作函数调用,而nil是Lisp中的空列表常量,不是可执行函数,这直接导致了"undefined function NIL"错误。
  2. 内置函数名冲突:pop是XLISP的内置函数,自定义同名函数会覆盖内置实现,引发异常;push在部分Lisp环境中也是内置宏/函数,同样存在冲突风险。

修正后的代码

; 初始化空栈,正确写法:直接将nil赋值给myStack
(setq myStack nil)

; 自定义入栈函数,改名避免与内置push冲突
(defun my-push ()
  (let ((num (read)))
    (if (and (numberp num) (> num 0))
        ; 用nconc替代append,直接修改原列表,效率更高
        (setq myStack (nconc myStack (list num)))
      (print "Invalid Input"))))

; 自定义出栈函数,改名避免与内置pop冲突
(defun my-pop ()
  (if (null myStack)
      (print "Stack is empty")
    (progn
      ; 取出栈顶元素(列表最后一个元素)并打印
      (print (car (last myStack)))
      ; 移除栈顶元素
      (setq myStack (butlast myStack)))))

代码说明

  • 初始化修正:(setq myStack nil)正确将空列表赋值给栈变量。
  • 函数名修改:将push改为my-push、pop改为my-pop,避免与XLISP内置功能冲突。
  • 效率优化:用nconc替代append,nconc会直接修改原列表拼接新元素,比append创建新列表的方式更高效(适合栈操作场景)。
  • 出栈增强:原代码只移除栈顶元素,修正后会先打印被弹出的栈顶元素,更符合栈pop操作的常规行为。

使用示例

> (my-push)
5  ; 输入正整数
> (my-push)
-3 ; 输入非正整数
"Invalid Input"
> (my-pop)
5
> (my-pop)
"Stack is empty"

内容的提问来源于stack exchange,提问作者AshuraSyntax

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 16:40:22