100개 언어 스피드런: 73회: 무료 파스카

6559 단어 pascal
터빈 파스카는 내가 졸업한 후 두 번째 언어다.
불행하게도 현대 하드웨어에서 터보-Pascal을 실행하는 데는 간단한 방법이 없을 것 같아서 다음 최선의 일을 해서 무료 Pascal을 시도해 보겠습니다.

안녕, 세상!


Pascal 코드는 program Name로 시작합니다.문장 사이는 ;로 구분하고 전체 문장 사이는 .로 구분한다.대소문자를 구분하지 않기 때문에 필요하면 writeln,WriteLn, 심지어WrItElN를 사용할 수 있지만 나는 모든 소문자를 사용할 것이다.
program Hello;
begin
  writeln('Hello, World!');
end.
$ fpc hello.pas
$ ./hello
Hello, World!

피보나치


우리 좀 더 웅대한 것을 시도해 봅시다. 피보나 계수.
program Fibonacci;

function fib(n:integer):integer;
begin
  if n<=2 then
    fib := 1
  else
    fib := fib(n-1) + fib(n-2);
end;

var
  n:integer;

begin
  for n := 1 to 20 do
  begin
    writeln('fib(', n, ')=', fib(n));
  end;
end.
한 걸음 한 걸음:
  • begin 부분에 앞서 우리는 어떤 물건이 사용하는 변수의 전체 목록을 성명했다. 이 예에서 우리는 var n:integer; 성명했다. 이것은 우리 프로그램이 사용하는 모든 변수의 목록
  • 이다.
  • 할당 사용:=
  • for n := 1 to 20 do는 for순환
  • 이다
  • 우리는 임의의 수량의 매개 변수를 writeln에 전달하고 문자열과 정수를 혼합할 수 있다. 이 모든 것이 유효하다
  • 우리가 사용하는 함수function name(arguments):return_type;를 정의한 다음에 그 어떠한 추가 국부 변수가 있는 var 블록을 정의한 다음에 코드
  • 가 있는 begin...end 블록을 정의한다.
  • 함수에서 되돌아오려면 함수와 같은 이름의 변수에 변수를 부여합니다.Pascal
  • 에 없습니다return
  • if condition then ... else ...;는 조건문
  • 이다

    <unk>거리다


    program FizzBuzz;
    
    var
      n:integer;
    
    begin
      for n := 1 to 100 do
      begin
        if n mod 15 = 0 then
          writeln('FizzBuzz')
        else if n mod 5 = 0 then
          writeln('Buzz')
        else if n mod 3 = 0 then
          writeln('Fizz')
        else
          writeln(n);
      end;
    end.
    
    이곳의 유일한 새로운 것은 약간 심상치 않은 문법인 = 은 등식 검사에 사용되고, mod 는 모형에 사용된다.
    하지만 아주 이상한 것들, 분호의 위치를 알아차렸을 수도 있다.분호를 사용하는 언어가 많지만, 이렇게 할 수 있는 언어는 하나도 없다.
    다른 언어에서는 끝 문장을 분호로 표시한다.파스카 분호에서는 서로 다른 문장을 사용한다.
    그것들 writeln 이 계속되고 있기 때문에, 우리는 그것들 뒤에 점수를 붙일 수 없다. 그것은 번역을 거부할 것이다.일부 점수는 선택할 수 있다. 예를 들어 마지막 else 뒤에 있는 점수는 여기에 더 많은 문장이 없기 때문이다.만약 있다면, 너는 분호가 필요하다.
    이것은 일리가 있지만, 만약 다른 언어가 자주 사용하는 시스템에 익숙해지고, 현대어도 분호를 사용하지 않는다면, 이것은 당신을 화나게 할 것이다.

    Unicode


    분명히 Turbo Pascal은 Unicode를 지원하지 않습니다. 오랜 시간 전에 이미 존재했기 때문입니다. 그러나 유감스럽게도 Unicode와 무료 Pascal은 모두 지원하지 않습니다.
    program Unicode;
    
    begin
      writeln(length('Hello'));
      writeln(length('Żółw'));
      writeln(length('💩'));
    
      writeln(upcase('Żółw'));
      writeln(lowercase('Żółw'));
    end.
    
    $ fpc unicode.pas
    $ ./unicode
    5
    7
    4
    ŻółW
    Żółw
    

    재시도


    분명히 Free Pascal 지원end과 같은 주석이 있으므로 어떻게 된 일인지 살펴보겠습니다.
    {$codepage UTF8}
    program Unicode;
    
    begin
      writeln(length('Hello'));
      writeln(length('Żółw'));
      writeln(length('💩'));
    
      writeln(upcase('Żółw'));
      writeln(lowercase('Żółw'));
    end.
    
    $ fpc unicode2.pas
    $ ./unicode2
    5
    4
    2
    This binary has no string conversion support compiled in.
    Recompile the application with a unit that installs a unicodestring manager in the program uses clause.
    Runtime error 234 at $000000010E719BCD
      $000000010E719BCD
    
    더 나쁜 건길이가 서로 다른 방식으로 부정확할 뿐만 아니라 (5/7/4, 그 다음에 5/4/2,correct는 5/4/1) 전체 과정이 붕괴되었고 심지어 문자열을 대문자나 소문자로 바꾸려고 시도하지 않았다.
    나는'유니코드의 직접적인 붕괴'가 지금까지 거의 모든 언어에서 최악의 표현이라고 생각한다.

    학급


    하나의 종류를 정의함으로써 이 회를 끝냅시다.이것은 터보 패스컬이 소유한 것이 아닙니다.
    {$mode objfpc}
    program PointProgram;
    
    type Point = class
    public
      x: integer;
      y: integer;
      constructor Create(_x, _y:integer);
      function ToString: string;
    end;
    
    constructor Point.Create(_x, _y:integer);
    begin
      x := _x;
      y := _y;
    end;
    
    function Point.ToString: string;
    var
      xs, ys: string;
    begin
      str(x, xs);
      str(y, ys);
      result := '<' + xs + ',' + ys + '>'
    end;
    
    operator + (p1, p2: Point): Point;
    begin
      result := Point.Create(p1.x + p2.x, p1.y + p2.y)
    end;
    
    var
      a: Point;
      b: Point;
      c: Point;
    
    begin
      a := Point.Create(200, 30);
      b := Point.Create(220, 39);
      c := a + b;
    
      writeln(c.ToString);
    end.
    
    $ fpc point.pas
    $ ./point
    <420,69>
    
    한 걸음 한 걸음:
  • 우리는 {$codepage UTF8}로 클래스 지원을 켜야 합니다. 많은 스위치가 있습니다. 이것은 당신이 사용하고자 하는 Pascal 사투리와 많은 다른 것들에 따라 바뀔 수 있습니다
  • {$mode objfpc} - 우리는 어떤 종류를 성명하는가;또 다른 type Point = class 성명, 예를 들면 type
  • 간단하게 보기 위해서 enum 속성public과 다시 쓰기costructor Create만 지정했습니다.
  • 우리가 각각 지정한 방법의 실현과 그것들의 성명
  • ToString 올바른 필드만 할당
  • constructor Point.Create 반환function Point.ToString: string;의 기본 표현 형식 - 우리는 먼저 Pointx를 클래식 Pascaly이 있는 문자열로 변환한 다음에 그것들을 str(anything, aString)<와 연결할 수 있다. - 그리고 많은 다른 해결 방안
  • 도 있다.
  • 우리는 >를 성명할 수 있지만, 그것은 하나의 방법이 아니라, 사실상 클래스 내용
  • 과 완전히 분리된다.
  • 함수 이름에 반환값을 설정하는 것 외에 우리는 operator +에게 분배할 수 있다. - 이것은 매우 유용한 함수이다. 왜냐하면 우리는 정확하게 분배할 수 없기 때문이다result
  • 우리는 여전히 + := Point.Create(p1.x + p2.x, p1.y + p2.y)에 명확한 전화를 걸어야 한다. writeln(c.ToString)는 우리를 위해 하지 않을 것이다.이것은 언어 기능이 아닌 관례일 뿐
  • 무료 Pascal을 사용해야 합니까?


    아뇨.
    이상한 무료 패스칼은 가끔 진정한 프로그램을 구축하는 데 사용된다. 가장 유명한 것은Cheat Engine이지만 기본적으로 베이비붐 세대가 터보 패스칼이나 델파이로 프로그래밍을 배워 떠난 적이 없다.
    어떤 형태의 Pascal을 사용할 진정한 이유가 없습니다.
    다 엉망이라고 한 거 아니야.예를 들어, 내가 지난번에 Pascal을 쓴 지 수십 년이 되었고, 대부분의 문법을 잊어버렸지만, 그 오류 메시지는 확실히 질이 높고, 지정된 위치에 확실한 문제가 있다.
    그러나 전반적으로 말하면 없다.

    비밀 번호


    All code examples for the series will be in this repository .
    Code for the Free Pascal episode is available here .

    좋은 웹페이지 즐겨찾기