在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
相关产品推荐
相关产品推荐

