Sharing Code Between Programs
01-16-2022, 08:44 PM (This post was last modified: 01-16-2022 08:53 PM by IHarwell.)
Post: #1
 IHarwell Junior Member Posts: 18 Joined: Jan 2022
Sharing Code Between Programs
I can't be the only person annoyed that the documentation for the Prime describes "calling programs from other programs" basically amounts to "there's a call stack, but you can't call functions from other files."

With that said, I found a rather straightforward way to call code contained in other files. I haven't tested the feature too extensively, but here's what I've found so far:

Let's say you want to make a function library for your programs to share. In my case, I wanted to have a way to draw the "shift" symbol in the correct place for any of my programs. This is the "library" file I created.

Code:
#cas DrawShiftMark():= BEGIN  LOCAL c2:=RGB(0,255,255);  FILLPOLY_P(G0,{{2,7},{2,3},{1,3},{3,1},{5,3},{4,3},{4,7}},c2);  PIXON_P(G0,11,2,c2);  LINE_P(G0,8,1,10,1,c2);  LINE_P(G0,7,2,7,3,c2);  LINE_P(G0,8,4,10,4,c2);  LINE_P(G0,11,5,11,6,c2);  LINE_P(G0,8,7,10,7,c2);  PIXON_P(G0,7,6,c2); END; ClearShiftMark():= BEGIN  LOCAL x_left:=1;  LOCAL x_right:=11;  LOCAL y_top:=1;  LOCAL y_bottom:=7;  LOCAL Y;  FOR Y FROM y_top TO y_bottom DO   LOCAL bg:=GETPIX_P(G0,x_right+1,Y);   LINE_P(G0,x_left,Y,x_right,Y,bg);  END; END; #end

This file creates the functions and makes them available through the CAS system.

To call them, there are two options that currently occur to me. The first is more direct, and looks like:
Code:
CAS("DrawShiftMark()");

The second basically uses a verbose import statement by wrapping the CAS command in a function.

Code:
LOCAL DrawShiftMark() BEGIN  CAS("DrawShiftMark()"); END;

While it's a workable solution as-is, this approach is vulnerable to name collisions. I'll look into using the "folders" system that I ran across and posted about in an earlier thread to see if I can get something like namespaces working. Until then, I thought it was a pretty neat technique that enables more compact programs than could be done otherwise.

If anyone has related ideas or has any ways to extend this, I'd be very interested to take a look.

P.S. The current holdup for implementing namespaces is due to the EVAL function doing weird things with the "END" keyword. There may be a workaround, but I'll have to test it out a bit.
01-16-2022, 10:15 PM
Post: #2
 Didier Lachieze Senior Member Posts: 1,493 Joined: Dec 2013
RE: Sharing Code Between Programs
Any reason to have these defined as CAS programs while they don’t use any CAS function?

I would rather define them as PPL programs and with EXPORT they would be callable from other programs :

Code:
#pragma mode( separator(.,;) integer(h32) ) EXPORT DrawShiftMark() BEGIN  LOCAL c2:=RGB(0,255,255);  FILLPOLY_P(G0,{{2,7},{2,3},{1,3},{3,1},{5,3},{4,3},{4,7}},c2);  PIXON_P(G0,11,2,c2);  LINE_P(G0,8,1,10,1,c2);  LINE_P(G0,7,2,7,3,c2);  LINE_P(G0,8,4,10,4,c2);  LINE_P(G0,11,5,11,6,c2);  LINE_P(G0,8,7,10,7,c2);  PIXON_P(G0,7,6,c2); END; EXPORT ClearShiftMark() BEGIN  LOCAL x_left:=1;  LOCAL x_right:=11;  LOCAL y_top:=1;  LOCAL y_bottom:=7;  LOCAL Y;  FOR Y FROM y_top TO y_bottom DO   LOCAL bg:=GETPIX_P(G0,x_right+1,Y);   LINE_P(G0,x_left,Y,x_right,Y,bg);  END; END;
01-16-2022, 10:44 PM
Post: #3
 IHarwell Junior Member Posts: 18 Joined: Jan 2022
RE: Sharing Code Between Programs
(01-16-2022 10:15 PM)Didier Lachieze Wrote:  Any reason to have these defined as CAS programs while they don’t use any CAS function?

I would rather define them as PPL programs and with EXPORT they would be callable from other programs :

Code:
#pragma mode( separator(.,;) integer(h32) ) EXPORT DrawShiftMark() BEGIN  LOCAL c2:=RGB(0,255,255);  FILLPOLY_P(G0,{{2,7},{2,3},{1,3},{3,1},{5,3},{4,3},{4,7}},c2);  PIXON_P(G0,11,2,c2);  LINE_P(G0,8,1,10,1,c2);  LINE_P(G0,7,2,7,3,c2);  LINE_P(G0,8,4,10,4,c2);  LINE_P(G0,11,5,11,6,c2);  LINE_P(G0,8,7,10,7,c2);  PIXON_P(G0,7,6,c2); END; EXPORT ClearShiftMark() BEGIN  LOCAL x_left:=1;  LOCAL x_right:=11;  LOCAL y_top:=1;  LOCAL y_bottom:=7;  LOCAL Y;  FOR Y FROM y_top TO y_bottom DO   LOCAL bg:=GETPIX_P(G0,x_right+1,Y);   LINE_P(G0,x_left,Y,x_right,Y,bg);  END; END;

Weirdly, I was getting errors with that method. Ideally, I'd like to arrange these as "UI.DrawShift" and "UI.ClearShift". Unfortunately, that requires CAS to do. Getting it to work is proving challenging. They appear to have gone to great lengths to prevent the use of those structures in code.
01-19-2022, 12:29 AM
Post: #4
 BruceH Senior Member Posts: 390 Joined: Dec 2013
RE: Sharing Code Between Programs
Have you tried attaching the code to an app and calling that?

Which I think you can do by calling

Code:
var := appname.functioname(params)

Sorry to be so vague - don't have the Prime to hand but I'm sure I recall CdB mentioning it at one time.
 « Next Oldest | Next Newest »

User(s) browsing this thread: 1 Guest(s)