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

