Index: /trunk/Ohana/src/opihi/lib.shell/convert_to_RPN.c
===================================================================
--- /trunk/Ohana/src/opihi/lib.shell/convert_to_RPN.c	(revision 3028)
+++ /trunk/Ohana/src/opihi/lib.shell/convert_to_RPN.c	(revision 3029)
@@ -48,4 +48,7 @@
     if (!strcmp (argv[i], "dacos")) { type = 7; goto gotit; }
     if (!strcmp (argv[i], "datan")) { type = 7; goto gotit; }
+
+    if (!strcmp (argv[i], "lgamma")) { type = 7; goto gotit; }
+
     if (!strcmp (argv[i], "rnd"))   { type = 7; goto gotit; }
     if (!strcmp (argv[i], "xramp")) { type = 7; goto gotit; }
@@ -60,4 +63,5 @@
     /* binary operations */
     if (!strcmp (argv[i], "^"))     { type = 6; goto gotit; }
+    if (!strcmp (argv[i], "@"))     { type = 5; goto gotit; }
 
     if (!strcmp (argv[i], "<"))     { type = 5; goto gotit; }
Index: /trunk/Ohana/src/opihi/lib.shell/isolate_elements.c
===================================================================
--- /trunk/Ohana/src/opihi/lib.shell/isolate_elements.c	(revision 3028)
+++ /trunk/Ohana/src/opihi/lib.shell/isolate_elements.c	(revision 3029)
@@ -147,4 +147,5 @@
   if (!strncmp (c, "-",  1)) return (TRUE);
   if (!strncmp (c, "^",  1)) return (TRUE);
+  if (!strncmp (c, "@",  1)) return (TRUE);
   if (!strncmp (c, "(",  1)) return (TRUE);
   if (!strncmp (c, ")",  1)) return (TRUE);
@@ -152,4 +153,5 @@
   if (!strncmp (c, "|",  1)) return (TRUE);
   if (!strncmp (c, ">",  1)) return (TRUE);
+  if (!strncmp (c, "<",  1)) return (TRUE);
   if (!strncmp (c, "<",  1)) return (TRUE);
   if (!strncmp (c, "<<", 2)) return (TRUE);
Index: /trunk/Ohana/src/opihi/lib.shell/stack_math.c
===================================================================
--- /trunk/Ohana/src/opihi/lib.shell/stack_math.c	(revision 3028)
+++ /trunk/Ohana/src/opihi/lib.shell/stack_math.c	(revision 3029)
@@ -56,4 +56,8 @@
       *out = pow (*M1, *M2);
     break; 
+  case '@': 
+    for (i = 0; i < Nx; i++, out++, M1++, M2++) 
+      *out = DEG_RAD*atan2 (*M1, *M2);
+    break; 
   case 'D': 
     for (i = 0; i < Nx; i++, out++, M1++, M2++) 
@@ -168,4 +172,8 @@
       *out = pow (*M1, *M2);
     break; 
+  case '@': 
+    for (i = 0; i < Nx; i++, out++, M2++) 
+      *out = DEG_RAD*atan2 (*M1, *M2);
+    break; 
   case 'D': 
     for (i = 0; i < Nx; i++, out++, M2++) 
@@ -274,4 +282,8 @@
     for (i = 0; i < Nx; i++, out++, M1++) 
       *out = pow (*M1, *M2);
+    break; 
+  case '@': 
+    for (i = 0; i < Nx; i++, out++, M1++) 
+      *out = DEG_RAD*atan2 (*M1, *M2);
     break; 
   case 'D': 
@@ -399,4 +411,10 @@
     }
     break; 
+  case '@': 
+    for (i = 0; i < Ny; i++, M2++) {
+      for (j = 0; j < Nx; j++, out++, M1++) 
+        *out = DEG_RAD*atan2 (*M1, *M2);
+    }
+    break; 
   case 'D': 
     for (i = 0; i < Ny; i++, M2++) {
@@ -554,4 +572,11 @@
       for (j = 0; j < Nx; j++, out++, M1++, M2++) 
         *out = pow (*M1, *M2);
+    }
+    break; 
+  case '@': 
+    for (i = 0; i < Ny; i++) {
+      M1 = V1[0].ptr;
+      for (j = 0; j < Nx; j++, out++, M1++, M2++) 
+        *out = DEG_RAD*atan2 (*M1, *M2);
     }
     break; 
@@ -710,4 +735,8 @@
       *out = pow (*M1, *M2);
     break; 
+  case '@': 
+    for (i = 0; i < Nx*Ny; i++, out++, M1++, M2++) 
+      *out = DEG_RAD*atan2 (*M1, *M2);
+    break; 
   case 'D': 
     for (i = 0; i < Nx*Ny; i++, out++, M1++, M2++) 
@@ -826,4 +855,8 @@
       *out = pow (*M1, *M2);
     break; 
+  case '@': 
+    for (i = 0; i < Nx*Ny; i++, out++, M1++) 
+      *out = DEG_RAD*atan2 (*M1, *M2);
+    break; 
   case 'D': 
     for (i = 0; i < Nx*Ny; i++, out++, M1++) 
