首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Dr.racket中调试和REPL模式的不同行为:修改常量

Dr.racket中调试和REPL模式的不同行为:修改常量
EN

Stack Overflow用户
提问于 2014-09-25 15:44:35
回答 2查看 188关注 0票数 1

我正在尝试在方案中编码我自己的单元测试库。到目前为止,在“定义”窗口中有以下代码:

代码语言:javascript
复制
#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提交以下代码时:

代码语言:javascript
复制
> (make-tests tests + (1 2 -> 3))
set!: assignment disallowed;
 cannot modify a constant
  constant: all-tests

然而,当我试图在Racket博士中调试它时:

代码语言:javascript
复制
(debug)> (make-tests tests + (1 2 -> 3))

(debug)> tests
(#<procedure:+> ((1 2)) (3))
(debug)> all-tests
((#<procedure:+> ((1 2)) (3)))

因此,由于某种原因,在Dr.racketv6.1中,我的代码在调试模式下工作,但在使用REPL时不工作。发生了什么,我如何调试我的代码?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-25 17:15:14

基于这个先前的答案上的注释:如果一个模块不改变绑定,您就不能从模块外部突变它。在REPL中运行的代码与模块中运行的代码不同。在球拍语言中的一个球拍源是一个模块,#lang scheme不是Scheme,而是#lang racket的同义词。

因此,要想得到您想要的行为,可以将(define all-tests '())替换为:

代码语言:javascript
复制
(define all-tests #f)
(set! all-tests '())   ; quick fix that makes all-test mutable

它会成功的。您也可以更深入地研究关于它的球拍文档

票数 2
EN

Stack Overflow用户

发布于 2014-09-25 17:39:37

您可以取消选中“动态属性”框中“选择语言”菜单中的“选择语言”菜单中的Enforce constant definition选项。

并作为你的宏的注解。为什么要为测试指定名称?名称没有放在列表中,除了将其定义为将其压缩为all-tests之外,它从未被使用过。你可以用一个let代替。当然,除非您稍后会对tests做一些事情。

代码语言:javascript
复制
(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)))]))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26042728

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档