March 5, 1988 Dear Bob: I'm immensely flattered that you should be using my editor for anything at all. I'm sending you a new version; it has a few added capa- bilities, a few fewer bugs, & greatly improved color if you have an EGA, as I wrote you in my last letter. It cannot execute programs out of a window, however; I'm not quite smart enough to do that, & executing anything costs you about 250 k of memory, which I'd rather not spare. Maybe that has changed in Turbo 4. Epsilon (a version of Emacs) lets you run programs out of a window; however, Epsilon is big & awkward & has a user interface that I was never able to get used to. I'm also including the C version; it's not bug-free, & it doesn't have all the features that the Pascal version has (I only update the Pascal version), but you may like to fiddle with it. (Make sure you do any seri- ous editing with ed.com, on the Maxell disc, not the C version.) Please feel free to criticize my C style; after a year or so of programming in C, I still do not consider myself a C programmer. Two further observations about C: (a) Nat has suddenly declared himself for Pascal again, especially Version 4; this afternoon, in the thick of a frustrating debugging session, he suddenly burst out, "All right. I'll admit it: I hate C!" (b) this quote from a recent Computing Reviews: "If the mental investment in learning a language is greater than the return in mental leverage for the production of correct programs, the language fails." I'm also including a runoff program which you can use until you get Write back again. Its name is BIP: I originally wrote a bi-directional printer for the Diablo, which I named BI; then when I wanted one for the Epson, I modified BI & named the modified version BIP. It is geared to the Epson FX-80, but you can easily modify the commands as needed. It supports: -automatic pagination (which can be turned off) -pause for sheet feeding (which can also be disabled) -continuous & non-continuous underscore -italics -phantom page-break (breaks if phantom is within 6 lines of bottom) -page numbering with optional headers (can also be disabled) -automatic centering & a few other things. I'll include a file (BIP.DIR) with directions for running it. (These programs are for Turbo 3, of course.) The normal pro- cedure is, first edit the file with Ed, then run it off with Bip. (This is like the Unix world, where you edit with something & then use Nroff.) The source is generously commented & should be easy to adapt; I imagine all you would need would be an option switch for NLQ. When my Diablo broke down a year ago, I modified Bip to work with the HP LaserJet (called it, stupidly, BIPL) & ran off essentials on D&B's laser printer: so I know it's not difficult to customize for another printer. Your comments about the 386 were very illuminating. As for hanging multiple users on a PC, that's silly. I agree with Pournelle's philosophy: at least one computer per user. (One way to get more than one is by way of a LAN. We're using IBM's PC-LAN at D&B; as long as you don't try to do any- thing out of the ordinary with it, it's OK, but it's a memory pig, renders the server virtually unusable for anything else, & hung on me repeatedly when I tried to read/write to a 1/2" mag tape drive while using the net- work. It's termed a token ring, but curiously all the computers seem to be connected in a star configuration.) The question in my mind is how much good a 386 will do you if you use ordinary software, like Turbo or (in fact) most compilers, where the target machine is presumably still the 8088. Of course, you get a fast clock speed, & I suppose a wider data path, but what else?--unless you hand-optimize, as you have done. Perhaps we will see alternatives on the market where the back end of the compiler generates 386 code, but I don't think we'll see them soon. Microsoft's assemblers are one huge mess, in my opinion; they've always stuck me as having been designed by academics rather than computer professionals. Even making full allowance for the brain-damaged architec- ture of the '86 family, it's a clumsy language with an ill-thought-out instruction set. I particularly dislike assemblers in which all data transfers are indicated by Mov instructions. I know it's beautifully uniform. So are upper-case letters, but we know from psychologists that people read the slightly irregular lower-case characters more easily. A certain amount of non-uniformity actually facilitates comprehension: look at human languages. Of the assembly languages I've used, I still regard the IBM 370's as ideal. I tell students that they will look back on the 370 with longing when they program in assembly language for micros; I always get stares of stark disbelief. (Which reminds me of the gasp which went up from a data structures class one day when they learned that I had programmed my first quicksort in 370 assembly language. I had been talking about removal of recursion by means of a stack & had said that I had had to do that once. Someone then asked me what language I had been using, that that should have been necessary, which is how the story came out; I hadn't been aiming to impress them, but I sure did. When things like that come out these days, I usually lessen the impact by pointing out to them how different it is in the workplace, where a young programmer has 8 hours a day in which to do nothing but write that program, with no other classes, no competing home- work assignments, no term papers...etc.) The fights over improving the graduate program continue. Joseph Fulda & Phil Panzeca got in a shouting match two meetings ago; Phil kept saying, "Where's your documentation [for all these claims]?" I hope he asks this again next time; I've run off a copy of your letter describing all the stupid questions that were asked in Lincoln's class (suppressing the names) & I'm going to read the whole thing aloud in the meeting if I'm asked for documentation. (I won't mention your name, although I doubt if it would make any difference if I did; it would probably make you well- liked by a number of people.) I just got a letter from Poly, bragging about how highly their program has been rated by some organization or other. I want to find out how one gets rated; it might give us some valuable ammunition. Joseph didn't tell me he was using Hofstadter. I find that daring & original. As for Hastings' class, I will include my Turbo-callable FFT library; you may be interested in the games I play with the 8087 stack. The file is called FFTLIB; it's called by a Pascal program, FFTDEMO, also included. Joseph is up for tenure this Summer, & he is having nervous fits over it. He wants it very, very, v e r y badly & is sure he's going to get shot down. He may be, too: he's eccentric & argumentative, & he has Phil Panzeca against him. On the other hand, he has a better publications record than anyone else in the department, with the possible exception of Tom Steel, & he's brilliant & a demon for work. He has published a couple of very interesting papers recently, especially one quite original contri- bution on estimating the semantic content of logical expressions. I pointed out to him that he might draw on information theory for this & gave him a quick & dirty tutorial on it; he got all excited & would now like to do a collaboration this Summer. Wait till he sees how little information theory I know. Joseph also inadvertently got me involved in another project. Some- how, in the course of a conversation once, I told Joseph that I thought the book of Job was the only honest book in the Bible--& in January he found a remaindered copy of some famous classic French biblical scholar's commen- tary on Job & got it for me. (A goyish commentator, by the way.) There's a famous parody of annotated copies of Shakespeare, which has two lines of Shakespeare at the top of the page & commentary from there on down. That's the way this book is--a smaller text/commentary ratio even than in most Hebrew books I've seen. I think he sent it me as a joke, but of course I started reading it. The commentary is in English, not French, but it's studded all over with little bits of Hebrew. So that reminded me of how long it's been since I studied Hebrew, & how lousy I was at it when I did, & I started trying to trying to puzzle out the little bits. The upshot of all this was that I found a really good Hebrew grammar & I've been at it since shortly before the beginning of term. I suppose it's weird for goy who's not a clergyman to learn Hebrew, but I have the example of the critic, Edmund Wilson, before me. The problem isn't the grammar, but the vocabulary, which is just about impossible for a native speaker of English, since there are so few cognates to aid the memory. I've prepared a set of flash cards, & I drill myself with them on the train mornings. If I learn the vocabulary presen- ted in the grammar, which is of course quar, which is of course questionable (I am not noted for persistence in studying languages, & I'm surprised that this exploration has lasted as long as it has), then I'll know every word that appears in Tanach 100 times or more. Considering the repetitiousness of much of the writing, this should take one quite far. Predictably, when I see a word which has other associations, I learn it almost immediately. I learned "yada`," "he knows," [you'll have to forgive my clumsy transliterations, & I must use quotes instead of italics because the latter don't show up on the terminal], from a story I once heard from a rabbi who was my office-mate at Federal Scientific, which depended on the fact that Rashi says "lo yada`ti" three times in his com- mentary. Some of the words I recognize from Yiddish. I got "ohel" right away, because there was a shul in Riverdale called Congregation Ohel Torah, & I was glad to understand, at last, that that meant Tabernacle of the Torah. (I believe "tabernaculum" means tent in Latin.) But most of the words are simply brute force. I must be making some progress, however, because Joseph also lent me a book of writings by Hirsch, & this had clumps of unpointed text in it. Some of those clumps were almost intelligible, since I recognized words from my flash cards among them. When I first studied Hebrew, in my twenties, the textbook taught a pronunciation that was neither Sephardic nor Aschkenasic, but some Cam- bridge scholar's conjectural reconstruction of the speech of biblical times. Tav, in particular, has always given me trouble, because we were taught to pronounce it as -th- (without the daghesh, that is). It was no better when I found that Jews themselves weren't unanimous on the letter, some pronouncing it -s- & some -t-. I now find myself wobbling irregularly between -s- & -t-, which is probably going to get me in trouble some day. We were taught the "binyanim," & I can still remember most of their names--the "pi`el," the "pu`al," the "niph`al," the "hiph`il," the "hoph`al," the "hithpa`el" (note that -th-)--but the only one whose meaning has stuck with me is the "niph`al," & that's because it occurs in the Pass- over question, "Mah nishtaneh ... ?" "What causes-to-be-different ... ?" In my twenties, Piel's was one of New York's principal beers, & I never saw the name without mentally pronouncing it "Pi`el's." To answer a possible question, I am n o t planning on writing a Hebrew character-generation program for my HP plotter. I did that once, years ago, for a plotter at Federal Scientific, & that was enough. (I had written a general character-generation program, back in the days when characters weren't stored in the plotter's ROM, & I designed the Hebrew set to show how flexible the program w