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

Lisp元音计数函数异常求助:调用后计数未更新

Lisp countVowels函数计数不更新的问题解决

问题根源

你代码里的核心问题是类型不匹配:

  • 遍历字符串得到的是字符对象(比如#\e)
  • 但属性列表(plist)里用的是符号对象(比如'e)
  • member和getf默认用eq比较,不同类型的对象永远不相等,导致计数逻辑根本没触发。

修正方案一:用字符作为plist的键

直接把plist的键换成字符类型,同时指定字符专用的比较函数:

(defun countVowels (string)
  (let ((vowels (list #\a 0 #\e 0 #\i 0 #\o 0 #\u 0)))
    (loop for ch across string
          when (member ch vowels :test #'char=)
          do (incf (getf vowels ch)))
    (format t "~{~a~^, ~}" vowels)))
  • 用let声明局部变量vowels,避免污染全局命名空间
  • :test #'char=指定字符的相等比较逻辑,比默认的eq更适合字符类型
  • plist的键改为#\a这类字符,和遍历得到的ch类型一致

修正方案二:将字符转换为符号

如果需要保留符号作为plist键,可以把遍历到的字符转换为对应的符号:

(defun countVowels (string)
  (let ((vowels (list 'a 0 'e 0 'i 0 'o 0 'u 0)))
    (loop for ch across string
          for char-sym = (intern (string (char-downcase ch)))
          when (member char-sym vowels)
          do (incf (getf vowels char-sym)))
    (format t "~{~a~^, ~}" vowels)))
  • char-downcase把字符统一转为小写,兼容输入中的大写元音
  • string将字符转为字符串,intern把字符串转为符号,和plist里的'a等匹配

调用(countVowels "test")时,两种方案都会正确统计出E的计数为1(字符方案会显示#\a,符号方案显示A,可根据需求调整format输出格式)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 10:32:36