gpt4 book ai didi

Racket 模块契约(Contract)让我困惑

转载 作者:行者123 更新时间:2023-12-02 07:02:51 26 4
gpt4 key购买 nike

模块: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 中的契约(Contract):

(provide test)

更改为

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

然后我再次运行 act.rkt,我得到:

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

如果我提供 get func,它会再次正常。

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

(define (get-test)
test)

如果test的类型改为hash map,总是正常的。

我错过了什么?

最佳答案

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

(set! test3 (add1 test))

test3应该是test吗?

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

编辑2

为了方便起见,我将你的两个模块放在同一个文件中并更改了测试契约(Contract):

#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 与 0 0 输出。

嗯。为什么?

嗯。如果我们将提供形式更改为不使用契约(Contract)总而言之,输出是 0 1。

添加契约(Contract)不应该改变这种行为(我认为)。也许是一个错误?

http://pre.racket-lang.org/docs/html/guide/contracts-gotchas.html?q=contract&q=ignore

说:

The contract library assumes that variables exported via contract-out are not assigned to, but does not enforce it. Accordingly, if you try to set! those variables, you may be surprised. ...snip... Moral: This is a bug that we will address in a future release.

关于 Racket 模块契约(Contract)让我困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11598523/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com