Racket 球拍模块合同把我弄糊涂了

Racket 球拍模块合同把我弄糊涂了,racket,Racket,模块:test-define.rkt #lang racket (provide test) (provide (contract-out [add-test! (-> void)])) (define test 0) (define (add-test!) (set! test (add1 test))) 主程序:act.rkt #lang racket (require "test-define.rkt") (printf "~a~%" test) (add-tes

模块:test-define.rkt

#lang racket

(provide test)

(provide (contract-out [add-test! (-> void)]))

(define test 0)

(define (add-test!)
  (set! test (add1 test)))
主程序:act.rkt

#lang racket

(require "test-define.rkt")

(printf "~a~%" test)

(add-test!)

(printf "~a~%" test)
运行act.rkt,我得到:

0
1
这就是我想要的

但如果我在test-define.rkt中更改合同:

(provide test)
改为

(provide (contract-out [test integer?]))
然后我再次运行act.rkt,我得到:

0
0
为什么??我无法更改测试值

如果我提供一个get func,它将再次变为正常

(provide (contract-out [get-test (-> integer?)]))

(define (get-test)
  test)
若测试的类型更改为哈希映射,那个么它总是正常的


我遗漏了什么?

我注意到在test-define.rkt中有这一行

(set! test3 (add1 test))
test3
应该是
test

这也许可以解释为什么您看到两个零(测试从未改变)

编辑2

为了方便起见,我将两个模块放在同一个文件中 并更改了测试合同:

#lang racket
(module test-define racket 
  (provide test)
  ; (provide (contract-out [test integer?]))
  (provide get-test)
  (provide (contract-out [add-test! (-> void)]))
  (define test 0)
  (define (add-test!)
    (set! test (add1 test)))
  (define (get-test)
  test))

(module ack racket
  (require (submod ".." test-define))
  (printf "~a~%" test)
  (add-test!)
  (printf "~a~%" test))

(require (submod "." ack))
现在,我看到了与您一样的0 1 vs 0输出

嗯,为什么

嗯。如果我们将表格更改为不使用合同 总之,输出是0 1

添加合同不应该改变这种行为(我认为)。 也许是虫子

说:

合同库假定通过合同导出的变量为 未指定,但不强制执行。因此,如果您尝试 开始!对于这些变量,你可能会感到惊讶。。。剪寓意:这 是一个我们将在未来版本中解决的bug


谢谢你的回答,这是我的第一个答案!但这是我的类型错误,我已经解决了。这个问题让我困惑,是球拍模块或合同的一些基本理论让我喘不过气来吗?我不能像上面那样运行你的ack.rkt。缺少
get test
的定义。非常抱歉,我再次输入错误。它应该是:(printf“~a~%”测试)我的球拍版本是5.2.1。谢谢您的回复,我期待您的回答。现在我的当地时间是晚上10:00,您的位置是什么时候?请不要离开,我会一次又一次刷新页面。我很高兴看到您回来。现在是环法自行车赛时间:-)