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..."
 |