# How to combine and simplify the following PostScript operators?

## Background

Let

\def\RR#1{(2^(#1/10))}
\def\TT#1{(#1)}


be the radius and angle functions, respectively.

/AAA {AlgParser cvx exec exch AlgParser cvx exec exch RadtoDeg PtoC} def


It can be used to translate

\pscircle*[linecolor=red](!\RR{7*Pi/2} \TT{7*Pi/2} AAA){2pt}


from polar infix to polar postfix. However 7*Pi/2 are repeated, it breaks DRY (Don't Repeat Yourself) principle and cannot make use of t as explained shortly below.

I modified Herbert's operators as follows

/BBB {/TT ED TT AlgParser cvx /t ED  /RR ED RR AlgParser cvx /r ED r t RadtoDeg PtoC} def
/CCC { AlgParser cvx /t ED  AlgParser cvx exec t RadtoDeg PtoC} def


to allow me to write two styles as follows.

\pscircle*[linecolor=green](!{(2^(t/10))} {(3*Pi/2)} BBB){2pt}
\pscircle*[linecolor=blue](!\RR{t} \TT{5*Pi/2} CCC){2pt}


The first does not make use of \RR and \TT and the last does make use of \RR and \TT.

## Complete code

\documentclass[pstricks,border=12pt]{standalone}
\usepackage{pst-plot}
\pstVerb
{
/AAA {AlgParser cvx exec exch AlgParser cvx exec exch RadtoDeg PtoC} def
/BBB {/TT ED TT AlgParser cvx /t ED  /RR ED RR AlgParser cvx /r ED r t RadtoDeg PtoC} def
/CCC { AlgParser cvx /t ED  AlgParser cvx exec t RadtoDeg PtoC} def
}

\def\RR#1{(2^(#1/10))}
\def\TT#1{(#1)}

\begin{document}
\begin{pspicture}[showgrid](-3,-3)(3,3)
\psplot[algebraic,polarplot]{TwoPi}{TwoPi 2 mul}{\RR{x}}
\pscircle*[linecolor=red](!\RR{7*Pi/2} \TT{7*Pi/2} AAA){2pt}
\pscircle*[linecolor=green](!{(2^(t/10))} {(3*Pi/2)} BBB){2pt}
\pscircle*[linecolor=blue](!\RR{t} \TT{5*Pi/2} CCC){2pt}
\end{pspicture}

\end{document}


## Question

Can I combine BBB and CCC to create DDD as simple as AAA but they must still work for the following?

\pscircle*[linecolor=green](!{(2^(t/10))} {(3*Pi/2)} DDD){2pt}
\pscircle*[linecolor=blue](!\RR{t} \TT{5*Pi/2} DDD){2pt}


Bonus question: I still don't understand why Herbert used only one exec while Christoph used 2 execs? What does exec do actually?

• What about defining \def\RT#1{\RR{#1} \TT{#1}} and calling \pscircle*[linecolor=red](!\RT{7*Pi/2} AAA){2pt}, so that DRY is not broken ? – Adam B. Nov 28 '13 at 8:02
• @AdamB. But now there is a constraint more, \RR cannot be represented as an expression with t when passed as a point. – kiss my armpit Nov 28 '13 at 8:14

simplified

/AAA {AlgParser cvx exec exch AlgParser cvx exec exch RadtoDeg PtoC} def
/BBB {exec AlgParser cvx /t ED  exec AlgParser cvx exec t RadtoDeg PtoC} def
/CCC {AlgParser cvx /t ED  AlgParser cvx exec t RadtoDeg PtoC} def


for /BBB: the expression {(2^(t/10))} is moved to PostScript with the parentheses {...} the reason why we first need an exec for removing it, or, of course, /anyvar exch def anyvar or /anyvar ED anyvar (saving it and pushing the saved data onto the stack) will do the same. Without the {...} it can't work on TeX side.

For your examples you need only /BBB, it works for all:

\documentclass[pstricks,border=12pt]{standalone}
\usepackage{pst-plot}
\pstVerb{
/A2P {exec AlgParser cvx /t ED  exec AlgParser cvx exec t RadtoDeg PtoC} def }

\def\RR#1{(2^(#1/10))}
\def\TT#1{(#1)}

\begin{document}
\begin{pspicture}[showgrid](-3,-3)(3,3)
\psplot[algebraic,polarplot]{2 Pi mul neg}{4 Pi mul}{\RR{x}}
\pscircle*[linecolor=red  ](!\RR{7*Pi/2} \TT{7*Pi/2} A2P){2pt}
\pscircle*[linecolor=green](!{(2^(t/10))} {(3*Pi/2)} A2P){2pt}
\pscircle*[linecolor=blue ](!\RR{t} \TT{5*Pi/2} A2P){2pt}
\end{pspicture}

\end{document}


Only the bonus answer regarding the exec:

AlgParser parses a string (...) and leaves an array [...] on the stack. The expression

(2^(Pi/10)) AlgParser


evaluates to the array

[tx@AddMathFunc begin 2.0 Pi 10.0 div exp end]


In order to evaluate this, one must turn this into an executable array (or procedure) with cvx, which gives

{tx@AddMathFunc begin 2.0 Pi 10.0 div exp end}


Now you can either call exec to execute this procedure which is on the stack (which is what I did twice), or you can save it and execute it by calling the variable, i.e. use /x exch def x to execute it (which is what Herbert did once).

So the following statements are equal

(2^(Pi/10)) AlgParser cvx exec


and

(2^(Pi/10)) AlgParser cvx /x exch def x

• you also need the cvx when saving the expression – user2478 Nov 28 '13 at 9:02

Thanks to Christoph's answer on exec, I managed to make a DDD working in both cases. Here is the MWE (Minimal Working Example).

\documentclass[pstricks,border=12pt]{standalone}
\usepackage{pst-plot}
\pstVerb
{
/AAA {AlgParser cvx exec exch AlgParser cvx exec exch RadtoDeg PtoC} def
/DDD {exec AlgParser cvx /t ED exec AlgParser cvx exec t RadtoDeg PtoC} def
}

\def\RR#1{(2^(#1/10))}
\def\TT#1{(#1)}
\def\RT#1{\RR{#1} \TT{#1}}

\begin{document}
\begin{pspicture}[showgrid](-3,-3)(3,3)
\psplot[algebraic,polarplot]{2 Pi mul neg}{4 Pi mul}{\RR{x}}
\pscircle*[linecolor=red](!\RT{7*Pi/2} AAA){2pt}
\pscircle*[linecolor=green](!{(2^(t/10))} {(3*Pi/2)} DDD){2pt}
\pscircle*[linecolor=blue](!\RR{t} \TT{5*Pi/2} DDD){2pt}
\end{pspicture}
\end{document}

• DDD works for all ... – user2478 Nov 28 '13 at 9:56
• @Herbert I actually just tested it in replacement of BBB and CCC, but yes it works for all – Adam B. Nov 28 '13 at 10:09