Conditional inclusion of subroutine

For tips, questions and general information about writing Add-ins, how to package them, and how to submit them to EViews for publication.

Moderators: EViews Gareth, EViews Moderator

CrisisStudent
Posts: 49
Joined: Mon Nov 16, 2020 10:52 am

Conditional inclusion of subroutine

Postby CrisisStudent » Mon Nov 16, 2020 11:11 am

Hi,

I am writing add-in and as one option I allow users to specify their own modified subroutine to perform as part of the add-in. The motivation is to allow users to easily incorporate their custom procedure into the add-in that performs many other functions. However, when doing this I am encountering limitations on what is allowed in Eviews. My first attempt was to include the subroutine only if add-in argument is specified, e.g.

Code: Select all

Select all if arg="T" then include subname.prg endif

This does not seem to be allowed in Eviews.

The alternative approach was to specify variable path from which to include subroutine and use default path if subroutine program does not exist in the specified location; e.g.

Code: Select all

Select all if arg="T" then %subourtine_path = "C:\\documents" else %subourtine_path = "default_path" endif include %subourinte_path

However, it seems that inclusion command cannot use strings, but has to have hardcoded path.

Therefore, the only solution I could figure out was to include default subroutine program from the add-in folder, which the user then would have to modify, i.e. user would not be able to use subroutine program of his own choosing.

Is there any suggested way one can allow conditional inclusion of subroutines or variable path of subroutine files?

Thanks!
CrisisStudent

EViews Matt
EViews Developer
Posts: 585
Joined: Thu Apr 25, 2013 7:48 pm

Re: Conditional inclusion of subroutine

Postby EViews Matt » Tue Nov 17, 2020 5:45 pm

Hello,

The include command is unlike other commands in that all includes are processed when a program is loaded, before the program actually begins executing. Consequently, includes cannot benefit from conditional statements or program variables. You can work around this limitation by splitting the program into two parts, a first part that writes the dynamic information (the desired include statements) to a fixed-name auxiliary program, and a second part the includes said auxiliary program and performs the rest of the work. As a working example, suppose I have two different versions of a subroutine, only one of which I want to include in my main program at runtime.

version1.prg:

Code: Select all

subroutine get_message(string %m) %m = "Low" endsub
version2.prg:

Code: Select all

subroutine get_message(string %m) %m = "High" endsub
Unfortunately, I cannot write my main program as follows:

Code: Select all

create u 1 series x = rnd if x(1) < .5 then include version1.prg else include version2.prg endif call get_message(%msg) @uiprompt(%msg)
Instead, I will split my main program and have the first part use a text object to build and save a list of inclusions that the second part will intake.

part1.prg:

Code: Select all

create u 1 series x = rnd text include_list if x(1) < .5 then include_list.append include version1.prg else include_list.append include version2.prg endif include_list.save dynamic_includes.prg run part2.prg
part2.prg:

Code: Select all

include dynamic_includes.prg call get_message(%msg) @uiprompt(%msg)
Following this approach, your add-in should be to accept user-provided code without unduly limiting the user.
Last edited by EViews Matt on Wed Nov 18, 2020 8:05 am, edited 2 times in total.

CrisisStudent
Posts: 49
Joined: Mon Nov 16, 2020 10:52 am

Re: Conditional inclusion of subroutine

Postby CrisisStudent » Wed Nov 18, 2020 1:59 am

Thanks Matt, this should work!


Return to “Add-in Writing area”

Who is online

Users browsing this forum: No registered users and 1 guest