[racket] Destructors in Racket
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>