{
 "cells": [
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# If you have not used polymake in a long time...\n",
    "\n",
    "...you might want to read up on some things that are important for backward compatibility.\n",
    "\n",
    "### Numbers\n",
    "\n",
    "`polymake` always was a hybrid system written half in C++, half in Perl, but it is only now that the user can directly take advantage of C++ data types and interfaces in Perl.  For instance, via the interface to [GMP](http://www.swox.com/gmp/) `polymake` can also become your favorite programmable pocket calculator:\n",
    "\n",
    "    \n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "$f = new Integer(1);"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "    \n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "for (my $i = new Integer(100); $i>0; --$i) { $f *= $i; }"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "    \n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000\n",
       "\n"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "print $f;"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "The input of large integer and rational numbers was kind of subtle in the past, but now (since version 2.11) it has become quite intuitive:\n",
    "\n",
    "    \n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "$bignum=93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000;"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "    \n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000\n",
       "    \n"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "print $bignum;"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "$ratnum=123456/789012;"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "    \n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "10288/65751\n",
       "    \n"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "print $ratnum;"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "Each integer constant being too large to fit into a normal perl scalar value is automatically converted to an `Integer` object; each fraction of two integer constants is automatically converted to a `Rational` object (and canonicalized, as can be seen in the example above).  \n",
    "\n",
    "\n",
    "### Stored files\n",
    "\n",
    "Suppose you still have a file `cube.poly`, e.g., from trying out the tutorial of a previous version.  You can still do\n",
    "\n",
    "    \n",
    "    polymake cube.poly N_FACETS\n",
    "\n",
    "    \n",
    "    N_FACETS\n",
    "    6\n",
    "\n",
    "\n",
    "from the command line as you used to.  This is the backward compatibility mode.  While this may give the impression that nothing changed and that you do not have to adapt to the new, this is plain wrong.  There are two things to keep in mind:\n",
    " 1.  The old stand-alone clients (such as `cube`, e.g.) are gone.\n",
    " 2.  Once you used the next generation `polymake` on your old files they will be transformed into XML (keeping all your data).  In particular, once you called the next generation `polymake` on your files you will not be able to use any old version on them later.\n",
    "\n",
    "Equivalent to calling \"`cube c3.poly 3`\" as before would now be:\n",
    "\n",
    "    \n",
    "    polymake 'save(cube(3),\"c3.poly\")'\n",
    "\n",
    "\n",
    "A word of warning: It was rarely legal but always popular to edit files that `polymake` worked on with an ASCII text processor.  This is still possible (if you know what you are doing), but in addition to the caveats previously in place (which are still valid) you have to pay attention to producing valid XML.\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "polymake",
   "language": "polymake",
   "name": "polymake"
  },
  "language_info": {
   "codemirror_mode": "perl",
   "file_extension": ".pm",
   "mimetype": "text/x-polymake",
   "name": "polymake"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}