A propos de l'implémentation d'E / S nommées

introduction

Une fois, à l'un des forums informatiques, les participants ont partagé leurs réflexions sur ce qui leur manque en langues, pour ainsi dire, dans leurs activités quotidiennes. L'un d'eux a dit qu'il lui manquait cruellement un opérateur comme put data . Pour ceux qui n'en ont pas entendu parler, j'expliquerai que le langage PL / 1 a fourni un opérateur pour sortir (ou entrer) les valeurs des variables avec leurs noms, c'est-à-dire ainsi que des identifiants.





, put list(X,Y); - :





1280    1024





put data(X,Y); :





X=   1280  Y=   1024





:





put list(’X=’,X,’Y=’,Y);





, . , put data, «» get data .





, «» ( ) put data .





, , () . put data . « », (.. ) . , exe- . «» . , , , put data, , . , «» . , .





-

, , put data . . , , . :





1. , -. , , . (.. ) , , , , .., .





2. , . , , . , , .





, . - .





put data , ( ) , « ».





. - «», . «» , .. , , -.





, , :





put data(x(i+1,j-1));





:





put list(’x(i+1,j-1)=’,x(i+1,j-1));





, -, . . , , .





-

« » . put data, – - . - , .





, put data , :





put data(x);





« » - :





do i=lbound(x) to hbound(x); put data(x(i)); end;





. , x – (, 33), put data(x); , - :





X(1,1)=    1 X(1,2)=    2 X(1,3)=    3 X(2,1)=    4 X(2,2)=    5 X(2,3)=    6 X(3,1)=    7 X(3,2)=    8 X(3,3)=    9





put data(x(2)); :





X(2,1)=    4 X(2,2)=    5 X(2,3)=    6





x – ( PL/1 ), , :





declare





1 a,





 2 a1  fixed,





 2 a2  fixed,





 2 b,





  3 b1 fixed,





  3 b2 float;





put data(a);





A.A1=      0 A.A2=      0 A.B.B1=      0 A.B.B2=  0.000000E+00





, , (.. ), :





declare





1 a(1:2),





 2 a1         fixed,





 2 a2         fixed,





 2 b,





  3 b1 (-5:3) fixed,





  3 b2 float;





put data(b);





B(1).B1(-5)=      0 B(1).B1(-4)=      0 B(1).B1(-3)=      0 B(1).B1(-2)=      0 B(1).B1(-1)=      0 B(1).B1(0)=      0 B(1).B1(1)=      0 B(1).B1(2)=      0 B(1).B1(3)=      0 B(1).B2=  0.000000E+00 B(2).B1(-5)=      0 B(2).B1(-4)=     0 B(2).B1(-3)=      0 B(2).B1(-2)=      0 B(2).B1(-1)=      0 B(2).B1(0)=      0 B(2).B1(1)=      0 B(2).B1(2)=   0 B(2).B1(3)=      0 B(2).B2=  0.000000E+00





PL/1 -. . - :





put list((x(i) do i=lbound(x) to hbound(x)));





:





do i=lbound(x) to hbound(x); put list(x(i)); end;





- . , PL/1 , , , . , :





put list(1e0*(x1+x2)/2e0));





, , - , . – , . .





, (put data) – . , . , , . . . – , , , -.





, -, « », . .





, put data, , . .. , , . - , , , , , , - .





, , . , , x(1:10,1:10,1:10) :





put list(x); 1000





put list(x(5)); 100





put list(x(5,6)); 10 .





put list(x(5,6,8)); - .





, put data , . ?A, ?B, ?,…?O ( 15 15) :





X(?A,?B)=    1 X(?A,?B)=    2 X(?A,?B)=    3 X(?A,?B)=    4 X(?A,?B)=    5 X(?A,?B)=    6 X(?A,?B)=    7 X(?A,?B)=    8 X(?A,?B)=    9





. put data – ?A, ?B, ?,…?O, 07FH.





, , , , , . . , , .





, put data - get data, , . , , PL/1 . , . , , put data(x);, :





X(1,2)=    2 X(1,1)=    1 X(2,3)=    6 X(2,1)=    4 X(2,2)=    5 X(3,1)=    7 X(1,3)=    3 X(3,2)=    8 X(3,3)=    9





get data(x); , . , , , , - . , , exe-, get data. , . – put data get data «» put get .





, - . , , - , . - , , , .





, , , , . , , , , -.





, , :





1.  .





2.   .





« » , , , « ».





, , . , , , , .. , put data.





, , , PL/1:





using System.Console;
using PL1.Macro;

module Program
{
  Main() : void
  {
    def x = 1280;
    def y = 1024;
    put data(x, y);
    put data(x, y, x + y, x.ToString() + "asd");
    _ = ReadLine();
  }
}
using Nemerle;
using Nemerle.Compiler;
using Nemerle.Compiler.Parsetree;

using System.Collections.Generic;
using System.Linq;

namespace PL1.Macro
{
  public macro PutData(args)
  syntax ("put", "data", args)
  {
    PutDataImpl.Impl(args)
  }

  module PutDataImpl
  {
    public Impl(args : PExpr) : PExpr
    {
      match (args)
      {
        | PExpr.Tuple as args =>
          def code = List();
          foreach (arg in args.args)
          {
            code.Add(<[ $(arg.ToString()) ]>);
            code.Add(<[ "=" ]>);
            code.Add(arg);
            code.Add(<[ " " ]>);
          }
          code.RemoveAt(code.Count - 1);
          def code = code.Aggregate((a1, a2) => <[ $a1 + $a2 ]>);
          <[ System.Console.WriteLine($(code)) ]>
        | _ => PExpr.Error(args.Location, "Tuple expected.")
      }
    }
  }
}

      
      



Cependant, quand on m'a demandé de modifier la bibliothèque pour qu'elle permette d'afficher des objets non scalaires avec l'impression de tous les index (et que cela répéterait vraiment les capacités de PL / 1), on m'a demandé de le faire moi-même comme un "devoir". J'ai rejeté cet honneur, sous prétexte qu'en fait, j'ai tout cela et je l'utilise depuis longtemps. Apparemment, l'auteur de la bibliothèque n'a tout simplement pas compris immédiatement comment procéder. Et pour une raison quelconque, je me suis souvenu d'une scène du film "Formula of Love", où Cagliostro, ayant surpris tout le monde en mangeant une fourchette, refusait toujours de manger une assiette.








All Articles