Vortragsprogramm/2006/Postscript Programming

Aus LaborWiki
Wechseln zu: Navigation, Suche

Facts[Bearbeiten]

  • Was: Programmieren in Postscript
  • Wann: 29.08.2006
  • Wo: im Labor (wo sonst?)
  • Wer: Daniel

Teaser[Bearbeiten]

Postscript kennen die meisten nur als Format für Drucker, dabei handelt es sich bei Postscript doch um eine mächtige Programmiersprache. Diese Vortrag soll einen Einblick geben wie eine solche Stack-basierte Sprache funktioniert, wie sie bedient wird und was für Vor- und Nachteile sich daraus ergeben. Als Tools zum loslegen und mit-coden reicht ein Texteditor (z.B. vim) und ein Postscript-Viewer (empfehlenswert ist Ghostview).

Links[Bearbeiten]

Code[Bearbeiten]

%!PS

/inch {	72 mul } def
/mm { 2.8346456 mul } def
/cm { 28.346456 mul } def
/DIN_A_ratio { 2 sqrt } def
/DIN_A_0 { 100 cm 100 cm mul DIN_A_ratio div sqrt dup DIN_A_ratio mul } def % A = 1 qm
/DIN_A { % a -- x y 	a is the number of th DIN A, x and y are the corresponding sizes
	dup 0 eq 
		{ pop DIN_A_0 }
		{ 1 sub DIN_A 2 div exch } ifelse
} def

/papersize {
	4 DIN_A
} def

/fontsize {	0.5 cm } def
/lmargin { 2 cm } def
/umargin { 1 cm } def
/bmargin { 1 cm } def

/init_page {
	papersize umargin sub fontsize sub lmargin exch
	moveto pop
} def

/newpage { showpage init_page } def

/newline {
	currentpoint								% -- x y
	fontsize 1.5 mul sub						% -- x y_n
	dup  bmargin ge								% -- x y_n (y_n >= bmargin)
	{ lmargin exch moveto pop } { pop pop newpage } ifelse
} def

%--- MID
/midx papersize pop 2 div def
/midy papersize 2 div exch pop def
/mid {midx midy} def

%--- Colors
/coloradd { %	a b c x y z -- a+x b+y c+z
	% swap x & z // a b c z y x
	3 1 roll exch
	6 -1 roll add	% // b c z y a+x
	3 1 roll		% // b c a+x z y
	5 -1 roll add	% // c a+x z b+y
	exch 4 -1 roll	% // a+x b+y z c
	add
 } def

/rgb-black	{0 0 0} def
/rgb-white	{1 1 1} def
/rgb-blue	{0 0 1} def
/rgb-green	{0 1 0} def
/rgb-red	{1 0 0} def
/rgb-yellow [rgb-red rgb-green coloradd] cvx def

%----------- MAIN ---------------------------------------

/smsize 5 cm def

/smline smsize 20 div def
/smmouthmid smsize 5 div 3 mul def
/eyesize smsize 10 div def
/eyexrel smsize 2.5 div def
/eyeyrel smsize 2.5 div def

smline setlinewidth
rgb-yellow setrgbcolor
newpath
mid smsize 0 360 arc

gsave
fill
grestore

rgb-black setrgbcolor
%newpath
stroke

% mouth
newpath
mid smmouthmid 0 180 arcn
stroke


% left eye
mid  eyeyrel add
exch eyexrel sub exch
newpath
eyesize 0 360 arc fill

% right eye
mid  eyeyrel add
exch eyexrel add exch
newpath
eyesize 0 360 arc fill


%showpage

%!PS

%--- calculate int-size
1 1
{ 
	exch 1 add exch
	1 bitshift
	dup 0 le {exit} if
} loop
dup
/minint exch def
 not
/maxint exch def
/sizeofint exch def

%--- END calculate int-size


(\n\nBitsize:) print
sizeofint 4 string cvs print
(\nMaxInt:) print
maxint 20 string cvs print
(\nMinInt:) print
minint 20 string cvs print

%--- Big Num Stuff
/intsInBig 5 def

sizeofint 1 sub 2 log mul truncate dup
cvi /decDigitsPerInt exch def
10 exch exp cvi
/innerRollOver exch def

/newBig { [ intsInBig {0} repeat ] } def
/newBig1 { [ intsInBig 1 sub {0} repeat 1] } def

/addIntToBig { % int Big -- Big'
	
} def

/addBigBig { % Big Big -- Big
	aload pop intsInBig 1 add -1 roll
	aload pop 
		% now we have a lot of ints on the stack
	/BigCarry	false def % initial carry
	intsInBig {
		intsInBig index % copy other summand on stack
		add
		BigCarry { 1 add } if
		dup innerRollOver ge dup /BigCarry exch def 
		{ innerRollOver sub} if 
		intsInBig 2 mul 1 roll
	} repeat
	intsInBig array astore pop
	intsInBig array astore 
} def

/Big2String { % Big -- Sting
	{	% we add a leading 1  to get the zeros
		innerRollOver add
		decDigitsPerInt 1 add string cvs
		1 decDigitsPerInt getinterval
	} forall
	% now we merge the substrings in one large string
	intsInBig array astore
	/tmpString decDigitsPerInt intsInBig mul cvi string def
	/tmpStringIndex 0 def
	{
		tmpString tmpStringIndex 3 -1 roll putinterval
		/tmpStringIndex tmpStringIndex decDigitsPerInt add def
	} forall
	tmpString
} def

%--- END Big Num Stuff


(\n\n) print
(#############\n) print
(# Fibonacci #\n) print
(#############\n) print
%0 1
%{
%	dup 3 1 roll add
%	dup maxint gt {exit} if
%	dup =
%} loop	

newBig newBig1
{
	dup 3 1 roll addBigBig
	BigCarry {exit}if
	dup Big2String print (\n) print
	} loop

% [0 0 0 0  0 0 0 1 ] [0 0 0 0  0 0 0 1 ] addBigBig pstack
quit