[gambit-list] Puzzlement (different behavior of compiled code)
Marc Feeley
feeley at iro.umontreal.ca
Sun Jun 10 10:54:09 EDT 2012
Gambit is simply obeying your command! In the first invocation of gsc you are giving the -:s option which asks the compiler to assume the source code is using the standard Scheme syntax where '(path: ...) is a literal list whose first element is the *symbol* |path:|. But the procedure open-output-file is expecting a *keyword*. To make things clear look at this example:
---------------------------------------------------------
;; File: "foo.scm"
(define (type-of x)
(cond ((symbol? x) 'symbol)
((keyword? x) 'keyword)
(else 'other)))
(pp (map type-of
(list '|path:|
'path:
(string->symbol "path:")
(string->keyword "path"))))
---------------------------------------------------------
When compiled (with and without -:s) and executed, the program gives this output:
---------------------------------------------------------
% gsc foo ; gsi foo
(symbol keyword symbol keyword)
% gsc -:s foo ; gsi foo
(symbol symbol symbol keyword)
---------------------------------------------------------
So if you want to write code that will work with and without -:s, then the keywords should be constructed explicitly with string->keyword.
Marc
On 2012-06-09, at 5:52 PM, David Rush wrote:
> With Gambit 4.6.6, I am seeing decidedly different behavior for
> open-output-file between code compiled with gsc/gcc to run as a
> standalone executable and that same code compiled with gsc to run
> under gsi. The source code follows the body of the message, but the
> error from the standalone run tells the whole story, really.
> Specifically:
>
> ----------------------------------------------------------------------
> drr at dibbuk$ make target=gambit test/bug.gambit
> gsc -:s -link test/bug.Gambit
> gcc -I/home/drr/include test/bug.c test/bug_.c -o test/bug.gambit \
> -L/home/drr/lib -lgambc -lm -lutil -ldl
> drr at dibbuk$ test/bug.gambit
> *** ERROR IN flog-file -- (Argument 1) STRING or port settings expected
> (open-output-file '(|path:| "test.flog" |create:| maybe |append:| #t))
>
> drr at dibbuk$ gsc test/bug.Gambit
> drr at dibbuk$ gsi
> Gambit v4.6.6
>
>> (load "test/bug")
> "/home/drr/git/heureka/framework/test/bug.o2"
>> (main (vector "this is a test"))
>> (exit)
> drr at dibbuk$ cat test.flog
> this is a test
> this is a test
> ------------------------------------------------------------------------
>
> Now the repeated lines in test.flog are expected from the gsi case
> because the code is effectively run twice, once upon load and once
> manually (as will be seen from the source below). So what is going on
> with the standalone execution? I am very puzzled.
>
> the source code for bug.Gambit. This is the output of a preprocessor,
> so it looks a little strange, but it is really very straightforward.
>
> ------------------------------------------------------------------
> (define _cons_23 cons)
> (define *flog-use-current-output-port* #f)
> (define *flog-use-current-error-port* #f)
>
> (define
> flog-file
> (lambda
> (_file-name_38 _s_39)
> ((lambda
> (_f_40)
> (begin (display _s_39 _f_40)
> (newline _f_40)
> (if *flog-use-current-output-port*
> (display _s_39 (current-output-port)))
> (if *flog-use-current-error-port*
> (display _s_39 (current-error-port)))
> (close-output-port _f_40)))
> (open-output-file
> (_cons_23
> (quote path:)
> (_cons_23
> _file-name_38
> (quote (create: maybe append: #t))))))))
>
>
> (define
> main
> (lambda
> (_argv_38)
> (begin
> (flog-file "test.flog" "this is a test")
> )))
>
> (main (command-line))
> _______________________________________________
> Gambit-list mailing list
> Gambit-list at iro.umontreal.ca
> https://webmail.iro.umontreal.ca/mailman/listinfo/gambit-list
More information about the Gambit-list
mailing list