Alguma versão de 8 bits do MS BASIC permitia funções de string definidas pelo usuário?

Oct 18 2020

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

11 TimLocke Oct 18 2020 at 07:37

BBC BASIC faz. Exemplo do manual:

100 DEF FNMID(A$) 110 LOCAL L 120 L=LEN(A$)
140 =MID$(A$,L/2,1)
5 scruss Oct 18 2020 at 22:21

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
2 PatrickSchlüter Oct 19 2020 at 17:01

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 **