Racket自定义语言解释器三元条件表达式实现调试求助
解决Racket自定义语言三元条件表达式解析失败问题
问题核心
你的parse函数中,三元条件表达式的匹配模式与测试用例的语法结构不匹配,导致无法识别表达式,触发错误。
具体错误点
原parse函数中的三元模式:
`(,test '? ,true ': ,false)
这个模式要求表达式中的?和:必须是带引号的符号(即'?和':),但你的测试用例使用的是不带引号的?和:(比如(10 ? 100 : 200)),两者结构不匹配,因此无法触发对应的解析逻辑。
修正方案
将parse函数中的三元表达式匹配模式修改为:
`(,test ? ,true : ,false)
在Racket的match准引号(quasiquote)语法中,直接写?和:会匹配对应的符号'?和':,与测试用例的语法结构完全一致。
补充:truthy?函数实现
你提到要模拟JavaScript的truthy逻辑,但代码中未给出truthy?的实现,这会导致运行时错误。以下是符合JS规则的实现:
(define (truthy? val) (cond [(boolean? val) val] ; 布尔值直接取本身 [(number? val) (not (zero? val))] ; 非零数字为truthy,0为falsy [(string? val) (not (string-empty? val))] ; 非空字符串为truthy [else #t])) ; 其他类型默认truthy
修正后的完整parse函数
(define (parse expr) (match expr [(? number?) (num expr)] [(? string?) (str expr)] ['TRUE (bool #t)] ['FALSE (bool #f)] [`(+ ,x ,y) (add (parse x) (parse y))] [`(- ,x ,y) (sub (parse x) (parse y))] [`(=== ,x ,y) (equals (parse x) (parse y))] [`(,test ? ,true : ,false) (condt (parse test) (parse true) (parse false))] [_ (error "Invalid custom Lang expression")]))
测试验证
修正后,你的测试用例将能够正确解析并运行:
(evalcustom '(10 ? 100 : 200))会返回100(evalcustom '((- 100 100) ? "a" : "b"))会返回"b"
内容的提问来源于stack exchange,提问作者Zzen
相关产品推荐
相关产品推荐

