Racket 球拍模块合同把我弄糊涂了
模块:test-define.rktRacket 球拍模块合同把我弄糊涂了,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
#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,您的位置是什么时候?请不要离开,我会一次又一次刷新页面。我很高兴看到您回来。现在是环法自行车赛时间:-)