100가지 언어 달리기: 24회: 부언
12082 단어 postscript
그것은 정말로 인류를 위해 코드를 작성하는 것이 아니라, 단지 각종 조판 시스템을 위해 코드를 생성하는 것일 뿐이다. 그러나 이것은 우리를 막지 않을 것이다. 코드를 좀 작성하자.
이 프로그램들을 실행하려면 OSX 미리 보기를 사용해서 보기만 하면 됩니다.
안녕, 세상!
%!PS
/Monaco 32 selectfont
200 400 moveto
(Hello, World!) show
showpage
우리가 뭐부터 시작했는지 뻔해.결과는 다음과 같습니다.
여기서 무슨 일이 일어났는지:
%!PS
Postscript 제목/Monaco 32 selectfont
스택에서 두 값을 밀어 넣고 32pt 글꼴200 400 moveto
창고에 있는 두 개의 숫자를 누르고 커서를 거기로 옮깁니다. Postscript(0,0)에서는 왼쪽 아래쪽이지 일반적인 컴퓨터 도형학(Hello, World!) show
문자열을 스택에 밀어 넣은 다음 표시showpage
방금 그린 페이지 표시 hello.pdf
nothello.ps
-OSX 미리보기는 Postscript 파일이것은 그리 나쁜 편은 아니다.
순환하다
진정한 프로그래밍의 첫 번째 단계는 순환이다.
%!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이고 보폭은 1dup 30 mul
인덱스 복사 및 곱하기 30600 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
보아하니 이렇다.한 걸음 한 걸음:
condition { then branch } { else branch } ifelse
문장{}
의 코드 블록이 ifelse
에 전달되는 것을 포함하고, 그것들이 def
에 전달되는 것과 같이 필요할 때만 실행된다dup 2 le
예top-of-stack <= 2
pop 1
에서 창고에서 맨 윗부분 항목을 제거하고(else 지점에서만 필요함) 되돌려주기1
dup 1 sub fib
전화fib(n-1)
로 전화하겠습니다.exch
가 fib(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 .
Reference
이 문제에 관하여(100가지 언어 달리기: 24회: 부언), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/taw/100-languages-speedrun-episode-24-postscript-4i2k텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)