ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/common-sense/sense.pm
Revision: 1.1
Committed: Thu Jul 9 16:14:16 2009 UTC (15 years ago) by root
Branch: MAIN
Log Message:
*** empty log message ***

File Contents

# Content
1 =head1 NAME
2
3 common::sense - save a tree AND a kitten, use common::sense!
4
5 =head1 SYNOPSIS
6
7 use common::sense;
8
9 # roughly the same as, with much lower memory usage:
10 #
11 # use strict qw(vars subs);
12 # use feature qw(say state switch);
13 # no warnings;
14
15 =head1 DESCRIPTION
16
17 This module implements some sane defaults for Perl programs, as defined by
18 two typical (or not so typical - use your common sense) specimens of
19 Perl coders.
20
21 =over 4
22
23 =item use strict qw(subs vars)
24
25 Using C<use strict> is definitely common sense, but C<use strict
26 'refs'> definitely overshoots it's usefulness. After almost two
27 decades of Perl hacking, we decided that it does more harm than being
28 useful. Specifically, constructs like these:
29
30 @{ $var->[0] }
31
32 Must be written like this, when C<use strict 'refs'> is in scope, and
33 C<$var> can legally be C<undef>:
34
35 @{ $var->[0] || [] }
36
37 This is annoying, and doesn't shield against obvious mistakes such as
38 using C<"">, so one would even have to write:
39
40 @{ defined $var->[0] ? $var->[0] : [] }
41
42 ... which nobody with a bit of common sense would consider
43 writing. Curiously enough, sometimes, perl is not so strict, as this works
44 even with C<use strict> in scope:
45
46 for (@{ $var->[0] }) { ...
47
48 If that isnt hipocrasy! And all that from a mere program!
49
50 =item use feature qw(say state given)
51
52 We found it annoying that we always have to enable extra features. If
53 something breaks because it didn't anticipate future changes, so be
54 it. 5.10 broke almost all our XS modules and nobody cared either - and few
55 modules that are no longer maintained work with newer versions of Perl,
56 regardless of use feature.
57
58 If your code isn'talive, it's dead, jim.
59
60 =item no warnings
61
62 The dreaded warnings. Even worse, the horribly dreaded C<-w> switch. Even
63 though we don't care if other people use warnings (and certainly there are
64 useful ones), a lot of warnings simply go against the spirit of Perl, most
65 prominently, the warnings related to C<undef>. There is nothing wrong with
66 C<undef>: it has well-defined semantics, it is useful, and spitting out
67 warnings you never asked for is just evil.
68
69 So every module needs C<no warnings> to avoid somebody accidentally using
70 C<-w> and forcing his bad standards on our code. No will do.
71
72 (Also, why isn't this a C<use feature> switch? Adding warnings is
73 apparently considered O.K., even if it breaks your programs).
74
75 =item much less memory
76
77 Just using all those pragmas together waste <blink>I<< B<776> kilobytes
78 >></blink> of precious memory in my perl, for I<every single perl process
79 using our code>, which on our machines, is a lot.
80
81 The money/time/effort/electricity invested in these gigabytes (probably
82 petabytes globally!) of wasted memory could easily save 42 trees, and a
83 kitten!
84
85 =cut
86
87 package Async::Interrupt;
88
89 no warnings;
90
91 BEGIN {
92 $VERSION = '0.03';
93
94 require XSLoader;
95 XSLoader::load Async::Interrupt::, $VERSION;
96 }
97
98 our $DIED = sub { warn "$@" };
99
100 =cut
101
102 1;
103
104 =back
105
106 =head1 EXAMPLE
107
108 There really should be a complete C/XS example. Bug me about it.
109
110 =head1 IMPLEMENTATION DETAILS AND LIMITATIONS
111
112 This module works by "hijacking" SIGKILL, which is guaranteed to be always
113 available in perl, but also cannot be caught, so is always available.
114
115 Basically, this module fakes the receive of a SIGKILL signal and
116 then catches it. This makes normal signal handling slower (probably
117 unmeasurably), but has the advantage of not requiring a special runops nor
118 slowing down normal perl execution a bit.
119
120 It assumes that C<sig_atomic_t> and C<int> are both exception-safe to
121 modify (C<sig_atomic_> is used by this module, and perl itself uses
122 C<int>, so we can assume that this is quite portable, at least w.r.t.
123 signals).
124
125 =head1 AUTHOR
126
127 Marc Lehmann <schmorp@schmorp.de>
128 http://home.schmorp.de/
129
130 =cut
131