Racket待办事项程序中条件语句无法正确匹配字符串相等性的问题
Racket待办事项程序中条件语句无法正确匹配字符串相等性的问题
我来帮你搞定这个问题!你遇到的是Racket里字符串比较的一个常见小坑——用错了相等性判断函数。
问题根源
你现在用的eq?函数,在Racket里是用来判断两个对象是不是内存中的同一个实例,而不是比较它们的内容是否相同。对于字符串来说,哪怕两个字符串内容完全一样,只要它们是不同的对象(比如你从输入读取的字符串和直接写在代码里的"show list"),eq?就会返回#f,所以你的条件分支永远不会触发,自然就没有输出。
解决方法
要比较字符串的内容是否相等,你需要用专门的字符串相等判断函数string=?,或者通用的内容相等判断函数equal?。推荐用string=?,因为它是专门为字符串设计的,效率更高。
修改你的cond语句部分就行,把原来的:
[(eq? action "show list") (display lst)]
改成:
[(string=? action "show list") (display lst)]
或者用通用的equal?(也能正常工作,但不如string=?针对字符串高效):
[(equal? action "show list") (display lst)]
额外补充:Racket里几个相等判断函数的区别
为了避免以后再踩类似的坑,我给你简单梳理下Racket里常用的几个相等判断函数:
eq?:判断对象的同一性,适合符号(比如'a)、小整数这类会被Racket复用实例的类型eqv?:比eq?宽松,比如对于数字,只要值相等就返回#t,不管是不是同一个实例equal?:判断内容是否相等,适用于大多数复合类型(字符串、列表、结构体等),是日常开发中最常用的通用相等判断string=?:专门针对字符串的内容相等判断,只接受字符串参数,效率比equal?高
修改之后,当你输入“Show List”,经过string-downcase和string-trim处理后得到的"show list",就能和代码里的字符串正确匹配,程序会正常输出待办列表啦!
备注:内容来源于stack exchange,提问作者Firstmine




