Racket代码报错‘set-euqal?: unbound identifier’求助
问题排查与修复方案
嘿,我来帮你理清这个错误的原因和解决办法:
核心错误原因
你遇到的set-euqal?: unbound identifier in module错误,本质是拼写失误:你明明定义了set-equal?函数,但在equals里调用的时候写成了set-euqal?(把equal的字母顺序写反成euqal了),解释器找不到这个未定义的标识符,所以抛出了错误。
除此之外,你的代码还有几个需要修正的小问题:
check_length函数完全没必要单独定义,判断两个长度是否相等直接用(= (length a) (length b))就可以,大于小于的情况都返回#f,这个函数属于冗余代码;equals函数的cond表达式里,((check_length (length BST) (length value)))这一项不符合语法——cond的每个分支必须是(条件 要返回的值)的形式,这里只写了条件,没有后续的返回结果;((set-euqal? (BST) (value)))这里的(BST)和(value)是错误写法:BST和value是函数的参数,不是可调用的函数,直接写变量名就行,不需要加括号。
修正后的完整代码
我把所有问题都修复了,还做了一点小优化:
; 判断l1是否是l2的子集 (define (subset? l1 l2) (or (null? l1) (and (member (car l1) l2) (subset? (cdr l1) l2)))) ; 判断两个列表是否集合相等:长度相同且互为子集 (define (set-equal? l1 l2) (and (= (length l1) (length l2)) ; 先判断长度,提前终止无效递归 (subset? l1 l2) (subset? l2 l1))) ; 你需要的equals函数,修复了语法和调用错误 (define (equals BST value) (cond ((bst-isempty? BST) #f) ((not (= (length BST) (length value))) #f) ; 长度不等直接返回#f ((set-equal? BST value) #t) ; 调用正确拼写的函数,参数直接传变量 (else #f)))
额外优化说明
我在set-equal?里先加了长度判断,这样如果两个列表长度不一样,能直接返回#f,不用再走后续的子集判断递归,效率会更高。
现在测试你给的例子:(set-equal? '(1 2 3) '(2 1 3))会返回#t,完全符合你的预期。
内容的提问来源于stack exchange,提问作者kw Hyun
相关产品推荐
相关产品推荐

