Alguma versão de 8 bits do MS BASIC permitia funções de string definidas pelo usuário?
Meu BASIC está quase funcionando, quase sendo o DEF FN. Só para não me encurralar, existe algum BASIC "mainstream" da era de 8 bits que permite funções de string definidas pelo usuário ?
Estou usando principalmente "The Basic Language" de BASIC Computer Games como meu guia para a linguagem, e realmente não diz muito sobre o assunto. Todo uso de DEFno livro é sempre matemática. Commodore BASICs definitivamente não suportam funções de string, o lado direito deve ser uma expressão matemática, e eu suspeito que isso seja verdade para a maioria dos outros derivados dela.
Há algum dialeto de 8 bits importante que suporte isso - TRS-80, Coco, TI-99, Sinclair, BBC, etc? Não estou tentando fazer GW ou mesmo MSX, mas ficaria curioso para saber se eles fizeram.
Respostas
BBC BASIC faz. Exemplo do manual:
100 DEF FNMID(A$) 110 LOCAL L 120 L=LEN(A$)
140 =MID$(A$,L/2,1)
Locomotive BASIC oferece suporte a funções de string (assim como MSX BASIC 1.0 e BASIC-80 Rev. 5.2):
10 DEF FNa(x)=x/2
20 DEF FNb$(a$)=LEFT$(a$,1)
30 PRINT FNa(10)
40 PRINT FNb$("phweeen")
Ready
run
5
p
Ready
TI-99 / 4A definitivamente sim. Ele tinha DEF para funções numéricas e de string, em TI-Basic normal e em TI-Extended Basic. Trecho do manual do usuário.
DEFine
{ numeric-function-name |(parameter)| = numeric-expression }
DEF { string-functlon-name|(parameter)| = string$-expresslon } The DEFine statement allows you to define your own functions to use within a program. The function-name you specify may be any valid variable name. If you specify a parameter following the function-name. the parameter must be enclosed in parentheses and may be any valid variable name. Note that if the expression you specify evaluates to a string result. the (unction-name you use must be string variable name (i.e .. the last character must be a dollar sign. $).
[..]
User·s Reference Guide
Examples:
>NEW
>100 REM TAKE A NAME AND PRINT IT BACKWARDS
>110 DEF BACK$(Xl=SEG$(NAME$ , x, 1 ) >120 INPUT "NAME? ":NAME$
>130 FOR I=LEN(NAME$) TO 1 STEP -1 >140 BNAME$=BNAME$&BACK$(I)
>150 NEXT I
>160 PRINT NAME$: BNAMES
>170 END
>RUN
NAME? ROBOT
ROBOT
TOBOR
** FEITO **