hn-classics/_stories/2010/12358376.md

1224 lines
66 KiB
Markdown
Raw Normal View History

2018-02-23 18:19:40 +00:00
---
created_at: '2016-08-25T12:10:02.000Z'
title: The Glorious Horror of TECO (2010)
url: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/
author: okket
points: 52
story_text:
comment_text:
num_comments: 25
story_id:
story_title:
story_url:
parent_id:
created_at_i: 1472127002
_tags:
- story
- author_okket
- story_12358376
objectID: '12358376'
2018-06-08 12:05:27 +00:00
year: 2010
---
---
2018-02-23 18:19:40 +00:00
---
[Source](http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/ "Permalink to The Glorious Horror of TECO | Good Math Bad Math")
# The Glorious Horror of TECO | Good Math Bad Math
[ ![Good Math Bad Math][1] ][2]
Just another Scientopia site
 
 
* [Home][3]
* [About][4]
* [About MarkCC][5]
* [Contact Info][6]
![][7]
# [The Glorious Horror of TECO][8]
Nov 30 2010 Published by [MarkCC][9] under [pathological programming][10], [Uncategorized][11]
In my oh-so-abundant free time, I've been working on my own little text editor. And one of my motivations is TECO: one of the oldest, and one of the very best, ever written. It's both a text editor _and_ a programming language - and, in fact, that's exactly what made it such a brilliant tool. So much of the drudgery of programming is stuff that really could be done by a program. But we've spent so much time learning to be fancy that we've lost track of that. Nowadays, you can write an emacs lisp program to do the stuff you used to do in TECO; only it's awkward enough that you usually don't.
The problem, though, with just re-implementing TECO with a modern UI is that it was designed in a different time. When TECO was written, every byte was critical. And so the language, the syntax, the structure, it was completely ridiculous. And, as a result, it became the world's most _useful_ pathological programming language. It's a glorious, hideous, wonderful, horrific piece of computing history
TECO is one of the most influential pieces of software ever written. If, by chance, you've ever heard of a little editor called "emacs"; well, that was originally a set of editor macros for TECO (EMACS = Editor MACroS). As a language, it's both wonderful and awful. On the good side, The central concept of the language is wonderful: it's a powerful language for processing text, which works by basically repeatedly finding text that matches some kind of pattern, taking some kind of action when it finds it, and then selecting the next pattern to look for. That's a very natural, easy to understand way of writing programs to do text processing. On the bad side, it's got the most god-awful hideous syntax ever imagined.
## History
TECO deserves a discussion of its history - it's history is basically the history of how programmers' editors developed. This is a _very_ short version of it, but it's good enough for this post.
In the early days, PDP computers used a paper tape for entering programs. (Mainframes mostly used punched cards; minis like the PDPs used paper tape). The big problem with paper tape is that if there's an error, you need to either create a *whole new tape* containing the correction, or carefully cut and splice the tape together with new segments to create a new tape (and splicing was _very_ error prone).
This was bad. And so, TECO was born. TECO was the "Tape Editor and COrrector". It was a turing complete programming language in which you could write programs to make your corrections. So you'd feed the TECO program in to the computer first, and then feed the original tape (with errors) into the machine; the TECO program would do the edits you specified, and then you'd feed the program to the compiler. It needed to be Turing complete, because you were _writing a program_ to find the stuff that needed to be changed.
A language designed to live in the paper-tape world had to have some major constraints. First, paper tape is _slow_. _Really_ slow. And punching tape is a miserable process. So you _really_ wanted to keep things as short as possible. So the syntax of TECO is, to put it mildly, absolutely mind-boggling. _Every_ character is a command. And I don't mean "every punctuation character", or "every letter". _Every_ character is a command. Letters, numbers, punctuation, line feeds, control characters... Everything.
But despite the utterly cryptic nature of it, it was good. It was _very_ good. So when people started to use interactive teletypes (at 110 baud), they _still_ wanted to use TECO. And so it evolved. But that basic tape-based syntax remained.
When screen-addressable terminals came along - vt52s and such - suddenly, you could write programs that used cursor control! The idea of a full-screen editor came along. Of course, TECO lovers wanted their full screen editor to be TECO. For Vaxes, one of the very first full screen editors was a version of TECO that displayed a screen full of text, and did commands as you typed them; and for commands that actually needed extra input (like search), it used a mode-line on the bottom of the screen (exactly the way that emacs does now).
Not too long after that, Richard Stallman and James Gosling wrote emacs - the editor macros for TECO. Originally, it was nothing but editor macros for TECO to make the full screen editor easier to use. But eventually, they rewrote it from scratch, to be Lisp based. And not long after that, TECO faded away, only to be remembered by a bunch of aging geeks. The syntax of TECO killed it; the simple fact is, if you have an alternative to the mind-boggling hideousness that is TECO syntax, you're willing to put up with a less powerful language that you can actually _read_. So almost everyone would rather write their programs in Emacs lisp than in TECO, even if TECO _was_ the better language.
The shame of TECO's death is that it was actually a really nice programming language. To this day, I still come across things that I need to do that are better suited to TECO than to any modern day programming language that I know. The problem though, and the reason that it's disappeared so thoroughly, is that the _syntax_ of TECO is so mind-bogglingly awful that no one, not even someone as insane as I am, would try to write code in it when there are other options available.
### A Taste of TECO Programming
Before jumping in in and explaining the basics of TECO in some detail, let's take a quick look at a really simple TECO program. This program is absolutely *remarkably* clear and readable for TECO source. It even uses a trick to allow it to do comments. The things that look like comments are actually "goto" targets.
0uz ! clear repeat flag !
<j 0aua l ! load 1st char into register A !
<0aub ! load 1st char of next line into B !
qa-qb"g xa k -l ga-1uz ' ! if A>B, switch lines and set flag !
qbua ! load B into A !
l .-z;> ! loop back if another line in buffer !
qz;> ! repeat if a switch was made last pass !
The basic idea of TECO programming is pretty simple: search for something that matches some kind of pattern; perform some kind of edit operation on the location you found; and then choose new search to find the next thing to do.
The example program above is a rather sophisticated version of that for such a small program. It searches for the beginnings of consecutive lines. For each pair of lines, if they're not in sorted order, it swaps them, and then searches for the next pair of lines. That's enclosed in a loop which keeps repeated the scan through the file up until every consecutive pair is in order. In other words, it's a swap-sort.
The fundamental (the only?) data structure in TECO is a _buffer_. All TECO programs are based on the idea that you've got a buffer full of text, and you want to do something to change it. The way that you access a buffer is through a _cursor_, which is a pointer into the buffer, which represents the position at which any edit operations will be performed. So TECO operations all work by either reading text at the cursor; editing text at the cursor; or moving the cursor. In TECO lingo, the position of the cursor is called _dot_. Dot is always _between_ two characters.
### TECO Commands
I can't possibly explain all of TECO in one post, so I'm just going to go through enough to give you the flavor, and to make it possible to walk you through a sample program. If you want, you can go and [see the full command list][12], or even read [the TECO manual][13].
TECO commands are generally single characters. But there is some additional structure to allow arguments. There are two types of arguments: numeric arguments, and text arguments. Numeric arguments come _before_ the command; text arguments come _after_ the command. Numeric values used as arguments can be either literal numbers, commands that return numeric values, "." (for the index of the buffer pointer), or numeric values joined by arithmetic operators like "+", "-", etc.
So, for example, the `C` command moves the pointer forward one character. If it's preceded by a numeric argument _N_, it will move forward _N_ characters. The `J` command jumps the pointer to a specific location in the buffer: the numeric argument is the offset from the beginning of the buffer to the location where the pointer should be placed.
String arguments come _after_ the command. Each string argument can be delimited in one of two ways. By default, a string argument continues until it sees an Escape character, which marks the end of the string. Alternatively (and easier to read), if the command is prefixed by an "@" character, then the _first character_ after the command will be used as a string delimiter, so that the string parameter will continue until the next instance of that character.
So, for example, the first thing that most TECO programs do is specify what it is that they want to edit - that is, what they want to read into the buffer. The command to do that is "ER". It needs a string argument to tell it the name of the file to read - so the command to edit a file "foo.txt" is `ERfoo.txt` (followed by pressing escape twice to tell TECO to run the command). Alternatively, you could use one of the other variations for string arguments. For example, you could quote the filename, using `@ER'foo.txt'`. Or you could use quoting in a deliberately silly way: `@ER foo.txt `. (That is, using space as the quote character, giving you nearly invisible quoting.)
In addition to the standard arguments, you can also modify commands, by placing a ":" in front of them. For most commands, ":" makes them return either a 0 (to indicate that the command failed), or a -1 (to indicate that the command succeeded). For others, the colon does _something else_. The only way to know is to know the command.
So, now that we know basically what commands and arguments look like, we can start looking at the commands that create the beast that was TECO.
There are, of course, a bunch of commands for printing out some part of the buffer. Remember, TECO originally comes from the pre-full-screen-editor days, so you needed to be able to ask it to show you what the text looked like after a sequence of edits, to make sure you had it right before you went and saved it. The basic print command is `T`, which prints out the current line. To print a string, you'd use the command ^A (that is, control-A; I said everything is a command!).
This means that now, we can finally say how to write the good
old classic "Hello, World" program in TECO! It's very simple:
@^A'Hello, World!'
That is, string argument quoted, print, followed by the quoted
string. Perfoctly clear, right?
There are also, naturally, commands to edit text in various ways:
`D`
: delete the character after the cursor.
`FD`
: Find-and-delete. Takes a string argument, finds the next occurrence of the string, and deletes it.
`K`
: Delete the text from the cursor to the end of the line.
`HK`
: Delete the entire current buffer.
`I`
: Insert text. Obviously, this needs a string argument, which is the text that it inserts.
`<tab>`
: A second insert command; the only difference is that the tab character is also inserted into the text.
Next are the commands for moving dot around in the buffer.
`C`</dt
: move the pointer forward one character if no argument is supplied; if it gets a numeric argument `N`, it moves forwards N characters. `C` can be preceeded by a "`:`" to return a success value.
`J`
: jumps the pointer to a location specified by its numeric argument. If there is no location specified, it jumps to location 0. `J` can be preceeded by a "`:`" to see if it succeeded.
`ZJ`
: jumps to the position _after_ the last character in the file.
`L`
: pretty much like `C`, except that it moves by lines instead of characters.
`R`
: moves backwards one character - it's basically the same as `C` with a negative argument.
`S`
: searches for its argument string, and positions the cursor _after_ the last character of the search string it found, or at position 0 if the string isn't found.
`number,numberFB`
: searches for its argument string between the buffer positions specified by the numeric arguments. Search strings can include something almost like regular expressions, but with a much worse syntax. I don't want to hurt your brain _too_ much, so I won't go into detail.
TECO has variables; in it's own inimitable fashion, they're not called variables; they're called Q-registers. There are 36 global Q-registers, named "A" through "Z" and "0"-"9". There are also 36 _local_ Q-registers (local to a particular _macro_, aka subroutine), which have a "."
character in front of their name.
Q-registers are used for two things. First, you can use them as variables: each Q-register stores a string _and_ an integer. Second, any string stored in a Q-register can be used as a subroutine; in fact, that's the _only_ way to create a subroutine. The commands to work with Q-registers include:
`nUq`
: `n` is a numeric argument; `q` is a register name. This stores the value `n` as the numeric value of the register `q`.
`m,nUq`
: both `m` and `n` are numeric arguments, and `q` is a register name. This stores `n` as the numeric value of register `q`, and then returns `m` as a parameter for the next command.
`n%q`
: add the number `n` to the numeric value stored in register `q`.
`^Uqstring`
: Store the string as the string value of register `q`.
`:^Uqstring"`
: Append the string parameter to the string value of register `q`.
`nXq`
: clear the text value of register `q`, and copy the next `n` lines into its string value.
`m,nXq`
: copy the character range from position `m` to position `n` into register `q`.
`.,.+nXq`
: copy `n` characters following the current buffer pointer into register `q`.
`*Qq`
: use the integer value of register `q` as the parameter to the next command.
`nQq`
: use the ascii value of the `n`th character of register `q` as the parameter to the next command.
`:Qq`
: use the length of the text stored in register `q` as the parameter to the next command.
`Gq`
: copy the text contents of register `q` to the current location of the buffer pointer.
`Mq`
: invoke the contents of register `q` as a subroutine.
And last, but definitely not least, there's control flow. First, there are loops. A loop is "`n<commands>`", which executes the text between the left brack and the right bracket "n" times. Within the loop, ";" branches out of the loop if the last search command failed; "n;" exits the loop if the value of "n" is greater than or equal to zero. ":;" exits the loop if the last search succeeded. "F>" jumps to the loop close bracket (think C continue), "F<" jumps back to the beginning of the loop.
Conditionals are generally written `n"Xthen-command-string|else-command-string'`. The quotes there are part of the command!) The double-quote character introduces the conditional, and the single-quote marks the end. In this command, the "X" is one of a list of conditional tests, which define how the numeric argument `n`; is to be tested. Some possible values of `X` include:
* "A": tests if n is the character code for an alphabetic character.
* "D": tests if n is the character code of a digit
* "E": tests if n is zero or false
* "G": tests if n is greater than zero
* "N": tests if n is not equal to zero
* "L": test if n is a numeric value meaning that the last command succeeded.
### Example TECO Code
So, time for a couple of real TECO programs.
Let's start by looking back at the swapsort program up at the top of this
post.
1. `0uz`: set the Q-register z to 0.
2. `<j`: start a loop, and set dot to the beginning of the
file.
3. `0aua` read the character at the beginning of the line, and pass it as a numeric argument to `ua`, which updates the value of register a. So register a contains the first character of the line.
4. `l`: advance by one line.
5. `<0aub`: start a new loop, and assign the first character of the new line to register b.
6. `qa-qb"g`: subtract the value of register b from register a. If the result is greater than 0, then do the following:
1. ` xa `: load the current line (the second of these two consecutive lines) into register A.
2. `k`: delete this line.
3. `-l`: move back one line.
4. `ga`: insert the contents of a (what used to be the later line) into the line. So now, we used to have ... L1 L2 ...; we've deleted L2, giving us ... L1 ..., and now we've jumped the cursor back to before L1, and inserted, so we've got ... L2 L1 ... - so we've swapped the two lines.
5. `-1uz`: set register z to -1. This is just setting a flag saying "I did a swap".
6. `'`: end of the conditional.
7. `qbua`: put what was in register b into register a.
8. `l .-z;>`: if there are any more lines in the buffer, then go to the beginning of the (inner) loop.
9. `qz;>`: if the z flag is non-zero, ther repeat the outer loop.
Gosh, wasn't that simple? All kidding aside, it really is. Once you get used to the idea of editing a text buffer, it's really very natural. It's damned near impossible to _read_... but it's not at all bad, semantically.
So now you should be ready for something that's a bit less clearly written. No one wrote code like that example, with all of that documentation! This is an example of what real, working TECO code looked like. It's a really useful program: it scans through a file containing a mixture of spaces and tabs, and replaces all of the tabs, assuming that tab stops appear every 8 columns.
FEB :XF27: F H M Y<:N ;'.U 0L.UAQB-QAUC<QC-9"L1;'-8%C>9-QCUD
S DQD<I >>EX
That's perfectly clear now, isn't it?
Ok, since that was so easy, how about something _challenging_?
This little baby takes a buffer, and executes its contents as a BrainFuck program. Yes, it's a BrainFuck interpreter in TECO!
@^UB#@S/{^EQQ,/#@^UC#@S/,^EQQ}/@-1S/{/#@^UR#.U1ZJQZ^SC.,.+-^SXQ-^SDQ1J#
@^U9/[]-+<>.,/<@:-FD/^N^EG9/;>J30000<0@I//>ZJZUL30000J0U10U20U30U60U7
@^U4/[]/@^U5#<@:S/^EG4/U7Q7; -AU3(Q3-91)"=%1|Q1"=.U6ZJ@i/{/Q2@i/,/Q6@i/}
/Q6J0;'-1%1'>#<@:S/[/UT.U210^T13^TQT;QT"NM5Q2J'>0UP30000J.US.UI
<(0A-43)"=QPJ0AUTDQT+1@I//QIJ@O/end/'(0A-45)"=QPJ0AUTDQT-1@I/
/QIJ@O/end/'(0A-60)"=QP-1UP@O/end/'(0A-62)"=QP+1UP@O/end/'(0A-46)"=-.+QPA
^T(-.+QPA-10)"=13^T'@O/end/'(0A-44)"=^TUT8^TQPJDQT@I//QIJ@O/end/'(0A-91)
"=-.+QPA"=QI+1UZQLJMRMB -1J.UI'@O
/end/'(0A-93)"=-.+QPA"NQI+1UZQLJMRMC-1J.UI'@O/end/'
!end!QI+1UI(.-Z)"=.=@^a/END/^c^c'C>
If you're actually insane enough to want to try this masochistic monstrosity, you can get a TECO interpreter, with documentation and example programs, from [here][14].
Tags: [editors][15], [history][16], [pathological programming][17], [Programming][18], [teco][19]
[43 responses so far][20]
* ![][21] [Comrade PhysioProf][22] says:
[ November 30, 2010 at 10:50 pm][23]
Holy fuckenoloy!
[Reply][24]
* ![][25] [Randal L. Schwartz][26] says:
[ November 30, 2010 at 11:04 pm][27]
Do not disrespect the sacred TECO. TECO made me a lot of money in the early 80's. Emacs still has me be more productive today than any other text editor.
🙂
[Reply][28]
* ![][29] MarkCC says:
[ December 1, 2010 at 10:50 am][30]
I'm not disrespecting it! I think that TECO is one of the most important computer programs ever written. I believe that it shaped the entire history of software development tools. It's terribly ugly looked at with today's aesthetics, but back in its day, it was absolutely _brilliant_, a true gem. And even with all of the horrors of its syntax, it's _still_ a fantastic tool - better at what it does than most of the tools we're using today.
[Reply][31]
* ![][32] Alex Besogonov says:
[ December 2, 2010 at 6:48 am][33]
TECO reminds me of Refal ( <http://en.wikipedia.org/wiki/Refal> ) which is also based on recursive text substitution.
[Reply][34]
* ![][35] [Janne][36] says:
[ November 30, 2010 at 11:08 pm][37]
How about sed? Seems a bit in the same spirit, but more readable.
[Reply][38]
* ![][29] MarkCC says:
[ December 1, 2010 at 10:48 am][39]
I believe that sed is *vastly* less powerful. Sed is strictly line/stream based; TECO could shuttle forwards and backwards around your buffer. Sed is also not turing compete.
That's not to say that Sed isn't an incredibly useful tool. It's just much more limited that TECO.
[Reply][40]
* ![][35] [Janne][36] says:
[ December 1, 2010 at 5:31 pm][41]
sed is Turing complete, and you can jump around in the file if you want to.
I just found this Turing machine simulator in sed: <http://en.literateprograms.org/Turing_machine_simulator_%28Sed%29>
And the code for another one: <http://sed.sourceforge.net/local/scripts/turing.sed.html>
Of course, it also rather lays to rest any claims that sed is more readable than TECO...
[Reply][42]
* ![][43] David says:
[ November 30, 2010 at 11:10 pm][44]
You bring back both fond and disturbing memories. I remember moving to teco from 'ed' and how much of a step forward it was.
[Reply][45]
* ![][46] lily says:
[ December 1, 2010 at 12:07 am][47]
It's beautiful. Also, crazy.
[Reply][48]
* ![][49] beekguk says:
[ December 1, 2010 at 1:26 am][50]
Wow. Why didn't they teach us this kind of history in computer science classes? That's awesome. And frightening.
Also, my mind is officially blown - earlier today I was starting to work on the Project Euler problems, and looked at the stats for what languages people use - and there at the bottom was TECO. I'm astounded if anyone actually was able to do some of that math with this thing ...
Also, are you going to give us an update on your text editor? I'm curious what a modern version of this would look like - or are you just taking inspiration from the "editor as language" concept?
[Reply][51]
* ![][29] MarkCC says:
[ December 1, 2010 at 10:59 am][52]
I'll write some more about the editor at some point.
The actual motivation is more sam/acme, the two plan9 editors. They both have a notion of structural regular expressions and actions as a primary editor construct - which are, effectively, a programming language for editing text. The problem with both of them is that the UIs are absolutely ghastly.
But once I started working on it, the TECO stuff kept coming back to me. So I'm basically building a simple language based on structural regular expressions, and turning it into the back-end of an editing tool.
The front-end will just be a GUI shell - very much like samterm. All that the UI will really do is translate your UI actions into commands that get piped to the interpreter. And you'll be able to also enter commands directly in the editor, very much the way that you can in Sam.
I'm planning on eventually having multiple front-ends. The current prototype is wxWidgets, but I'd like to implement something that can live in a browser (looking towards the day when I get a ChromeOS netbook), and perhaps eventually do something tiled like Acme.
[Reply][53]
* ![][54] [Adrian Cockcroft][55] says:
[ December 1, 2010 at 1:56 am][56]
Ok, so that officially makes me an aging geek then. I used TECO on a DECsystem10 when I needed a way to edit ALGOL code on a teletype. Luckily I don't remember any of the syntax.
[Reply][57]
* ![][58] fgx3 says:
[ December 1, 2010 at 2:04 am][59]
My exposure to TECO was through a legend where "edit" somehow selected everything in the buffer, deleted it and inserted the letter 't', the moral being modal editors were not so cool. I don't really know if it is true but thanks for writing this up. I think I will give TECO a try 😉
[Reply][60]
* ![][61] div says:
[ December 1, 2010 at 1:12 pm][62]
'course you can do the same thing even faster in Notepad: ^At.
[Reply][63]
* ![][64] Yiab says:
[ December 1, 2010 at 3:19 am][65]
This makes me long for my days of writing a hello world program in malbolge.
[Reply][66]
* ![][67] [ebohlman][68] says:
[ December 1, 2010 at 6:10 am][69]
Back in college (76-80), Teco was a source of beer money; way too few of my classmates had mothers who made it clear to them that they wouldn't type their papers in high school (I had too many college classmates who never had to write papers in high school, and I went to one of the most prestigious liberal arts colleges in the US). I think I typed at least one classmate's paper on an ASR-33 (though VT-52s were much more common). Of course, TECO couldn't actually format a paper; that was up to runoff. All this was done under RSTS-E on a PDP-11/40; yup, a 16-bit processor with a whopping 64K of memory was a real campus-wide timesharing system back in the Good Old Days.
[Reply][70]
* ![][71] lorne schachter says:
[ December 1, 2010 at 8:46 am][72]
TECO - my favorite program. I port it everywhere. i got the source for visual TECO 20 years ago and I've ported it to every machine and operating system I've worked on. It does so many things that nothing else can do - like editing binary files. Data General had a version called SPEED for the nove and eclipse machines..
[Reply][73]
* ![][74] Stephen C. Steel says:
[ December 1, 2010 at 10:42 am][75]
This brought back some happy memories: the first serious computer I had access to was a PDP-10, and TECO was the editor of choice.
In those days, we had a simple test to distinguish the TECO gurus from mere mortals. A guru was someone who could explain how TECO would react when given their full name as input.
[Reply][76]
* ![][77] Joseph says:
[ December 1, 2010 at 11:37 am][78]
In Gentoo:
app-editors/teco
Latest version available: 1.00-r3
Latest version installed: [ Not Installed ]
Size of files: 210 kB
Homepage: <http://www.ibiblio.org/pub/linux/apps/editors/tty/> <http://w>
ww.ibiblio.org/pub/academic/computer-science/history/pdp-11/teco
Description: Classic TECO editor, Predecessor to EMACS
License: freedist
I'm emerging it now. Interesting, although I'm not sure what things it can do that emacs can't. Does explain the pervasive buffer and point system, tho.
[Reply][79]
* ![][29] MarkCC says:
[ December 1, 2010 at 11:46 am][80]
It's not that it can do anything that emacs _can't_. Elisp is turing complete, so obviously, anything you could do in Teco, you can do in emacs. It's just that in TECO, doing the edits by writing the program was _the_ way that you edited, and that made some things much more natural.
In TECO, doing a search and replace where you'd find something that matched a pattern, tested it with some condition, extracted something from it, showed you the proposed replacement, and asked you to confirm whether you wanted to do it or not - that was actually something that was very natural. Going from "search and replace specific text" to "search and replace regex" to "search and replace regex with confirmation" to "search and replace regex with automatic test followed by confirmation" was a natural progression. In emacs, you can do the search and replace - M-%. And you can do search-and-replace-regexp, again with a keystroke (which I don't remember). But there's a *huge* difference between using M-% and writing an elisp program to do search-and-replace-with-test.
[Reply][81]
* ![][82] Kevin C. says:
[ December 1, 2010 at 2:53 pm][83]
Ow ow ow ow! Was it truly necessary to subject us to such a detailed description of TECO?
Some of us have the good fortune to have been born into the age of visual editors. I thought you were discussing the details in order to then explain how your new editor makes a modern version of this... but no, you just end the article after describing the monstrosity. (which I'm sure may have been a pleasant reminder of days of yore for some...)
My sympathies to those who **had** to use such things, because that was the state of the art.
P.S. The worst editor I ever was subjected to on a regular basis was a modal editor under DOS called [SEE][84] which used the letter keys as commands, had one line of "help" text at the top to suggest commands. It reminds me in some ways of vi, but had nowhere the power or speed of vi. I either used a version before they added macro processing, or simply was never aware of how to use it due to a lack of a manual.
[Reply][85]
* ![][86] Eric says:
[ December 1, 2010 at 4:37 pm][87]
I happened to cut my teeth on VAXen, though I spent time in other editors, including the excellent TPU.
I recall the saying that one could not tell the difference between random transmission noise and a teco program.
[Reply][88]
* ![][89] trrll says:
[ December 1, 2010 at 5:20 pm][90]
I'd forgotten about TECO. It would be hard to convey to somebody raised on modern computers what a wonder it seemed when I first encountered it, after my previous experience in which the closest thing to an editor was a card punch machine.
[Reply][91]
* ![][92] WiseWoman says:
[ December 1, 2010 at 5:45 pm][93]
Ahhhh, TECO, there's a manual around here somewhere. I can't bear to part with it. TECO gave me the feeling of power, I could make that PDP-10 do stuff for *me*, if I could only get it fed into TECO right.
Didn't you all old geezers like me play the game of typing your name as a command and then seeing what was left? My real name starts with "D", with disastrous results....
Brainfuck in TECO - that's wild!
[Reply][94]
* ![][95] [Candid Engineer][96] says:
[ December 1, 2010 at 8:23 pm][97]
Ahh!!! After this post, I'm not sure I will ever try to read your blog again. 🙂
[Reply][98]
* ![][99] Martin Cohen says:
[ December 1, 2010 at 11:48 pm][100]
So I guess awk, with its pattern{action} paradigm was based, conceptually at least, on TECO.
gawk is my scripting language of choice.
[Reply][101]
* ![][102] Chris says:
[ December 2, 2010 at 3:22 am][103]
This article made me nostalgic for Boeing's cmedit... a character editing program that was available on the Cyber, PDP and VAX systems in the mid 1980s.
I could set up a batch cmedit program in the Cyber Star command file to change the data files so I could run multiple parameter studies (I set them to go sequentially as I left for home, and come in the next morning to several time series results being printed and plotted). One of my favorite moments was when a Computer Systems guy asked me why I didn't use the new fangled (1985) editors on the VAX, and then with three key strokes ran a cmedit batch file to change several data sets. The look on his face was priceless (these days the same thing would be a macro script, which was not a concept then).
Wow, I feel very old now. Especially since I started out using punch cards (but not paper tape!).
[Reply][104]
* ![][105] ix says:
[ December 2, 2010 at 11:00 am][106]
Working with the registers reminds me a lot of the same in vi: 0aua would "ayl.
I guess it's down to cross-pollination of the two in the times of ex?
[Reply][107]
* ![][46] lily says:
[ December 2, 2010 at 8:19 pm][108]
After reading this I looked TECO up on wikipedia and eventually I found this:
<http://en.wikipedia.org/wiki/LOLCODE>
I must learn this now.
[Reply][109]
* ![][110] Michael says:
[ December 2, 2010 at 10:11 pm][111]
Please post an update on your text editor when it is complete. As far as text editors go, there are some good ones already, but the differences you envision would be wonderful.
If you can really create a legible, sensible update to TECO, and embed it in a plain text editor, I'd easily see it replacing my current one (generally TextWrangler for OS X).
[Reply][112]
* ![][113] SWT says:
[ December 3, 2010 at 4:01 pm][114]
I so appreciate this discussion ... it makes me feel young! I got to use the newer tools (Scribe and emacs on a DEC 20) to prepare my Master's Thesis. I was able to leave the paper tape and Hollerith cards (and JCL) behinds when I finished my BS.
[Reply][115]
* ![][116] [matthiasr][117] says:
[ December 3, 2010 at 6:39 pm][118]
There are two separate C ports of teco - the one you linked and the one available the Gentoo ports and MacPorts.
The latter appears to be somewhat more complete; e.g. it has a working split screen mode with a live view of the buffer.
[Reply][119]
* ![][116] [matthiasr][117] says:
[ December 3, 2010 at 6:41 pm][120]
Also: thank you for showing this. I can now use an editor twice as old as me.
[Reply][121]
* ![][122] [Mark Westling][123] says:
[ December 3, 2010 at 7:07 pm][124]
I worked my way through college programming in the mid-70s and spent a fair amount of time on a DEC-10. What I remember most about TECO was that there was some useful combination of commands that was very close to HK (kill the buffer, and oh, by the way, it's not undoable). This was fixed in a release sometime around 1975 by changing the commands to make it harder to lose all your work. The hell with Beatles on iTunes; THAT was a day I'll remember forever!
[Reply][125]
* ![][126] Kaleberg says:
[ December 4, 2010 at 11:30 pm][127]
TECO was clearly influenced by Expensive Typewriter (ET) which ran on the PDP-1 using Friden Flexowriters. It had a great syntax for editing, even if it does seem obscure today. Too many editors were line oriented, so it was hard to diddle text in the middle of the line without typing in a complicated substitution command or giving up and just retyping the whole damned line. I liked TECO syntax so much I borrowed it for a file system maintenance and repair package. It was trivial to write a short command to grovel through a chain of disk blocks resetting bad flags or looking for bad block pointers.
By the early 70s, TECO was quite baroque and had commands for everything. One command, control-R, entered real time screen editing mode and let you specify a buffer that assigned each possible input character to a specified substring (I think based on chunks of six characters because six characters fit in a PDP-10 word.) The first usable screen version of TECO was known as RMACS, if I remember correctly, but EMACS quickly evolved, and I still remember and use the keystrokes I learned in 1973. (Control-A and Control-E work in most Cocoa text entry fields on the Mac; wow, they work here in Firefox.)
Bernie Greenberg wrote the first Lisp based EMACS for the old Multics system. He was one of the more serious system kernel programmers, but you had to be a kernel programmer to write EMACS because Multics didn't let anyone output a control-E which triggered automatic identification on an IBM 2741 terminal which could be used to defeat the time sharing CPU allocation algorithms by faking a user interaction. Since Bernie had access to the kernel code, he could send a control-E, so unlike others, he could send a command to move to the fifth line or fifth column on certain terminals.
Only later did Richard Stallman develop EMACS based on his own dialect of Lisp, though that programming language was basically compatible of Greenberg's version. In many ways, TECO and Lisp are both good languages for providing a simple programming substrate for all sorts of applications because neither is particularly hard to parse. You don't have to fire up YACC or Bison to deal with syntax. FORTH was another language with that characteristic, and FORTH survives as Postscript today.
[Reply][128]
* ![][129] [Jonathan][130] says:
[ December 5, 2010 at 2:54 pm][131]
You wrote "Vaxes" and Eric (above) wrote "VAXen" (which is what I remember). Were they both ok?
[Reply][132]
* ![][133] MBR says:
[ December 9, 2010 at 12:27 am][134]
I remember the TRS-80 level 2 BASIC line-editor being TECO-inspired, at least for simple commands like i,k,x, optional prefixes, etc.
I think SNOBOL was probably the most powerful text-massager around...
[Reply][135]
* ![][133] MBR says:
[ December 9, 2010 at 12:27 am][136]
And ICON...
[Reply][137]
* ![][138] fvngvs says:
[ December 9, 2010 at 5:07 am][139]
Crack the beer! Pathological Programming is back!
(Add another plea for updates on the editor, Mark.)
[Reply][140]
* ![][141] Scott says:
[ November 12, 2012 at 2:26 pm][142]
Good article. Interesting that in 38 plus years, TECO is still handy. Although, I have to type it without thinking too much -- its still in the fingers!
[Reply][143]
* ![][144] [Robin][145] says:
[ July 5, 2013 at 10:10 am][146]
Hi! I'm interested whether you still work on your TECO implementation.
I also did one with the motivation of updating TECO with more recent text editing features like syntax highlighting, interactivity, GUI interfaces and so on.
This is what I came up with: <http://rhaberkorn.github.io/sciteco/>
The main paradigmatic difference is I think that while you try to separate the interactive command dispatcher (i.e. function keys/mouse events) from the TECO interpreter like sam/Acme, I tried to combine them by making the language itself interactive.
The result is useful enough I'm already using it day to day as my *standard* editor!
btw. I'm also the one who did the project Euler solutions in TECO a few years ago 🙂
[Reply][147]
* ![][29] MarkCC says:
[ July 5, 2013 at 10:55 am][148]
I'm not really trying to build TECO - I'm doing a new language that's motivated by my love of TECO. I think that it's possible to build a cleaner, more legible, modern programming language that has many of the beautiful properties of teco.
My project has been sitting idle for quite a while - I was too busy to give it much attention. But in the last few weeks, I've actually been working on bringing it back to life.
I'm definitely going to check out what you've done - it sounds very exciting. Using a visual TECO again would be glorious.
[Reply][149]
* ![][150] Lee Doolan says:
[ June 4, 2016 at 7:11 am][151]
When I started a job working for a defense contractor in the mid-1970s, one of my first acts was to pick an editor. The choices were TECO and edlin. I picked TECO and I never regretted the decision.
[Reply][152]
### Leave a Reply [Cancel reply][153]
Name (required)
Email (required)
Website
* ![][154]
* **Scientopia Blogs**
Select a Blog Adventures in Ethics and Science Attack Polymerase Balanced Instability Book of Trogool Candid Engineer in Academia Chemical BiLOLogy Child's Play Christina's LIS Rant Complex Roots Data Hound The Difference Engine Drugmonkey Eagles RISE Everyday Biology Fumbling Towards Tenure Track Galactic Interactions Guest Blog Good Math/Bad Math Hardtack and Sardines InBabyAttachMode Mistress of the Animals Neurodynamics Neurotic Physiology Pondering Blather Professor in Training Prof-Like Substance Sanitized for Your Protection Science Professor Skulls in the Stars Suburban Stone Age Take it to the Bridge Tales of the Genomic Repairman The Hermitage The Meandering Scholar The Questionable Authority The Urban Ethnographer This Scientific Life Thus Spake Zuska Voltage Gate White Coat Underground WhizBANG
* * ## Recent Posts
* [Farewell, Scientopia! Hello goodmath.org!][155]
* [Hello World in ARM Assembly Language][156]
* [Everyone stop implementing programming languages, right now! It's been solved!][157]
* [On outing in the sciblogging community][158]
* [Oy Veh! Power Series, Analytic Continuations, and Riemann Zeta][159]
* ## Recent Comments
* [E. E. Escultura][160] on [E. E. Escultura and the Field Axioms][161]
* Lee Doolan on [The Glorious Horror of TECO][151]
* E. E. Escultura on [Turing Crackpottery!][162]
* E. E. Escultura on [Turing Crackpottery!][163]
* E. E. Escultura on [E. E. Escultura and the Field Axioms][164]
* ## Archives
* [February 2014][165]
* [January 2014][166]
* [December 2013][167]
* [November 2013][168]
* [October 2013][169]
* [September 2013][170]
* [August 2013][171]
* [July 2013][172]
* [June 2013][173]
* [May 2013][174]
* [April 2013][175]
* [March 2013][176]
* [February 2013][177]
* [January 2013][178]
* [December 2012][179]
* [November 2012][180]
* [October 2012][181]
* [September 2012][182]
* [August 2012][183]
* [July 2012][184]
* [June 2012][185]
* [May 2012][186]
* [April 2012][187]
* [March 2012][188]
* [February 2012][189]
* [January 2012][190]
* [December 2011][191]
* [November 2011][192]
* [October 2011][193]
* [September 2011][194]
* [August 2011][195]
* [July 2011][196]
* [June 2011][197]
* [May 2011][198]
* [April 2011][199]
* [March 2011][200]
* [February 2011][201]
* [January 2011][202]
* [December 2010][203]
* [November 2010][204]
* [October 2010][205]
* [September 2010][206]
* [August 2010][207]
* [July 2010][208]
* [June 2010][209]
* [May 2010][210]
* [April 2010][211]
* [March 2010][212]
* [February 2010][213]
* [January 2010][214]
* [December 2009][215]
* [November 2009][216]
* [October 2009][217]
* [September 2009][218]
* [August 2009][219]
* [July 2009][220]
* [June 2009][221]
* [May 2009][222]
* [April 2009][223]
* [March 2009][224]
* [February 2009][225]
* [January 2009][226]
* [December 2008][227]
* [November 2008][228]
* [October 2008][229]
* [September 2008][230]
* [August 2008][231]
* [July 2008][232]
* [June 2008][233]
* [May 2008][234]
* [April 2008][235]
* [March 2008][236]
* [February 2008][237]
* [January 2008][238]
* [December 2007][239]
* [November 2007][240]
* [October 2007][241]
* [September 2007][242]
* [August 2007][243]
* [July 2007][244]
* [June 2007][245]
* [May 2007][246]
* [April 2007][247]
* [March 2007][248]
* [February 2007][249]
* [January 2007][250]
* [December 2006][251]
* [November 2006][252]
* [October 2006][253]
* [September 2006][254]
* [August 2006][255]
* [July 2006][256]
* [June 2006][257]
* ## Categories
* [Abstract Algebra][258]
* [Bad Algebra][259]
* [Bad Economics][260]
* [Bad Logic][261]
* [Bad Math][262]
* [Bad Math Education][263]
* [Bad Physics][264]
* [Bad Probability][265]
* [Bad Software][266]
* [Bad Statistics][267]
* [Basics][268]
* [Book][269]
* [Cantor Crankery][270]
* [Category Theory][271]
* [Chatter][272]
* [classics][273]
* [climate][274]
* [complex analysis][275]
* [Computation][276]
* [Cryptography][277]
* [Data Structures][278]
* [Debunking Creationism][279]
* [Distributed Systems][280]
* [Egnorance][281]
* [Erlang][282]
* [fundamentalism][283]
* [Game Theory][284]
* [Good Math][285]
* [Good Physics][286]
* [goodmath][287]
* [Graph Theory][288]
* [Group Theory][289]
* [Haskell][290]
* [HIV denial][291]
* [Incompleteness][292]
* [Intelligent Design][293]
* [lambda calculus][294]
* [Logic][295]
* [Machine Language][296]
* [manual computing devices][297]
* [Meta][298]
* [Music][299]
* [Numbers][300]
* [Numerology][301]
* [Obfuscatory Math][302]
* [pathological programming][10]
* [People][303]
* [Personal][304]
* [Physics][305]
* [politics][306]
* [Politics][307]
* [probability][308]
* [Programming][309]
* [Recipes][310]
* [sexism][311]
* [Society][312]
* [statistics][313]
* [topology][314]
* [Uncategorized][11]
* [Warming][315]
* [woo][316]
* ## Meta
* [Log in][317]
* [Entries RSS][318]
* [Comments RSS][319]
* [WordPress.org][320]
[Site Admin][321] | Theme by [Niyaz][322] **Good Math Bad Math** Copyright © 2018 All Rights Reserved
[1]: http://goodmath.scientopia.org/wp-content/uploads/sites/18/2010/07/cropped-gmbm01_violet11.jpg
[2]: http://goodmath.scientopia.org/
[3]: http://goodmath.scientopia.org "Home"
[4]: http://goodmath.scientopia.org/about-2/
[5]: http://goodmath.scientopia.org/about-markcc/
[6]: http://goodmath.scientopia.org/contact-info/
[7]: http://scientopia.org/blogs/wp-content/uploads/2014/04/zappylab.png
[8]: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/
[9]: http://goodmath.scientopia.org/author/markcc/ "Posts by MarkCC"
[10]: http://goodmath.scientopia.org/category/good-math/programming/pathological-programming/
[11]: http://goodmath.scientopia.org/category/uncategorized/
[12]: http://home.tiac.net/~cri/2005/teco.html
[13]: http://www.copters.com/teco.html
[14]: http://almy.us/teco.html
[15]: http://goodmath.scientopia.org/tag/editors/
[16]: http://goodmath.scientopia.org/tag/history/
[17]: http://goodmath.scientopia.org/tag/pathological-programming/
[18]: http://goodmath.scientopia.org/tag/programming/
[19]: http://goodmath.scientopia.org/tag/teco/
[20]: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/#comments
[21]: http://2.gravatar.com/avatar/b288d022c980556b454d874b4032c0dc?s=28&d=mm&r=g
[22]: http://physioprof.wordpress.com
[23]: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/#comment-11094
[24]: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/?replytocom=11094#respond
[25]: http://2.gravatar.com/avatar/b337d1e52bf3d796a7728def67a602fd?s=28&d=mm&r=g
[26]: http://www.stonehenge.com/merlyn/
[27]: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/#comment-11095
[28]: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/?replytocom=11095#respond
[29]: http://1.gravatar.com/avatar/d91cbc789ef67801e927e627a583b5a4?s=28&d=mm&r=g
[30]: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/#comment-11107
[31]: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/?replytocom=11107#respond
[32]: http://1.gravatar.com/avatar/4334a219afde82433df63c7c71b675c5?s=28&d=mm&r=g
[33]: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/#comment-11120
[34]: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/?replytocom=11120#respond
[35]: http://0.gravatar.com/avatar/352603e575430df8997dad0ab4e35e17?s=28&d=mm&r=g
[36]: http://janneinosaka.blogspot.com
[37]: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/#comment-11096
[38]: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/?replytocom=11096#respond
[39]: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/#comment-11106
[40]: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/?replytocom=11106#respond
[41]: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/#comment-11115
[42]: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/?replytocom=11115#respond
[43]: http://2.gravatar.com/avatar/b3cba17cd5c6e976d2a58ff135587aec?s=28&d=mm&r=g
[44]: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/#comment-11097
[45]: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/?replytocom=11097#respond
[46]: http://0.gravatar.com/avatar/64ec7c9ae87fcf129e1488a4543a329e?s=28&d=mm&r=g
[47]: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/#comment-11098
[48]: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/?replytocom=11098#respond
[49]: http://0.gravatar.com/avatar/038e04cff1843e131b7c5da1f9c3db7c?s=28&d=mm&r=g
[50]: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/#comment-11099
[51]: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/?replytocom=11099#respond
[52]: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/#comment-11108
[53]: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/?replytocom=11108#respond
[54]: http://1.gravatar.com/avatar/a9220dff7c6e48a125c747dd2eb74ffe?s=28&d=mm&r=g
[55]: http://Perfcap.blogspot.com
[56]: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/#comment-11100
[57]: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/?replytocom=11100#respond
[58]: http://2.gravatar.com/avatar/5b4b1ef9c08a381e7ea09a593e24cca8?s=28&d=mm&r=g
[59]: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/#comment-11101
[60]: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/?replytocom=11101#respond
[61]: http://2.gravatar.com/avatar/b76f45154e724405359dfac73481dd57?s=28&d=mm&r=g
[62]: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/#comment-11111
[63]: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/?replytocom=11111#respond
[64]: http://2.gravatar.com/avatar/e27e3244a82fd04a8f8e7d2d6f67ae9e?s=28&d=mm&r=g
[65]: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/#comment-11102
[66]: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/?replytocom=11102#respond
[67]: http://0.gravatar.com/avatar/63a785851e350b71f4c310a0d9127745?s=28&d=mm&r=g
[68]: http://turnipsandpotatoes.wordpress.com
[69]: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/#comment-11103
[70]: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/?replytocom=11103#respond
[71]: http://0.gravatar.com/avatar/3ebc56ba96e19faf1cf4daf2d8655089?s=28&d=mm&r=g
[72]: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/#comment-11104
[73]: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/?replytocom=11104#respond
[74]: http://1.gravatar.com/avatar/d544f84477e19830e20057387ea3dec1?s=28&d=mm&r=g
[75]: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/#comment-11105
[76]: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/?replytocom=11105#respond
[77]: http://2.gravatar.com/avatar/84cfe73e01f1b39f8a0039af42d7e887?s=28&d=mm&r=g
[78]: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/#comment-11109
[79]: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/?replytocom=11109#respond
[80]: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/#comment-11110
[81]: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/?replytocom=11110#respond
[82]: http://1.gravatar.com/avatar/7bdce3bd7fa108e2b9d8f9c15c957f48?s=28&d=mm&r=g
[83]: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/#comment-11112
[84]: http://www.desmet-c.com/see_32.shtml
[85]: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/?replytocom=11112#respond
[86]: http://1.gravatar.com/avatar/af12de0b82ea567b80527604074a7d8a?s=28&d=mm&r=g
[87]: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/#comment-11113
[88]: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/?replytocom=11113#respond
[89]: http://1.gravatar.com/avatar/1e8dde1577ebb8d0fa2d909da84f1a6d?s=28&d=mm&r=g
[90]: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/#comment-11114
[91]: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/?replytocom=11114#respond
[92]: http://0.gravatar.com/avatar/6b034d5be32c619a7e1895862e6fd8a9?s=28&d=mm&r=g
[93]: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/#comment-11116
[94]: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/?replytocom=11116#respond
[95]: http://2.gravatar.com/avatar/5650517291937c6fac8107bb14586030?s=28&d=mm&r=g
[96]: http://scientopia.org/blogs/candidengineer
[97]: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/#comment-11117
[98]: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/?replytocom=11117#respond
[99]: http://2.gravatar.com/avatar/e214f5c143b40458c473bef6ee05823e?s=28&d=mm&r=g
[100]: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/#comment-11118
[101]: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/?replytocom=11118#respond
[102]: http://0.gravatar.com/avatar/0a9ae7b938ccff781b4a40a15598319d?s=28&d=mm&r=g
[103]: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/#comment-11119
[104]: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/?replytocom=11119#respond
[105]: http://0.gravatar.com/avatar/01bb891a03442bf5494b7e35804c6dc1?s=28&d=mm&r=g
[106]: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/#comment-11121
[107]: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/?replytocom=11121#respond
[108]: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/#comment-11122
[109]: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/?replytocom=11122#respond
[110]: http://0.gravatar.com/avatar/c822f3eb85599f1aeb3995fcc984c59b?s=28&d=mm&r=g
[111]: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/#comment-11123
[112]: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/?replytocom=11123#respond
[113]: http://0.gravatar.com/avatar/057da07c74d9cd73e33383e98c2fc82a?s=28&d=mm&r=g
[114]: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/#comment-11124
[115]: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/?replytocom=11124#respond
[116]: http://2.gravatar.com/avatar/bf10cdd3f7fae87516a246f132984792?s=28&d=mm&r=g
[117]: http://rampke.de
[118]: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/#comment-11125
[119]: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/?replytocom=11125#respond
[120]: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/#comment-11126
[121]: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/?replytocom=11126#respond
[122]: http://0.gravatar.com/avatar/04d5d4ec9b216b0e10680e757756d2dd?s=28&d=mm&r=g
[123]: http://westling@sigma-hk.com
[124]: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/#comment-11127
[125]: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/?replytocom=11127#respond
[126]: http://2.gravatar.com/avatar/5d094ab55778c2cd2ab5710eaf6eea29?s=28&d=mm&r=g
[127]: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/#comment-11128
[128]: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/?replytocom=11128#respond
[129]: http://1.gravatar.com/avatar/14818edd3dcff198f7cd8056677c0de5?s=28&d=mm&r=g
[130]: http://jd2718.wordpress.com
[131]: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/#comment-11129
[132]: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/?replytocom=11129#respond
[133]: http://2.gravatar.com/avatar/80d1c226cec9298f507edb0f2eb13a90?s=28&d=mm&r=g
[134]: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/#comment-11130
[135]: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/?replytocom=11130#respond
[136]: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/#comment-11131
[137]: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/?replytocom=11131#respond
[138]: http://1.gravatar.com/avatar/45878b203042a199eca292565ec3adde?s=28&d=mm&r=g
[139]: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/#comment-11132
[140]: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/?replytocom=11132#respond
[141]: http://0.gravatar.com/avatar/9f0a44483664fa1717b07d6ef2105b77?s=28&d=mm&r=g
[142]: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/#comment-11133
[143]: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/?replytocom=11133#respond
[144]: http://0.gravatar.com/avatar/6fbc8a1ceb420881e418236caaca2643?s=28&d=mm&r=g
[145]: https://github.com/rhaberkorn/
[146]: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/#comment-11134
[147]: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/?replytocom=11134#respond
[148]: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/#comment-11135
[149]: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/?replytocom=11135#respond
[150]: http://1.gravatar.com/avatar/1492d8d887b5a1178bf0103c3aae96c1?s=28&d=mm&r=g
[151]: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/#comment-218595
[152]: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/?replytocom=218595#respond
[153]: http://goodmath.scientopia.org/2010/11/30/the-glorious-horror-of-teco/#respond
[154]: http://scientopia.org/wp-content/uploads/logo-small.png
[155]: http://goodmath.scientopia.org/2014/02/13/farewell-scientopia-hello-goodmath-org/
[156]: http://goodmath.scientopia.org/2014/02/11/hello-world-in-arm-assembly-language/
[157]: http://goodmath.scientopia.org/2014/02/04/everyone-stop-implementing-programming-languages-right-now-its-been-solved/
[158]: http://goodmath.scientopia.org/2014/01/21/on-outing-in-the-sciblogging-community/
[159]: http://goodmath.scientopia.org/2014/01/20/oy-veh-power-series-analytic-continuations-and-riemann-zeta/
[160]: http://grandunitheory.com/
[161]: http://goodmath.scientopia.org/2011/02/10/e-e-escultura-and-the-field-axioms/#comment-240054
[162]: http://goodmath.scientopia.org/2010/09/08/1069/#comment-187641
[163]: http://goodmath.scientopia.org/2010/09/08/1069/#comment-187630
[164]: http://goodmath.scientopia.org/2011/02/10/e-e-escultura-and-the-field-axioms/#comment-187307
[165]: http://goodmath.scientopia.org/2014/02/
[166]: http://goodmath.scientopia.org/2014/01/
[167]: http://goodmath.scientopia.org/2013/12/
[168]: http://goodmath.scientopia.org/2013/11/
[169]: http://goodmath.scientopia.org/2013/10/
[170]: http://goodmath.scientopia.org/2013/09/
[171]: http://goodmath.scientopia.org/2013/08/
[172]: http://goodmath.scientopia.org/2013/07/
[173]: http://goodmath.scientopia.org/2013/06/
[174]: http://goodmath.scientopia.org/2013/05/
[175]: http://goodmath.scientopia.org/2013/04/
[176]: http://goodmath.scientopia.org/2013/03/
[177]: http://goodmath.scientopia.org/2013/02/
[178]: http://goodmath.scientopia.org/2013/01/
[179]: http://goodmath.scientopia.org/2012/12/
[180]: http://goodmath.scientopia.org/2012/11/
[181]: http://goodmath.scientopia.org/2012/10/
[182]: http://goodmath.scientopia.org/2012/09/
[183]: http://goodmath.scientopia.org/2012/08/
[184]: http://goodmath.scientopia.org/2012/07/
[185]: http://goodmath.scientopia.org/2012/06/
[186]: http://goodmath.scientopia.org/2012/05/
[187]: http://goodmath.scientopia.org/2012/04/
[188]: http://goodmath.scientopia.org/2012/03/
[189]: http://goodmath.scientopia.org/2012/02/
[190]: http://goodmath.scientopia.org/2012/01/
[191]: http://goodmath.scientopia.org/2011/12/
[192]: http://goodmath.scientopia.org/2011/11/
[193]: http://goodmath.scientopia.org/2011/10/
[194]: http://goodmath.scientopia.org/2011/09/
[195]: http://goodmath.scientopia.org/2011/08/
[196]: http://goodmath.scientopia.org/2011/07/
[197]: http://goodmath.scientopia.org/2011/06/
[198]: http://goodmath.scientopia.org/2011/05/
[199]: http://goodmath.scientopia.org/2011/04/
[200]: http://goodmath.scientopia.org/2011/03/
[201]: http://goodmath.scientopia.org/2011/02/
[202]: http://goodmath.scientopia.org/2011/01/
[203]: http://goodmath.scientopia.org/2010/12/
[204]: http://goodmath.scientopia.org/2010/11/
[205]: http://goodmath.scientopia.org/2010/10/
[206]: http://goodmath.scientopia.org/2010/09/
[207]: http://goodmath.scientopia.org/2010/08/
[208]: http://goodmath.scientopia.org/2010/07/
[209]: http://goodmath.scientopia.org/2010/06/
[210]: http://goodmath.scientopia.org/2010/05/
[211]: http://goodmath.scientopia.org/2010/04/
[212]: http://goodmath.scientopia.org/2010/03/
[213]: http://goodmath.scientopia.org/2010/02/
[214]: http://goodmath.scientopia.org/2010/01/
[215]: http://goodmath.scientopia.org/2009/12/
[216]: http://goodmath.scientopia.org/2009/11/
[217]: http://goodmath.scientopia.org/2009/10/
[218]: http://goodmath.scientopia.org/2009/09/
[219]: http://goodmath.scientopia.org/2009/08/
[220]: http://goodmath.scientopia.org/2009/07/
[221]: http://goodmath.scientopia.org/2009/06/
[222]: http://goodmath.scientopia.org/2009/05/
[223]: http://goodmath.scientopia.org/2009/04/
[224]: http://goodmath.scientopia.org/2009/03/
[225]: http://goodmath.scientopia.org/2009/02/
[226]: http://goodmath.scientopia.org/2009/01/
[227]: http://goodmath.scientopia.org/2008/12/
[228]: http://goodmath.scientopia.org/2008/11/
[229]: http://goodmath.scientopia.org/2008/10/
[230]: http://goodmath.scientopia.org/2008/09/
[231]: http://goodmath.scientopia.org/2008/08/
[232]: http://goodmath.scientopia.org/2008/07/
[233]: http://goodmath.scientopia.org/2008/06/
[234]: http://goodmath.scientopia.org/2008/05/
[235]: http://goodmath.scientopia.org/2008/04/
[236]: http://goodmath.scientopia.org/2008/03/
[237]: http://goodmath.scientopia.org/2008/02/
[238]: http://goodmath.scientopia.org/2008/01/
[239]: http://goodmath.scientopia.org/2007/12/
[240]: http://goodmath.scientopia.org/2007/11/
[241]: http://goodmath.scientopia.org/2007/10/
[242]: http://goodmath.scientopia.org/2007/09/
[243]: http://goodmath.scientopia.org/2007/08/
[244]: http://goodmath.scientopia.org/2007/07/
[245]: http://goodmath.scientopia.org/2007/06/
[246]: http://goodmath.scientopia.org/2007/05/
[247]: http://goodmath.scientopia.org/2007/04/
[248]: http://goodmath.scientopia.org/2007/03/
[249]: http://goodmath.scientopia.org/2007/02/
[250]: http://goodmath.scientopia.org/2007/01/
[251]: http://goodmath.scientopia.org/2006/12/
[252]: http://goodmath.scientopia.org/2006/11/
[253]: http://goodmath.scientopia.org/2006/10/
[254]: http://goodmath.scientopia.org/2006/09/
[255]: http://goodmath.scientopia.org/2006/08/
[256]: http://goodmath.scientopia.org/2006/07/
[257]: http://goodmath.scientopia.org/2006/06/
[258]: http://goodmath.scientopia.org/category/good-math/abstract-algebra/
[259]: http://goodmath.scientopia.org/category/bad-math/bad-algebra/
[260]: http://goodmath.scientopia.org/category/bad-math/bad-economics/
[261]: http://goodmath.scientopia.org/category/bad-math/bad-logic/
[262]: http://goodmath.scientopia.org/category/bad-math/
[263]: http://goodmath.scientopia.org/category/bad-math/bad-math-education/
[264]: http://goodmath.scientopia.org/category/bad-math/bad-physics/
[265]: http://goodmath.scientopia.org/category/bad-math/bad-probability/
[266]: http://goodmath.scientopia.org/category/bad-math/bad-software/
[267]: http://goodmath.scientopia.org/category/bad-math/bad-statistics/
[268]: http://goodmath.scientopia.org/category/good-math/basics/
[269]: http://goodmath.scientopia.org/category/book/
[270]: http://goodmath.scientopia.org/category/bad-math/cantor-crankery/
[271]: http://goodmath.scientopia.org/category/good-math/category-theory/
[272]: http://goodmath.scientopia.org/category/chatter/
[273]: http://goodmath.scientopia.org/category/classics/
[274]: http://goodmath.scientopia.org/category/bad-math/climate/
[275]: http://goodmath.scientopia.org/category/good-math/complex-analysis/
[276]: http://goodmath.scientopia.org/category/good-math/computation/
[277]: http://goodmath.scientopia.org/category/good-math/computation/cryptography/
[278]: http://goodmath.scientopia.org/category/good-math/programming/data-structures/
[279]: http://goodmath.scientopia.org/category/debunking-creationism/
[280]: http://goodmath.scientopia.org/category/distributed-systems/
[281]: http://goodmath.scientopia.org/category/bad-math/egnorance/
[282]: http://goodmath.scientopia.org/category/good-math/programming/erlang/
[283]: http://goodmath.scientopia.org/category/fundamentalism/
[284]: http://goodmath.scientopia.org/category/good-math/game-theory/
[285]: http://goodmath.scientopia.org/category/good-math/
[286]: http://goodmath.scientopia.org/category/good-math/good-physics/
[287]: http://goodmath.scientopia.org/category/goodmath/
[288]: http://goodmath.scientopia.org/category/good-math/graph-theory/
[289]: http://goodmath.scientopia.org/category/good-math/group-theory/
[290]: http://goodmath.scientopia.org/category/good-math/programming/haskell/
[291]: http://goodmath.scientopia.org/category/bad-math/hiv-denial/
[292]: http://goodmath.scientopia.org/category/good-math/logic/incompleteness-logic/
[293]: http://goodmath.scientopia.org/category/bad-math/intelligent-design/
[294]: http://goodmath.scientopia.org/category/good-math/lambda-calculus/
[295]: http://goodmath.scientopia.org/category/good-math/logic/
[296]: http://goodmath.scientopia.org/category/good-math/programming/machine-language/
[297]: http://goodmath.scientopia.org/category/manual-computing-devices/
[298]: http://goodmath.scientopia.org/category/meta/
[299]: http://goodmath.scientopia.org/category/music/
[300]: http://goodmath.scientopia.org/category/good-math/numbers/
[301]: http://goodmath.scientopia.org/category/bad-math/numerology/
[302]: http://goodmath.scientopia.org/category/bad-math/obfuscatory-math/
[303]: http://goodmath.scientopia.org/category/people/
[304]: http://goodmath.scientopia.org/category/personal/
[305]: http://goodmath.scientopia.org/category/physics/
[306]: http://goodmath.scientopia.org/category/politics/
[307]: http://goodmath.scientopia.org/category/politics-2/
[308]: http://goodmath.scientopia.org/category/good-math/probability/
[309]: http://goodmath.scientopia.org/category/good-math/programming/
[310]: http://goodmath.scientopia.org/category/recipes/
[311]: http://goodmath.scientopia.org/category/sexism/
[312]: http://goodmath.scientopia.org/category/society/
[313]: http://goodmath.scientopia.org/category/statistics/
[314]: http://goodmath.scientopia.org/category/topology/
[315]: http://goodmath.scientopia.org/category/warming/
[316]: http://goodmath.scientopia.org/category/woo/
[317]: http://goodmath.scientopia.org/wp-login.php
[318]: http://goodmath.scientopia.org/feed/
[319]: http://goodmath.scientopia.org/comments/feed/
[320]: https://wordpress.org/ "Powered by WordPress, state-of-the-art semantic personal publishing platform."
[321]: http://goodmath.scientopia.org/wp-admin/ "Site Admin"
[322]: http://www.diovo.com/links/voidy/ "Diovo"
[*RSS]: Really Simple Syndication