100가지 언어 달리기: 24회: 부언

12082 단어 postscript
Postscript는 어느 정도 PDF의 전신이지만 PDF와 달리 Postscript는 완전한 스택을 기반으로 한 프로그래밍 언어만 포함한다.
그것은 정말로 인류를 위해 코드를 작성하는 것이 아니라, 단지 각종 조판 시스템을 위해 코드를 생성하는 것일 뿐이다. 그러나 이것은 우리를 막지 않을 것이다. 코드를 좀 작성하자.
이 프로그램들을 실행하려면 OSX 미리 보기를 사용해서 보기만 하면 됩니다.

안녕, 세상!


%!PS
/Monaco 32 selectfont
200 400 moveto
(Hello, World!) show
showpage
우리가 뭐부터 시작했는지 뻔해.
결과는 다음과 같습니다.

여기서 무슨 일이 일어났는지:
  • %!PS Postscript 제목
  • 우리는 이전에 봤던Forth
  • 와 같은 창고 기반 프로그래밍 언어를 가지고 있다.
  • /Monaco 32 selectfont 스택에서 두 값을 밀어 넣고 32pt 글꼴
  • 을 선택합니다.
  • 200 400 moveto 창고에 있는 두 개의 숫자를 누르고 커서를 거기로 옮깁니다. Postscript(0,0)에서는 왼쪽 아래쪽이지 일반적인 컴퓨터 도형학
  • 처럼 왼쪽 위쪽이 아닙니다.
  • (Hello, World!) show 문자열을 스택에 밀어 넣은 다음 표시
  • showpage 방금 그린 페이지 표시
  • 또한 제목hello.pdf nothello.ps-OSX 미리보기는 Postscript 파일
  • 을 표시하기 전에 PDF 형식으로 변환됩니다
    이것은 그리 나쁜 편은 아니다.

    순환하다


    진정한 프로그래밍의 첫 번째 단계는 순환이다.
    %!PS
    /Monaco 32 selectfont
    
    0 1 10 {
                    % STACK CONTENTS:
                    % i
      dup 30 mul    % i 30i
      600 exch sub  % i 600-30i
      300           % i 600-30i 300
      exch          % i 300 600-30i
      moveto        % i
      20 string cvs % "i" (as string of max size 20 chars)
      show
    } for
    
    showpage
    
    보아하니 이렇다.

    나는 % 주석에서 매번 교체된 창고 내용을 주석했다.한 걸음 한 걸음 돌아봅시다.
  • 0 1 10 { ... } for는 0에서 10까지의 lop이고 보폭은 1
  • 이다.
  • dup 30 mul 인덱스 복사 및 곱하기 30
  • 600 exch sub 필요600-30i - 창고의 앞의 두 값을 exch와 교환해야 한다. 그렇지 않으면 필요30i-600가 있다.내가 언급한 바와 같이, 일반적인 관례와 비교하면 Postscript Y 좌표는 뒤바뀐다.
  • 300 exch 300을 누르고 창고의 맨 위에 있는 두 개의 값을 교환한 다음에 우리moveto는 이 위치
  • 20 string cvs 정수를 문자열로 변환하거나 기술적으로 20개의 빈 문자를 분배한 문자열i
  • show 페이지에 문자열 놓기
  • 두 배의 숫자


    다음 단계에서 사용자 정의 함수를 정의하여 숫자를 배로 늘리고 포맷합니다.
    %!PS
    /Helvetica 32 selectfont
    
    /double {
      dup add
    } def
    
    1 1 10 {
      dup 30 mul
      600 exch sub
      100
      exch
      moveto
      (double\() show
      dup 20 string cvs show
      (\) = ) show
      double 20 string cvs show
    } for
    
    showpage
    
    보아하니 이렇다.

    한 걸음 한 걸음:
  • /double { ... } def는 함수double를 정의했다. 함수는 숫자를 받아들여 두 배로 늘린다. 이것은 창고를 기반으로 하는 언어이기 때문에 특정한'매개 변수'와'반환값'이 없고 함수는 창고 맨 위에 있는 숫자만 배로 늘린다
  • (double\() show는 문자열() 등 특수 문자의 뜻을 나타낸다.
  • 우리가 show에 어떤 물건을 인쇄할 때 커서가 문자열의 끝으로 이동합니다. 만약 인쇄한 물건이 같은 줄
  • 에 있다면 다시 위치를 정할 필요가 없습니다.
  • 우리가 함수를 호출하는 방식double은 그 어떠한 내장 함수
  • 를 호출하는 방식과 같다

    피보나치


    이제 우리는 피보나치수를 만들어야 할 거의 모든 것이 생겼다.
    %!PS
    /Helvetica 20 selectfont
    
    /fib {
      dup 2 le {
        pop
        1
      } {
        dup 1 sub fib
        exch
        2 sub fib
        add
      } ifelse
    } def
    
    1 1 30 {
      dup 20 mul
      700 exch sub
      50
      exch
      moveto
      (fib\() show
      dup 20 string cvs show
      (\) = ) show
      fib 20 string cvs show
    } for
    
    showpage
    
    보아하니 이렇다.

    한 걸음 한 걸음:
  • 순환은 이전과 같다
  • fib 함수는 큰 condition { then branch } { else branch } ifelse 문장{}의 코드 블록이 ifelse에 전달되는 것을 포함하고, 그것들이 def에 전달되는 것과 같이 필요할 때만 실행된다
  • dup 2 letop-of-stack <= 2
  • then 지점pop 1에서 창고에서 맨 윗부분 항목을 제거하고(else 지점에서만 필요함) 되돌려주기
  • 로 푸시1
  • else지점에서 우선dup 1 sub fib전화fib(n-1)로 전화하겠습니다.
  • 그리고 우리exchfib(n-1)교환으로 계산한 n
  • 그리고 저희가 2 sub fib해서 계산해 볼게요. fib(n-2)
  • 마지막으로 우리add는 이 두 값을 합쳐서
  • <unk>거리다


    분명히 우리 사이다 한 잔 마셔요.하지만 작은 문제가 하나 있다. 1~100개의 파이즈 버즈는 한 페이지에 놓을 수 없다.그럼 우리 두 페이지 쓰는 게 어때요?
    %!PS
    /Helvetica 14 selectfont
    
    /fizzbuzz {
      dup 15 mod 0 eq {
        pop (FizzBuzz)
      } {
        dup 5 mod 0 eq {
          pop (Buzz)
        } {
          dup 3 mod 0 eq {
            pop (Fizz)
          } {
            20 string cvs
          } ifelse
        } ifelse
      } ifelse
    } def
    
    /fizzbuzzpage {
      /n exch def
      1 1 50 {
        dup 14 mul
        780 exch sub
        50
        exch
        moveto
        n add fizzbuzz show
      } for
      showpage
    } def
    
    0 fizzbuzzpage
    50 fizzbuzzpage
    
    페이지당 50개의 값이 포함된 것처럼 보입니다.

    한 걸음 한 걸음:
  • fizzbuzz 일반적인 Fizz Buzz 규칙
  • 에 따라 숫자를 가져와 그 숫자의 Fizz, Buzz, FizzBuzz 또는 문자열 표시 형식을 되돌려줍니다.
  • fizzbuzzpage 편향량을 취하여 전체 페이지의 Fizz Buzz 값을 인쇄한다. N+1에서 N+50
  • /n exch def 창고 맨 위에 n 변수인 Postscript에 저장하면 창고 깊은 곳의 값에 접근할 수 있지만 국부 변수로 저장하는 것이 더 쉽다고 생각합니다.우리는 exch가 예상한 주문서/name value def와 같이 필요합니다. 우리가 시작하기 전에 우리는 이미 value가 있습니다.이 기술을 사용하면 마지막 변수부터 임의의 함수 호출 파라미터를 국부 변수에 저장할 수 있습니다.
  • n add fizzbuzz show 컴퓨팅fizzbuzz(n+i) 및 페이지
  • 에 표시

    포스트스크립트를 사용해야 합니까?


    물론 프로그래밍에 적합하지 않습니다. 지금은 조판에도 적합하지 않습니다. PDF가 포스트스크립트를 거의 완전히 대체했기 때문입니다. 그러나 이것은 창고를 기반으로 한 언어에 대한 상당히 좋은 소개입니다. 아마도 Forth보다 더 재미있을 것입니다. 왜냐하면 당신은 포스트스크립트에서 정교한 도형을 만들 수 있기 때문입니다.
    프린터에 따라 프로그램을 프린터에 직접 보내서 일반적인 컴퓨터에서 실행할 필요가 없이 페이지에서 실행할 수도 있습니다.

    비밀 번호


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

    좋은 웹페이지 즐겨찾기