libera/#sbcl - IRC Chatlog
Search
13:40:31
phoe
Krystof: AFAIK SBCL at some point in time had a compile-time warning for things like (defstruct foo (x 0 :type string)) - do you know if I remember correctly and what happened to it?
13:41:48
Krystof
I can't remember when it got removed. (I think it was unintentionally, as a side-effect of something else)
13:45:32
phoe
1.5.9 mentions: enhancements: more thorough compile-time type checking of various initforms (defclass, &key, defstruct).
14:25:12
phoe
I mean, it's not the first time SBCL would issue type warnings that broke already broken code
14:25:15
phoe
example being https://github.com/AccelerationNet/access/commit/cadf09373da4afc739cf177d0fcea3612778a3f7
15:18:00
scymtym
phoe: try (locally (declare (optimize (safety 0))) (defstruct f (x (print t) :type fixnum)))
15:20:54
scymtym
phoe: i guess the reasoning is like "it breaks too much stuff if enabled by default, but for (safety 0) the type error can cause a (runtime) crash so the warning is justified there"
15:22:25
phoe
scymtym: is the "breaks too much stuff if enabled by default" documented anywhere? asking for the purpose of writing a SBCL RFC-esque mail for enabling additional compiler warnings, codename SB-PEDANTIC
15:24:28
scymtym
phoe: i think https://irclog.tymoon.eu/freenode/%23sbcl?around=1574802609#1574802609
15:28:59
scymtym
in any case, bac9b5e7a introduced the check and 1513ac241 (right before the release) restricted the check to (safety 0) so that's the timeframe in which the discussion (if any) must have happened
15:38:40
Krystof
my memory is that there was a primordial check for defstruct slot initforms and type, well before 1.0
16:02:38
phoe
which SBCL-defined packages are "external" and therefore meant to be depended on by other people, and which are "internal"? I can't see a list in the manual
16:05:40
phoe
still, there's 38 SB-FOO packages I have access in my image; I'd rather have an explicit ones of those that I should touch as a user
16:06:41
mfiano
My guess is stay away from sb-int, sb-c, sb-vm, and maybe more. If in doubt, look at nibbles :D
19:09:28
karlosz
wait, so is the consensus that we want to have (defstruct foo (x nil :type fixnum)) give a warning or not?
19:11:27
phoe
and the warning should become available once this whole idea for opt-in compiler warnings manifests itself
19:11:52
phoe
I should be able to write some sort of RFC soon and send it for review before it hits sbcl-devel
19:22:47
phoe
AFAIK it's the idea that the world will never be ready and adding more and more warnings harms backwards compatibility with buggy-but-working software systems by breaking their builds
19:23:13
phoe
so people who are developing new code can turn the warnings on, whereas people who have projects that need to Just Build™ can keep on using the defaults
19:24:59
karlosz
if the "world" = quicklisp, wouldnt it be easier and more effective if the slot typr mismatch initform warning is made its own condition? then quicklisp can just handle it specially
19:27:49
phoe
the world = quicklisp + the rest, and I have no idea if/how much code in "the rest" would be affected by that
19:35:37
phoe
karlosz: the best I know of is (alexandria:required-argument) I think which basically signals an error
19:36:32
phoe
"Required argument :FOO missing." with the stack frame showing the constructor - looks good enough for me
19:41:17
karlosz
would be even nicer if defstruct bound required-argument as a local function for each slot
19:45:12
stassats
defclass doesn't have an initform problem, because it has defined unbound slot behavior
19:45:43
phoe
sure - just thought that a nice "this argument is required" behavior would also be useful
19:48:26
phoe
as for CDRs, no idea - but note that e.g. PLNs became widespread without the CDR process
19:49:25
phoe
all it takes is someone who decides to make it their goal and then persist until the goal is done
19:51:48
phoe
"...it is initialized by evaluating slot-initform in the slot description at the time the constructor function is called."
19:53:00
phoe
except I can't imagine a situation in which that line of thought is useful for programmers - other than "it used to build yesterday, don't break it for me"
19:53:43
phoe
a mistyped initform like that is a bomb waiting for ignition, and signaling a warning at compilation time will be useful for people who care
19:54:29
phoe
or rather - not everyone cares about software that built and worked fine yesterday but doesn't cleanly build today
19:54:30
karlosz
"If it is never needed, there can be no type-mismatch error, even if the type of the slot is specified; no warning should be issued in this case."
19:55:52
phoe
you can figure out that you need to issue a warning without evaluating SLOT-INITFORM if you can--- exactly
19:56:13
phoe
a quoted form or a self-evaluating object can be analyzed without "evaluating the SLOT-INITFORM"
19:56:51
karlosz
my take is that it would be consistent with how we treat warnings in the rest of the system if we always warned on initform type mismatches
19:57:16
mfiano
"If it is never needed" is talked about runtime evaluation due to the mention of structure instance. Issuing a warning at compile time should be fine?
19:57:57
phoe
karlosz: I agree, except now I remember that I was on #sbcl during the time when Xach posted that thing - the list of the failures was pretty long, hence I used the word "spectacular" before
19:57:59
karlosz
yeah thats how i read it too. again irrelevant because "must" is not included anyway
19:58:26
phoe
I'd be fine with a warning like that, but the question is, how many people are going to complain at SBCL afterwards
19:58:42
karlosz
our usual practice is to fix those libraries or ask that warnings not stop those cases?
20:06:07
|3b|
i thought the argument that code that relies code that is specified to error actually erroring isn't actually broken
20:06:53
|3b|
defstruct with bad initializers generates a constructor that will error if called, and that is the desired behavior
20:10:32
|3b|
so the valid place for a warning would be on calls to the constructor that don't specify a value for that slot (which actually sounds useful now that i think about it. would such a warning also be possible if the slot-initform was (error...)?)
20:13:15
mfiano
|3b|: If I am reading the spec correctly, then only if it does not also specify a :type.