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: 48
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: 560
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: 48
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 4 guests