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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:25:54