@@ -932,4 +965,8 @@
     for (i = 0; i < Nx*Ny; i++, out++, M2++)
       *out = pow (*M1, *M2);
+    break; 
+  case '@': 
+    for (i = 0; i < Nx*Ny; i++, out++, M2++) 
+      *out = DEG_RAD*atan2 (*M1, *M2);
     break; 
   case 'D': 
@@ -1024,4 +1061,7 @@
     *out = pow (*M1, *M2);
     break; 
+  case '@': 
+    *out = DEG_RAD*atan2 (*M1, *M2);
+    break; 
   case 'D': 
     *out = MIN (*M1, *M2);
@@ -1114,8 +1154,9 @@
   if (!strcmp (op, "sqrt"))  {    *out = sqrt (*M1);          }
 
-  if (!strcmp (op, "sinh"))  {    *out = sinh (*M1);         }
-  if (!strcmp (op, "cosh"))  {    *out = cosh (*M1);         }
-  if (!strcmp (op, "asinh")) {    *out = asinh (*M1);        }
-  if (!strcmp (op, "acosh")) {    *out = acosh (*M1);        }
+  if (!strcmp (op, "sinh"))  {    *out = sinh (*M1);          }
+  if (!strcmp (op, "cosh"))  {    *out = cosh (*M1);          }
+  if (!strcmp (op, "asinh")) {    *out = asinh (*M1);         }
+  if (!strcmp (op, "acosh")) {    *out = acosh (*M1);         }
+  if (!strcmp (op, "lgamma")) {   *out = lgamma (*M1);        }
 
   if (!strcmp (op, "sin"))   {    *out = sin (*M1);           }
@@ -1170,8 +1211,9 @@
   if (!strcmp (op, "sqrt"))  { for (i = 0; i < Nx; i++, out++, M1++) { *out = sqrt(*M1);         }}
 
-  if (!strcmp (op, "sinh"))   { for (i = 0; i < Nx; i++, out++, M1++) { *out = sinh(*M1);       }}
-  if (!strcmp (op, "cosh"))   { for (i = 0; i < Nx; i++, out++, M1++) { *out = cosh(*M1);       }}
-  if (!strcmp (op, "asinh"))  { for (i = 0; i < Nx; i++, out++, M1++) { *out = asinh(*M1);      }}
-  if (!strcmp (op, "acosh"))  { for (i = 0; i < Nx; i++, out++, M1++) { *out = acosh(*M1);      }}
+  if (!strcmp (op, "sinh"))   { for (i = 0; i < Nx; i++, out++, M1++) { *out = sinh(*M1);        }}
+  if (!strcmp (op, "cosh"))   { for (i = 0; i < Nx; i++, out++, M1++) { *out = cosh(*M1);        }}
+  if (!strcmp (op, "asinh"))  { for (i = 0; i < Nx; i++, out++, M1++) { *out = asinh(*M1);       }}
+  if (!strcmp (op, "acosh"))  { for (i = 0; i < Nx; i++, out++, M1++) { *out = acosh(*M1);       }}
+  if (!strcmp (op, "lgamma")) { for (i = 0; i < Nx; i++, out++, M1++) { *out = lgamma(*M1);      }}
 
   if (!strcmp (op, "sin"))   { for (i = 0; i < Nx; i++, out++, M1++) { *out = sin(*M1);          }}
@@ -1235,8 +1277,9 @@
   if (!strcmp (op, "sqrt"))  { for (i = 0; i < Nx*Ny; i++, out++, M1++) { *out = sqrt(*M1);         }}
 
-  if (!strcmp (op, "sinh"))  { for (i = 0; i < Nx*Ny; i++, out++, M1++) { *out = sinh(*M1);        }}
-  if (!strcmp (op, "cosh"))  { for (i = 0; i < Nx*Ny; i++, out++, M1++) { *out = cosh(*M1);        }}
-  if (!strcmp (op, "asinh")) { for (i = 0; i < Nx*Ny; i++, out++, M1++) { *out = asinh(*M1);       }}
-  if (!strcmp (op, "acosh")) { for (i = 0; i < Nx*Ny; i++, out++, M1++) { *out = acosh(*M1);       }}
+  if (!strcmp (op, "sinh"))  { for (i = 0; i < Nx*Ny; i++, out++, M1++) { *out = sinh(*M1);         }}
+  if (!strcmp (op, "cosh"))  { for (i = 0; i < Nx*Ny; i++, out++, M1++) { *out = cosh(*M1);         }}
+  if (!strcmp (op, "asinh")) { for (i = 0; i < Nx*Ny; i++, out++, M1++) { *out = asinh(*M1);        }}
+  if (!strcmp (op, "acosh")) { for (i = 0; i < Nx*Ny; i++, out++, M1++) { *out = acosh(*M1);        }}
+  if (!strcmp (op, "lgamma")) { for (i = 0; i < Nx*Ny; i++, out++, M1++) { *out = lgamma(*M1);      }}
 
   if (!strcmp (op, "sin"))   { for (i = 0; i < Nx*Ny; i++, out++, M1++) { *out = sin(*M1);          }}
