You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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-downcasestring-trim处理后得到的"show list",就能和代码里的字符串正确匹配,程序会正常输出待办列表啦!

备注:内容来源于stack exchange,提问作者Firstmine

火山引擎 最新活动