在使用完整的 Rosette 语言时,有哪些方法可以识别未提升的 Racket 结构?
What are the ways to identify unlifted Racket constructs while using the full Rosette language?
我在使用 Rosette is using unlifted Racket constructs 以不安全的方式实现程序合成器时犯下的最常见错误之一,使合成器输出 (unsat)
。
事实上,作为 Rosette 程序员的初学者,很难确定可能导致问题的未提升的 Racket 构造。我认为 DrRacket 可能会有所帮助,例如,通过不显示从 #lang rosette
行到未提升的 Racket 结构(例如 assv
)的箭头,但事实并非如此,即它是向未提升的(例如 assv
)和提升的运算符(例如 first
)显示箭头。
我一直在使用两种策略,(i) 在 rosette/safe
中构建综合代码,然后我可以切换到完整的语言,这很不方便,因为我不能使用更新和更高级的 Racker构造,以及 (ii) 浏览我在代码中使用的构造并检查它们是否是 rosette/base/base.rkt
的 "provided",这很烦人。
经验丰富的 Rosette 程序员有什么建议吗?
一种方法是在 rosette/safe
中开始编程,然后根据需要从 Racket 中明确要求您需要的结构。然后,如果出现问题,就可以更容易地找出他们在何时何地发生的事情。
因此,例如,您的代码将如下所示:
#lang rosette/safe
(require (only-in racket for assv))
随着代码库的增长,您还可以将所有这些导入收集到一个导出它们的模块中。然后,您的其余代码将需要该模块,它将充当您的自定义版本 rosette/safe
加上您需要的最少量 Racket 构造。
我在使用 Rosette is using unlifted Racket constructs 以不安全的方式实现程序合成器时犯下的最常见错误之一,使合成器输出 (unsat)
。
事实上,作为 Rosette 程序员的初学者,很难确定可能导致问题的未提升的 Racket 构造。我认为 DrRacket 可能会有所帮助,例如,通过不显示从 #lang rosette
行到未提升的 Racket 结构(例如 assv
)的箭头,但事实并非如此,即它是向未提升的(例如 assv
)和提升的运算符(例如 first
)显示箭头。
我一直在使用两种策略,(i) 在 rosette/safe
中构建综合代码,然后我可以切换到完整的语言,这很不方便,因为我不能使用更新和更高级的 Racker构造,以及 (ii) 浏览我在代码中使用的构造并检查它们是否是 rosette/base/base.rkt
的 "provided",这很烦人。
经验丰富的 Rosette 程序员有什么建议吗?
一种方法是在 rosette/safe
中开始编程,然后根据需要从 Racket 中明确要求您需要的结构。然后,如果出现问题,就可以更容易地找出他们在何时何地发生的事情。
因此,例如,您的代码将如下所示:
#lang rosette/safe
(require (only-in racket for assv))
随着代码库的增长,您还可以将所有这些导入收集到一个导出它们的模块中。然后,您的其余代码将需要该模块,它将充当您的自定义版本 rosette/safe
加上您需要的最少量 Racket 构造。