* Reporting possibly unbound variables @ 2009-10-06 22:21 Ludovic Courtès 2009-10-07 20:27 ` Neil Jerram 0 siblings, 1 reply; 10+ messages in thread From: Ludovic Courtès @ 2009-10-06 22:21 UTC (permalink / raw) To: guile-devel Hello, I just committed support for ‘-Wunbound-variable’: http://git.sv.gnu.org/cgit/guile.git/commit/?id=f67ddf9dbfec851676806a2f3dff7eae539ac499 It works pretty well, except for occurrences of ‘define-class’ et al., which lead to false positives because the code generated by these macros doesn’t use ‘define’ (this is to make sure a top-level binding is created, not a lexical one.) Ideas on how to “fix” it? (Presumably I won’t work on it again until after 1.9.4.) Thanks, Ludo’. ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: Reporting possibly unbound variables 2009-10-06 22:21 Reporting possibly unbound variables Ludovic Courtès @ 2009-10-07 20:27 ` Neil Jerram 2009-10-07 21:53 ` Ludovic Courtès 2009-10-19 18:56 ` Reporting possibly unbound variables Andy Wingo 0 siblings, 2 replies; 10+ messages in thread From: Neil Jerram @ 2009-10-07 20:27 UTC (permalink / raw) To: Ludovic Courtès; +Cc: guile-devel ludo@gnu.org (Ludovic Courtès) writes: > Hello, > > I just committed support for ‘-Wunbound-variable’: > > http://git.sv.gnu.org/cgit/guile.git/commit/?id=f67ddf9dbfec851676806a2f3dff7eae539ac499 Looks great! > It works pretty well, except for occurrences of ‘define-class’ et al., > which lead to false positives because the code generated by these macros > doesn’t use ‘define’ (this is to make sure a top-level binding is > created, not a lexical one.) > > Ideas on how to “fix” it? Are there deeper problems with compilation and define-class / module-define? E.g. is it possible that correct compilation of code following a define-class or module-define would be dependent on understanding the define-class/module-define properly? If so, I guess either the compiler needs to recognise and process these calls specially - in which case it should be easy for it also to pass appropriate information to your unbound variable check - or we could provide some kind of compile-time declaration form, and say that correct compilation and unbound variable checking requires this to be used. On a loosely related point, I notice that we have deprecated eval-case in 1.9.x, in favour of eval-when. But 1.8.x only has eval-case; so isn't the deprecation going to make it more difficult to handle code that has to be different in 1.8.x and 1.9/2.0? (For example, 1.8.x requires the comma trick in a macro definition that uses a non-exported procedure from the same module, whereas 1.9/2.0 requires not using a comma.) Alternatively, should we add a suitable eval-when to the next 1.8.x release, to help with this? Regards, Neil ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: Reporting possibly unbound variables 2009-10-07 20:27 ` Neil Jerram @ 2009-10-07 21:53 ` Ludovic Courtès 2009-10-19 18:58 ` Andy Wingo 2009-10-19 18:56 ` Reporting possibly unbound variables Andy Wingo 1 sibling, 1 reply; 10+ messages in thread From: Ludovic Courtès @ 2009-10-07 21:53 UTC (permalink / raw) To: guile-devel Hi, Neil Jerram <neil@ossau.uklinux.net> writes: > Are there deeper problems with compilation and define-class / > module-define? E.g. is it possible that correct compilation of code > following a define-class or module-define would be dependent on > understanding the define-class/module-define properly? No. For any variable that’s not lexically bound, the compiler generates instructions that amount to ‘(module-ref (current-module) VAR)’. Note that the warning reports /possibly/ unbound variables. Variables that get bound at run-time via ‘module-define!’ or similar are ignored, and that’s precisely what ‘define-class’ does. > On a loosely related point, I notice that we have deprecated eval-case > in 1.9.x, in favour of eval-when. But 1.8.x only has eval-case; so > isn't the deprecation going to make it more difficult to handle code > that has to be different in 1.8.x and 1.9/2.0? Yes, I agree it’s problematic. What about leaving both forms for 2.0, and only deprecating ‘eval-case’ in the next stable series? > Alternatively, should we add a suitable eval-when to the next 1.8.x > release, to help with this? That wouldn’t help much since it wouldn’t work with < 1.8.8. Thanks, Ludo’. ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: Reporting possibly unbound variables 2009-10-07 21:53 ` Ludovic Courtès @ 2009-10-19 18:58 ` Andy Wingo 2009-10-20 8:08 ` Ludovic Courtès 0 siblings, 1 reply; 10+ messages in thread From: Andy Wingo @ 2009-10-19 18:58 UTC (permalink / raw) To: Ludovic Courtès; +Cc: guile-devel On Wed 07 Oct 2009 23:53, ludo@gnu.org (Ludovic Courtès) writes: >> Alternatively, should we add a suitable eval-when to the next 1.8.x >> release, to help with this? > > That wouldn’t help much since it wouldn’t work with < 1.8.8. You could have a local module in your program that provides eval-when. Perhaps you could use the new cond-expand key to include it if necessary. Andy -- http://wingolog.org/ ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: Reporting possibly unbound variables 2009-10-19 18:58 ` Andy Wingo @ 2009-10-20 8:08 ` Ludovic Courtès 2009-10-20 18:42 ` Andy Wingo 0 siblings, 1 reply; 10+ messages in thread From: Ludovic Courtès @ 2009-10-20 8:08 UTC (permalink / raw) To: Andy Wingo; +Cc: guile-devel Hello! Andy: What about leaving both ‘eval-case’ and ‘eval-when’ for 2.0, and only deprecating ‘eval-case’ in the next stable series? Thanks, Ludo’. ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: Reporting possibly unbound variables 2009-10-20 8:08 ` Ludovic Courtès @ 2009-10-20 18:42 ` Andy Wingo 2009-10-21 11:59 ` eval-case Ludovic Courtès 0 siblings, 1 reply; 10+ messages in thread From: Andy Wingo @ 2009-10-20 18:42 UTC (permalink / raw) To: Ludovic Courtès; +Cc: guile-devel On Tue 20 Oct 2009 10:08, ludo@gnu.org (Ludovic Courtès) writes: > Andy: What about leaving both ‘eval-case’ and ‘eval-when’ for 2.0, and > only deprecating ‘eval-case’ in the next stable series? The problem is that eval-case has really murky semantics -- to me at least. We've *never* needed to use it in the past, to my knowledge, except to distinguish toplevel expressions from lexically nested expressions -- an iffy use, IMO. (Any definition should be valid anywhere a definition is valid.) So I think we should /discourage/ eval-case -- but how would people know if it weren't deprecated? It's still there, in deprecated.scm. I would say deprecate it now, and remove it in the next series. Andy -- http://wingolog.org/ ^ permalink raw reply [flat|nested] 10+ messages in thread
* eval-case 2009-10-20 18:42 ` Andy Wingo @ 2009-10-21 11:59 ` Ludovic Courtès 2009-10-21 18:06 ` eval-case Andy Wingo 0 siblings, 1 reply; 10+ messages in thread From: Ludovic Courtès @ 2009-10-21 11:59 UTC (permalink / raw) To: guile-devel Hello! Andy Wingo <wingo@pobox.com> writes: > The problem is that eval-case has really murky semantics -- to me at > least. We've *never* needed to use it in the past, to my knowledge, > except to distinguish toplevel expressions from lexically nested > expressions -- an iffy use, IMO. (Any definition should be valid > anywhere a definition is valid.) Right, it was essentially useless, but supposedly it was added with Guile-VM in mind---how visionary! :-) My suggestion to not deprecate it in 2.0 was motivated by 1.8/2.0 portability. ‘eval-case’ in 1.8 only understands the ‘load-toplevel’ clause. In 2.0, we could add a ‘compile’ clause. That clause is never true in 1.8, but in 2.0 it could amount to ‘(eval-when (compile) ...)’. This is so that people could place things like ‘current-reader’ effects on the right phase: (eval-case ((compile) (display "current-reader effects for 2.0\n")) (else (display "current-reader effects for 1.8\n"))) (Actually this isn’t perfect because the ‘else’ branch would also been taken in 2.0 at load-time.) OTOH, with ‘(cond-expand (guile-2 ...))’, one can achieve this and more, which may be a good reason to not worry about it. Thanks, Ludo’. ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: eval-case 2009-10-21 11:59 ` eval-case Ludovic Courtès @ 2009-10-21 18:06 ` Andy Wingo 0 siblings, 0 replies; 10+ messages in thread From: Andy Wingo @ 2009-10-21 18:06 UTC (permalink / raw) To: Ludovic Courtès; +Cc: guile-devel On Wed 21 Oct 2009 13:59, ludo@gnu.org (Ludovic Courtès) writes: > OTOH, with ‘(cond-expand (guile-2 ...))’, one can achieve this and more, > which may be a good reason to not worry about it. Would you be happy settling on this? Andy -- http://wingolog.org/ ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: Reporting possibly unbound variables 2009-10-07 20:27 ` Neil Jerram 2009-10-07 21:53 ` Ludovic Courtès @ 2009-10-19 18:56 ` Andy Wingo 2009-10-19 21:23 ` Neil Jerram 1 sibling, 1 reply; 10+ messages in thread From: Andy Wingo @ 2009-10-19 18:56 UTC (permalink / raw) To: Neil Jerram; +Cc: Ludovic Courtès, guile-devel On Wed 07 Oct 2009 22:27, Neil Jerram <neil@ossau.uklinux.net> writes: > ludo@gnu.org (Ludovic Courtès) writes: > >> It works pretty well, except for occurrences of ‘define-class’ et al., >> which lead to false positives because the code generated by these macros >> doesn’t use ‘define’ (this is to make sure a top-level binding is >> created, not a lexical one.) >> >> Ideas on how to “fix” it? > > Are there deeper problems with compilation and define-class / > module-define? E.g. is it possible that correct compilation of code > following a define-class or module-define would be dependent on > understanding the define-class/module-define properly? I don't think there are problems, no... > If so, I guess either the compiler needs to recognise and process these > calls specially - in which case it should be easy for it also to pass > appropriate information to your unbound variable check - or we could > provide some kind of compile-time declaration form, and say that correct > compilation and unbound variable checking requires this to be used. Well the compiler could recognize module-define as a primitive, and potentially transform it to be a <toplevel-define>. But that would happen after the unbound-variables check runs -- so I don't know. Another possibility would be a hack, but hey: have the -Wunbound thing detect (if (defined? ...) ...) forms, and do something appropriate. > On a loosely related point, I notice that we have deprecated eval-case > in 1.9.x, in favour of eval-when. But 1.8.x only has eval-case; so > isn't the deprecation going to make it more difficult to handle code > that has to be different in 1.8.x and 1.9/2.0? Perhaps, though if you are updating already to 2.0, I would just make a 2.0 compatibility library, as far as possible. In macros you could do the @/@@ trick. > (For example, 1.8.x requires the comma trick in a macro definition that > uses a non-exported procedure from the same module, whereas 1.9/2.0 > requires not using a comma.) See NEWS line 282 :) And add something or propose new behavior, as appropriate. > Alternatively, should we add a suitable eval-when to the next 1.8.x > release, to help with this? I think that would be a good idea, yes. Andy -- http://wingolog.org/ ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: Reporting possibly unbound variables 2009-10-19 18:56 ` Reporting possibly unbound variables Andy Wingo @ 2009-10-19 21:23 ` Neil Jerram 0 siblings, 0 replies; 10+ messages in thread From: Neil Jerram @ 2009-10-19 21:23 UTC (permalink / raw) To: Andy Wingo; +Cc: Ludovic Courtès, guile-devel Andy Wingo <wingo@pobox.com> writes: > On Wed 07 Oct 2009 22:27, Neil Jerram <neil@ossau.uklinux.net> writes: > >> On a loosely related point, I notice that we have deprecated eval-case >> in 1.9.x, in favour of eval-when. But 1.8.x only has eval-case; so >> isn't the deprecation going to make it more difficult to handle code >> that has to be different in 1.8.x and 1.9/2.0? > > Perhaps, though if you are updating already to 2.0, I would just make a > 2.0 compatibility library, as far as possible. Yes, you're right. I think I was a bit confused when I wrote the above, thinking that eval-case/eval-when was something like cond-expand. In fact Ludovic's suggestion for (cond-expand (guile-2) ...) will be enough. > In macros you could do the @/@@ trick. > >> (For example, 1.8.x requires the comma trick in a macro definition that >> uses a non-exported procedure from the same module, whereas 1.9/2.0 >> requires not using a comma.) > > See NEWS line 282 :) Nice entry! > And add something or propose new behavior, as appropriate. I don't think we need anything else. People can use @@ if they want code that works in both 1.8.x and 2.0, or cond-expand for different versions. >> Alternatively, should we add a suitable eval-when to the next 1.8.x >> release, to help with this? > > I think that would be a good idea, yes. As Ludovic said, that would only help 1.8.8 and onwards. I think it would be better to add this to a compatibility library, as and when it's needed. Neil ^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2009-10-21 18:06 UTC | newest] Thread overview: 10+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2009-10-06 22:21 Reporting possibly unbound variables Ludovic Courtès 2009-10-07 20:27 ` Neil Jerram 2009-10-07 21:53 ` Ludovic Courtès 2009-10-19 18:58 ` Andy Wingo 2009-10-20 8:08 ` Ludovic Courtès 2009-10-20 18:42 ` Andy Wingo 2009-10-21 11:59 ` eval-case Ludovic Courtès 2009-10-21 18:06 ` eval-case Andy Wingo 2009-10-19 18:56 ` Reporting possibly unbound variables Andy Wingo 2009-10-19 21:23 ` Neil Jerram
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).