ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/common-sense/sense.pm
(Generate patch)

Comparing common-sense/sense.pm (file contents):
Revision 1.13 by root, Tue Sep 1 13:42:29 2009 UTC vs.
Revision 1.20 by root, Fri Oct 30 02:50:35 2009 UTC

4 4
5=head1 SYNOPSIS 5=head1 SYNOPSIS
6 6
7 use common::sense; 7 use common::sense;
8 8
9 # roughly the same as, with much lower memory usage: 9 # supposed to be the same, with much lower memory usage, as:
10 # 10 #
11 # use strict qw(vars subs); 11 # use strict qw(vars subs);
12 # use feature qw(say state switch); 12 # use feature qw(say state switch);
13 # no warnings; 13 # no warnings;
14 # use warnings qw(FATAL closed threads internal debugging pack substr malloc
15 # unopened portable prototype inplace io pipe unpack regexp
16 # deprecated exiting glob digit printf utf8 layer
17 # reserved parenthesis taint closure semicolon);
18 # no warnings qw(exec newline);
14 19
15=head1 DESCRIPTION 20=head1 DESCRIPTION
16 21
17This module implements some sane defaults for Perl programs, as defined by 22This module implements some sane defaults for Perl programs, as defined by
18two typical (or not so typical - use your common sense) specimens of 23two typical (or not so typical - use your common sense) specimens of Perl
19Perl coders. 24coders.
20 25
21=over 4 26=over 4
22 27
23=item no warnings 28=item use strict qw(subs vars)
29
30Using C<use strict> is definitely common sense, but C<use strict
31'refs'> definitely overshoots its usefulness. After almost two
32decades of Perl hacking, we decided that it does more harm than being
33useful. Specifically, constructs like these:
34
35 @{ $var->[0] }
36
37Must be written like this (or similarly), when C<use strict 'refs'> is in
38scope, and C<$var> can legally be C<undef>:
39
40 @{ $var->[0] || [] }
41
42This is annoying, and doesn't shield against obvious mistakes such as
43using C<"">, so one would even have to write (at least for the time
44being):
45
46 @{ defined $var->[0] ? $var->[0] : [] }
47
48... which nobody with a bit of common sense would consider
49writing: clear code is clearly something else.
50
51Curiously enough, sometimes perl is not so strict, as this works even with
52C<use strict> in scope:
53
54 for (@{ $var->[0] }) { ...
55
56If that isn't hypocrisy! And all that from a mere program!
57
58
59=item use feature qw(say state given)
60
61We found it annoying that we always have to enable extra features. If
62something breaks because it didn't anticipate future changes, so be
63it. 5.10 broke almost all our XS modules and nobody cared either (or at
64least I know of nobody who really complained about gratuitous changes -
65as opposed to bugs).
66
67Few modules that are not actively maintained work with newer versions of
68Perl, regardless of use feature or not, so a new major perl release means
69changes to many modules - new keywords are just the tip of the iceberg.
70
71If your code isn't alive, it's dead, Jim - be an active maintainer.
72
73
74=item no warnings, but a lot of new errors
24 75
25Ah, the dreaded warnings. Even worse, the horribly dreaded C<-w> 76Ah, the dreaded warnings. Even worse, the horribly dreaded C<-w>
26switch: Even though we don't care if other people use warnings (and 77switch: Even though we don't care if other people use warnings (and
27certainly there are useful ones), a lot of warnings simply go against the 78certainly there are useful ones), a lot of warnings simply go against the
28spirit of Perl. 79spirit of Perl.
29 80
30Most prominently, the warnings related to C<undef>. There is nothing wrong 81Most prominently, the warnings related to C<undef>. There is nothing wrong
31with C<undef>: it has well-defined semantics, it is useful, and spitting 82with C<undef>: it has well-defined semantics, it is useful, and spitting
32out warnings you never asked for is just evil. 83out warnings you never asked for is just evil.
33 84
34So every module needs C<no warnings> to avoid somebody accidentally using 85The result was that every one of our modules did C<no warnings> in the
35C<-w> and forcing his bad standards on our code. No will do. Really, the 86past, to avoid somebody accidentally using and forcing his bad standards
36C<-w> switch should only enable wanrings for the main program. 87on our code. Of course, this switched off all warnings, even the useful
88ones. Not a good situation. Really, the C<-w> switch should only enable
89warnings for the main program only.
37 90
38Funnily enough, L<perllexwarn> explicitly mentions C<-w> (and not in a 91Funnily enough, L<perllexwarn> explicitly mentions C<-w> (and not in a
39favourable way), but standard utilities, such as L<prove>, or MakeMaker 92favourable way, calling it outright "wrong"), but standard utilities, such
40when running C<make test> enable them blindly. 93as L<prove>, or MakeMaker when running C<make test>, still enable them
94blindly.
41 95
42=item use strict qw(subs vars) 96For version 2 of common::sense, we finally sat down a few hours and went
97through I<every single warning message>, identifiying - according to
98common sense - all the useful ones.
43 99
44Using C<use strict> is definitely common sense, but C<use strict 100This resulted in the rather impressive list in the SYNOPSIS. When we
45'refs'> definitely overshoots its usefulness. After almost two 101weren't sure, we didn't include the warning, so the list might grow in
46decades of Perl hacking, we decided that it does more harm than being 102the future (we might have made a mistake, too, so the list might shrink
47useful. Specifically, constructs like these: 103as well).
48 104
49 @{ $var->[0] } 105Note the presence of C<FATAL> in the list: we do not think that the
106conditions caught by these warnings are worthy of a warning, we I<insist>
107that they are worthy of I<stopping> your program, I<instantly>. They are
108I<bugs>!
50 109
51Must be written like this (or similarly), when C<use strict 'refs'> is in 110Therefore we consider C<common::sense> to be much stricter than C<use
52scope, and C<$var> can legally be C<undef>: 111warnings>, which is good if you are into strict things (we are not,
112actually, but these things tend to be subjective).
53 113
54 @{ $var->[0] || [] } 114After deciding on the list, we ran the module against all of our code that
115uses C<common::sense> (that is almost all of our code), and found only one
116occurence where one of them caused a problem: one of elmex's (unreleased)
117modules contained:
55 118
56This is annoying, and doesn't shield against obvious mistakes such as 119 $fmt =~ s/([^\s\[]*)\[( [^\]]* )\]/\x0$1\x1$2\x0/xgo;
57using C<"">, so one would even have to write (at least for the time
58being):
59 120
60 @{ defined $var->[0] ? $var->[0] : [] } 121We quickly agreed that indeed the code should be changed, even though it
122happened to do the right thing when the warning was switched off.
61 123
62... which nobody with a bit of common sense would consider
63writing.
64
65Curiously enough, sometimes perl is not so strict, as this works even with
66C<use strict> in scope:
67
68 for (@{ $var->[0] }) { ...
69
70If that isn't hipocrasy! And all that from a mere program!
71
72=item use feature qw(say state given)
73
74We found it annoying that we always have to enable extra features. If
75something breaks because it didn't anticipate future changes, so be
76it. 5.10 broke almost all our XS modules and nobody cared either (or at
77leats I know of nobody who really complained about gratitious changes - as
78opposed to bugs).
79
80Few modules that are not actively maintained work with newer versions of
81Perl, regardless of use feature or not, so a new major perl release means
82changes to many modules - new keywords are just the tip of the iceberg.
83
84If your code isn't alive, it's dead, jim - be an active maintainer.
85 124
86=item mucho reduced memory usage 125=item mucho reduced memory usage
87 126
88Just using all those pragmas mentioned in the SYNOPSIS together wastes 127Just using all those pragmas mentioned in the SYNOPSIS together wastes
89<blink>I<< B<776> kilobytes >></blink> of precious memory in my perl, for 128<blink>I<< B<776> kilobytes >></blink> of precious memory in my perl, for
100 139
101=cut 140=cut
102 141
103package common::sense; 142package common::sense;
104 143
105our $VERSION = '1.0'; 144our $VERSION = '2.01';
145
146# paste this into perl to find bitmask
106 147
107# no warnings; 148# no warnings;
108# use warnings qw(FATAL closed threads internal debugging pack substr malloc unopened portable prototype 149# use warnings qw(FATAL closed threads internal debugging pack substr malloc unopened portable prototype
109# inplace io pipe unpack regexp deprecated exiting redefine glob digit printf 150# inplace io pipe unpack regexp deprecated exiting glob digit printf
110# utf8 layer reserved parenthesis taint closure); 151# utf8 layer reserved parenthesis taint closure semicolon);
152# no warnings qw(exec newline);
111# BEGIN { warn join "", map "\\x$_", unpack "(H2)*", ${^WARNING_BITS} }; 153# BEGIN { warn join "", map "\\x$_", unpack "(H2)*", ${^WARNING_BITS}; exit 0 };
112 154
113# overload should be included 155# overload should be included
114 156
115sub import { 157sub import {
116 # verified with perl 5.8.0, 5.10.0 158 # verified with perl 5.8.0, 5.10.0
117 ${^WARNING_BITS} = "\xfc\xff\xff\x00\xcf\xf3\xcf\xc0\xf3\xcc\x33\x03"; 159 ${^WARNING_BITS} ^= ${^WARNING_BITS} ^ "\xfc\x3f\xf3\x00\x0f\xf3\xcf\xc0\xf3\xfc\x33\x03";
118 160
119 # use strict vars subs 161 # use strict vars subs
120 $^H |= 0x00000600; 162 $^H |= 0x00000600;
121 163
122 # use feature 164 # use feature
138=head1 STABILITY AND FUTURE VERSIONS 180=head1 STABILITY AND FUTURE VERSIONS
139 181
140Future versions might change just about everything in this module. We 182Future versions might change just about everything in this module. We
141might test our modules and upload new ones working with newer versions of 183might test our modules and upload new ones working with newer versions of
142this module, and leave you standing in the rain because we didn't tell 184this module, and leave you standing in the rain because we didn't tell
143you. 185you. In fact, we did so when switching from 1.0 to 2.0, which enabled gobs
186of warnings, and made them FATAL on top.
144 187
145Most likely, we will pick a few useful warnings, instead of just disabling
146all of them. And maybe we will load some nifty modules that try to emulate 188Maybe we will load some nifty modules that try to emulate C<say> or so
147C<say> or so with perls older than 5.10 (this module, of course, should 189with perls older than 5.10 (this module, of course, should work with older
148work with older perl versions - supporting 5.8 for example is just common 190perl versions - supporting 5.8 for example is just common sense at this
149sense at this time. Maybe not in the future, but of course you can trust 191time. Maybe not in the future, but of course you can trust our common
150our common sense to be consistent with, uhm, our opinion). 192sense to be consistent with, uhm, our opinion).
151 193
152=head1 WHAT OTHER PEOPLE HAD TO SAY ABOUT THIS MODULE 194=head1 WHAT OTHER PEOPLE HAD TO SAY ABOUT THIS MODULE
153 195
154apeiron 196apeiron
155 197
157 "I hope common::sense is a joke." 199 "I hope common::sense is a joke."
158 200
159crab 201crab
160 202
161 "i wonder how it would be if joerg schilling wrote perl modules." 203 "i wonder how it would be if joerg schilling wrote perl modules."
204
205Adam Kennedy
206
207 "Very interesting, efficient, and potentially something I'd use all the time."
208 [...]
209 "So no common::sense for me, alas."
162 210
163H.Merijn Brand 211H.Merijn Brand
164 212
165 "Just one more reason to drop JSON::XS from my distribution list" 213 "Just one more reason to drop JSON::XS from my distribution list"
166 214
199 247
200acme 248acme
201 249
202 "THERE IS NO 'no common::sense'!!!! !!!! !!" 250 "THERE IS NO 'no common::sense'!!!! !!!! !!"
203 251
204apeiron (meta-comment) 252apeiron (meta-comment about us commenting^Wquoting his comment)
205 253
206 How about quoting this: get a clue, you fucktarded amoeba. 254 How about quoting this: get a clue, you fucktarded amoeba.
255
256quanth
257
258 common sense is beautiful, json::xs is fast, Anyevent, EV are fast and
259 furious. I love mlehmannware ;)
260
261=head1 FREQUQNTLY ASKED QUESTIONS
262
263Or frequently-come-up confusions.
264
265=over 4
266
267=item Is this module meant to be serious?
268
269Yes, we would have put it under the C<Acme::> namespace otherwise.
270
271=item But the manpage is written in a funny/stupid/... way?
272
273This was meant to make it clear that our common sense is a subjective
274thing and other people can use their own notions, taking the steam out
275of anybody who might be offended (as some people are always offended no
276matter what you do).
277
278This was a failure.
279
280But we hope the manpage still is somewhat entertaining even though it
281explains boring rationale.
282
283=item Why do you impose your conventions on my code?
284
285For some reason people keep thinking that C<common::sense> imposes
286process-wide limits, even though the SYNOPSIS makes it clear that it works
287like other similar modules - only on the scope that uses them.
288
289So, no, we don't - nobody is forced to use this module, and using a module
290that relies on common::sense does not impose anything on you.
291
292=item Why do you think only your notion of common::sense is valid?
293
294Well, we don't, and have clearly written this in the documentation to
295every single release. We were just faster than anybody else w.r.t. to
296grabbing the namespace.
297
298=item But everybody knows that you have to use strict and use warnings,
299why do you disable them?
300
301Well, we don't do this either - we selectively disagree with the
302usefulness of some warnings over others. This module is aimed at
303experienced Perl programmers, not people migrating from other languages
304who might be surprised about stuff such as C<undef>.
305
306In fact, this module is considerably I<more> strict than the canonical
307C<use strict; use warnings>, as it makes all warnings fatal in nature, so
308you can get away with as many things as with the canonical approach.
309
310This was not implemented in version 1.0 because of the daunting number
311of warning categories and the difficulty in getting exactly the set of
312warnings you wish (i.e. look at the SYNOPSIS in how complicated it is to
313get a specific set of warnings - it is not reasonable to put this into
314every module, the maintainance effort would be enourmous).
315
316=item But many modules C<use strict> or C<use warnings>, so the memory
317savings do not apply?
318
319I am suddenly so sad.
320
321But yes, that's true. Fortunately C<common::sense> still uses only a
322miniscule amount of RAM.
323
324=item But it adds another dependency to your modules!
325
326It's a fact, yeah. But it's trivial to install, most popular modules have
327many more dependencies and we consider dependencies a good thing - it
328leads to better APIs, more thought about interworking of modules and so
329on.
330
331=item But! But!
332
333Yeah, we know.
334
335=back
207 336
208=head1 AUTHOR 337=head1 AUTHOR
209 338
210 Marc Lehmann <schmorp@schmorp.de> 339 Marc Lehmann <schmorp@schmorp.de>
211 http://home.schmorp.de/ 340 http://home.schmorp.de/

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines