Logcomp1 es un “compilador” de logo a basic, es decir, crea un programa de logo y crea un programa basic. El problema es que, realmente, mi conocimiento de logo era muy superficial (sólo conocía las instrucciones de dibujo y la creación de diccionarios, lo que hoy llamaríamos “funciones” o “subs”). Pero sirve para crear pequeños dibujos.
Antes de escribirlo había hecho (en papel!) otro programa similar para Spectrum, que no llegué a probar.
A partir de este programa creé otro para Qbasic; sin embargo, las características de Qbasic hicieron que lo enfocase de manera diferente.
NOTA: Hay una línea errónea entre la 560 y la 580, debido a la degradación del disquete. Creo que sólo está mal el número de línea (que debería ser 570), pero por si acaso lo he dejado igual.
10 REM COMPILADOR DE JLOGO A BASIC 20 CLS:PRINT "TRADUCTOR DE JOSELOGO A GWBASIC. VERSIàN 0.1." 30 DIM P$(10):DIM PR$(100):LI=10 40 LET BUCLE=0 50 LINE INPUT "¨Archivo? ";F$ 60 GOSUB 390 70 LINE INPUT "¨àrden? ";A$ 80 REM Separando ¢rdenes y par metros------------------------------------- 90 P=1 100 FOR A=1 TO 10:P$(A)="":NEXT 110 ORD$="":FOR N=1 TO LEN(A$) 120 IF MID$(A$,N,1)=" " AND P=1 THEN ORD$=MID$(A$,1,N-1):P=2:GOTO 150 130 IF MID$(A$,N,1)=" " AND MID$(A$,N+1,1)<>" " AND P>2 THEN P=P+1:GOTO 150 140 IF P>1 THEN P$(P)=P$(P)+MID$(A$,N,1) 150 NEXT 160 IF P=1 AND ORD$="" THEN ORD$=A$ 170 REM Int‚rprete--------------------------------------------------------- 180 TRA$="" 190 IF ORD$="TO" THEN F$=P$(2):GOSUB 560 200 IF ORD$="FILE" THEN F$=P$(2):GOSUB 390 210 IF ORD$="DO" THEN BUCLE=BUCLE+1 220 BUCL$=STR$(BUCLE):IF MID$(BUCL$,1,1)=" " THEN BUCL$=MID$(BUCL$,2) 230 IF ORD$="SET" THEN TRA="LET "+P$(2) 240 IF ORD$="PD" THEN TRA$="PU=1" 250 IF ORD$="PU" THEN TRA$="PU=0" 260 IF ORD$="FD" THEN TRA$="X=X+SIN(DIR)*"+P$(2)+":Y=Y+COS(DIR)*"+P$(2) 270 IF ORD$="BK" THEN TRA$="X=X-SIN(DIR)*"+P$(2)+":Y=Y-COS(DIR)*"+P$(2) 280 IF ORD$="LT" THEN TRA$="DIR=DIR+("+ P$(2)+ "/180) *3.141592" 290 IF ORD$="RT" THEN TRA$="DIR=DIR-("+ P$(2)+ "/180) *3.141592" 300 IF ORD$="DO" OR ORD$="{" THEN TRA$="FOR A"+ BUCL$+ "=1 TO "+P$(2) 310 IF ORD$="}" THEN TRA$="NEXT A"+BUCL$ 320 IF ORD$="END" THEN TRA$="END" 330 IF ORD$="PROCEDURE" THEN GOSUB 680 340 IF ORD$="ENDPROC" THEN GOSUB 630 350 IF ORD$="HOME" THEN TRA$="X=160:Y=100" 360 IF ORD$="CS" THEN TRA$="CLS: X=160:Y=100" 370 GOSUB 480 380 GOTO 70 390 REM ------------------ARCHIVO------------------------------- 400 ON ERROR GOTO 430 410 OPEN F$ FOR APPEND AS #1 420 RETURN 430 RESUME 440 OPEN F$ FOR OUTPUT AS #1 450 PRINT #1, 5:" SCREEN 2" 460 ON ERROR GOTO 470 RETURN 480 REM *******************GRABANDO****************************** 490 IF TRA$="" THEN PRINT "ERROR SINTµCTICO":RETURN 500 TRA$=TRA$+":LINE (AX,AY)-(X,Y),PU:AX=X:AY=Y 510 PRINT #1, LI;" ";TRA$ 520 PRINT LI, TRA$ 530 IF ORD$="}" THEN BUCLE=BUCLE-1 540 LI=LI+5 550 RETURN 560 REM ---------------------PROCESO------------------------------ 14880 IF ALIN<>LI AND ALIN<>0 THEN GOSUB 630:PRINT "CERRANDO EL PROCESO ANTERIOR" 580 ALIN=0:FOR A=1 TO 100 590 IF PR$(A)="" AND ALIN=0 THEN PR$(A)=F$:ALIN=LI:LI=A*1000:ABU=BUCLE:BUCLE=A*20 600 NEXT :IF LI=ALIN THEN PRINT "NO HAY ESPACIO PARA EL PROCESO EN MEMORIA" 610 TRA$="REM *TO "+F$+"*" 620 RETURN 630 REM ----------------------ENDPROC---------------------------- 640 IF LI=ALIN THEN PRINT "NO HAY PROCESO EN DEFINICIàN":RETURN 650 TRA$="RETURN":GOSUB 480:TRA$="" 660 LI=ALIN:BUCLE=ABU 670 RETURN 680 REM LLAMADA A UN PROCESO 690 CLIN=0:FOR A=1 TO 100 700 IF CLIN=0 AND PR$(A)=P$(2) THEN CLIN=A*1000 710 NEXT 720 IF CLIN=0 THEN PRINT "EL PROCESO NO SE ENCUENTRA":RETURN 730 TRA$="GOSUB "+STR$(CLIN) 740 RETURN
EJEMPLO: