/* * sli-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/>. * */ /* SLI Interpeter initalization */ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% %%% Note on Dictionary Stack Initialization %%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % At startup, two dictionaries are to be on the dictionary stack: % % userdict <---- % systemdict % % The interpreter first pushes the system dictionary. Since all % modules have to be initialized in the system dictionary, % the user dictionary can only be pushed once the bootstraping % starts, i.e. at the beginning of this file. % % The operator end will prevent these two dictionaries % from being removed from the stack. This is according to PS. % % After userdict has been pushed, we have to activate % systemdict in order to have all new operators defined in there. % userdict begin % initialize DictStack. This begin has NO end!! %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% systemdict begin %% Only initialize those type tries here which are %% immediately needed. All others are loaded from %% typeinit.sli at the end of this initialization. /* BeginDocumentation Name: length - counts elements of a container object Synopsis: proc/literal/array/string/dict length -> int Description: length counts type-dependent elements, e.g. characters of a string, entries of a dictonary, number of command of a procedure. Alternatives: Functions length_p, length_lp, length_a, length_s, length_d (documented:SeeAlso) Parameters: One of the types proc, literal, array, string, dict Returns integer with number of elements. Examples: (Hello world!) length --> 12 {(Hello world!) ==} length --> 2 Bugs: Author: Gewaltig, Diesmann FirstVersion: ?? SeeAlso: length_p, length_lp, length_a, length_s, length_d, capacity, size */ /length trie [/proceduretype ] /length_p load addtotrie [/literalproceduretype ] /length_lp load addtotrie [/arraytype ] /length_a load addtotrie [/stringtype ] /length_s load addtotrie [/dictionarytype ] /length_d load addtotrie def /* BeginDocumentation Name: get - retrieve element indexed Object of a container Synopsis: array/proc/litproc/string int --> obj dict literal --> obj dict array --> obj Description: get will call the various typedependend get operators, returning the specified object. There are many possibilities for the combination of types, see examples. Alternatives: Functions get_a for arrays, get_p for procedures, get_lp for literal procedures, get_s for strings, get_d and get_d_a for dictionaries (all undocumented) -> behavior and synopsis are the same. Parameters: array/proc/litproc/string/dict is the container, int/literal is the index for the lookup. The object returned depends on the container contents. For arrays it is also possible to use an array of indices. In this case, individual indices may appear more than once. For dictionaries the interpretation of the array argument is identical to the one of the index array of operator Part. This is useful to extract data from nested dictionaries and arranging them for further numerical processing. The array elements are sequentially applied from left to right to the object resulting from the get operation of the previous element. If an array element is itself an array, its elements are simultaneously applied to the argument and the result is an array of the same size. Applications of SLI like the NEST kernel may impliment variants of get to provide a homogeneous interface to further containers. Examples: (Hello World!) 0 get --> 184 [(Hello) 1 /a 12] 1 get --> 1 {(Hello World!) ==} 1 get --> == systemdict /get get --> +get+ [/a /b /c /d] [0 2] get -> [/a /c] << /a 3 /c 2 >> /c get --> 2 << /a 3 /c 2 >> [/c] get --> 2 << /a 3 /c 2 >> [[/c]] get --> [2] << /a 3 /c 2 >> [[/c /a /a]] get --> [2 3 3] << /a << /b 3 /c 2 >> >> [/a /c] get --> 2 << /a << /b 3 /c 2 >> >> [/a [/b /c]] get --> [3 2] Author: Gewaltig, Diesmann FirstVersion: ?? SeeAlso: get_d, put, Part, getinterval */ /get_d_a { { dup type /arraytype eq { % d a { % d l exch dup % l d d rolld % d d l get_d } Map exch pop } {get_d} ifelse } forall } def /get trie [/arraytype /integertype] /get_a load addtotrie [/arraytype /arraytype] /get_a_a load addtotrie [/proceduretype /integertype] /get_p load addtotrie [/literalproceduretype /integertype] /get_lp load addtotrie [/stringtype /integertype] /get_s load addtotrie [/dictionarytype /literaltype] /get_d load addtotrie [/dictionarytype /arraytype] /get_d_a load addtotrie def /* BeginDocumentation Name: put - put indexed object into container Synopsis: array/proc int any --> array/proc array array any --> array string/array/proc int int --> string/array/proc litproc int any --> litproc dict literal any --> - Description: put will call appropriate typedepending put operator. The indexed object of the container will be replaced by the new one. Alternatives: Functions put_a for arrays, put_p for procedures, put_lp for literal procedures, put_s for strings (all undocumented) and put_d for dictionaries (SeeAlso) -> behaviour and synopsis are the same. Parameters: First parameter is the container, Second the index, third the object to put. The modified container is returned. Examples: (Hello Wxrld!) 7 111 put --> (Hello World!) [(Hello) 1 /a 12] 2 /here put --> [Hello 1 here 12] [[1 2][3 4]] [1 1] 6 put --> [[1 2] [3 6]] {(Hello World!) ==} (Bye!) 1 put --> {(Bye!) ==} systemdict /MyLit 5 put --> - % MyLit equals integer 5 now! Author: Gewaltig, Diesmann FirstVersion: ?? Remarks: Commented Hehl April 21, 1999 SeeAlso: get, put_d */ /put trie [/arraytype /integertype /integertype] /put_a load addtotrie [/arraytype /arraytype /anytype ] /put_a_a_t load addtotrie [/arraytype /integertype /anytype ] /put_a load addtotrie [/literalproceduretype /integertype /anytype] /put_lp load addtotrie [/dictionarytype /literaltype /anytype] /put_d load addtotrie [/proceduretype /integertype /anytype ] /put_p load addtotrie [/stringtype /integertype /integertype] /put_s load addtotrie % The following seemingly redundant definitions fix a deficiency of /anytype % We must manually add the functions to the branches which have specific types [/arraytype /arraytype /integertype ] /put_a_a_t load addtotrie [/arraytype /arraytype /doubletype ] /put_a_a_t load addtotrie [/proceduretype /integertype /integertype ] /put_p load addtotrie [/proceduretype /integertype /doubletype ] /put_p load addtotrie [/literalproceduretype /integertype /integertype] /put_lp load addtotrie [/literalproceduretype /integertype /doubletype] /put_lp load addtotrie [/dictionarytype /literaltype /integertype] /put_d load addtotrie [/dictionarytype /literaltype /doubletype] /put_d load addtotrie def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Initialize Error Dictionary %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% errordict /recordstacks true put_d %% Enable stack snapshot on error errordict /newerror false put_d %% Initialize errordict /commandname () put_d errordict /oldcommandname () put_d errordict /olderrorname () put_d errordict /oldestack () put_d /raiseerror trie [/literaltype /literaltype] /raiseerror load addtotrie def /* BeginDocumentation Name: bind - recursively replaces executable operator names by their values. Synopsis: proc bind --> proc Description: bind iterates through the given procedure object and replaces names which are bound to tries or functions by their values. bind works recursively and processes any nested procedure object it encounters. bind uses the current dictionary context to perform its operation. Thus, changing the dictionary context after bound was applied has no effect on the name-lookup of operators during the execution of the procedure. bind removes some execution overhead which is due to name-lookup. Thus, a bound procedure executes 10%-50% faster. Parameters: proc - procedure to be bound Examples: {1 2 add} bind --> {1 2 +add+} if you know the arguments are integer, {1 2 add_ii} will be the fastest choice, but there will be no sli-level typechecking any more! Bugs: Author: Gewaltig FirstVersion: ??? Remarks: Commented Hehl April 20, 1999 compare RedBook 2nd ed. page 370 SeeAlso: trie, addtotrie */ /bind { 0 1 2 index length 1 sub_ii { 2 copy get dup type /nametype eq { cvlit_n lookup { dup type dup /functiontype eq exch /trietype eq or { put }{ pop pop } ifelse } { pop } ifelse } { dup type dup /literalproceduretype eq exch /proceduretype eq or { bind put } { pop pop } ifelse } ifelse } for } def /bind dup load bind def /* BeginDocumentation Name: = - Print object to screen. Synopsis: any = --> - Description: Displays topmost operand stack object and pops it. In contrast to == operator, = will only give part of the information if the object is not of simple kind (for example, there's no difference for integers, but there is one for procedures!) Parameters: any Examples: SLI ] 12 = 12 SLI ] {1211} = <proceduretype> SLI ] Author: Gewaltig, Diesmann FirstVersion: ??? Remarks: Commented Hehl April 20, 1999 compare RedBook 2nd ed. page 362 SeeAlso: ==, =only, ==only */ /= { cout exch <- endl ; } bind def /* BeginDocumentation Name: == - Print object to screen in syntax-form. Synopsis: any == --> - Description: Displays topmost operand stack object and pops it. In contrast to = operator, == will try to represent any printable object, not only objects of simple kind (for example, there's no difference for integers, but there is one for procedures!) Parameters: any Examples: SLI ] 12 == 12 SLI ] {1211} == {1211} SLI ] Author: Gewaltig, Diesmann FirstVersion: ??? Remarks: Commented Hehl April 20, 1999 compare RedBook 2nd ed. page 362 SeeAlso: =, =only, ==only */ /== { cout exch <-- endl ; } bind def /* BeginDocumentation Name: =only - Print object to screen without linefeed Synopsis: any =only --> - Description: like =, but without a linefeed. Parameters: any Examples: SLI ] 12 =only 12SLI ] {1211} =only <proceduretype>SLI ] Author: Gewaltig, Diesmann FirstVersion: ??? Remarks: Commented Hehl April 20, 1999 compare RedBook 2nd ed. page 362 SeeAlso: =, ==, ==only */ /=only { cout exch <- ; } bind def /* BeginDocumentation Name: ==only - Print syntax form of object to screen without linefeed Synopsis: any ==only --> - Description: like ==, but without linefeed Parameters: any Examples: SLI ] 12 ==only 12SLI ] {1211} ==only {1211}SLI ] Bugs: Author: Gewaltig, Diesmann FirstVersion: ??? Remarks: Commented Hehl April 20, 1999 compare RedBook 2nd ed. page 362 SeeAlso: =, ==, =only */ /==only { cout exch <-- ; } bind def /* BeginDocumentation Name: stack - Display operand stack Synopsis: stack --> - Description: Displays operand stack using = operator on each object. Parameters: - Examples: 1 2 3 stack --> 3 2 1 {123} stack --> <proceduretype> Bugs: Author: Gewaltig, Diesmann FirstVersion: ??? Remarks: Commented Hehl April 20, 1999 compare RedBook 2nd ed. page 522 SeeAlso: pstack, typestack, =, == */ /stack { 0 1 count 3 sub_ii { index = } for } bind def /* BeginDocumentation Name: typestack - Display types of operand stack Synopsis: typestack --> - Description: Displays operand stack, showing Type as well as value of each object. Parameters: - Examples: {1} {2} {3} typestack proceduretype:{3} proceduretype:{2} proceduretype:{1} Bugs: Author: Gewaltig, Diesmann FirstVersion: ??? Remarks: Commented Hehl April 20, 1999 SeeAlso: stack, pstack, =, == */ /typestack { 0 1 count 3 sub_ii { index dup type =only (:) =only == } for } bind def /* BeginDocumentation Name: pstack - Display operand stack in syntax form. Synopsis: pstack --> - Description: Displays operand stack using == on each object. Parameters: - Examples: {1} {2} {3} stack --> {3} {2} {1} Bugs: Author: Gewaltig, Diesmann FirstVersion: ??? Remarks: Commented Hehl April 20, 1999 compare RedBook 2nd ed. page 465 SeeAlso: stack, typestack, =, == */ /pstack { 0 1 count 3 sub_ii { index == } for } bind def /*BeginDocumentation Name: pick - copy element from stack level n Synopsis: on ..ok .. o0 k pick -> on ..ok .. o0 ok Examples: 1 2 3 4 5 6 7 3 pick -> 4 SeeAlso: over, index */ /pick /index load def %% Routines for benchmarking %% ptimes, realtime, usertime, systemtime, tic, toc /* BeginDocumentation Name: ptimes - returns real, user, and system time Synopsis: ptimes -> [rtimes utimes stimes cutimes cstimes] Description: Calls the POSIX times() function to obtain real, user, and system time in seconds, as well as user and system times counts for all child processes. Real time has arbitrary origin, i.e., only differences are meaningful. Note: results for user and system time may not be reliable if more than one thread is used. Author: Hans Ekkehard Plesser FirstVersion: 2003-07-29 References: man 2 times SeeAlso: realtime, usertime, systemtime, tic, toc, pclockspersec, pclocks */ /ptimes { pclocks pclockspersec cvd div } def /* BeginDocumentation Name: realtime - returns realtime Synopsis: realtime -> rtime Description: Calls the POSIX times() function to obtain real time in seconds. Real time has arbitrary origin, i.e., only differences are meaningful. Author: Hans Ekkehard Plesser FirstVersion: 2003-07-29 References: man 2 times SeeAlso: ptimes, usertime, systemtime, tic, toc, pclockspersec, pclocks */ /realtime { ptimes 0 get } def /* BeginDocumentation Name: usertime - returns usertime for current process Synopsis: usertime -> utime Description: Calls the POSIX times() function to obtain usertime for the current process in seconds. The value might not be meaningful if more than one thread is used. Author: Hans Ekkehard Plesser FirstVersion: 2003-07-29 References: man 2 times SeeAlso: ptimes, realtime, systemtime, tic, toc, pclockspersec, pclocks */ /usertime { ptimes 1 get } bind def /* BeginDocumentation Name: systemtime - returns system time for current process Synopsis: systemtime -> stime Description: Calls the POSIX times() function to obtain system time for the current process in seconds. The value might not be meaningful if more than one thread is used. Author: Hans Ekkehard Plesser FirstVersion: 2003-07-29 References: man 2 times SeeAlso: ptimes, realtime, systemtime, tic, toc, pclockspersec, pclocks */ /systemtime { ptimes 2 get } bind def /* BeginDocumentation Name: tic - start timing script execution Synopsis: tic -> - Description: Records the current real time obtained from the POSIX times() function as starting point for timing script execution. Author: Hans Ekkehard Plesser FirstVersion: 2003-07-29 SeeAlso: toc, realtime, ptimes */ /tic { systemdict begin /:tictime realtime def end } bind def /* BeginDocumentation Name: toc - Return wall clock time elapsed since tic was called. Synopsis: toc -> runtime Description: Determines the wall clock (real) time elapsed since tic was called last, in seconds. Resolution is given by pclockspersec. Author: Hans Ekkehard Plesser FirstVersion: 2003-07-29 SeeAlso: tic, realtime, ptimes, pclockspersec, clic, cloc */ /toc { systemdict begin realtime :tictime sub_dd end } bind def /* BeginDocumentation Name: clock - returns realtime Synopsis: clock -> double Description: Same as realtime, for backward compatibilty only. Author: Hans Ekkehard Plesser FirstVersion: 2003-07-29 SeeAlso: realtime */ /clock { realtime } bind def /* BeginDocumentation Name: sleep - Pauses current process. Synopsis: x sleep -> - Description: Pauses the process for x seconds. n can be integer or double. Resolution is given by pclockspersec. Examples: 5 sleep %wait for 5 seconds tic 2.75 sleep toc = %should print 2.75 Author: Schrader SeeAlso: realtime, tic, toc, ptimes, pclockspersec, clic, cloc */ /sleep trie [/integertype] /sleep_i load addtotrie [/doubletype] /sleep_d load addtotrie def /* BeginDocumentation Name: ms2hms - Convert milliseconds to an array [h min sec]. Synopsis: ms ms2hms -> [h min sec] Converts the given number of milliseconds into an array containing the corresponding number of hours minutes and seconds SeeAlso: tic, toc */ /ms2hms { << >> begin 1000.0 div /sec exch def sec cvi 3600 div /hours exch def sec hours 3600 mul sub /sec exch def % remainder sec cvi 60 div /min exch def sec min 60 mul sub /sec exch def % remainder hours min sec 3 arraystore end } bind def %% clic/cloc can be used to measure the number of %% milliseconds per interpreter cycle. %% The result includes also the cycles taken up by the %% involved routines. /* BeginDocumentation Name: clic - Start measuring interpreter cycles. Description: clic/cloc can be used to measure the number of milliseconds per interpreter cycle. The result includes also the cycles taken up by the SeeAlso: cloc, tic, toc */ /clic { systemdict begin /:cliccycles cycles def end } bind def /* BeginDocumentation Name: cloc - Return elapsed interpreter cycles since clic was called. SeeAlso: clic, tic, toc */ /cloc { systemdict begin cycles :cliccycles sub_ii :clicclocs sub_ii end } bind def %% Calibrate offset imposed by clic/cloc /:clicclocs 0 def /:clicclocs clic cloc def /* BeginDocumentation Name: reset - Reset dictionary stack and clear the userdict SeeAlso: ResetKernel */ /reset { cleardictstack userdict cleardict } bind def % ****************************** % * Dictionary Query Functions % * /* BeginDocumentation Name: who - list contents of the top-level dicitonary Synopsis: who -> - Description: who prints the contents of the current top-level dictionary to the standard output. Remarks: taken from Matlab. The listing would be more legible with a pager. If you want to pass the output to a stream, use topinfo_d instead. Author: Gewaltig SeeAlso: info_ds, dictstack, info, topinfo_d, who */ /who { cout topinfo_d } bind def /* BeginDocumentation Name: whos - list contents of all dictionaries on the dicitonary stack Synopsis: whos -> - Description: whos prints the contents of all dictionaries which are cunnrently on the dictionary stack to the standard output. Dictionaries are printed from bottom to top, i.e. systemdict then userdict and then all additional dictionaries (if any). Remarks: taken from Matlab. The listing would be more legible with a pager. If you want to pass the output to a stream, use info_ds instead. Author: Gewaltig SeeAlso: info_ds, dictstack, info, topinfo_d, who */ /whos { cout info_ds } bind def % * dict info % * Prints the contents of the given dictionary % * This one is documented in slidict.cc /info trie [/dictionarytype] { cout exch info_d } bind addtotrie [/trietype] { cout (This type trie contains the following overloaded functions:\n\n) <- exch trieinfo_os_t } bind addtotrie def %% %% Conversion Operators %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % PostScript style conversion to string % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /* BeginDocumentation Name: cvs - Convert object to string Description: cvs converts every object into a string Examples: 23 cvs -> (23) {3 2 mul dup} cvs -> (<proceduretype>) (hello) cvs -> (hello) Author: docu by Sirko Straube SeeAlso: pcvs, print, pprint, cst, cva, cv1d, cv2d, cvd, cvi, cvlit, cvn, cvt_a */ /cvs { ostrstream pop % unsafe, better check boolean exch <- str } bind def /* BeginDocumentation Name: pcvs - Convert object to string (long version) Description: pcvs converts every object into a string (long version) Examples: 23 pcvs -> (23) {3 2 mul dup} pcvs -> ({3 2 mul dup}) (hello) pcvs -> ((hello)) Author: R Kupper by copy-and-modify from cvs SeeAlso: cvs, print, pprint */ /pcvs { ostrstream pop % unsafe, better check boolean exch <-- str } bind def /* BeginDocumentation Name: cvs_f - Formatted conversion of double to string Synopsis: x q cvs_f -> str x [p q] cvs_f -> str Description: x q cvs_f -> str converts a double (or integer) number x into a string str with a specified number q of digits after the decimal point x [p q] cvs_f -> str puts in addition p minus IntegerPart(x) zeros in front of the string (nothing happens if p is smaller than the length of x's integer part). Examples: 2.3456 3 cvs_f -> (2.346) 2.3456 0 cvs_f -> (2) 2.3456 neg 2 cvs_f -> (-2.35) 2.3456 [2 3] cvs_f -> (02.346) 2.3456 neg [2 3] cvs_f -> (-02.346) 222.3456 [2 3] cvs_f -> (222.346) Author: Tom Tetzlaff SeeAlso: cvs */ /cvs_f { /n Set % number of desired digits after decimal point /x Set % some double number n 1 arraystore Flatten length 1 eq { % x n cvs_f n 0 eq {x round cvs } { x 0. eq { (0.) n {(0) join} repeat } { x abs 10. n pow mul round {dup 1e9 lt} assert int cvs /xstr Set xstr length n lt { () n xstr length sub {(0) join} repeat xstr join /xstr Set } if xstr 0 xstr length n sub getinterval /bd Set % integer digits xstr xstr length n sub xstr length getinterval /ad Set % digits after decimal point bd (.) ad join join bd () eq {(0) exch join} if x 0 lt {(-) exch join} if % add minus sign if x<0 } ifelse } ifelse } { {n 1 arraystore Flatten length 2 eq} assert % x [n1 n2] cvs_f n First /n1 Set n Last /n2 Set x abs 10. n2 pow mul round {dup 1e9 lt} assert int cvs /xstr Set xstr length n2 lt { () n xstr length sub {(0) join} repeat xstr join /xstr Set } if xstr 0 xstr length n2 sub getinterval /bd Set % integer digits bd length 0 eq { (0) /bd Set} if xstr xstr length n2 sub xstr length getinterval /ad Set % digits after decimal point () n1 bd length sub {(0) join} repeat bd join (.) ad join join bd () eq {(0) exch join} if x 0 lt {(-) exch join} if % add minus sign if x<0 } ifelse } def /*BeginDocumentation Name: statusdict - dictionary with platform dependent status information. Description: The status dictionary contains various platform dependend status information. Among others, it contains the following useful things: argv arraytype full list of commandline arguments given to NEST userargs arraytype user supplied arguments, usable by scripts interactive booltype does this NEST session read its commands from an interactive prompt? files arraytype list of files to execute, as specified on the commandline prgdatadir stringtype path to the installation directory prgdocdir stringtype path to the documentation directory have_mpi booltype this flag is always defined and indicates whether an MPI library is available to the NEST system or not. The flag does not indicate whether the interpreter actually has MPI support. is_mpi booltype this flag may not be defined if the interpreter does not have MPI support. If the value of the flag is true, the interpreter has support for parallel computing. View the whole contents of the status dictionary with 'statusdict info'. SeeAlso: info, LocateFileNames, searchifstream, searchfile */ statusdict begin /version prgmajor cvs (.) join_s prgminor cvs join_s (.) join_s prgpatch cvs join_s def /userargs [] def /interactive true def /files [] def end /* * SLIHOME is obsolete. It may disappear anytime. * DO NOT USE !!! */ systemdict begin /SLIHOME { M_WARNING (sli-init.sli) (The variable 'systemdict::SLIHOME' is obsolete. It may disappear anytime.) message M_WARNING (sli-init.sli) ( Go and fix your SLI code. It WILL break in the future.) message M_WARNING (sli-init.sli) ( Replacements:) message M_WARNING (sli-init.sli) ( (1) If you want to locate a file in the NEST distribution, use 'SLISearchPath <filename> LocateFileNames'.) message M_WARNING (sli-init.sli) ( For more information, type '/LocateFileNames help'.) message M_WARNING (sli-init.sli) ( If you think a file is missing from the distribution, ask a developer to add it to the installation list.) message M_WARNING (sli-init.sli) ( (2) If you want to locate a file in a custom searchpath, use '[<searchpath>] <filename> LocateFileNames'.) message M_WARNING (sli-init.sli) ( (3) If you need the path to NEST's installation directory, use 'statusdict::prgdatadir'.) message M_WARNING (sli-init.sli) ( For more information, type '/statusdict help'.) message M_WARNING (sli-init.sli) ( WARNING: NEVER try to locate a file in NEST's source directory, it may not exist any longer!) message % As a temporary workaround, this is where SLIHOME used to point to: statusdict /prgsourcedir get_d } def end /SLISearchPath [ statusdict /prgdatadir get_d (/sli) join_s ] def /* BeginDocumentation Name: joinpath - Join filename and path strings, adding the slash. Synopsis: (path) (filename) joinpath -> (path/filename) Author: R Kupper (replacing U Hehls ill-named "exch joinpath") FirstVersion: 17-jul-2008 SeeAlso: join */ /joinpath trie [/stringtype /stringtype] { exch (/) join_s exch join_s } bind addtotrie def /* BeginDocumentation Name: searchfile - tries to open a file for reading using one of the pathes given within an array of pathnames. Synopsis: (filename) [pathnames] searchfile -> istream true -> false Description: searchfile concatenates every pathname with the filename and calls ifstream until ifstream was able to open the file or until no other path is left. In ordinary cases you will not call searchfile, but searchifstream. Call searchfile if you want to use customized search pathes. Diagnostics: The routine issues debugging messages of priority M_DEBUG displaying the search status. Parameters: string is the filename, while array contains pathname strings. Examples: test.dat [(./) (~/) (/home/synod/)] tries to open test.dat for reading using the current, your user, and the /home/synod/ path one after the other. It opens the first test.dat found along the way, or returns false if there is no one in neither path. References: Bugs: Author: Gewaltig, Diesmann, R Kupper FirstVersion: 1995 Remarks: commented April 13, 1999 Hehl added debugging output 4-dec-2007 R Kupper SeeAlso: ifstream, searchifstream, LocateFileNames */ %% we have two versions of this routine: :searchfile_nodebug and %% :searchfile_debug. One issues debugging %% messages, the other doesn't. At this point in the initialization %% cycle, the 'message' command is not yet available. Hence we first %% define /searchfile to be /:searchfile_nodebug. %% As soon as 'msc_helper.sli' has been loded %% below, we will redefine /searchifle to be :/searchfile_debug. %% (see below) /:searchfile_nodebug { false 3 1 roll { 1 index joinpath ifstream {% found true 4 -2 roll pop exit } if } forall_a pop } bind def /:searchfile_debug { 1 index M_DEBUG (searchfile) (Locating file ) 4 -1 roll join (:) join message false 3 1 roll { 1 index joinpath dup ifstream {% found M_DEBUG (searchfile) ( searching for ) 5 -1 roll join ( ... yes) join message true 4 -2 roll pop exit } {% not found M_DEBUG (searchfile) ( searching for ) 4 -1 roll join ( ... no) join message } ifelse } forall_a pop } bind def /searchfile /:searchfile_nodebug load def /* BeginDocumentation Name: LocateFileNames - Look up complete pathnames of given file in given search path. Synopsis: stringarray string LocateFileNames -> stringarray Description: Tries to locate a file specified in string using the search path of the stringarray. Returns an array of complete filenames including pathname. Parameters: stringarray : a search path string : filename stringarray : Returned matches Examples: SLISearchPath (sli-init.sli) LocateFileNames --> [(SLIHOME/lib/sli/sli-init.sli)] Author: Hehl FirstVersion: April 16, 1999 SeeAlso: searchfile, searchifstream */ /LocateFileNames { << >> /TheFile 3 -1 roll def /FileMatches [] def begin { TheFile joinpath dup ifstream { pop % we don't really want a file handler! FileMatches exch append /FileMatches exch def % store match in resulting array } {pop} ifelse } forall FileMatches % push result end } bind def /* BeginDocumentation Name: searchifstream - searches SLI's search path for a file Synopsis: string searchifstream -> istreamtype true -> false Description: searchifstream calls searchfile to open the file specified in string for reading. Searchfile will use the Search path mechanism, trying any path in SLISearchPath. If searchfile fails, operator tries to add .sli to the name. Returns a pointer to the stream for reading and true to indicate success if filename or filename.sli is a valid file, otherwise returns false. Parameters: string is a filename with full path information or a file found within one of the Pathes specified in SLISearchPath. Examples: (sli-init.sli) searchifstream opens sli-init.sli for reading since the path to system sli files is contained in SLISearchPath. References: Bugs: Author: Gewaltig, Diesmann FirstVersion: 1995 Remarks: commented April 12, 1999 Hehl SeeAlso: ifstream, searchfile, LocateFileNames */ /searchifstream { SLISearchPath 2 copy % first try plain searchfile % filename. Then dup % add extension not_b % .sli { pop % remove extra true exch (.sli) join_s exch searchfile } { 4 2 roll pop pop } ifelse } bind def /* BeginDocumentation Name: file - opens file for reading or writing Synopsis: string1 string2 file -> ostreamtype -> istreamtype Description: file is the PostScript operator used to open files for reading or writing. If opening is successful the appropriate streamtype is returned. If opening fails /FileOpenError is raised. If the file name contains path information "/", the operator tries to open the specified file directly, otherwise if the file should be opened for reading the operator uses the searchpath to locate the file. Parameters: string1 is the file name, string2 is a modifier (r) or (w) which specifies if the file should be opened for reading or writing. Examples: (sli-init.sli) (r) file type == -> istreamtype References: compare RedBook 2nd ed. page 414 Author: Gewaltig, Diesmann FirstVersion: 1995 Remarks: commented April 12, 1999 Hehl, Diesmann SeeAlso: close, ofstream, ifstream, searchifstream */ /file trie [/stringtype /stringtype] { 2 copy % save parameters in case an error occurs. (w) eq { ofstream % never search if file is for write access } { dup % pick filenamename (/) search_s % see if name contains path information { 3 npop ifstream % if so, try to open file directly } { pop searchifstream % if not, search file in pathlist } ifelse } ifelse not_b { 2 copy (w) eq { (Could not open the following file for writing: ") } { (Could not open the following file for reading: ") } ifelse exch join (".) join /error_description Set errordict begin /message error_description def end /file /FileOpenError raiseerror } { 3 1 roll % remove extra copy of parameters 2 npop }ifelse } bind addtotrie def /* BeginDocumentation Name: run - execute a sli file Synopsis: string run -> - Description: Opens the file specified via file operator and executes it. Parameters: string is the filename, either with complete path or found within one of the SLISerachPath pathes. The extension (.sli) may be omitted. Examples: (MySli.sli) run --> execute file MySli, assuming it exists in the search path entries. (~/MySliRoutines/DoIt) run --> execute file, ignoring search pathes Bugs: Author: Gewaltig, Diesmann FirstVersion: ?? Remarks: Commented Hehl April 21, 1999 SeeAlso: exec, file */ /run trie [/stringtype] { dup (.sli) search_s { 3 npop } { pop (.sli) join_s } ifelse (r) file cvx_f exec } bind addtotrie def /* BeginDocumentation Name: addpath - add a path to SLISearchPath Synopsis: string addpath -> - Description: The new path will be appended to SLISearchPathvariable. There is no check if path really exists. Parameters: string is path's name. Examples: (~/MySliRoutines) addpath --> sli files will additionally be looked for in ~/MySliRoutines now. Bugs: Author: Gewaltig, Diesmann FirstVersion: ?? Remarks: Commented Hehl April 21, 1999 SeeAlso: searchfile, path, setpath */ /addpath trie [/stringtype] { systemdict begin SLISearchPath exch_ append_a /SLISearchPath exch_ def_ end } bind addtotrie def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % patharray (string) setpath -> % Append string to path array % % (string) patharray setpath % Prepend string to patharray % % Side Effects: sets SLISeachPath in systemdict. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /* BeginDocumentation Name: setpath - Append string to path array SeeAlso: addpath, path */ /setpath trie [/arraytype /stringtype] { systemdict begin append_a /SLISearchPath exch_ def end } bind addtotrie [/stringtype /arraytype] { systemdict begin exch_ prepend_a /SLISearchPath exch_ def end } bind addtotrie [/arraytype /arraytype] { systemdict begin join /SLISearchPath exch_ def end } bind addtotrie def /* BeginDocumentation Name: path - Return current search path as array SeeAlso: addpath, setpath */ /path { systemdict /SLISearchPath get_d } bind def %%%%%%%%%%%%%%%%%%% Error Handling %%%%%%%%%%%%%%%%%%%%% /* BeginDocumentation Name: handleerror - Default error handler Description: handleerror is the default error handler. It issues error messages according to the state of the errordict. The command that caused the error is left at the top of the dicitonary stack. An error is raised by the command /func /error raiseerror The flag newerror helps to distinguish between interrupts caused by call of stop and interrupts raised by raiseerror. It also helps to find errors in the handler itself. This is why it should be re-set to false at the very end of the handler! Examples: To catch errors from an unknown function f, one can write: {f} stopped {handleerror} if References: The Red Book SeeAlso: raiseerror, raiseagain, stopped, stop, errordict */ /handleerror { errordict /newerror get % check error state { print_error errordict /newerror false put % Re-set error state } { % this catches extra stops (\n Software Interrupt \n) = % issued by the user } ifelse % or a user function % cleardictstack % clean up dictionary stack } bind def /MissingOptionError { /errorname Set M_ERROR errorname cvs (An option for the command is missing. Please see the) message M_ERROR errorname cvs (documentation of ') errorname cvs join (' and 'Options' for details.) join message errorname /MissingOptionError raiseerror } def /MissingOptionError trie [/literaltype] /MissingOptionError load addtotrie def /* BeginDocumentation Name: assert - assert that procedure returns true Synopsis: {assertion} assert -> - Remarks: assertion is a boolean Author: docu by Sirko Straube */ /assert { << exch /func exch >> begin func not { cerr (Assertion ) <-/func load <-- ( failed.) <- endl pop /assert /FailedAssertion raiseerror } if end } bind def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % cst stands for convert string to token % % it gets a string as argument and returns % % an executable array. % % addapted to SYNOD2, Apr. 98, D&G % % First Version: 19. July 1995 % % Diesmann & Gewaltig % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /* BeginDocumentation Name: cst - Convert string to array of tokens Synopsis: string cst -> array Examples: (hello) cst -> [hello] Author: docu by Sirko Straube SeeAlso: cv1d, cv2d, cva, cvd_s, cvi_s, cvlit, cvn, cvs, cvt_a */ /cst { [] % create array { % begin of evaluation loop exch % make string the top element token_s % get token from string not_b { exit } if % exit loop if string is empty 3 -1 roll % move array on top exch append_a % append token to array } loop % now only the array is left } bind def /css { [] % create array { % begin of evaluation loop exch % make string the top element symbol_s % get token from string not_b { exit } if % exit loop if string is empty 3 -1 roll % move array on top exch append_a % append token to array } loop % now only the array is left } bind def % % prompt % ------- % flushes the standard output and % displays a prompt. If the operand stack % is not empty, its count is also shown % % In synod 1.x we used the routine of GS, % here it is rewritten with new operators % April 17. 1998, Diesmann % /sprompt { (SLI ) count 1 gt_ii % counter has to be corrected for operative { % objects on the stack ([) join_s count 1 sub_ii cvs join_s } if (] ) join_s } bind def /prompt { cout sprompt <- flush ; } bind def /batchprompt_ { cout (]) <- endl ; } bind def /batchprompt /batchprompt_ load def % % (prompt) readline (input) true % false /*BeginDocumentation Name: readline - read and edit a line from standard input Synopsis: any readline -> any true -> false Description: readline takes anything from the prompt as a string and prints it. If something is added, readline pushes the additional phrase as string plus a true on the stack (that means readline reads a line from standard input). If nothing is added false is pushed. Author: docu by Sirko Straube SeeAlso: GNUreadline */ /readline { cout exch <- ; % readline takes prompt string as argument cin getline_is not { %% cin pop false } { %% cin string dup () eq { 2 npop false } { exch pop true } ifelse } ifelse } bind def /quit_i trie [/integertype] { statusdict /exitcode rolld put quit } addtotrie def /abort { statusdict /exitcodes get /userabort get quit_i } bind def /* BeginDocumentation Name: exithook - Procedure executed if the executive mode is left. Description: The task of exithook is to handle accidental exits from the interactive executive session. The most common reason is the use of 'exit' when the user wants to quit the interpreter. By default, exithook will issue a message and restart the executive mode. If you would like to quit the interpreter, put the following code into your .nestrc file /exithook {quit} def For debugging it is often useful to be able to access the fallback input which has no prompt. For this, put the following code to your .nestrc file /exithook {} def SeeAlso: quit, exit, executive */ /exithook { quit } def /*BeginDocumentation Name: callback - Function to execute before each input prompt. Description: callback is a procedure which is called in the executive mode, before the input prompt appears. It can be used for debugging. For example, during development, the user might want to see the contents of the stack after each input. callback is only called in the executive mode. It cannot be used to trace the execution of a procedure. If this is what you want to do, use debug instead. Examples: The following definition will display the stack before each prompt. /callback {stack} def The following definition will clear the callback. /callback {} def SeeAlso: executive, debug, break, continue */ /callback {} def /* BeginDocumentation Name: executive - Start interactive interpreter session. SeeAlso: callback, exithook, quit, exit */ %% check whether GNU readline is installed. If so, %% use it for the executive command. systemdict /GNUreadline known { /executive { { %% loop with stopped context to catch signals { callback sprompt GNUreadline { dup GNUaddhistory cst cvx_a stopped {handleerror} if } if } stopped {handleerror} if % to catch signals } loop exithook } bind def } { /executive { { { callback sprompt readline { cst cvx_a stopped {handleerror} if } if } stopped {handleerror} if % to catch signals } loop exithook } bind def } ifelse /warranty { (This program is provided AS IS and comes with) = (NO WARRANTY. See the file LICENSE for details.) = () = } def /:helptext { (Type 'helpindex' to see the list of commands.) = (Type 'helpdesk' to access the online documentation in a browser.) = (Type '/<command> help' to get help on a command.) = (Type '/help help' to learn more about the online help system.) = (Type 'quit' or CTRL-D to quit NEST.) = (Type 'sysinfo' to see details on the system configuration.) = (Type 'authors' for information about the makers of NEST.) = (Type 'license' to display the license agreement that came with your copy of NEST.) = (For more information visit http://www.nest-initiative.org.) = (Type 'help' to see this text again.) = () = } def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Display Welcome Message % % Now DOCUMENTED % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /* BeginDocumentation Name: welcome - Print SLI welcome message Description: After the startup process of the interpreter is finished, welcome is called to print the familiar greeting message. The contents of this message can be personalized by changing the welcome procedure in the personal startup file .nestrc SeeAlso: nestrc */ /:warnings {} def % little helper to display warnings AFTER the welcome message. /:addwarnings % add a piece of code to the /:warnings procedure { systemdict begin /:warnings load exch append /:warnings Set end } def /welcome { statusdict begin cout endl argv 0 get reverse 0 3 getinterval (ils) eq { ( -- S L I --) <- endl } { ( -- N E S T --) <- endl } ifelse endl ( Copyright (C) 2004 The NEST Initiative) <- endl ( Version ) <- prgmajor <- (.) <- prgminor <- (.) <- prgpatch <- ( ) <- built <- endl endl ; end warranty (Problems or suggestions?) = ( Website : http://www.nest-initiative.org) = ( Mailing list: nest_user@nest-initiative.org) = () = (Type 'help' to get more information.) = (Type 'quit' or CTRL-D to quit NEST.) = () = :warnings } def /shortwelcome { statusdict begin cout argv 0 get reverse 0 3 getinterval (ils) eq { (SLI v) <- } { (NEST v) <- } ifelse version <- ( (C) 2004 The NEST Initiative) <- endl ; end } def /sysinfo { statusdict begin cout (Built on ) <- built <- ( for ) <- host <- endl (Architecture: ) <- statusdict /architecture get /long get 8 mul <- ( bit) <- endl (SLI revison: ) <- stdlibrevision <- endl /kernelname lookup { % we are running the interpreter with a simulation kernel <- ( revision: ) <- kernelrevision <- endl (Kernel library rev: ) <- kernellibrevision <- endl } { % we are running the pure interpreter (no simulation kernel linked.) <- endl } ifelse (Searching files in: ) <- path <-- endl pop end } def /authors { cout endl (NEST has been created and is maintained by the ) <- (members of the NEST Initiative:) <- endl endl ( * Honda Research Institute Europe, Offenbach, Germany) <- endl ( * Computational Neurophysics Research Unit,) <- endl ( RIKEN Brain Science Institute, Wako City, Japan) <- endl ( * Department of Mathematical Sciences & Technology,) <- endl ( Norwegian University of Life Sciences, Aas, Norway) <- endl ( * Neurobiology & Biophysics, Institute for Biology III,) <- endl ( Albrecht-Ludwigs-Universitaet Freiburg, Germany) <- endl () <- endl endl (For the list of developers and more information visit us at http://www.nest-initiative.org.) <- endl endl ; } def /* BeginDocumentation Name: license - Display the NEST license. Description: Displays the license agreement that came with your copy of NEST. Remarks: license uses the command "pager" to display its information. Type /pager help to learn how to customize the output of this command. SeeAlso: page */ /license { statusdict /prgdocdir get (/LICENSE) join page } def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Encapsulate builtins in type-trie structures %% (typeinit.sli) run %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% %% Please place all other libraries below %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Helper routines % % (see misc_helpers.sli) % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% (misc_helpers.sli) run %% We now have the 'message' command available, so we can now switch %% to the version of /searchfile that issues debugging messages: /searchfile /:searchfile_debug load def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Define unique Library Version %% (note: depends on misc_helpers.sli for "breakup") %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /* BeginDocumentation Name: stdlibrevision - revision number of sli-init libray Description: String constants which contains the unique CVS revision number of the SLI startup file. This value can be used by custom programs to check whether certain features ought to be present. This symbol is defined in the status dictionary. */ statusdict begin /stdlibrevision ($Revision: 10138 $) % CVS revision number (unique) def end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % ENVVAR :pathlist -> array % % UNDOCUMENTED % %% (note: depends on misc_helpers.sli for "breakup") %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /:pathlist trie [/stringtype] { getenv { (:) breakup % breakup is defined very late } { [ ] } ifelse } bind addtotrie def %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % SLI library handling % % (see library.sli) % % and support: % % Version number handling routines % % (see library.sli) % % % % This should be initialized as early as % % possible, so that other initialization % % diles can use the library management! % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% (library.sli) run (version.sli) run % note: version.sli depends on misc_helpers.sli %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% PS conforming operators % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /ps-lib (1.2) require %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Module Initialization %% %% %% %% now execute all module %% %% commandstrings. %% %% These are defined in the %% %% module classes and called %% %% by the interpreter. %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% M_STATUS (sli-init) (Executing module initializers...) message moduleinitializers { initialize_module } forall %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Mathematica Style Formatted IO % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% (FormattedIO.sli) run %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Debugging Features %% %% %% %% run after modules are %% %% initialized %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% (debug.sli) run %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Online Help System %% %% %% %% run after modules are %% %% initialized %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% (helpinit.sli) run %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% %% Below this point, the interpreter is completely %% set up. All following code evaluate commandline %% arguments and user startup file. %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /* Documentation (not included in helpdesk) Name: :commandline - evaluates sli commandline arguments argv Synopsis: - :commandline -> true (interactive session) -> [filenames] false (non-interactive session) Description: :commandline scans for the following commandline arguments (short forms given in backets): --version (-v), --help (-h), --batch (-). The argument -c has to be followed by a string, which is executed in a stopped context, before sli quits. All other commandline arguments are interpreted as file names that are executed in the sequence of their appearance on the commandline using the run command. Execution takes place in a stopped context using the standard error handler handleerror. After execution of the last argument the interpreter terminates by invocation of the quit command. If :commandline encounters the argument --batch or - it starts reading and executing tokens from stdin using :parsestdin without any support for commandline editing and limitations on the length of an input line. This is useful if sli is used as a computational engine called by some other application. Batch mode is protected by a stopped context using the standard error handler handleerror. Parameters: :commandline does not take any arguments. It evaluates argv which resides in the statusdict. Examples: Bugs: Author: Eppler, Gewaltig Remarks: Commented Diesmann July 8, 2000 SeeAlso: statusdict, argv, executive, start, :parsestdin, run */ /:commandline { /scripterror statusdict /exitcodes get /scripterror get def statusdict /argv get Rest << >> begin /printhelp false def /printversion false def /batch false def /runcommand false def { { % get the next argument from argv empty { exit } if dup First exch Rest exch dup (--help) eq over (-h) eq or { /printhelp true def pop exit } if dup (--version) eq over (-v) eq or { /printversion true def pop exit } if dup (--batch) eq over (-) eq or { /batch true def pop exit } if dup 0 11 getinterval (--userargs=) eq { size 11 sub % stack: (--userargs=...) size-11 11 exch getinterval % stack: (...) (:) breakup statusdict /userargs rolld put exit } if dup (-c) eq { pop empty { M_ERROR (:commandline) (Option '-c' needs an extra argument) message quit } if dup First exch Rest exch /command Set /runcommand true def exit } if % the argument is not an option, so we take it as a file to execute: statusdict begin /interactive false def files exch append /files Set end } loop empty { pop exit } if } loop % Following are the helper functions that are executed according % to the flags set above. Their order is used to prioritize the % options. printhelp { (usage: nest [options] [ - | file [file ...] ]) = ( file1 file2 ... filen read SLI code from file1 to filen in ascending order) = ( Quits with exit code ) scripterror cvs join ( on error.) join = ( - --batch read SLI code from stdin/pipe.) = ( Quits with exit code ) scripterror cvs join ( on error.) join = ( -c cmd Execute cmd and exit) = ( -h --help print usage and exit) = ( -v --version print version information and exit) = ( --userargs=arg1:... put user defined arguments in statusdict::userargs) = ( -d --debug start in debug mode (implies --verbosity=ALL) ) = ( --verbosity=ALL turn on all messages.) = ( --verbosity=DEBUG|STATUS|INFO|WARNING|ERROR|FATAL) = ( show messages of this priority and above.) = ( --verbosity=QUIET turn off all messages.) = quit } if printversion { statusdict begin cout (NEST version ) <- version <- (, built on ) <- built <- ( for ) <- host <- endl (Copyright (C) 2004 The NEST Initiative) <- endl endl end quit } if batch { statusdict /interactive false put {cin cvx exec quit} stopped { handleerror scripterror quit_i } if } if runcommand { statusdict /interactive false put {command cvx exec quit} stopped { handleerror scripterror quit_i } if } if end % put the value of interactive on the stack statusdict/interactive :: dup not { % put the files to execute on the stack if not running interactively statusdict/files :: exch } if } bind def /* BeginDocumentation Name: start - interpreter start symbol Synopsis: - start -> - Description: The full featured life of the interpreter begins after boot-strapping with sli-init.sli by pushing the start symbol. When no commandline arguments are present the start symbol prepares for an interactive session in the shell with the help of the executive command. When command line arguments are present a non-interactive session is assumed and the start symbol prepares for recognition of these arguments with the help of the :commandline command. When executing files and an error is raised that is not caught by the script, quit with the exit code scripterror, which is defined in the exitcodes dictionary in statusdict. Parameters: start does not take any arguments. It evaluates the length of argv which resides in the statusdict. Examples: Bugs: Author: Gewaltig, Diesmann FirstVersion: similar code appeared in sli-1 Remarks: Commented Diesmann July 8, 2000 SeeAlso: executive, statusdict */ /start { /scripterror statusdict /exitcodes get /scripterror get def { :commandline { % we have an interactive session welcome executive } { % we have a non-interactive session shortwelcome % Execute in stopped context so we can detect uncaught errors % We also check if /newerror is set in errordict. This in case % an error occured in a stopped context without proper error % handler. { { run } forall } stopped { handleerror scripterror quit_i } if quit } ifelse } stopped { handleerror } if } def /* BeginDocumentation Name: nestrc - Personal interpreter initialization file Description: During startup, the NEST searches for a personal resource file. The name (and PATH) of this resource file can be specified by the environment variable NESTRCFILENAME. If this variable is not set sli executes the file $HOME/.nestrc. If this file does not exist, it is created from a template. The resource file is executed before the welcome messsage is printed. SeeAlso: welcome */ /:createdefaultrcfile { << >> begin (HOME) getenv pop % get home directory (we alrady know that $HOME is set) (/.slirc) % Check if a legacy file is present join ifstream {% $HOME/.slirc is present close { M_WARNING (evalrcfile) (The name of NEST's resource file has changed to .nestrc) message M_WARNING (evalrcfile) (You seem to have a legacy .slirc file in your $HOME directory.) message M_WARNING (evalrcfile) (If this is so, please check and rename it to .nestrc,) message M_WARNING (evalrcfile) (or create a file with the name .nestrc in your $HOME directory.) message } :addwarnings } {% $HOME/.slirc is not present (HOME) getenv pop % get home directory (we alrady know that $HOME is set) (/.nestrc) join /outfile Set statusdict /prgdocdir get (/examples/nestrc.sli) join /infile Set infile outfile CopyFile { M_WARNING (evalrcfile) (NEST has created its configuration file $HOME/.nestrc) message M_WARNING (evalrcfile) (If this troubles you, type '/nestrc help' at the prompt to learn more.) message } :addwarnings } ifelse end } def /evalrcfile { { (NESTRCFILENAME) getenv { dup ifstream { exch pop cvx exec % execute curstom rc file } { (Could not open file ) exch join { M_ERROR (evalrcfile) (In environment variable NESTRCFILENAME) message M_ERROR (evalrcfile) } exch append { message } join :addwarnings } ifelse } { (HOME) getenv % get home directory { (/.nestrc) % Use default rc-filename join ifstream % check if rc file is present { cvx exec % if so, execute it. } { :createdefaultrcfile % if not, create one. } ifelse } { { M_ERROR (evalrcfile) (NEST was unable to locate its configuration file, because your $HOME environment variable is not set.) message } :addwarnings } ifelse } ifelse } stopped %% This is a modfified version of handleerror. { errordict begin newerror % check error state { errorname /SystemError eq % Was the reason for the error a failed system call? {%yes, a system error (System Error in NEST resource file: ) =only sys_errname ==only ( in ) =only = } {%no, "ordinary" error (Error in nest resource file: ) =only errorname ==only ( in ) =only = } ifelse % Re-set error state /newerror false def % this is NOW IMPORTANT! } { % this catches extra stops (\n Software Interrupt \n) = % issued by the user } ifelse % or a user function end } if } def %%%% % evalstring % used by interpret.cc %%%% /evalstring { cvx stopped {handleerror} if } def end % systemdict (SLIUSER) :pathlist path setpath % prepend user directories (.) path setpath % prepend current directory evalrcfile /* BeginDocumentation Name: environment - return divtionary of environment variables Synopsis: enviroment -> dict Description: Returns dictionary with the environment variables of the process that invoked NEST. It is a shortcut for statusdict/environment ::, provided for backward compatibility. SeeAlso: statusdict */ /environment { statusdict/environment :: } def