Exegesis 7 Released (Perl 6 Text Formatting)
chromatic writes "Perl.com has just published Exegesis 7, Damian Conway's explanation of how text formatting will work Perl 6 (and now, Perl 5, thanks to his Perl6::Form module) will work. Think of it as Perl 1 for the 21st century. Also, Parrot 0.1.0, the virtual machine for Perl 6 and several other dynamic languages, released on Leap Day -- ever wanted to program in an object oriented assembly language?"
This was an excellent read.. glad to see perl is keeping up with the times!
Just because you disagree doesn't make it offtopic or flamebait.
One thing that you really have to love about the people who write Perl is that they have a sense of humor. This kind of document could be extremely boring and bland, but Damian had the good sense to liven it up by using humorous examples, mostly drawn from Shakespeare. He's doing some great work, but he's also obviously having fun doing it.
There's no point in questioning authority if you aren't going to listen to the answers.
I just couldn't wrap my brain around Perl.
I ended up giving up and learning Python instead.
Background: 28/M/Bi-Sexual; Owner of a Linux company; MBA Harvard 2003; B.S. Comp Sci MIT 2000
"ever wanted to program in an object oriented assembly language?"
Uh... I gotta say... No.
"For years, I struggled with reality... but I'm happy to say I finally won out over it." -- Elwood P. Dowd
lots of lame jokes about Perl code being incomprehensible despite the fact it can be the most readable.
The screen is covered with what looks like a still shot
of a copy of "The Matrix" screen saver.
He looks at it a minute, and realizes that the coworker
is reading it, so it can't be a screen saver.
He thinks about it a second, and then asks "Do you always
ready your email fully encrypted with PGP like that?
Decoding PGP in you head like that is _really_ impressive!".
"No," says the coworker, "that's just a Perl script I'm
working on".
Y'know, that couldn't be ANY MORE WRONG than an HTML rendering of a .GIF of a psychotic nun in a bondage outfit clubbing a baby seal to death with an Al Gore doll.
(With apologies to the denizen of the Monastery, from whom I stole the idea.)
I'm sure Perl 6 will just be the bee's knees, but I have long since switched to Ruby (or Python if I need certain libraries). As I get older, the philosophy behind Perl (more than one way to do it) really gets on my nerves.
So, I'm interested to see Perl 6 when it comes out, but I sure as hell won't be using it for anything.
Also I'm looking forward to a common runtime between the three languages so I can use Perl modules from Ruby. Now *that's* the best of all possible worlds, eh?
http://developers.slashdot.org/comments.pl?sid=992 97&cid=8470784
I have been using Perl for years now, and I have to say, its not been the best language to use.
/me nods his hat to Perl6.
Being one who's never gone along with the best methods of coding, I've stuck with Perl for the past few years. I deem myself pretty proficient in it, and I find a new plethora of exploration available to me now that Perl6 is out.
The fact that Perl6 is now a subroutine rather than hardcoded allows me to directly stream the formatting through the test. This is immensely helpful, for it allows me to organize the code more efficiently and get more out of my hard worked code.
Sure, some parts may seem like a step back, but this new versions is much simpler to use, and has some huge advantages that all coders should get use from.
Programming in assembler allows the programmer to create machine instructions tailored to a specific processor. This allows her to do things that are beyond the capabilities of any JIT optimizer or bytecode interpreter. If it assembles to VM bytecode, it's not assembler.
I have always thought of C as high level assembler, and C++ as object oriented high level assembler.
Virtual Machines really seem to be the way of the future. But I am really not sure how I feel about them yet.. Parrot will have to prove itself yet, especially with the aftertaste .net and java have left in my mouth.
Sounds like an interesting idea though even if only for a neatly compiling language
One of the reasons I love Perl (cut my teeth with Perl 4, now write a lot of Perl 5 code) is that it is a virtual swiss army knife of programming languages. There is a lot of power in there, but you can choose to use only as much as you might need. The "TMTOWTDI" ethos also appeals to me. And, in reading the updates on Perl.com, I see that this exact same spirit is going into the creation of Perl 6.
.NET announcements and said, "Hmmm...multiple programming languages that all compile down to the same bytecode and execute in the same virtual machine...sounds like a reasonable idea to me!" The Parrot VM is a neat idea, that goes even further than .NET since it's multi-platform, and definitely will be very nice when it's finished. But I feel like it's going to delay Perl 6. And as nice as Perl 5 is, languages like Python and PHP are beginning to surpass it in feature set and ease of use. I don't want Perl 6 to be irrelevant when it finally shows up.
So why am I worried? Well, it feels like Larry saw Microsoft's
Also, like a very impatient, immature kid on December 23, I want my Perl 6 now, damnit!
But, I trust the Perl 6 team. They're smart people. Read the newsgroups and the forums, and you'll agree. When Perl 6 and Parrot are ready for prime-time, I am pretty sure that I won't be looking over at Python and PHP and feeling guilty anymore.
Ah well, back to coding...
Blogging Weight Loss, Distance Education, and more at verlin.com
#!/usr/bin/perl
,1,0,0);unshift@s,$_,$_ for 1..$e-1;unshift@s,$e;= shift@m;push@p,$a=shift@p;$d?$a?++$x:++$y:$a?--$x: --$$ e<10?$v<10?0:'':'').$v++,for 1..$_}
($e,$x,$y,$v,@m)=(shift,0,0,1,1
@p=(1,0);for(@s){push@m,$d
y,$l[$y][$x]=($e=>10?$v<10?'00':$v<100?0:'':
warn"@$_\n"for@l
Next time, you might want to try reading the article a little bit closer next time. ;P
Perl6 does not assemble to VM bytecode anymore.
Perl6 now assembles to assembly.
I wonder how many moderators won't know that Perl6 isn't even out yet.
i'm sorry .. i love perl .. i mean, i LOVE perl .. but the one thing i never cared two whits about was the format stuff .. its like 'print using' in BASIC .. screw that
imo, they could have left the whole thing out of perl6 entirely and have been none the worse for wear
just curious
ever wanted to program in an object oriented assembly language?
Yes. However, some nights when I drive home from work I eye a bridge abutment thinking I'd like to bury my car in it at 140mph. So I'm not certain that whether I'd like to do something is a great way to evaluate it. What's your point?
BTW, is there a simple way to disable an airbag? Isn't there supposed to be a switch someplace? Thanks.
Maw! Fire up the karma burner!
I am sure something is coming down the pike, but making a huge announcement like a major rearchitect puts a lot of developers in suspended animation - unwilling to invest more time mastering and extending the "end-of-life'd" perl 5. Many of those people are now looking at other options.
As an aside, I'm not sure where the consensus is coming from for the new language proposals - the code samples in Larry and Damian's writings are becoming more and more cryptic. I wonder if they are making perl 6 to unapproachable by new coders.
It's too bad that the teams had been only joking about joining forces. If the teams had worked together to create a conceptual clone of .NET wherein Python and PERL could be used interchangeably in the same runtime, the OSS developer base would be very well off right now.
Think about the possibility. First port PyQT and wxPython to parrot. You write your GUI code with Python and byte compile it to a neutral Parrot format. You need to do complex substring matching so you write some good reusable functions that take advantage of PERL's string handling capabilities and then byte compile them. Load them into the event handling code and you've got a great hybrid.
What would be really cool would be to see Java and a form of OO BASIC ported to Parrot.
Click here or a puppy gets stomped!
Parrot will perpetually be 6 months from doing anything useful. Perl 6 may exist one day, but it will not run on Parrot. Parrot is too complex and bloated for what little it does. It already has over a thousand opcodes - talk about simplicity! What moron designed this thing?
Not once did I ever say I had Perl6, which I assume you're implying.
Being an experienced coder, I was able to determine what this update would allow me to do, and I listed those. I don't need the program to know what it means for my coding.
So,please, hold your tongue before calling "troll" on my posts. =P
Then there are the practical issues - will Parrot be fast enough and mostly bugless in time for Perl 6 to sit on top of it? I am concerned that we will need eighteen months of point releases and we haven't even had an alpha yet. Meanwhile people are looking at Ruby, Python, Mono/C# etc.
I recommend they just wrap up whatever concepts they have now and start moving toward an alpha. If we don't see one in 2004 I think most people will have moved on.
... ever wanted to program in an object oriented assembly language? ...
God no. It's bad enough when a high level compiler attemps to guess what you want (C++, etc)... it'd be horrid if ya had to have something supposedly machine level guess...
and I can say I love the new stuff. No less powerful than regex, and no less obscure, easy to learn, use and abuse. Slightly easier to read and understand, though still tricky. Eh, if we had that in the pre-ncurses times! :)
And for those who hate Perl, it's still worth reading, for great texts used in the "text formatting examples" like a recipe for 2 doomed souls or 10 reasons why you didn't do your English Lit. homework.
45 5F E1 04 22 CA 29 C4 93 3F 95 05 2B 79 2A B2
but Parrot is really starting to excite me.
The main reason being it's potential use as a generic high level "ABI" of sorts. Look at GTK/GNOME for example. The developers choose to use C as the base language, largely because it was the easiest language to create bindings for - everything can link to C. But the problem is that C only implements procedural concepts. Anything else must be crafted from hand, like gObject. So you end up reimplementing all the features of a high-level object oriented language, in C, and often this implementation isn't even as efficent as the high level language's implementation. On top of that, when create bindings for a high level language, you wrap all of these gObjects inside of a native language object, and end up with double the overhead. So what it comes down to is that you worked four times as hard, and came up with something twice as slow, just to be able to have an object oriented library that many languages can link to.
Parrot has the oportunity to be for object oriented languages, what the C ABI has become for procudural languages - a common interface for programs of different languages to communicate. Imagine having high level libraries, that can be efficiently used by python, perl, ruby, befunge. Or having scriptable applications that are not just scriptable by one language, but by anything that targets parrot.
When you add to that they fact that it will be cross-platform, and more efficent then most of these high level languages were to begin with, it's hard not to get excited.
The early developers of .Net at MS did indeed do that for some time while compilers were being built. I do look at IL on occasion, if nothing more than "What the hell am I trying to do here?"
It's not as awful as it seems. I'd rather look at IL than x86 anyday.
Feel free to draw your conclusions as you wish.
Perl6's design methodology is completely ass-backwards. They should have prototyped a Perl6 interpreter in Perl5 first and then once they got the feature set they are looking for then - and only then - should they attempt to devise a runtime model for it and rewrite it. This way they would have a reference implementation and spark outside interest in the project since they could actually run what Larry and gang are preaching about in their Apocolypses. To design a platform for a language that has yet to be spec'ed out is complete stupidity.
Although there are the Perl6:: modules/bundle, these are coming much later than they should have to spark interest. Seeing these in early 2002 would have generated much more interest.
I now see you you are not a troll but an idiot who has no grasp of verb tenses:
... now that Perl6 is out.
... allows me to directly stream
... it allows me to
... and get more out of my hard worked code.
... this new versions is much simpler to use
And I just started learning Perl 5...
Accursed macro users!
So Perl 1 is the newest perl, after perl 6, of the 20th century? What about perl 5.005_03? Which century was that for? Is that perl 3? I don't get it. What's with the fucked up version numbers? Where was perl 6 anyways? Is that perl 5.6?
Looking forward to running perl 7^H1^W^Wphp in the future...
I don't expect to make much sense of these writings just yet. Sure, they're fun to read, so that I have some idea of all the new things they're doing, but beyond that *shrug*
:]
I intend to buy the new camel book from O'Reilly (just like I did for Perl 5), which will surely help me learn all the new bits (and, quite probably, help me relearn the bits I only thought I knew).
I wonder if they'll do anything new with regular expressions? (I haven't RTFA just yet, and I don't remember anything from the past exegesises just now.) They always were my favorite bit of Perl for some reason...
101010101010? 101010111101011010001010!
1010100011010... 1010111010111.... 10101111010101!
get Parrot. Perl6 is there. Alpha, not beta. Good riddance.
It's better to be the foot on the boot than the face on the pavement. ~~ tkx Kadin2048
ever wanted to program in an object oriented assembly language?
I already have - Borland Turbo Assembler (TASM) had an object-oriented programming framework. This was at least 10 years ago.
This new OO assembler is interesting, sure - but it's by no means the first.
Nice rant. Now could you please explain what does it have in common with the article?
Holy son of a priest's altar boy!
Remove fuse. Done.
Well fuck my ass and call me a Windows user.
Perl is the most beautiful language I've had the pleasure of learning. Lots of folks complain that perl must be ugly since it's so easy to write really butt-ugly code in it; but it's also very easy to write mindblowingly powerful, clear code. Enough thought has been put into the language design that you can abuse most aspects of the language and still get what you wanted.
It's easy to forget, when using perl, just how, well, tedious, it is to work in C (let alone C++) or shell or Java or even, yes, Python.
The exegeses so far have been full of fabulous goodies to use and abuse. The main problem, as others have pointed out, is that perl6 is still largely vaporware.
It serves its purpose... ancient chinese proverb.
"That which is most obvious
Is the least likely to be noticed."
No, but if I wanted to, I could already, thanks.
Ceterum censeo subscriptionem esse delendam.
After reading through a lot of this article and being blown away by the genuinely powerful and, dare I say it, awesome abilities that have been given to the form function, I'm left asking myself:
... that's all it is, some geek's personal project that doesn't really seem to have much relevance to the real world.
"Who gives a crap?"
Most the projects I've worked on for the last few years have predominately displayed text in web pages. Almost all the reports produced have been generated as HTML and then printed as necessary. The only text output done has been generally into log files, where you really don't need a lot of formatting.
While this is obviously a really great, well thought out piece of coding,
Maybe I'm just missing a huge community of people who spend most of their time looking at command lines and printing out reports in fixed width fonts.
Comment removed based on user account deletion
... Second Edition:
page 18
"ever wanted to program in an object oriented assembly language?"
No.
Last.fm - join the social music revolution
License compatibility.
Parrot has an odd license -- it currently uses the same license as Perl 5, which is the disjunction of the GNU GPL and the Artistic License, which can be written (Artistic|GPL) for short. Thus, Parrot's license is compatible with the GNU GPL, which means you can combine Parrot with GPL'ed code.
Code accepted into the core interpreter must fall under the same terms as parrot. Library code (for example the ICU library we're using for Unicode) we link into the interpreter can be covered by other licenses so long as their terms don't prohibit this.
Platform compatibility.
Parrot has to work on most of Perl 5's platforms, as well as a few of its own. Perl 5 runs on eighty platforms; Parrot must run on Unix, Windows, Mac OS (X and Classic), VMS, Crays, Windows CE, and Palm OS, just to name a few. Among its processor architectures will be x86, SPARC, Alpha, IA-64, ARM, and 68x00 (Palms and old Macs). If something doesn't work on all of these, we can't use it in Parrot.
Speed, size, and flexibility.
Not only does Parrot have to run on all those platforms, but it must also run efficiently. Parrot's core size is currently between 250K and 700K, depending on compiler. That's pushing it on the handheld platforms like a horse in the ass of a chinese schoolgirl. Any library used by Parrot must be fast enough to have a fairly small performance impact, small enough to have little impact on core size, and flexible enough to handle the varying demands of Perl, Python, Tcl, Ruby, Scheme, and whatever else some clever or twisted hacker throws at Parrot.
These tests are very hard to pass; currently we're expecting we'll probably have to write everything but the Unicode stuff."
Well there goes that idea.
Parrot Code FAQ
The new Perl "form" stuff sure seemed familiar for some reason, but I couldn't figure out why. Then I figured it out .... anyone else remember the "print using" statement in BASIC ????
See more.
Not quite. Weak is not the opposite of dynamic, but the opposite of strong. Type systems may be either weak or strong, and may be either dynamic or static.
A weak type system will allow implicit type conversions, even those that are 'lossy' or improper. For example, converting a float to an int without requiring a cast. Or, more importantly, treating memory references (pointers) identically to integers. Pointer arithmetic is an abuse of a weak typing system.
Strong typing requires explicit casts and will throw errors where casts do not appear. Java, Lisp, Python are all strongly typed. Haskell is _really_ strongly typed. When you cast a object to type Object in Java, you are losing type information, but you are doing it _explicitly_.
C, Pascal, and Java are statically typed. Variables are created with a specific type in the code, not on demand. Python and Lisp are dynamically typed -- a variable's type is determined at run-time.
For example, in C:
int foo( int a, int b );
declares a function that returns type 'int' and takes two arguments a, b, both of types 'int'.
In Python:
def foo( a, b ):
declares a function that may or may not return a value (and whose type is known only at run-time) and takes two arguments, which may be of any type (although, internally, the program likely assumes a type).
There are some quirks in the type systems of many languages. In Java, for example, "str" + 3 doesn't have any normal meaning, but the developers have defined any operation using a string as concatenation. In Python, and in most languages, such an expression will either return an error on compilation (static) or when running (dynamic).
However, all combinations are possible and type systems are a fertile area of research.
(missing a huge community etc.) many, many projects need the ability to write in fixed-width fonts to a printer, p.ex. the output of your supermarket cashier ticket / credit card ticket. This is a real world-class application to formats (because those little printers are best suited to the job and they write in monospaced). There are others, many, many others.
It's better to be the foot on the boot than the face on the pavement. ~~ tkx Kadin2048
There's more to the success of a scripting language than abstract concepts. That's why PHP continues apace as the de facto webdev tool, according to Netcraft's Apache module statistics. Keeping the tools in the basic package is one reason they've succeeded.
Ever had a module from CPAN fail to compile? That's bearable on your own box but suggest putting your ISP through the hassle and they'll simply turn round and tell you to use PHP instead if it's webdev you're into.
How many ISPs are offering a Perl combo to match PHP? You'd need Perl5 + mod_perl + Mason if you wanted decent templating. I don't see many ISPs offering this because mod_perl is a memory hog and requires a higher level of process management than PHP.
I wish it were not true as I started with Perl and prefer it as a language. However, I feel it is in great danger of becoming sidelined.
Uh. Uh, you windows uh user.
uH. Ahhh.
Where oh where do you get that? Perl 5 is a live and well, and has seen quite a large boost in support and development in the last several years. Right on the heels of the overdue perl 5.8, we've got 5.10 coming down the pike(still a ways off).
There have been nice improvements in the perl 5 core, stable threading support, more useful core modules, major updates for unicode support, etc.
Then there's POE (poe.perl.org), and other stuff.
Perl 5 is far from being "end-of-life'd".
Sticking feathers up your butt does not make you a chicken - Tyler Durden
Don't ever write "PERL" in correspondence with a diehard Perl programmer.
Only perl can parse Perl.
Sticking feathers up your butt does not make you a chicken - Tyler Durden
use Parrot::BuildUtil;
there's no file with 'BuildUtil*' name in the source distro.
Conclusion: not ready for prime time.
No electrons were harmed creating this post, though some may have been subjected to electrical and/or magnetic fields.
An object-oriented assembly language -- what, you mean like zasm?
Cut that out, or I will ship you to Norilsk in a box.
How does Perl templating mechanism to other templating implementation like Velocity? I would like to know what pro/cons has each one or others that /.ers may have used.
"I think this line is mostly filler"
"The Parrot source code was first released to the world on Monday 10th of September 2001." ...and just LOOK WHAT HAPPENED!
It's intriguing how the social significance of assembler programming has drifted over the decades.
When I met my first computer, an IBM 1440, Assembler was the only thing they taught us and we developed some very useful application software to run within its 12,000 characters of decimally addressed magnetic core memory.
Even through the transition to System/360, assembler was it, though there was Fortran on the 7044 at uni and PL/1 was coming as a promised advance on both Fortran and Cobol which others had started to use but our place did not touch.
Then Ed Dijkstra came to town and I was an immediate convert. Nowadays we would call in "professional development". But still we programmed in assembler, and I could not see any reason that my assembler code would not benefit from following the principles of structured programming.
Years later, a job interview became quite confused when the interviewer did not understand that assembler programming and systems programming had not always been synonymous and that there were application programmers who had also used assembler, especially back when any of the functionality we might now expect to find in an operating system was basically hard wired.
Now, I do know that "structured programming" is not strictly synonymous with "object oriented" but they are also the major then and now approached to encapsulation, which remains a good thing. I also know that Parrot is "byte code" rather than a true assembler language, and don't expect any of this will convince me to take Parrot up in preference to the real thing (Perl of course) at this late stage of my programming life.
-- Our systemic servants do not good masters make.
Is it just my imagination or are the two tops of this article linking perls extended new plain text rendering capabilities with perl 6 and the parrot vm? Is that what Larry has been working towards all this time? Better faster plain text reports?
Ouch. (-:
Of course it will: :-p
Damian Conway's explanation of how text formatting will work Perl 6 (and now, Perl 5, thanks to his Perl6::Form module) will work.
At least twice better (or faster) than now
Perl made us productive and inspired new languages like Ruby which took some great features from Perl and made a language actually a pure joy to use. http://www.ruby-lang.org
Perl6 will finally cleanup a lot of baggage to make it more competitive with newer/cleaner/easier languages (like Ruby). If done right, it will recapture the former Perl users who migrated to Python and/or Ruby.
Parrot will give us an alternative to the single-language Java VM and the multi-language Microsoft CLR. We can only hope that it leverages the mistakes and successes of both JVM and CLR to provide something that is better than both.
While it shouldn't be limited in a particular CPU, it should take reality into consideration and make it easy to aggressively optimize for AMD/Intel (98% of desktops) and IBM PPC97x (Macs, XBox 2, Playstation 3, future IBM Linux workstations).
YOW!!!
and at least, you can write *short* code that is well formated too - unlike programing languages like java who force you to write long code - but long doesn't mean "clean"...
...is exactly that: Perl supports ten ways of doing X, so you're free to choose #3 for your code.
And your coworker is free to choose way #7, and the sourceforge project whose code you're extending chose way #2, and they're all incomoatible.
So even though you're free to choose which way you want to do something, you still have to learn and understand all ten ways if you plan on completing the project and getting paid. And then maintaining it.
Yeah, you could pick one way and enforce it with corporate coding standards (and hope you pick the right one), but then there goes the advantage of ten different ways. Or the sourceforge project could document the choice in its HACKING.README file, but then the coders who only know six of the ten ways are locked out.
All the coders I know at big companies tell me that this is exactly why Perl is banned -- at each of those companies -- for official work. There's too much variance between each way of doing X for large scripts to remain maintainable across multiple serial coders.
(I suspect most of the people who are going to post followups flaming me have only ever had to maintain their own Perl scripts, without ever inheriting a pile of mission-critical scripts from somebody whose choices were all different from yours, and who's not available for questioning.)
You cannot apply a technological solution to a sociological problem. (Edwards' Law)
I wish I had something inciteful to say, but I don't. However, I have to jump at the chance to type, "exegesis". It's just such a cool word. I wonder how long it will be before Fox News claims they own it.
You couldn't pick a better name for such a utility.
Turbo Assembler (later versions) from Borland did support a level of object orientation. It actually shipped with examples of object oriented assembly code.
OOPs in TASM
Kludgiest scripting language except perhaps for VB
High time perl is put to sleep. Anyone who writes a Perl program more than 1 page long is insane!
Use decent languages like Python or Ruby.
Stop using perl!
Sure, lets add operators that can't even by !@#$% typed. Yes, you can add :is ASCII(!@#$%) but that kind of misses the point.
Not only does Larry get the colon, he gets the entire unicode set!
I don't get it, since I have never worked with Perl, so I am asking the perl programmers out there: what is so special about plain-text reporting ? there are fine tools out there that can produce beautiful html reports that plain text will never be comparable to. I understand that text reports may have their uses in the back office, but that accounts for a small percentage of overall reporting.
Furthermore, 'reporting' is a not a feature of a programming language. The same report package could be done with C++, for example. Will Perl 6 bring something *really new* in the programming languages department ?
"now that Perl6 is out". It isn't.
"Perl6 is now a subroutine" Beg pardon? Do you mean form is a subroutine in Perl6? Or what?
"stream the formatting through the test" What???
Mods, clue up!
Maybe they all go off and become Perl programmers instead of going to grad school?
But seriously: academia has very little room for people with interests like Damian's. Academia does not encourage the kind of research that would make professors better teachers, instead the research should be as esoteric and far from undergrad subjects as possible. And grad students who like to "hack" are told to get over that impulse despite the fact that it would probably make them better teachers.
is a functioning Perl6 prototype - not a VM to end all VMs. Design the Perl6 language interpreter in Perl5, learn from it, use Perl6 to bootstrap the next version of Perl6, throw it out the original interpreter and then - and only then - write the real thing. To write a VM beforehand based on God only knows what as criteria is complete stupidity.
to embed the Python interpreter inside of Parrot as an opcode "DOPYTHON". Seriously, the Parrot crew are seriously underestimating the complexity of various different interpreted languages. Dan will probably make up some lame excuse why he could not deliver. I wish Parrot would brag less and deliver more.
..and it doesn't actually look that bad. =)
No matter how fast light travels it finds the darkness has always got there first, and is waiting for it. (T. Pratchett)