在 Pick BASIC 源代码中,我看到诸如
CALL SOMEPROGRAM (PARAM1, PARAM2)
如何从 TCL 命令提示符调用同一行?我尝试了以下变体,但似乎没有任何效果。
SOMEPROGRAM ('1','2')
我发现的唯一方法是使用单行命令编写和编译程序,然后运行该程序。
在 Pick BASIC 源代码中,我看到诸如
CALL SOMEPROGRAM (PARAM1, PARAM2)
如何从 TCL 命令提示符调用同一行?我尝试了以下变体,但似乎没有任何效果。
SOMEPROGRAM ('1','2')
我发现的唯一方法是使用单行命令编写和编译程序,然后运行该程序。
如果这是你的日常:
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
我实际上是在输入一些详尽的答案,但是您的问题已得到解答。不能直接调用子程序,需要调用调用子程序的程序。子程序也是将代码与主程序分开以减少混乱的好方法,但它们并不总是必需的。您可以使用的其他方法是函数或 GOSUBS/GOTOS。这是下面的 GOTO 示例。
VAR = 'HELLO'
GOTO 10:
10:
CRT VAR
从 TCL 中,您将调用程序的名称,并且所有这些代码都将在不调用另一个程序的情况下执行。输出将是字符串 hello。
我在 30 多年前写了一个实用程序来解决这个问题。其他基础知识(QB、VB、达特茅斯)只有一个命令行。您要么将行写入程序,要么处理单行请求。皮克没有。
我创建了一个名为 PRINT 的 MD 项目。然后它运行一个名为 BP PRINT 的程序,该程序获取整个 TCLREAD 行,将其写入另一个名为 BP PPRINT 的程序空间,对其进行编译,然后运行它。
非常有用。因此,在 TCL 中,这些命令将起作用:
打印 ; X=1 ; Y=2;呼叫某些人(X,Y)
打印 ; 对于 I=1 到 12 ;打印 (I*28)"DMA" ; 下一个
打印 ; 打开“CUST”然后从“1234”读取名称,1 然后打印名称
打印 OCONV("12345678","MD2Z,$")
打印日期()
基本上任何可以在一行代码中编程的东西都可以通过这种方式在 TCL 上输入。任何 IF 或 ELSE 语句都必须在同一行中完成。非常适合测试。
应该是开箱即用的每个 Pick 实现的一部分。
马克约翰逊
In Pick BASIC CALL statements are used to call subroutines and they can't be directly executed from TCL. Subroutines are denoted by setting the first word on the first line of the program to SUBROUTINE.
You can execute "programs" from TCL. These don't include the SUBROUTINE at the top of the source code. In some Pick BASIC variants you may need to include PROGRAM but I think most don't require that (I know D3 doesn't). These programs can be run from TCL but they don't get the command line parameters passed in automatically like subroutines do. I think you can use SENTENCE() in pretty much any Pick BASIC variant to get the command line parameters.
Here's an example program that will print the command line arguments:
PRINT SENTENCE()
END
You could use this to create a program that will take the command line arguments and pass them into a subroutine to do something for you.
Tcl 可以使用 调用您的整个程序文件作为子exec
进程,但是由您的程序将其转换为对程序的调用和正确参数的处理。
运行程序的 Tcl 代码可能看起来像这样:
exec {*}[auto_execok CALLERPROGRAM]
如果您传递参数1
并2
结束,您会这样做:
exec {*}[auto_execok CALLERPROGRAM] 1 2
同样,这并没有说明这些值是如何从命令行进入 Pick Basic 子程序的。您需要查阅 Pick 文档以了解如何执行此操作。但我知道(并且已经测试过)Tcl 肯定会正确地提供它们……</p>