在Pick BASIC源代码中,我看到诸如
的行CALL SOMEPROGRAM (PARAM1, PARAM2)
如何从TCL命令提示符下调用同一行?我尝试了以下方法的变体,但似乎没有任何作用。
SOMEPROGRAM ('1','2')
我发现的唯一方法是使用单行命令编写和编译程序,然后运行该程序。
答案 0 :(得分:0)
Tcl可以使用exec
作为子进程来调用 overall 程序文件,但是由程序决定将其转换为对程序的调用并处理正确的参数。 / p>
运行该程序的Tcl代码可能看起来像这样:
exec {*}[auto_execok CALLERPROGRAM]
如果要传递参数1
和2
,则可以这样做:
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实现的一部分。
马克·约翰逊