Mais antigamente ainda não tinha o GOSUB tinha que se virar com o GOTO.

Nós usavamos um artifício, uma variável que armazenava o número da linha para a qual o programa deveria continuar.

Bem, é possível que a versão que vocês utilizavam não havia implementado gosub. Assim como algumas não implementavam READ/DATA (o que eu acho que seria bem interessante para a fase de testes nas linguagens atuais)

Busquei o manual do primeiro BASIC (1964) para confirmar. Tinha GOTO/GOSUB e me deparei com algo que não conhecia. Já era possível definir funções simples iniciando com FN e mais uma letra (até 26 funções) do tipo:

10 REM FND = DOBRO
15 DEF FND(X)=2*X
20 PRINT FND(4)

Como eram usados cartões, em vez de = era para entrar EQU, LSS para <, etc..

Moral: Aprendi algumas coisas que não sabia sobre BASIC (não vou usar mas não tem problema :D )

Provavelmente você aprendeu BASIC no CP500 não foi? O CP500 tinha muita memória RAM. Eu sempre fico feliz quando encontro algum programador da mesma época. Eu usava BASIC em PCs mais simples; sem o `GOSUB`. Haviam também os Sinclair com uma versão extendida; o Sinclair BASIC, com vários (ironia aqui) comandos a mais que os outros PCs, talvez uns 5 comandos a mais. O `DEF FN` funciona de maneira semelhante ao `#define` do C, utilizando o exemplo que você deu, sempre que o interpretador BASIC encontrar `FND(X)` faz uma substituição por `2*X` (mantendo o que encontrar no lugar do `X`); dessa maneira o programa não perdia desempenho em termos de velocidade, e ainda era possível utilizar o `DEF FN` com qualquer tipo de variável inclusive alfanuméricas. Se ingnorarmos que o C é compilado e o BASIC interpretado, então `DEF FN` e `#define` são exatamente iguais. Porém; não éra possível ter "Comandos" BASIC dentro do `DEF FN`, nem recursividade, nem multiplas linhas. Não era possível por exemplo criar uma função que aguardasse o usuário digitar algo e então retornar um valor; nem uma função que pudesse ler de um arquivo e retornar um valor. Apesar de ser uma função do ponto de vista matemático; não era uma função como as outras da própria linguagem e que morriamos de vontade de criar nossas próprias funções personalizadas; nada perto do que sabemos que é uma função numa linguagem de programação. Isso foi introduzido mais tarde com o uso de `SUB` e `FUNCTION`. Quanto ao `GOSUB` não foi implementado nos primeiros interpretadores BASIC por que esse comando necessitava de uma STACK para empilhar as linhas para as quais deveria retornar. Observe que o manual de **1964** que você leu é do "Dartmouth Time Sharing System"; e anterior ao lançamento do primeiro processador comercial; o Intel 4004 de **1971**. Acredito que raríssimos programadores tiveram acesso a esse sistema da Dartmouth. Nessa época nem os bancos tinham computadores! Os computadores só se tornaram acessíveis aos programadores após o Z80 de **1976**; mas bem depois... No Brasil os primeiros PCs foram fabricados em meados dos anos **80** e custavam o equivalente a dois carros zero quilômetros; e as leis de importação tornavam proibitivo importar um PC. Alguns PCs dessa época tinham o interpretador BASIC na própria ROM que costumava ter 4 kB para caber o interpretador BASIC e era invocado logo após a BIOS, isso tornava possível baratear o PC pois não precisaria uma unidade de disquetes para rodar o BASIC. Porém a RAM como era muito cara tinha no máximo 1 kB então o `GOSUB` foi suprimido evitando a necessidade de criar uma stack adicional só para esse comando.