After a few rounds of golf I have arrived at this minimal demonstration of a problem where the arguments that a C function receives are not the arguments it is given.
Originally the *wtf* let also declared an integer to look up but this was removed by the golf. If it were still there then only the *wtf* let and the final (map) would be necessary to see the problem occur. Everything else is here to demonstrate the problem not occurring. I have tested with today's s7 tarball. (require cload.scm) ; This is broken: (define *wtf* (let () (c-define `( (C-function ("anything" _anything "..." 2)) (in-C "static s7_pointer _anything (s7_scheme *sc, s7_pointer args) { printf(\"%s\", s7_object_to_c_string(sc, args)); return s7_nil(sc); }")) "" () "" "" "libs7crash") (curlet))) ; This is for demonstration: (define *other* (let ((one 1)) (define (anything . AB) (format #t "~A" AB) ()) (curlet))) ; Works fine if looping with for-each (for-each (lambda (N) ((*wtf* 'anything) "any string" (logior 42 (*other* 'one)))) '(ok fail)) (newline) ; -> ("any string" 43)("any string" 43) ; Works fine if not calling a C function (map (lambda (N) ((*other* 'anything) "any string" (logior 42 (*other* 'one)))) '(ok fail)) (newline) ; -> ("any string" 43)("any string" 43) ; This combination fails: ; call a C function found in a let ; have one of its arguments be a simple call to logior (or some others) ; have one of logior's arguments be looked up in a (any) let. ; loop at least twice ; ; The first argument to the C function will be replaced by the first ; argument to logior on the second and subsequent loop iterations (map (lambda (N) ((*wtf* 'anything) "any string" (logior 42 (*other* 'one)))) '(ok fail)) (newline) ; -> ("any string" 43)(42 43) Matthew _______________________________________________ Cmdist mailing list Cmdist@ccrma.stanford.edu https://cm-mail.stanford.edu/mailman/listinfo/cmdist