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

如何在Common Lisp中判断两种类型是否相同?

解决Common Lisp中复刻lexical_cast<bool>的类型比较问题

我来帮你搞定这个Common Lisp里的类型比较问题,你要复刻C++的lexical_cast<bool>(string)功能,其实只要调整对CL类型表示的理解就能解决!

错误根源:混淆了类型符号和函数对象

你之前的代码里用#BOOLEAN是错误的——在Common Lisp中,布尔类型的标识是符号boolean,而不是函数对象。#'boolean试图获取名为BOOLEAN的函数,但ANSI CL并没有定义这个函数,所以SBCL会抛出未定义函数的警告和错误。

修改后的正确实现

把类型比较的逻辑改成检查ret-type是否等于符号'boolean,同时可以用string-equal来实现不区分大小写的字符串比较(更贴近lexical_cast的常见行为,如果你需要严格区分大小写,换成equalp即可):

(defun lexical-cast (ret-type val)
  (cond
    ((eq ret-type 'boolean)
     (string-equal val "true"))
    ; 后续可以在这里扩展其他类型的处理逻辑,比如integer、string等
    ))

测试示例

  • (lexical-cast 'boolean "true") → 返回T
  • (lexical-cast 'boolean "TRUE") → 返回T(因为string-equal忽略大小写)
  • (lexical-cast 'boolean "false") → 返回NIL
  • (lexical-cast 'boolean "bar") → 返回NIL

扩展:处理复杂类型

如果之后需要支持复合类型(比如(integer 0 10)这种带约束的类型),可以用subtypep函数来做类型兼容性检查,比如:

(subtypep ret-type 'boolean)

这个函数会返回两个值:第一个表示ret-type是否是boolean的子类型,第二个表示类型检查是否确定。对于基础类型的比较,直接用eq比较符号已经足够简洁高效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 13:37:44