My best guess is that it's an issue with memory management, because memory management gets a lot trickier when you call a function that can call back into Racket. A GC can happen during the callback, and therefore during the dynamic extent of the foreign-function call, which can move arguments that were passed to the foreign function, for example.
Would it be possible to provide a complete example? At Sat, 13 Sep 2014 22:45:28 +0700 (NOVT), "Evgeny Odegov" wrote: > Oh, I'm wrong. The last code is not equivalent to initial. > The equivalent code has this problem: > > (define result (make-hash)) > (define big-list (list)) > (define (callback dwTextID lpszInfoText lpvUser) > (if (equal? lpszInfoText "") > (set! big-list (append big-list (list dwTextID))) > (hash-update! result > lpszInfoText > (lambda (id-lst) > (define v (list dwTextID)) > (append id-lst v)) > '())) > #t) > > > The code with `cons' instead `append' works fine: > > (define result (make-hash)) > (define (callback dwTextID lpszInfoText lpvUser) > (hash-update! result > lpszInfoText > (lambda (id-lst) > (define new-id-lst (cons dwTextID id-lst)) > (unless (list? new-id-lst) > > (error "~v" new-id-lst)) > new-id-lst) > '()) > #t) > > > > > ____________________ > Racket Users list: > http://lists.racket-lang.org/users ____________________ Racket Users list: http://lists.racket-lang.org/users