179 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			179 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|  | # 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..." |