/*
 *  pynest-init.sli
 *
 *  This file is part of NEST.
 *
 *  Copyright (C) 2004 The NEST Initiative
 *
 *  NEST is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  NEST is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with NEST.  If not, see <http://www.gnu.org/licenses/>.
 *
 */

/*
Name: sli_func - execute sli code on array of arguments
Synopsis: [arg1 arg2 ... argN] (function code) sli_func -> [res1 res2 ...]
Arguments: The first arg is an array containing arguments to the
           function. The array contents is pushed onto the stack.

	   The second arg is SLI code that is a string containing
	   SLI code that is executed. Anything left on the stack
	   is stored in an array as result.
Note: This function is for use by the python sli_func().
SeeAlso: sli_func_litconv
 */
/sli_func
[/arraytype /stringtype]
{
 << >> begin   % work in local dictionary to avoid side effects
   /mark rollu
   cvx                        % convert string to SLI procedure
   {arrayload pop} prepend    % code prepare arguments
   exec             
   counttomark                % count number of return values
   arraystore 
   exch pop         % remove the mark
 end
}
def

/*
Name: sli_func_litconv - execute sli code on array of arguments
Synopsis: [arg1 arg2 ... argN] (function code) sli_func_litconv -> [res1 res2 ...]
Arguments: If argn is a string and its first char is /, it is 
	   converted to a literal before loaded onto the stack.
Note: same as sli_func, but string args beginnig with / are converted to literals
SeeAlso: sli_func_litconv
 */
/sli_func_litconv
[/arraytype /stringtype]
{
 << >> begin   % work in local dictionary to avoid side effects
   /mark rollu
   cvx                        % convert string to SLI procedure
   {
     { StringQ { dup First 47 eq { Rest cvlit } if } if } Map
     arrayload pop
   } prepend    % code prepare arguments
   exec             
   counttomark                % count number of return values
   arraystore 
   exch pop         % remove the mark
 end
}
def



/pywelcome
{
  cout endl

  statusdict begin
    (              -- N E S T --) <- endl
    endl
    (  Copyright (C) 2004 The NEST Initiative) <- endl
    (  Version ) <- 
    prgmajor <- (.) <- prgminor <- (.) <- prgpatch <-
    ( ) <- built <- endl endl ;
  end

  warranty

  cout
  (Problems or suggestions?) <- endl
  (  Website     : http://www.nest-initiative.org) <- endl
  (  Mailing list: nest_user@nest-initiative.org) <- endl

  endl
  (Type 'nest.help()' to find out more about NEST.) <- endl ;

  :warnings
} def


/runprotected
{
  stopped dup
  {
    errordict /newerror get 
    {
      errordict /message known 
      { (: ) errordict /message get join errordict /message undef}
      { () } ifelse
      errordict /errorname get cvs
      3 2 roll % get the error flag to the top again
      errordict /newerror false put  % Tell NEST that the error is handled already
    }
    {
      (Software Interrupt)
    }
    ifelse
  } if
  not % invert the return value of stopped
} bind def