我正在尝试在方案中编码我自己的单元测试库。到目前为止,在“定义”窗口中有以下代码:
#lang scheme
(define all-tests '())
(define-syntax make-tests
(syntax-rules (->)
[(_ test-name function (args ... -> result) ...)
(begin
(define test-name
(list function (list (list args ...) ...) (list result ...)))
(set! all-tests (cons test-name all-tests)))]))使用Racket博士时,当我向REPL提交以下代码时:
> (make-tests tests + (1 2 -> 3))
set!: assignment disallowed;
cannot modify a constant
constant: all-tests然而,当我试图在Racket博士中调试它时:
(debug)> (make-tests tests + (1 2 -> 3))
(debug)> tests
(#<procedure:+> ((1 2)) (3))
(debug)> all-tests
((#<procedure:+> ((1 2)) (3)))因此,由于某种原因,在Dr.racketv6.1中,我的代码在调试模式下工作,但在使用REPL时不工作。发生了什么,我如何调试我的代码?
发布于 2014-09-25 17:15:14
基于这个先前的答案上的注释:如果一个模块不改变绑定,您就不能从模块外部突变它。在REPL中运行的代码与模块中运行的代码不同。在球拍语言中的一个球拍源是一个模块,#lang scheme不是Scheme,而是#lang racket的同义词。
因此,要想得到您想要的行为,可以将(define all-tests '())替换为:
(define all-tests #f)
(set! all-tests '()) ; quick fix that makes all-test mutable它会成功的。您也可以更深入地研究关于它的球拍文档。
发布于 2014-09-25 17:39:37
您可以取消选中“动态属性”框中“选择语言”菜单中的“选择语言”菜单中的Enforce constant definition选项。
并作为你的宏的注解。为什么要为测试指定名称?名称没有放在列表中,除了将其定义为将其压缩为all-tests之外,它从未被使用过。你可以用一个let代替。当然,除非您稍后会对tests做一些事情。
(define-syntax make-tests
(syntax-rules (->)
[(_ function (args ... -> result) ...)
(let
((test (list function (list (list args ...) ...) (list result ...))))
(set! all-tests (cons test all-tests)))]))https://stackoverflow.com/questions/26042728
复制相似问题