12:48:08jmercourisI'm not sure if this is a problem specific to the Sqlite driver and I won't have problems on postgres or mysql, however cl-dbi doesn't seem to have a "execute-queries" or something like that

12:48:09jdzYes, that's an SQLite error. So you can use a real database, or have each SQL statement in a separate file.

22:09:16verisimilitudeAda's system for preventing just this manner of thing comes to mind; you can use the overriding keyword to cause a compilation error if the subprogram doesn't actually override something or not overriding to do the opposite.

22:10:28verisimilitudeI suppose I'd rather have a superfluous warning when purposefully doing this, since it would also cover this case.

22:25:00pjbThe other solution is 1- respect the Lysoff substitution principle, 2- to use next-method-p and call-next-method when appropriate, 3- to use method combinations when appropriate, 4- not care whether there's other methods or not, since methods can be added or removed dynamically.

22:32:30aethFailing early can be good. e.g. It would be nice to see if a CLEANUP method exists before the program runs instead of at the very end.

22:33:07aethWell, not really before the program runs. Right at the start before anything is really started is often good enough.

22:40:46pjbaeth: already, with CL you have multiple dispatch, and multiple inheritance. So it doesn't make much sense to expect to "override" or not a method.

22:41:23pjbasarch: I can't load your file because there's no defpackage or in-package.

22:42:27pjbasarch: for example, if I use CL and CLIM, there's: Using #<Package "COMMON-LISP"> in #<Package "FOO"> would cause name conflicts with symbols inherited by that package: interactive-stream-p clim-lisp-patch:interactive-stream-p

22:51:07aethpjb: What I mean is that some APIs are simply "if it implements #'bar it's okay" but if #'bar is only called at the end, or at least hours in, it could take you quite some time to realize that something's missing!

22:51:10pjbasarch: when I define a package, and the *application-frame* variable, there's no error.

22:51:51pjbaeth: Granted, API should be defined studily. This is why I have some doubt about using generic functions in APIs…

23:00:43aethpjb: I'm not sure there's a better solution than calling a #'cleanup method at the end of an unwind protect if it's a framework (with inversion of control: i.e. it is in charge of the control flow) that wraps everything in an unwind-protect.

23:00:47aethAnd that cleanup could have just about anything, including freeing foreign data if CFFI-wrapped libraries are used, other calls to cleanup, resetting globals, etc.

23:01:37aethThe main drawback, of course, is that that method is essentially by definition called exactly once at the very end, so if it's missing it will take some time to find out when ideally you want to verify that it's there before init.