在DrRacket中运行Rosette语言提示destruct未绑定错误如何解决
报错原因
destruct: unbound identifier in: destruct 报错的核心原因是destruct不属于Rosette语言的默认导出语法,默认环境中没有加载该标识符对应的定义。
解决方案
你可以任选以下任意一种方式修复该问题:
- 方案1:显式导入
destruct对应的依赖库
在代码开头#lang rosette行的下方新增导入语句:
(require rosette/lib/match)
修改后的完整可运行代码如下:
#lang rosette (require rosette/lib/match) (struct plus (left right) #:transparent) (struct mul (left right) #:transparent) (struct square (arg) #:transparent) (define prog (plus (square 7) 3)) (define (interpret p) (destruct p [(plus a b) (+ (interpret a) (interpret b))] [(mul a b) (* (interpret a) (interpret b))] [(square a) (expt (interpret a) 2)] [_ p])) (interpret prog)
运行后会返回预期结果52。
- 方案2:替换为Racket原生匹配语法
destruct的模式匹配语法和Racket标准库自带的match完全兼容,你可以直接把代码中的destruct关键字替换为match,不需要额外导入任何依赖。修改后的interpret函数定义如下:
(define (interpret p) (match p [(plus a b) (+ (interpret a) (interpret b))] [(mul a b) (* (interpret a) (interpret b))] [(square a) (expt (interpret a) 2)] [_ p]))
内容的提问来源于stack exchange,提问作者MathStudent
相关产品推荐
相关产品推荐

