RetroBASIC
Basicprogramming(.org) => Community news and announcements => Topic started by: Ed Davis on June 05, 2019, 11:02:13 AM
-
New Web-based BASIC-like language: https://easylang.online/
It is pretty cool. Lots of examples at their website (above). For instance, here is our old friend the mandelbrot:
floatvars
for y% range 300
cy = (y% - 150) / 120
for x% range 300
cx = (x% - 220) / 120
n% = 0
x = 0
y = 0
while x * x + y * y < 4 and n% < 128
h = x * x - y * y + cx
y = 2 * x * y + cy
x = h
n% += 1
.
if n% = 128
color_red 0
else
color_red n% / 16
.
move x% / 3 y% / 3
rect 0.4 0.4
.
.
It is pretty fun to play with!
-
Interesting, Python like and min. punctuation, reminds me of BestOf's stuff (who started calling himself "easylang").
-
Interesting, Python like and min. punctuation, reminds me of BestOf's stuff (who started calling himself "easylang").
Not to be argumentative - well, but I guess I am :-) - I don't really see much Python in it.
Python uses indentation for syntax, this uses ".". Python has lists and hashes, this does not.
This reminds me more of BASIC, what with the integer% and float# stuff.
And functions and subs look at least a little like BASIC:
# compute the greatest common divisor
#
func gcd a b . res .
while b <> 0
h = b
b = a mod b
a = h
.
res = a
.
call gcd 120 35 r
print r
I really don't like the "." syntax - much prefer the "end" style stuff, or even C's {}.
And it also has the infamous Fern, so it must be BASIC :-)
floatvars
color 060
for i% range 200000
r = randomf
if r < 0.01
nx = 0
ny = 0.16 * y
elif r < 0.08
nx = 0.2 * x - 0.26 * y
ny = 0.23 * x + 0.22 * y + 1.6
elif r < 0.15
nx = -0.15 * x + 0.28 * y
ny = 0.26 * x + 0.24 * y + 0.44
else
nx = 0.85 * x + 0.04 * y
ny = -0.04 * x + 0.85 * y + 1.6
.
x = nx
y = ny
move 50 + x * 15 100 - y * 10
rect 0.3 0.3
.
-
he he
it is freaking BASIC...
...sooooo is not dead ;D
-
Interesting, Python like and min. punctuation, reminds me of BestOf's stuff (who started calling himself "easylang").
Not to be argumentative - well, but I guess I am :-) - I don't really see much Python in it.
Python uses indentation for syntax, this uses ".". Python has lists and hashes, this does not.
This reminds me more of BASIC, what with the integer% and float# stuff.
And functions and subs look at least a little like BASIC:
# compute the greatest common divisor
#
func gcd a b . res .
while b <> 0
h = b
b = a mod b
a = h
.
res = a
.
call gcd 120 35 r
print r
I really don't like the "." syntax - much prefer the "end" style stuff, or even C's {}.
And it also has the infamous Fern, so it must be BASIC :-)
floatvars
color 060
for i% range 200000
r = randomf
if r < 0.01
nx = 0
ny = 0.16 * y
elif r < 0.08
nx = 0.2 * x - 0.26 * y
ny = 0.23 * x + 0.22 * y + 1.6
elif r < 0.15
nx = -0.15 * x + 0.28 * y
ny = 0.26 * x + 0.24 * y + 0.44
else
nx = 0.85 * x + 0.04 * y
ny = -0.04 * x + 0.85 * y + 1.6
.
x = nx
y = ny
move 50 + x * 15 100 - y * 10
rect 0.3 0.3
.
My opinion based on superficial look of one code sample, ha! the dots are like nothing... It does have a number of simple examples. I wonder about doing something more complex, say with image manipulation or alpha coloring.
BTW the elif and func are just like SmallBASIC.
-
It does have a number of simple examples. I wonder about doing something more complex, say with image manipulation or alpha coloring.
How about this one? https://easylang.online/samples/analog-clock.html (https://easylang.online/samples/analog-clock.html)
And then click on "Edit with EasyLang" to see the code.
See here for other samples: https://easylang.online/samples/ (https://easylang.online/samples/)
Being the ignorant old console oriented guy I am, I have no idea what alpha coloring is :)
-
Alpha is adding transparency to color.
Are all variables global? Range start at 1 or 0?
Where is decent Help for complete list and description of keywords?
3 digit color is something I worked up myself some time ago: 1000 permutations from R,G,B 0 to 9.
-
3 digit color is something I worked up myself some time ago: 1000 permutations from R,G,B 0 to 9.
This sounds very interesting! I'd really like to see this if you don't mind sharing it.
Are all variables global?
Good question. I'm not really sure. I found this:
Subroutines are defined with subr and called with call. Global variables are used for parameters and return values.
Functions are defined with func and called with call. Value and reference parameters are specified after the function name. Variables that occur for the first time within a function are local to that function.
Still not 100% clear to me.
# greatest common divisor with a function
#
func gcd a b . res .
while b <> 0
h = b
b = a mod b
a = h
.
res = a
.
call gcd 120 35 r
print r
Range start at 1 or 0?
I found this:
The field elements can be accessed using square brackets and a position specification, also called index. The first element is at position 0. len returns the number of elements in the array.
Definitely in need of additional reference material.
Where is decent Help for complete list and description of keywords?
Missing in action, it seems! Hopefully the author will add it soon!
Alpha is adding transparency to color.
In terms of the Windows API, is that this guy?
SetLayeredWindowAttributes function
Sets the opacity and transparency color key of a layered window.
Syntax
BOOL SetLayeredWindowAttributes(
HWND hwnd,
COLORREF crKey,
BYTE bAlpha,
DWORD dwFlags
);
Parameters
hwnd - Type: HWND
A handle to the layered window. A layered window is created by specifying WS_EX_LAYERED when creating the window with the CreateWindowEx function or by setting WS_EX_LAYERED via SetWindowLong after the window has been created.
crKey - Type: COLORREF
A COLORREF structure that specifies the transparency color key to be used when composing the layered window. All pixels painted by the window in this color will be transparent. To generate a COLORREF, use the RGB macro.
bAlpha - Type: BYTE
Alpha value used to describe the opacity of the layered window. Similar to the SourceConstantAlpha member of the BLENDFUNCTION structure. When bAlpha is 0, the window is completely transparent. When bAlpha is 255, the window is opaque.
dwFlags - Type: DWORD
An action to be taken. This parameter can be one or more of the following values.
Value Meaning
LWA_ALPHA
0x00000002
Use bAlpha to determine the opacity of the layered window.
LWA_COLORKEY
0x00000001
Use crKey as the transparency color.
-
Quote from: B+ on Today at 14:51:16
3 digit color is something I worked up myself some time ago: 1000 permutations from R,G,B 0 to 9.
This sounds very interesting! I'd really like to see this if you don't mind sharing it.
If you don't mind QB64 code ;)
_TITLE "3 digit Colour System demo" 'B+ 2019-06-06
'everything without Type Suffix will be Single
'setup a graphics screen
CONST xmaxScreen = 800 '<<< constants don't have to be typed
CONST ymaxScreen = 600
SCREEN _NEWIMAGE(xmaxScreen, ymaxScreen, 32) '<<< 32 means to use highest graphics RGBA color system
_SCREENMOVE 300, 100 'put screen approx in middle of display for 1280X760 laptop
colour 950
S$ = "Here is Orange: colour 950"
FOR i = 1 TO 10
LINE (RND * xmaxScreen * .4, RND * ymaxScreen)-STEP(80, 60), _DEFAULTCOLOR, BF
NEXT
LOCATE 20, 20: PRINT S$
colour 707
S$ = "And here is Purple: colour 707"
FOR i = 1 TO 10
LINE (RND * xmaxScreen * .5 + .5 * xmaxScreen, RND * ymaxScreen)-STEP(80, 60), _DEFAULTCOLOR, BF
NEXT
LOCATE 20, 60: PRINT S$
SLEEP
'set COLOR foreground for drawing or printing text FROM up to 3 digit integer parameter
SUB colour (n AS INTEGER) 'can't use COLOR as is keyword
s3$ = RIGHT$("000" + LTRIM$(STR$(n)), 3)
r = VAL(MID$(s3$, 1, 1)): IF r THEN r = 28 * r + 3
g = VAL(MID$(s3$, 2, 1)): IF g THEN g = 28 * g + 3
b = VAL(MID$(s3$, 3, 1)): IF b THEN b = 28 * b + 3
COLOR _RGB32(r, g, b)
END SUB
' 2019-06-06 I will build an rgb sub off a mod of this because I can't find the SmallBASIC code or maybe SdlBasic code
FUNCTION rgba~& (n) ' New (even less typing!) New Color System 1000 colors with up to 3 digits
s4$ = RIGHT$("0000" + LTRIM$(STR$(n)), 4)
r = VAL(MID$(s4$, 1, 1)): IF r THEN r = 28 * r + 3
g = VAL(MID$(s4$, 2, 1)): IF g THEN g = 28 * g + 3
b = VAL(MID$(s4$, 3, 1)): IF b THEN b = 28 * b + 3
a = VAL(MID$(s4$, 4, 1)): IF a THEN a = 28 * a + 3
rgba~& = _RGBA32(r, g, b, a)
END SUB
With QB64 I have since moved on to using &HFFFF8C00 for Orange 950 and &HFF840084 for Purple 707:
_TITLE "3 digit Colour System demo" 'B+ 2019-06-06
'everything without Type Suffix will be Single
'setup a graphics screen
CONST xmaxScreen = 800 '<<< constants don't have to be typed
CONST ymaxScreen = 600
SCREEN _NEWIMAGE(xmaxScreen, ymaxScreen, 32) '<<< 32 means to use highest graphics RGBA color system
_SCREENMOVE 300, 100 'put screen approx in middle of display for 1280X760 laptop
'colour 950
COLOR &HFFFF8C00
S$ = "Here is Orange: COLOR &HFFFF8C00"
FOR i = 1 TO 10
LINE (RND * xmaxScreen * .4, RND * ymaxScreen)-STEP(80, 60), _DEFAULTCOLOR, BF
NEXT
LOCATE 20, 20: PRINT S$
'colour 707
COLOR &HFFD400D4
S$ = "And here is Purple: COLOR &HFFD400D4"
FOR i = 1 TO 10
LINE (RND * xmaxScreen * .5 + .5 * xmaxScreen, RND * ymaxScreen)-STEP(80, 60), _DEFAULTCOLOR, BF
NEXT
LOCATE 20, 60: PRINT S$
SLEEP
'set COLOR foreground for drawing or printing text FROM up to 3 digit integer parameter
SUB colour (n AS INTEGER) 'can't use COLOR as is keyword
s3$ = RIGHT$("000" + LTRIM$(STR$(n)), 3)
r = VAL(MID$(s3$, 1, 1)): IF r THEN r = 28 * r + 3
g = VAL(MID$(s3$, 2, 1)): IF g THEN g = 28 * g + 3
b = VAL(MID$(s3$, 3, 1)): IF b THEN b = 28 * b + 3
COLOR _RGB32(r, g, b)
END SUB
' 2019-06-06 I will build an rgb sub off a mod of this because I can't find the SmallBASIC code or maybe SdlBasic code
FUNCTION rgba~& (n) ' New (even less typing!) New Color System 1000 colors with up to 3 digits
s4$ = RIGHT$("0000" + LTRIM$(STR$(n)), 4)
r = VAL(MID$(s4$, 1, 1)): IF r THEN r = 28 * r + 3
g = VAL(MID$(s4$, 2, 1)): IF g THEN g = 28 * g + 3
b = VAL(MID$(s4$, 3, 1)): IF b THEN b = 28 * b + 3
a = VAL(MID$(s4$, 4, 1)): IF a THEN a = 28 * a + 3
rgba~& = _RGBA32(r, g, b, a)
END SUB
-
Range starts at 1, it must!
Angles are in degrees.
Here is Easylang Clock Sim at least the drawing part, I simplified the call to SYStem since QB64 has TIME$ function:
_TITLE "Easylang Sim Output: Clock " 'started 2019-06-06 by B+
DEFSNG A-Z 'everything without Type Suffix will be Single
'setup a graphics screen
CONST xmaxScreen = 400 '<<< constants don't have to be typed
CONST ymaxScreen = 400
SCREEN _NEWIMAGE(xmaxScreen, ymaxScreen, 32) '<<< 32 means to use highest graphics RGBA color system
_SCREENMOVE 300, 100 'put screen approx in middle of display for 1280X760 laptop
'setup globals to do things like easylang does
DIM SHARED sz, cx, cy
DIM SHARED colr AS _UNSIGNED LONG
'on timer
' if t$ <> sys "time"
' t$ = sys "time"
' h$ = sys "time:" & t$
' sec = number substr h$ 17 2
' min = number substr h$ 14 2
' hour = number substr h$ 11 2
' if hour > 12
' hour -= 12
' .
' call draw hour min sec
' timer 0.98
' else
' timer 0.01
' .
'.
'timer 0
'using a timer is too complicated, just get the time, 30 per sec
CLS , &HFFFFFFFF
DO
t$ = TIME$
hour = VAL(MID$(t$, 1, 2))
IF hour > 12 THEN hour = hour - 12
min = VAL(MID$(t$, 4, 2))
sec = VAL(MID$(t$, 7, 2))
drawClock hour, min, sec
_DISPLAY
_LIMIT 30 '<<< loops per sec
LOOP
'func draw hour min sec . . <<< really a sub because no return value
SUB drawClock (hour, min, sec)
' # dial
' color 333
colour 333
' move 50 50
move 50, 50
' circle 45
circul 45
' color 797
colour 797
' circle 44
circul 44
' color 333
colour 333
' for i range 60
FOR i = 1 TO 60
' a# = i * 6
a = i * 6
' move 50 + sin a# * 40 50 - cos a# * 40
move 50 + SIN(_D2R(a)) * 40, 50 - COS(_D2R(a)) * 40
' circle 0.25
circul .25
' .
NEXT
' for i range 12
FOR i = 1 TO 12
' a# = i * 30
a = i * 30
' move 50 + sin a# * 40 50 - cos a# * 40
move 50 + SIN(_D2R(a)) * 40, 50 - COS(_D2R(a)) * 40
' circle 1
circul 1
' .
NEXT
' # hour
' linewidth 2
lineWidth 2
' color 000
colour 0
' a# = (hour * 60 + min) / 2
a = (hour * 60 + min) / 2
' move 50 50
move 50, 50
' line 50 + sin a# * 32 50 - cos a# * 32
lyne 50 + SIN(_D2R(a)) * 32, 50 - COS(_D2R(a)) * 32
' # min
' linewidth 1.5
lineWidth 1.5
' a# = (sec + min * 60) / 10
a = (sec + min * 60) / 10
' move 50 50
move 50, 50
' line 50 + sin a# * 40 50 - cos a# * 40
lyne 50 + SIN(_D2R(a)) * 40, 50 - COS(_D2R(a)) * 40
' # sec
' linewidth 1
lineWidth 1
' color 700
colour 700
' a# = sec * 6
a = sec * 6
' move 50 50
move 50, 50
' line 50 + sin a# * 40 50 - cos a# * 40
lyne 50 + SIN(_D2R(a)) * 40, 50 - COS(_D2R(a)) * 40
'.
END SUB
'set COLOR foreground for drawing or printing text FROM up to 3 digit integer parameter
SUB colour (n AS INTEGER) 'can't use COLOR as is keyword
s3$ = RIGHT$("000" + LTRIM$(STR$(n)), 3)
r = VAL(MID$(s3$, 1, 1)): IF r THEN r = 28 * r + 3
g = VAL(MID$(s3$, 2, 1)): IF g THEN g = 28 * g + 3
b = VAL(MID$(s3$, 3, 1)): IF b THEN b = 28 * b + 3
colr = _RGB32(r, g, b)
END SUB
SUB move (setX, setY)
cx = setX * 4: cy = setY * 4
END SUB
SUB circul (radius)
fcirc cx, cy, 4 * radius, colr
END SUB
SUB lyne (endx, endy)
thic2 cx, cy, 4 * endx, 4 * endy, sz, colr
END SUB
SUB lineWidth (width)
sz = 4 * width
END SUB
' 2019-06-06 I will build an rgb sub off a mod of this because I can't find the SmallBASIC code or maybe SdlBasic code
FUNCTION rgba~& (n) ' New (even less typing!) New Color System 1000 colors with up to 3 digits
s4$ = RIGHT$("0000" + LTRIM$(STR$(n)), 4)
r = VAL(MID$(s4$, 1, 1)): IF r THEN r = 28 * r + 3
g = VAL(MID$(s4$, 2, 1)): IF g THEN g = 28 * g + 3
b = VAL(MID$(s4$, 3, 1)): IF b THEN b = 28 * b + 3
a = VAL(MID$(s4$, 4, 1)): IF a THEN a = 28 * a + 3
rgba~& = _RGBA32(r, g, b, a) '>>> a is for alpha 0 to 255 0 is completely transparent 255 is completely opaque
END SUB
'from Steve Gold standard
SUB fcirc (CX AS INTEGER, CY AS INTEGER, R AS INTEGER, C AS _UNSIGNED LONG)
DIM Radius AS INTEGER, RadiusError AS INTEGER
DIM X AS INTEGER, Y AS INTEGER
Radius = ABS(R)
RadiusError = -Radius
X = Radius
Y = 0
IF Radius = 0 THEN PSET (CX, CY), C: EXIT SUB
' Draw the middle span here so we don't draw it twice in the main loop,
' which would be a problem with blending turned on.
LINE (CX - X, CY)-(CX + X, CY), C, BF
WHILE X > Y
RadiusError = RadiusError + Y * 2 + 1
IF RadiusError >= 0 THEN
IF X <> Y + 1 THEN
LINE (CX - Y, CY - X)-(CX + Y, CY - X), C, BF
LINE (CX - Y, CY + X)-(CX + Y, CY + X), C, BF
END IF
X = X - 1
RadiusError = RadiusError - X * 2
END IF
Y = Y + 1
LINE (CX - X, CY - Y)-(CX + X, CY - Y), C, BF
LINE (CX - X, CY + Y)-(CX + X, CY + Y), C, BF
WEND
END SUB
'this version needs fcirc and is pretty inefficient but once and a while it comes in handy
SUB thic2 (x1, y1, x2, y2, rThick, K AS _UNSIGNED LONG)
'x1, y1 is one endpoint of line
'x2, y2 is the other endpoint of the line
'rThick is the radius of the tiny circles that will be drawn
' from one end point to the other to create the thick line
'Yes, the line will then extend beyond the endpoints with circular ends.
rThick = INT(rThick / 2): stepx = x2 - x1: stepy = y2 - y1
length = INT((stepx ^ 2 + stepy ^ 2) ^ .5)
IF length THEN
dx = stepx / length: dy = stepy / length
FOR i = 0 TO length
fcirc x1 + dx * i, y1 + dy * i, rThick, K
NEXT
ELSE
fcirc x1, y1, rThick, K
END IF
END SUB
Easylangs Clock window size did adjust to changing window size of browser! I had to scale everything in Easylang to 4 x's pixels for comparison drawings.
-
wait a moment
qb64 don't have RGB(r,g,b) function built in :o
-
wait a moment
qb64 don't have RGB(r,g,b) function built in :o
wait... then what are QB64's: _RGB(r, g, b), _RGB32(r, g, b [, a optional]), _RGBA(r, g, b, a), _RGBA32(r, g, b, a) functions for? ;)
BTW all keywords that start with underline eg_KEYWORD, are new to QB64 that are not found in QB 4.5 or other older QB versions. This is to help track what is and is not compatible to old code.
-
OK a list of built in functions can be found at the end of Code Snippets section.