Le dimanche 7 mai 2017 07:27:08 UTC+2, Daniel Prager a écrit : > 1. Default argument goes missing from post-condition, leading to an > unexpected error ...
You should use unsupplied-arg? . But I couldn't find a way to get the default value from the contract. I would guess that the problem is that the contract can be specified separately from the function, and the function itself knows the default argument's value. In the general case, extracting the default argument's value (without running the default expression multiple times) might be tricky. > 2. contract-exercise seems to miss explicit #pre-conditions ... This does look like a real (pun intended) problem. > 3. post-conditions appear to be called twice ... With the code below, the post-condition only gets called once: #lang racket (define/contract (real-sqrt x) (->i ([x real?]) #:pre (x) (>= x 0) [result any/c] #:post (result) (begin (displayln result) (>= result 0))) (sqrt x)) (real-sqrt 1) With this code, however, the contract does get called twice: #lang racket (define/contract (real-sqrt x) (->i ([x real?]) #:pre (x) (>= x 0) [result (λ (result) (displayln result) (>= result 0))] #:post (result) #t) (sqrt x)) (real-sqrt 1) See this very interesting thread on the mailing list for a detailed discussion about this https://groups.google.com/forum/#!searchin/racket-users/contract$20twice%7Csort:relevance/racket-users/SUzcozdPh6Q/bjgEjTyQEAAJ . Short story: if one of the arguments is a function, and a dependent #:pre, #:post, argument or result contract calls that function, you want it to be protected. The contract therefore needs to be applied to the argument before it is passed to the other dependent clause, and is applied again when actually calling the function. > Finally, some timings. Thanks for taking the time to test this out :) . -- You received this message because you are subscribed to the Google Groups "Racket Users" group. To unsubscribe from this group and stop receiving emails from it, send an email to racket-users+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.