【发布时间】:2012-11-18 14:27:12
【问题描述】:
我的项目有一个实验,基本上,我需要在代码中嵌入一些s-expression并使其运行,就像这样,
(define (test lst)
(define num 1)
(define l (list))
`@lst) ; oh, this is not the right way to go.
(define lst
`( (define num2 (add1 num))
(displayln num2)))
我希望test 函数在球拍代码中的test(lst) 之后:
(define (test lst)
(define num 1)
(define l (list))
(define num2 (add1 num)
(displayln num2))
我怎样才能在球拍中做到这一点?
更新
我想使用eval 或之前的问题的原因是我正在使用 Z3 球拍绑定,我需要生成公式(使用球拍绑定 API),然后我会在某个时候触发查询,那是我需要评估这些代码。
在我的情况下,我还没有想出其他方法......
一个超级简单的例子是,想象一下(let ([arr (array-alloc 10)])(array-set! arr 3 4))
我有一些模型来分析结构(所以我没有直接使用racketZ3),在每个分析点的过程中,我都会将程序中的数据类型映射到Z3类型中,并做出一些断言,
我会生成类似的东西:
-
在分配现场,我需要制定以下公式:
(smt:declare-fun arr_z3 () IntList)(define len (make-length 10)) -
然后在数组设置站点,我将有以下断言并检查 3 是否小于长度
(smt:assert (</s 3 (len arr_z3)))(smt:check-sat) -
最后,我将收集如上生成的公式,并将它们包装在能够触发 Z3 绑定的形式中,以将以下收集的信息作为代码运行:
(smt:with-context
(smt:new-context)
(define len (make-length 10))
(smt:assert (</s 3 (len arr_z3))) (smt:check-sat))
这是我能想到的超级简单的例子……有意义吗?
旁注。 Z3 Racket binding 在 5.3.1 版本上会因为某种原因崩溃,但它在 5.2.1 版本上大部分都可以工作
【问题讨论】:
-
从这个加上你关于使用
eval的另一个问题stackoverflow.com/questions/13428091/…,听起来你想在运行时编写代码?你能帮助我们了解你想要做什么吗?eval可能不是最好的方法。 -
@GregHendershott 问题中的编辑是否清楚?
-
我只是快速浏览了github.com/sid0/z3.rkt/blob/master/examples/nqueens.rkt 的 Z3 包的 N-Queens 示例,我看不出有什么理由需要在这里使用语法级别的东西;为什么生成查询需要 eval?您能否提供一个超级简单的示例来说明您想要制定查询的方式?
-
@JohnClements 我更新了一个简单的示例来说明为什么以及如何需要生成公式并对其进行评估。
-
我看到你交叉发布到球拍语言列表,我认为这是一个优秀的想法。我也会把你的解释拖到那里,我认为你会得到很好的反馈。