[racket] Destructors in Racket

From: Roman Klochkov (kalimehtar at mail.ru)
Date: Sat Aug 2 07:15:43 EDT 2014

 Then how?

Suppose I have
(struct obj (file))
(define my-obj (obj (open-output-file "out.dat")))

What I have to write to close the file, when my-obj will be GC'ed?

I can write
(define will (make-will-executor))
(will-register will my-obj (lambda (x) (close-output-port (obj-file x))))

But as far as I understand, it will not be called until `will-execute' or `will-try-execute' will be manually called?

Then how to call will-try-execute when GC is collecting my-obj?

Sat, 2 Aug 2014 11:57:32 +0100 от Matthew Flatt <mflatt at cs.utah.edu>:
>No, use the safe "will executors" API, instead.
>The unsafe finalizer API is for low-level, atomic finalization. Closing a port can flush buffers and more, and it's not a good idea to do that in an unsafe atomic context.
>> On Aug 2, 2014, at 11:12 AM, Roman Klochkov < kalimehtar at mail.ru > wrote:
>> I have a structure, that has a filestream inside it. File have to be cosed, when the structure is not used anymore (so gargbage collected).
>> Is the best way to do
>> (require ffi/unsafe)
>> (register-finalizer my-obj
>>    (lambda (x) (close-output-port (obj-file x))))
>> ?
>> It seems doing right thing, but why `ffi/unsafe'? Is it OK, when my program actually doesn't use FFI?
>> -- 
>> Roman Klochkov
>> ____________________
>>  Racket Users list:
>>  http://lists.racket-lang.org/users

Roman Klochkov
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.racket-lang.org/users/archive/attachments/20140802/c05c1016/attachment-0001.html>

Posted on the users mailing list.