# About script-fu-interpreter It is PIKA's Scheme interpreter akin to any other language interpreter, rather than a PIKA extension as is the plugin extension-script-fu. This interpreter (like all the ScriptFu plugins) embeds a TinyScheme interpreter. It is an executable program that is passed the name of a .scm file. The combination defines one or more PDB procedures of type PLUGIN. Differences from extension-script-fu ==================================== Since pika-script-fu-interpreter and extension-script-fu use the same embedded interpreter (they both wrap TinyScheme) there is no difference in the language interpreted. Any differences are in the larger behavior of plugins. ### PDB Procedure type Defines PDB procedure(s) of type PLUGIN. Unlike for the scriptfu extension, where a .scm file defines PDB procedure(s) of type TEMPORARY (owned by the PDB procedure of type PLUGIN named extension-script-fu) ### Protocol Uses protocol to PIKA like other interpreters e.g. Python (query, create, and run phases.) The protocol to PIKA is unlike the protocol to the PIKA extension extension-script-fu. (Note that "extension" has many meanings. It can denote: a protocol, or "suffix of a filename", or "a resource that extends PIKA." extension-script-fu is "a resource that extends PIKA" and it also uses the "extension" protocol, while pika-script-fu-interpreter is a "a resource that extends PIKA" but uses the "plugin" protocol.) ### Process lifetimes Executed many times, for many phases, unlike extension-script-fu which stays executing and gets a remote procedure call from PIKA to run a PDB procedure. ### Process concurrency Each invocation of a plugin is in a separate process. One plugin process crash does not affect others. Unlike extension-script-fu, where a crash means the PIKA app must be restarted to restart extension-script-fu. ### GUI concurrency Each plugin can have its own GUI visible concurrently with the GUI of other ScriptFu plugins. For extension-script-fu, an open dialog prevents other plugins in /scripts (implemented by extension-script-fu) from opening a dialog. Instead extension-script-fu opens such dialogs sequentially. This difference is not very important, since most users work sequentially. Most dialogs for plugins do not do anything substantive until a user closes the dialog with the OK button. ### Calls between scripts In extension-script-fu, a call to another PDB procedure implemented by TEMPORARY procedure owned by extension-script-fu does not leave the process. In pika-script-fu-interpreter, a call to another PDB procedure implemented in another plugin file starts another process. For other plugins, most calls to another PDB procedure starts another process. The exception is when one plugin file implements many PDB procedures. One common case is when one plugin file implements its own TEMPORARY PDB procedures that exist only for the duration of the plugin's lifetime. Naming ====== script-fu-interpreter is the informal name. Source is located in /plug-ins/script-fu/interpreter Filename of the executable is pika-script-fu-interpreter-3.0. The name is versioned by a number corresponding to the API and the major version of PIKA (when script-fu-interpreter was introduced). We expect plugin authors to be insulated from changes to script-fu-interpreter, for the duration of the PIKA 3 version. About .scm scripts for script-fu-interpreter ============================================ The contents of a .scm file queried by script-fu-interpreter are the same as those handled by extension-script-fu except for the addition of a shebang: #!/usr/bin/env pika-script-fu-interpreter-3.0 (define (script-fu-test img drawable) ... (script-fu-register "script-fu-test" ... ### Query of scripts As for other interpreters, a plugin script file must have certain attributes to be queried by PIKA. But a queried file may define many PDB procedures. A .scm file queried by script-fu-interpreter: - must have permission to execute. - must be in a directory names the same as the file's base name (less suffix.) A directory containing an .scm file queried by script-fu-interpreter is usually a subdirectory of one of the /plug-ins directories, unlike for extension-script-fu, where the .scm files are in a /scripts dir. A plugin directory should contain only one queriable .scm file: only one file can have the same base name as the directory and PIKA will query that file. ### Defining many PDB procedures per directory When PIKA queries, script-fu-interpreter will load *ALL* the .scm files in the same directory (regardless of shebang or execute permission.) Any of the .scm files can declare and register a PDB procedure. Any single .scm file can declare and register many PDB procedures. Similarly, when PIKA runs a named PDB procedure defined in an .scm file, script-fu-interpreter will actually load *ALL* the .scm files in the same directory, but run only the define run function so named. A plugin directory that contains many .scm files having a shebang will also work, since only one can be named the same as the parent directory, and PIKA will only query it, but find the other .scm files with a shebang. ### Requery of scripts As with other plugins, PIKA caches plugin definitions between sessions. PIKA queries plugin files at startup. PIKA will not requery any plugin files which have not changed since cached. PIKA will not query a plugin file that is added to the file system until PIKA is restarted. (Filters>Development>ScriptFu>Refresh Scripts will not requery script files handled by pika-script-fu-interpreter, only those handled by extension-script-fu.) ### Errors during query Most errors occurring during query appear only in the console. If you are a plugin author, you should start PIKA in a console so you can see such errors. A script may be malformed because it does not define a "run" function having the same name as the PDB procedure name declared in the call to script-fu-register(). Formerly, such a malformed script was successfully queried but the script would throw a "undefined variable" error at run time. Now, such a malformed script is not queried successfully, but throws a warning to the console: "Run function not defined, or does not match PDB procedure name:" Test scripts ============ Small test scripts for pika-script-fu-interpreter are located in /plug-ins/script-fu/scripts/test The script ts-helloworld.scm, formerly installed in /scripts and handled by extension-script-fu, is now installed in /plug-ins/ts-helloworld/ts-helloworld.scm and is now handled by pika-script-fu-interpreter. It appears as "Filters>Development>Script-Fu>Test>Hello World..."