如何使用参数运行程序(Pick BASIC)

时间:2019-03-15 14:24:32

标签: pick

在Pick BASIC源代码中,我看到诸如

的行
CALL SOMEPROGRAM (PARAM1, PARAM2)

如何从TCL命令提示符下调用同一行?我尝试了以下方法的变体,但似乎没有任何作用。

SOMEPROGRAM ('1','2')

我发现的唯一方法是使用单行命令编写和编译程序,然后运行该程序。

5 个答案:

答案 0 :(得分:0)

Tcl可以使用exec作为子进程来调用 overall 程序文件,但是由程序决定将其转换为对程序的调用并处理正确的参数。 / p>

运行该程序的Tcl代码可能看起来像这样:

exec {*}[auto_execok CALLERPROGRAM]

如果要传递参数12,则可以这样做:

exec {*}[auto_execok CALLERPROGRAM] 1 2

同样,也没有说这些值如何从命令行获取到Pick Basic子程序中。您需要查阅Pick文档以了解操作方法。但是我知道(并且已经测试)Tcl肯定会正确地提供它们……

答案 1 :(得分:0)

在Pick BASIC中,CALL语句用于调用子例程,不能直接从TCL中执行它们。通过将程序第一行的第一个单词设置为SUBROUTINE来表示子例程。

您可以从TCL执行“程序”。这些不包括源代码顶部的SUBROUTINE。在某些Pick BASIC变体中,您可能需要包括PROGRAM,但我认为大多数都不需要(我知道D3不需要)。这些程序可以从TCL运行,但是它们不会像子例程那样自动传递命令行参数。我认为您几乎可以在任何Pick BASIC变体中使用SENTENCE()来获取命令行参数。

这是一个示例程序,将打印命令行参数:

PRINT SENTENCE()
END

您可以使用它来创建一个程序,该程序将使用命令行参数并将其传递给子例程以为您执行某些操作。

答案 2 :(得分:0)

如果这是您的日常活动:

SUBROUTINE REALPROG(A,B)
PRINT "A is ":A
PRINT "B is ":B
END

要从命令行调用它,您将构建以下例程:

PROGRAM WRAPPERPROG
COMMAND.RECEIVED = SENTENCE()
VAR1 = FIELD(COMMAND.RECEIVED,' ',2)
VAR2 = FIELD(COMMAND.RECEIVED,' ',3)
CALL REALPROG(VAR1, VAR2)
END

假设您是从TCL / ECL命令行输入的:

WRAPPERPROG DOG CAT

VAR1为DOG,VAR2为CAT

...并使用这些参数调用REALPROG,您应该看到

A is DOG
B is CAT

答案 3 :(得分:0)

我实际上是在输入一些详尽的答案,但您的问题已得到回答。您不能直接调用子例程,需要调用一个调用该子例程的程序。子例程也是从主程序中分离代码以减少混乱的好方法,但它们始终是必需的。您可以使用的其他方法是函数或GOSUBS / GOTOS。这是下面的GOTO的示例。

VAR = 'HELLO'
GOTO 10:

10:
CRT VAR

在TCL中,您将调用程序的名称,并且无需调用其他程序即可执行所有这些代码。 输出将是字符串hello。

答案 4 :(得分:0)

30年前,我写了一个实用程序来解决这个问题。其他基础知识(QB,VB,Dartmouth)只有一个命令行。您正在将行写入程序中或正在处理单行请求。选择没有。

我创建了一个名为PRINT的MD项目。然后,它运行一个名为BP PRINT的程序,该程序占用整个TCLREAD行,并将其写到另一个名为BP PPRINT的程序空间中,对其进行编译,然后运行它。

非常有用。因此,在TCL上,这些命令将起作用:

打印; X = 1; Y = 2;呼叫SOMESUB(X,Y)

打印;对于I = 1到12;打印(I * 28)“ DMA”;下一步我

打印;从“ 1234”中打开“ CUST”,然后为READV名称,然后是1 THEN,然后打印名称

PRINT OCONV(“ 12345678”,“ MD2Z,$”)

打印日期()

基本上,可以在单行代码中编程的任何内容都可以通过TCL以这种方式键入。任何IF或ELSE语句必须在同一行中完成。非常适合测试。

应该是开箱即用的每个Pick实现的一部分。

马克·约翰逊