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

在Lisp中检查字符数组元素匹配指定值的代码报错求解

Lisp代码错误说明及修正方案

存在的问题列表

  • 变量作用域错误:第一个let块定义的count、my-array只在对应括号范围内生效,后续的dotimes逻辑无法访问这两个变量,会直接触发未定义变量报错。
  • let语法错误:(let (c "a"))写法不符合规范,let的变量绑定必须是(变量名 初始值)的格式,且该let块后无对应执行逻辑,定义无实际意义。
  • 类型匹配错误:=是数字专用比较符,比较字符需要用char=;代码中使用的"+"是字符串类型,单个字符的Lisp写法为#\+,二者类型不匹配永远返回假。
  • aref用法错误:(aref (my-array n))多了一层括号,my-array是数组变量不是函数,正确写法为(aref my-array n)。
  • 表达式写法错误:n+1在Lisp中不能直接识别,加法为前缀表达式,需要写成(+ n 1)。
  • 分支逻辑错误:判断*的if分支位置错误,无论是否匹配**都会输出OP_MULT,不符合需求。
  • 边界判断缺失:访问n+1位置的数组元素时没有做越界判断,容易触发数组下标溢出错误。
  • 逻辑重复错误:两处空格判断分别输出OP_OC、OP_CC,属于明显笔误,应为大/中括号的判断逻辑。

修正后可运行代码

(defun gppinterpreter (filename)
  (let ((count 0)
        (my-array (make-array '(1000))))
    (with-open-file (stream filename)
      (do ((char (read-char stream nil)
                 (read-char stream nil)))
          ((null char))
        (setf (aref my-array count) char)
        (incf count)))
    (print my-array)
    ;; 遍历逻辑放在同一个作用域内
    (dotimes (n count)
      (let ((c (aref my-array n)))
        (cond
          ((char= c #\+)
           (format t "OP_PLUS ~%"))
          ((char= c #\-)
           (format t "OP_MINUS ~%"))
          ((char= c #\/)
           (format t "OP_DIV ~%"))
          ((char= c #\*)
           ;; 增加越界判断,匹配到**后跳过后一位避免重复解析
           (if (and (< (+ n 1) count)
                    (char= (aref my-array (+ n 1)) #\*))
               (progn
                 (format t "OP_DBLMULT ~%")
                 (incf n))
               (format t "OP_MULT ~%")))
          ((char= c #\()
           (format t "OP_OP ~%"))
          ((char= c #\))
           (format t "OP_CP ~%"))
          ((char= c #\{)
           (format t "OP_OC ~%"))
          ((char= c #\})
           (format t "OP_CC ~%"))
          ((char= c #\,)
           (format t "OP_COMMA ~%"))))))

内容的提问来源于stack exchange,提问作者Burcu Sultan Orhan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 20:45:07