#574 closed defect (fixed)
Define-constant cannot be used with the FFI
Reported by: | sjamaan | Owned by: | felix winkelmann |
---|---|---|---|
Priority: | minor | Milestone: | 4.9.0 |
Component: | compiler | Version: | 4.6.x |
Keywords: | constants, ffi, foreign values | Cc: | |
Estimated difficulty: |
Description
I'm not 100% sure this is even a bug or just bad documentation/error messaging, but here goes:
If I compile the following "program", I get an error message:
(define-constant one (foreign-value "1" int))
The error says
Syntax error: cannot evaluate compiler-special-form (##core#define-foreign-variable code_0 int "1")
I can see why; in compiler.scm, line 1111 under ##core#define-constant
it runs eval
on the constant that's defined (unless it's a collapsible literal) but of course eval
doesn't have access to compiler syntax, so it dies.
The question is - should this be an error or not? It might make sense to just put the foreign value as-is in each usage point.
PS: there's a small spelling error in there, the predicate collapsable-literal?
should be collapsible-literal?
with an "i" instead of an "a".
Change History (4)
comment:1 Changed 14 years ago by
comment:2 Changed 14 years ago by
Milestone: | → 4.8.0 |
---|---|
Priority: | not urgent at all → minor |
The constant-value must be evaluatable at compile-time. I will document this. The example you give later actually is a bug - "x" is treated as a symbol, as you correctly point out. Yet it expands into a variable reference. I have to investigate this more.
comment:3 Changed 14 years ago by
Resolution: | → fixed |
---|---|
Status: | new → closed |
The example you give in your later comment will now trigger an error. Yes, any error in the evaluation of the constant expression will abort the compilation.
Oddly enough, the following does not give an error. When I run it, it cleanly prints the number 1 on stdout. (well, not that odd, as it's a collapsible literal symbol "x", I guess...)
What I really don't understand is why it doesn't say
"error in constant evaluation of ~S for named constant ~S"
wheneval
fails. Is the syntax-error-hook bound to some odd error handler which quits the compiler immediately? If so, any error in eval would cause this to happen, I think?