【问题标题】:Does any dialect of Pascal allow a variable number of arguments?帕斯卡的任何方言是否允许可变数量的参数?
【发布时间】:2009-09-22 12:21:37
【问题描述】:

这是年长程序员的问题。

几年前,我遇到了一种帕斯卡方言,它通过某种扩展允许可变数量的参数。

有谁知道当前的帕斯卡方言允许可变数量的参数?

鉴于 Pascal 不像以前那样受欢迎,如果答案是否定的,我不会感到惊讶。

顺便说一句, 更正确,不是说可变数量的参数,而不是参数?

【问题讨论】:

  • 是的,更正确的说法是可变参数个数,函数只能有一个参数,即可变参数列表,通常作为最后一个参数
  • 我喜欢这样的思考方式:'一个参数是参数的变量列表' +1(但你还不够足够老 ;-D)

标签: language-features pascal


【解决方案1】:

没有。答案基于我使用过的帕斯卡方言;其他的可能不同。

原因是 Pascal 将参数按顺序推送到堆栈帧上,因此所有参数都通过堆栈指针的固定偏移量访问。相比之下,C 以相反的顺序推送参数,因此定义的参数位于固定偏移量,您可以通过指针算术访问“额外”参数。我会尝试一些 ASCII 艺术:

        Pascal                  C

                                ---------------------
                                |     extra arg     |
        ---------------------   ---------------------
        |     1st param     |   |     3rd param     |
        ---------------------   ---------------------
        |     2nd param     |   |     2nd param     |
        ---------------------   ---------------------
SP ->   |     3rd param     |   |     1st param     |
        ---------------------   ---------------------

至于参数与参数:据我所知,函数(方法)定义其参数,调用者传递参数。我相信,这个定义来自 Fortran 手册,所以这应该让您了解我的年龄:-)

【讨论】:

  • 谢谢,我看看能不能找到关于 Apollo DOMAIN Pascal 内部结构的一些描述,这是一种允许变量列表的方言(我仍然仍然使用)。你的解释有道理。
  • 如果你还在使用它,你应该能够反汇编一个具有不同调用序列的示例。如果他们使用 C 调用约定,我不会感到惊讶。
  • 有关 Apollo 文档,请参见此处:bitsavers.trailing-edge.com/pdf/apollo
【解决方案2】:

您可以在 delphi 中使用可选参数来获得相同的效果:

procedure Proc(const A: Integer; const B: Integer = 15);

Proc(10);  // B = 15
Proc(20,30);

或重载方法:

procedure Proc(const A: Integer); overload;
procedure Proc(const A,B: Integer); overload;

Proc(10);     // Variant 1
Proc(20,30);  // Variant 2

或者你可以使用变量数组作为参数:

procedure Message(const AMessage: string; const AArgs: array of const);

Message('Hello %s', [Name]);
Message('%s %s', [Greeting, Name]);

【讨论】:

  • 太好了,我刚刚把自己认定为老了 ;-)。
  • 看起来您在第二个示例中明确构建了数组,对吗?
  • @Gamecat,我会把它归结为你 30 年的经验,虽然 age 并没有什么问题。谢谢。
【解决方案3】:

GNU-Pascal(基于 gcc)afaik 将 1:1 映射到 C 支持。使用类似语法的函数 something(arg:pchar;...)

Delphi/Free Pascal 支持“const 数组”,这是一个类型安全的版本,以及用于 C 接口(D6 或 D7+)的 varargs 指令

【讨论】:

    【解决方案4】:

    您可能正在考虑一个可用于 Turbo Pascal 的库,他们有这样的 hack。我的语法对于对象和继承它有点生疏。

    type
      TValue = object;
    
      TInteger = object(TValue)
        Value : Integer;
      end
    
      TString = object(TValue)
        Value : String;
      end
    
      TParam = record
        Value : TValue;
        Param : TParam;
      end;
    
      TValue = object;
    
    { Definition of Function }
    function Test (Arg : TParam);
    
    { Usage }
    var
      I : TInteger;
      S : TString;
    
    Test (TParam (I, TParam (S, nil));
    

    你可以链接任意数量的参数。最后一个必须以 nil 终止。

    【讨论】:

      【解决方案5】:

      是的!

      使用params 关键字:

      procedure write(params args: array of Object);
      begin
        {...}
      end;
      

      【讨论】:

      • 这是什么方言?
      • @Doj PascalABC.NET
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多